Как правильно бороться с реквотами?

 
Мой эксперт на Чемпионате () пытался открыть позицию и получил реквоту. Кусок кода, открывающий позицию:
              for (i=1; i<=5; i++)
               {
                t=OrderSend(Symbol(),OP_SELL,Lot,Bid,5,SL,TP,NULL,0,0,CLR_NONE);
                if (t>0) break;
                Sleep(5000);
               }


Т.е. эксперт должен совершить 5 попыток открытия в случае неудачи. Однако в логах видим, что этого не происходит:

Всю голову сломал, но так и не понял, что я сделал неправильно?

Полные логи - на https://www.mql5.com/ru/users/owl/

 

Нужно ставить RefreshRates() каждый раз перед t=OrderSend(Symbol(),OP_SELL,Lot,Bid,5,SL,TP,NULL,0,0,CLR_NONE);

 
Ronen:

Нужно ставить RefreshRates() каждый раз перед t=OrderSend(Symbol(),OP_SELL,Lot,Bid,5,SL,TP,NULL,0,0,CLR_NONE);


Ну поставил бы я RefreshRates()... Это не изменило бы того, что эксперт не стал выполнять цикл попыток открытия ордера!
А потом, насколько я понял, Bid в аргументах OrderSend практически аналогично применению RefreshRates.
 
Лучше не пользоваться циклами при попытках открыть/изменить ордер.
Лучше по сигналу включить тригер о необходимости открытия/изменения позиции
(тригер - просто переменная, включен = 1, выключен = 0)

А дальше на каждом тике пытаемся один раз выполнить открытие.
Если удалось, или прошел заданный таймаут, или цена ушла слишком далеко, сбросываем тригер (=0)
Иначе выходим до следующего тика с включенным тригером.
 
owl:
Ronen:

Нужно ставить RefreshRates() каждый раз перед t=OrderSend(Symbol(),OP_SELL,Lot,Bid,5,SL,TP,NULL,0,0,CLR_NONE);


Ну поставил бы я RefreshRates()... Это не изменило бы того, что эксперт не стал выполнять цикл попыток открытия ордера!
А потом, насколько я понял, Bid в аргументах OrderSend практически аналогично применению RefreshRates.
Нет, Bid известен на момент запуска функции start().
Во время выполнения start() он не меняется, а реальная цена может уйти.
RefreshRates обновляет Bid при выполнении скрипта.
 
Mak писал (а):
Нет, Bid известен на момент запуска функции start().
Во время выполнения start() он не меняется, а реальная цена может уйти.
RefreshRates обновляет Bid при выполнении скрипта.

OK. С этим я согласен. И метод открытия с триггером - понятно.

Но почему-же все-таки цикл НЕ ВЫПОЛНИЛСЯ ?

 

Надо бы анализировать GetLastError

Похоже, следующие запросы просто-напросто сам клиентский терминал не пропустил

 
Я просто после посылки на открытие ордера ставлю Sleep(60000);
и никогда никаких проверок не делаю.
Через минуту (уже на другом запуске функции start()) если ордер не открылся делаю повторную посылку на его открытие и так далее. Давно уже так делаю (скоро уже год будет!) - пока что всё устраивало. За минуту цена туда и обратно ещё сходит и в итоге всё будет зависеть от вашей стратегии а не от скорости открытия ордера.
 
Лично я, пока не стал использовать триггеры, имел постоянную головную боль с открытием и закрытием ордеров. Сейчас советники работают железно.
 

Я тоже, как и Mak, обхожусь без циклов. На каждом новом выполнении функции start() нужно пытаться открыть ордер. Во-первых, приходит реальный тик, во-вторых обновленное значение Bid().

 
А вот мне тоже интересно, почему он не вполнил цикл? Или выполнил, но т.к. цена ушла и не стала равна Bid или Ask настоящим терминал просто послал советник? Так?
Причина обращения: