Можно ли полностью исключить реквоты при закрытии позиций?

 
При закрытии рыночных позиций пользуюсь конструкцией класса Trade. Примерно такого вида (в цикле перебора)
bool result_close = Trade.PositionClose(PositionInfo.Ticket());
И периодически возникает ошибка 10004 (Requote)
Ну то есть позиции то в итоге закрываются скриптом, но алерт с данной ошибкой начал уже раздражать. Можно ли что-то с этим сделать, кроме исключения данной ошибки из отчета?
 
leon_17:
При закрытии рыночных позиций пользуюсь конструкцией класса Trade. Примерно такого вида (в цикле перебора)
И периодически возникает ошибка 10004 (Requote)
Ну то есть позиции то в итоге закрываются скриптом, но алерт с данной ошибкой начал уже раздражать. Можно ли что-то с этим сделать, кроме исключения данной ошибки из отчета?

полностью реквоты исключить нельзя, но можно минимизировать: торговые действия должны быть в самом начале OnTick. До всего прочего. И всё прочее тоже должно быстро работать.

то есть надо "вывернуть" алгоритм советника чтобы торговые приказы стали первыми, потом взять профилировщик и забороть тормоза. Потом вручную проводить измерения и вычищать хвосты. И так далее.

в основном реквот - это значит вы не успели среагировать за отведённое время. 

 
Maxim Kuznetsov #:

полностью реквоты исключить нельзя, но можно минимизировать: торговые действия должны быть в самом начале OnTick. До всего прочего. И всё прочее тоже должно быстро работать.

то есть надо "вывернуть" алгоритм советника чтобы торговые приказы стали первыми, потом взять профилировщик и забороть тормоза. Потом вручную проводить измерения и вычищать хвосты. И так далее.

в основном реквот - это значит вы не успели среагировать за отведённое время. 

Не поможет. Там цены используются свежие

//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }

А вот в конструкторе

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CTrade::CTrade(void) : m_async_mode(false),
                       m_magic(0),
                       m_deviation(10),
                       m_type_filling(ORDER_FILLING_FOK),
                       m_log_level(LOG_LEVEL_ERRORS)

Можно попробовать увеличить указав бо́льшее значение в строке 

bool result_close = Trade.PositionClose(PositionInfo.Ticket(), 500);

Но и это не панацея. Возможны другие причины. И с некоторыми можно бороться только кардинальными методами.

 
Смените кухню.
 
secret #:
Смените кухню.

Эта кухня - демосчет метаквотов.

Alexey Viktorov #:

Не поможет. Там цены используются свежие

А вот в конструкторе

Можно попробовать увеличить указав бо́льшее значение в строке 

Но и это не панацея. Возможны другие причины. И с некоторыми можно бороться только кардинальными методами.

Спасибо! Да, это ближе к теме, я то до этого как-то считал, что там в настройках стоит -1, то есть принимается любое проскальзывание.

Обновление котировок через SymbolInfoTick перед каждым закрытием позиции бессмысленно? 

SYMBOL_BID точно берет самые свежие данные из возможного? 

 
leon_17 #:

Эта кухня - демосчет метаквотов.

Спасибо! Да, это ближе к теме, я то до этого как-то считал, что там в настройках стоит -1, то есть принимается любое проскальзывание.

Обновление котировок через SymbolInfoTick перед каждым закрытием позиции бессмысленно? 

SYMBOL_BID точно берет самые свежие данные из возможного? 

Почему бессмысленно? Это ведь не обновление котировок, а указание цены по которой надо закрывать позицию.

Что касается свежести SYMBOL_BID читайте документацию… по SymbolInfoTick 

 
Maxim Kuznetsov #:

взять профилировщик и забороть тормоза.

Такое мог только со старым профилировщиком (кто знает последний билд с ним, дайте знать). На новом не смог найти узкие места, польза обнулилась.

 
leon_17 #:

Эта кухня - демосчет метаквотов.

Тем более.
 
Alexey Viktorov #:

Но и это не панацея. Возможны другие причины. И с некоторыми можно бороться только кардинальными методами.

Какие еще могут быть причины? Увеличение значения проскальзывания до 500 сократило число реквотов, но не решило проблему до конца. Скачков больше 20 пунктов в любом случае не было.  

 
leon_17 #:

Какие еще могут быть причины? Увеличение значения проскальзывания до 500 сократило число реквотов, но не решило проблему до конца. Скачков больше 20 пунктов в любом случае не было.  

После этого

говорить о кардинальных методах не приходится.

Остаётся только писать обработчик ошибок и при получении реквоты действовать соответственно стратегии, в зависимости от размера разницы цен…