OnTick - страница 2

 
Mikalas:

Добрый день!

Поскольку функция OnBookEvent() является широковещательной, то

необходимо фильтровать события для своего символа:

 И всё заработает правильно.

Естественно фильтруется.

Кроме этого еще проверяется цена ордера, и если она не совпадает с нужной - только тогда пытаюсь модифицировать. 

Получается если не было изменения котировок я не могу модифицировать ордер? Бред.

 

Какой вопрос - такой ответ... в правильно заданном вопросе почти 100% ответа...

Ваш вопрос, мягко выражаясь, некомпетентен...

Нужно видеть блок кода, где отправляются запросы на сервер. Может Вы сервер забросали своими запросами в асинхронном режиме, вот он и ругается...

Читкайте тут дополнительно:

https://www.mql5.com/ru/forum/10969

TRADE_RETCODE_INVALID
TRADE_RETCODE_INVALID
  • www.mql5.com
При быстрой (несколько раз в секунду) модификации ордера функцией OrderSendAsync иногда выскакивает такая ошибка. - - Категория: общее обсуждение
 
Serj_Che:

Естественно фильтруется.

Кроме этого еще проверяется цена ордера, и если она не совпадает с нужной - только тогда пытаюсь модифицировать. 

Получается если не было изменения котировок я не могу модифицировать ордер? Бред.

К сожалению ( или к счастью), ЛЮБОЙ советник - это машина состояний.

Событие --> Проверка состояния --> Реакция.

Все мои советники (более 10 месяцев) работают на реале по OnBookEvent() с OrderSendAsync()

У меня нет никаких проблем ни с постановкой, ни с удалением, ни с модификацией ордеров!

Ищите ньюанс в Вашем коде. 

Помимо состояний самого эксперта, есть состояния Вашего ордера:

enum ENUM_ORD_STATE
{
  ORD_NO_STATE       = 0,
  ORD_BUY_DO_SET     = 1,
  ORD_BUY_DO_MODIFY  = 2,
  ORD_BUY_WORK       = 3,
  ORD_BUY_DO_CANCEL  = 4,
  ORD_SELL_DO_SET    = 5,
  ORD_SELL_DO_MODIFY = 6,
  ORD_SELL_WORK      = 7,
  ORD_SELL_DO_CANCEL = 8
};

 Тогда в OnBookEvent() нужно учитывать состояние Вашего ордера,

иначе ордер будет постоянно модифицироваться (ставиться или удаляться), что у Вас и происходит... 

Над ордером можно совершать действия, когда ордер находится в стабильном состоянии. 

ORD_NO_STATE - ордер не выставлен

 ORD_BUY_WORK - ордер выставлен и никаких действий с ним не происходит:

void OnBookEvent( const string &a_symbol )
{
  if ( a_symbol == MySymbol )
  {
    if ( BuyOrder.state == ORD_NO_STATE ) || ( BuyOrder.state == ORD_BUY_WORK ) )
    {
      //Едем дальше
    }
  }
}
 
Mikalas:

...Ищите ньюанс в Вашем коде...

Верно. Но смею предположить, что дело не в состоянии ордера. Просто слишком частые попытки модифицировать ордер приводят к тому, что сервер начинает отказывать советнику...

Событие BookEvent случается гораздо чаще, чем событие NewTick. Можно проверить периодичность... и тогда многое станет понятно...

 
denkir:

Верно. Но смею предположить, что дело не в состоянии ордера. Просто слишком частые попытки модифицировать ордер приводят к тому, что сервер начинает отказывать советнику...

Событие BookEvent случается гораздо чаще, чем событие NewTick. Можно проверить периодичность... и тогда многое станет понятно...

Я высказал предположения. Кода-то нет.

И на 99,9% уверен, что не закончилось действие первой команды ( ордер в состоянии ORD_BUY_DO_MODIFY ),

как уже летит другая... А если бы была проверка, то повторная команда на модификацию не поступила бы.

Так, что не известно кто из нас прав :) 

P/S При работе с отложенными ордерами ВООБЩЕ нельзя обойтись без состояния ордера.

У меня была проблема. Срабатывал отложенный ордер, а событие в OnTradeTransaction приходило

(иногда) позже, чем в OnBookEvent() - долго голову ломал по этому поводу

(было двойное срабатывание)! 

 
Mikalas:

Я высказал предположения. Кода-то нет.

И на 99,9% уверен, что не закончилось действие первой команды ( ордер в состоянии ORD_BUY_DO_MODIFY ),

как уже летит другая... А если бы была проверка, то повторная команда на модификацию не поступила бы.

Так, что не известно кто из нас прав :) 

P/S При работе с отложенными ордерами ВООБЩЕ нельзя обойтись без состояния ордера.

У меня была проблема. Срабатывал отложенный ордер, а событие в OnTradeTransaction приходило

(иногда) позже, чем в OnBookEvent() - долго голову ломал по этому поводу! 

Похоже в этом дело! Добавил проверку, пока ошибок не выдает. Спасибо!

Завтра еще понаблюдаю на быстром рынке.

 
denkir:

Верно. Но смею предположить, что дело не в состоянии ордера. Просто слишком частые попытки модифицировать ордер приводят к тому, что сервер начинает отказывать советнику...

Событие BookEvent случается гораздо чаще, чем событие NewTick. Можно проверить периодичность... и тогда многое станет понятно...

Асинхронный режим отключен, используется стандартный класс. С NewTick  таких проблем не было. Поэтому и возник вопрос в первом посту. Пока на него ответа нет.
 
Serj_Che:

Похоже в этом дело! Добавил проверку, пока ошибок не выдает. Спасибо!

Завтра еще понаблюдаю на быстром рынке.

Как "быстрый" рынок?
 
Mikalas:
Как "быстрый" рынок?

В основном нормально, без ошибок.

Но все равно, редко встречаются пограничные случаи. 

После проверки статуса, все нормально, отправляется приказ на модификацию. Пока долетел приказ модификации, ордер исполнился и выдает invalid request. 

2015.04.22 18:35:19.223 Trades 'ххххх': modify order #13038500 sell limit 1.00 SBRF-9.15 at 7587 sl: 0 tp: 0 -> 7608, sl: 0 tp: 0 placed for execution in 52 ms

2015.04.22 18:35:19.223 Trades 'ххххх': modify order #13038500 sell limit 1.00 SBRF-9.15 at 7587 sl: 0 tp: 0 -> 7608, sl: 0 tp: 0

2015.04.22 18:35:19.223 Trades 'ххххх': deal #11494544 sell 1.00 SBRF-9.15 at 7587 done (based on order #13038500)

2015.04.22 18:35:19.270 Trades 'ххххх': failed modify order #13038500 buy 0.00 SBRF-9.15 at market sl: 0 tp: 0 -> 7608, sl: 0 tp: 0 [Invalid request]

 

Еще пару раз такая ошибка вылезла:

2015.04.22 21:06:41.156 (SBRF-9.15,M5) CTrade::OrderSend: modify #13043194 at 7671.00000 (sl: 0.00000 tp: 0.00000) [unknown retcode 0]

пока не понял что это такое.

 
Serj_Che:

В основном нормально, без ошибок.

Но все равно, редко встречаются пограничные случаи. 

После проверки статуса, все нормально, отправляется приказ на модификацию. Пока долетел приказ модификации, ордер исполнился и выдает invalid request. 


Я же описывал эту ситуацию... :)

Она будет возникать часто, если НЕ использовать OrderSendAsync()...

OnTradeTransaction() позволяет отслеживать состояния ордера ОЧЕНЬ быстро. 

(у меня не возникает таких проблем)