А почему бы не воспользоваться уже готовым решением,
я только немного переделал, вместо OrderTicket() можно подставить любую другую функцию Order*()
//+----------------------------------------------------------------------------+//| test_GetTicketLastClosePos.mq4 |//| |//| Ким Игорь В. aka KimIV |//| http://www.kimiv.ru |//| |//| 18.05.2008 Скрипт для тестирования функции GetTicketLastClosePos(). |//+----------------------------------------------------------------------------+#property copyright "Ким Игорь В. aka KimIV"#property link "http://www.kimiv.ru"#property show_confirmvoid start() {
Message(GetNameOP(GetTicketLastClosePos()));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает тикет последней закрытой позиции или -1 |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+int GetTicketLastClosePos(string sy="", int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal(), r=-1;
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
r=OrderTicket();
}
}
}
}
}
return(r);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Возвращает наименование торговой операции |//+----------------------------------------------------------------------------+//| Параметры: |//| op - идентификатор торговой операции |//+----------------------------------------------------------------------------+string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("BuyLimit");
case OP_SELLLIMIT: return("SellLimit");
case OP_BUYSTOP : return("BuyStop");
case OP_SELLSTOP : return("SellStop");
default : return("Unknown Operation");
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Вывод сообщения в коммент и в журнал |//+----------------------------------------------------------------------------+//| Параметры: |//| m - текст сообщения |//+----------------------------------------------------------------------------+void Message(string m) {
Comment(m);
if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+
- почему нужно использовать OrdersHistoryTotal() - 1, OrdersTotal() - 1 ?
- ф-ция при выборе ордера OrderSelect() нумеруется с нуля?
- после модификации ордера OrderModify(), нумерация ордеров через OrderSelect() изменяется?
Ордер с номером OrdersTotal() не существует, как правильно Vinin заметил. В данном случае при использовании ОрдерСелект от ошибки можно избавиться - просто пропустить.
Остальное, уверен, Вам известно - просто расшифрую свой подход, может кому и пригодится:
Сама по себе привычка перебирать элементы массива без учета размеров массивов (в терминах С - без учета размеров отведеной памяти) приводит к возникновению массы проблем, основная - конфликты доступа. Такие "плавающие" ошибки, которые очень тяжело отлавливать. В мкл4 это работает из-за наличия собственного менеджера памяти, в других языках не всегда. В С++, например, программисту гарантируется наличие адреса за выделенной памятью, но не гарантируется наличие значения и возможности доступа - результатом обращения туда запросто может стать крэш приложения. Поскольку жизнь на мкл4 не заканчивается, то лучше привычку писать обработку массивов с учетом выхода за пределы вырабатывать сразу, тем более, что в мкл5, это, похоже, уже ошибка.
int history(){
int time = 0;double profit = 0;//обьявляем необходимые нам переменные куда мы положим интересующие нас характеристики ордераfor(int i = OrdersHistoryTotal();i>=0;i--){// Перебираем все закрытые ордераif(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){//если ордер с таким номером (i) в списке закрытых ордеров есть ( не путать с тикетом)if(OrderSymbol() == Symbol()){//если выбранный ордер был открыт по нашей валютной пареif(time<OrderCloseTime()){//(сравниваем его с хранящимся в пероеменной time)
time=OrderCloseTime();//если время закрытия ордера больше - ложим его в переменную
profit=OrderProfit();//и заодно запоминаем прибыль ордера
}
}
}
}
//по окончании этой процедуры в наших переменных будут сидет наибольшее время закрытия, и его профит. Или по нулям если история чистая.//теперь мы можем выставлять условия в зависимости от результата процедурыif(profit == 0 &&time == 0){//действия если история чистая}
}
if(profit >= 0){//действия если последний ордер был прибыльным, или нулевым}
}
if(profit < 0 ){//действия если последний ордер был убыточным}
}
return(0);
}
Всем доброго времени суток! Господа подскажите, почему при компиляции данного кода выдаются ошибки? Функция крайне полезная!
чет никак не найду конкретной инфы:
- почему нужно использовать OrdersHistoryTotal() - 1, OrdersTotal() - 1 ?
- ф-ция при выборе ордера OrderSelect() нумеруется с нуля?
- после модификации ордера OrderModify(), нумерация ордеров через OrderSelect() изменяется?
OrdersHistoryTotal() - 1
Можно пояснить, зачем -1 ?
OrdersHistoryTotal() возвращает количество ордеров (элементов в массиве)
в MQL индексы массивов от 0. Поэтому получается что последний элемент массива OrdersHistoryTotal() -1
А почему бы не воспользоваться уже готовым решением,
я только немного переделал, вместо OrderTicket() можно подставить любую другую функцию Order*()
чет никак не найду конкретной инфы:
- почему нужно использовать OrdersHistoryTotal() - 1, OrdersTotal() - 1 ?
- ф-ция при выборе ордера OrderSelect() нумеруется с нуля?
- после модификации ордера OrderModify(), нумерация ордеров через OrderSelect() изменяется?
Ордер с номером OrdersTotal() не существует, как правильно Vinin заметил. В данном случае при использовании ОрдерСелект от ошибки можно избавиться - просто пропустить.
Остальное, уверен, Вам известно - просто расшифрую свой подход, может кому и пригодится:
Сама по себе привычка перебирать элементы массива без учета размеров массивов (в терминах С - без учета размеров отведеной памяти) приводит к возникновению массы проблем, основная - конфликты доступа. Такие "плавающие" ошибки, которые очень тяжело отлавливать. В мкл4 это работает из-за наличия собственного менеджера памяти, в других языках не всегда. В С++, например, программисту гарантируется наличие адреса за выделенной памятью, но не гарантируется наличие значения и возможности доступа - результатом обращения туда запросто может стать крэш приложения. Поскольку жизнь на мкл4 не заканчивается, то лучше привычку писать обработку массивов с учетом выхода за пределы вырабатывать сразу, тем более, что в мкл5, это, похоже, уже ошибка.
Удачи.
Всем доброго времени суток! Господа подскажите, почему при компиляции данного кода выдаются ошибки? Функция крайне полезная!
и много ошибок?
порядка 4
ясно, вам надо любую книгу по c++ открыть и почитать хотя бы оглавление.