В качестве аргументов использовал 2 противоположных ордера по одному инструменту, функцией OrdersTotal() до и после OrderCloseBy() вывел количество ордеров, оно не изменилось, функция GetLastError() после клоуса пишет об отсутствии ошибок, в истории счета нулевых прибылей нет. Вопросы:
1. имеет ли разница в порядке баевых и селльных ордеров?
2.как все же закрыть встречные ордера?
- покажите код
- покажи те журнал
- покажите терминал
}
журнал
в истории этих ордеров нету, но в торговле они есть
}
журнал
в истории этих ордеров нету, но в торговле они есть
Переменная id точно помнит тикет открытого ордера? Возможно, она где-то обнуляется.
Также странно, что не проверен результат вызова OrderCloseBy. Ну а количество ордеров не может быть получено через GetLastError. Какой-то сумбур получается.
Нужно хотя бы:
if(getorder(cmd1) > 0) if (OrderCloseBy(getorder(cmd1), id)) Alert("Закрытие произошло успешно. Осталось ордеров: ", OrdersTotal()); else Alert("Ошибка закрытия: ", GetLastError());
Но непонятно, что там возвращает функция getorder и что такое cmd1.
Все-таки проверьте, что там лежит в id перед вызовом OrderCloseBy, а потом попробуйте сделать, как я написал.
}
журнал
в истории этих ордеров нету, но в торговле они есть
Ваш код не совсем понятен. Даже Вам будет трудно в нем ориентироваться.
Хотя я тоже грешу этим. когда делаю для себя, или чтобы никто не смог понять мой код при декомпиле. :-)
посмотрите этот код:
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ int id1=0,id2=0; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { if(id1==0) { id1=OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT),MarketInfo(Symbol(),MODE_ASK),MarketInfo(Symbol(),MODE_SPREAD),0,0); if(id1>0)Alert("Открыта новая позиция("+OP_BUY+", "+id1+").Всего открытых позиций: "+OrdersTotal()); else Alert("Ошибка открытия позиции "+GetLastError()); } if(id2==0) { id2=OrderSend(Symbol(),OP_SELL,MarketInfo(Symbol(),MODE_MINLOT),MarketInfo(Symbol(),MODE_BID),MarketInfo(Symbol(),MODE_SPREAD),0,0); if(id2>0)Alert("Открыта новая позиция ("+OP_SELL+", "+id2+").Всего открытых позиций: "+OrdersTotal()); else Alert("Ошибка открытия позиции "+GetLastError()); } if(id1!=0 && id2!=0) { bool result=OrderCloseBy(id1,id2); if(result) { Alert("Позиции закрыты: "); ExpertRemove(); return; } else Alert("Позиции не закрыты: "+GetLastError()); } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+
он полностью рабочий и показывает, что функция работает.
Господа, я не пробовал эту функцию, но говорят один спред экономится, так ли это?
других скрытых прибылей не добавляется :-)
CloseBy не всегда можно использовать. Проверить можно так:
MarketInfo(NULL,MODE_CLOSEBY_ALLOWED);
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В качестве аргументов использовал 2 противоположных ордера по одному инструменту, функцией OrdersTotal() до и после OrderCloseBy() вывел количество ордеров, оно не изменилось, функция GetLastError() после клоуса пишет об отсутствии ошибок, в истории счета нулевых прибылей нет. Вопросы:
1. имеет ли разница в порядке баевых и селльных ордеров?
2.как все же закрыть встречные ордера?