ФОРТС: OnTradeTransaction() коды возврата - страница 6

 

Офигеть!

Время установки - 15:07:31.849

Время удаления - 15:07:31.865

И уже 25-ую неделю перетирается Invalid request, и это на полном серьезе. Теперь понятно почему сервисдеск молчит. 


 

В каких случаях советник может получить код:

TRADE_RETCODE_REJECT
 

Сергей!

Ты оказался прав. Бага MQ

В терминале не обновляется состояние ордера:

2015.11.26 15:41:56.094 Forts_trader (GAZR-12.15,H1)    Remove: Ордер не отослан! Причина: Неправильный запрос; Билет = 24041883
2015.11.26 15:41:56.094 Forts_trader (GAZR-12.15,H1)    DEBUG: order state = ORDER_STATE_STARTED
2015.11.26 15:41:56.068 Forts_trader (GAZR-12.15,H1)    CheckOrders: Sell ордер установлен. Билет = 24041883

 Ордер я получил, а его состояние так и "висит" ORDER_STATE_STARTED 

 
Михаил:

Сергей!

Ты оказался прав. Бага MQ

В терминале не обновляется состояние ордера:

 Ордер я получил, а его состояние так и "висит" ORDER_STATE_STARTED 

Михаил, ордер продолжает существовать после этих сообщений? По нему, случайно, за несколько мс до этого сделка не могла исполниться?

 
Alexey Kozitsyn:

Михаил, ордер продолжает существовать после этих сообщений? По нему, случайно, за несколько мс до этого сделка не могла исполниться?

Да, ордер существует существует и после ошибки.

Да это и не важно, потому что перед удалением (модификацией) делается проверка что ордер существует:

void COrder::Remove()
{
  if ( ticket > 0 )
  {
    if ( OrderSelect( ticket ) )
    {
      ENUM_ORDER_STATE ord_state = ENUM_ORDER_STATE( OrderGetInteger( ORDER_STATE ) );
      if ( ( ord_state == ORDER_STATE_REQUEST_MODIFY ) ||
           ( ord_state == ORDER_STATE_REQUEST_CANCEL ) ||
           ( ord_state == ORDER_STATE_REQUEST_ADD ) ) return;
//........................................ Other code 
   }
  }
}
 

Почему спрашиваю, у меня сложилась вот такая ситуация:

Журнал (эксперты):

2015.11.26 18:05:16.725 FROG (RTS-12.15,M1)     TradeRemoveCycle case ORDER_STATE_PLACED: ОШИБКА #4756, retcode = 10013. Ордер не удален!
2015.11.26 18:05:16.691 FROG (RTS-12.15,M1)     TradeRemoveCycle: ORDER_STATE_PLACED

Видно, что ордер принят (значит с ним можно работать), однако запрос не верный.

В журнале лог такой:

2015.11.26 18:05:16.725 Trades  '1007642': failed cancel order #35817112 buy 0.00  at market [Invalid request]
2015.11.26 18:05:16.693 Trades  '1007642': cancel order #35817112 buy limit 1.00 RTS-12.15 at 87780
2015.11.26 18:05:16.691 Trades  '1007642': deal #4375646 buy 1.00 RTS-12.15 at 87780 done (based on order #35817112)

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

Вот сейчас решаю, как быть. 

 
Михаил:

Да, ордер существует существует и после ошибки.

Да это и не важно, потому что перед удалением (модификацией) делается проверка что ордер существует:

Как видите, у меня тоже делается...
 
Alexey Kozitsyn:

Почему спрашиваю, у меня сложилась вот такая ситуация:

Журнал (эксперты):

Видно, что ордер принят (значит с ним можно работать), однако запрос не верный.

В журнале лог такой:

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

Вот сейчас решаю, как быть. 

Я тоже наступал на эти грабли, но решил проблему.

Вы какой командой устанавливаете ордер OrderSend() или OrderSendAsync()? 

 
Михаил:

Я тоже наступал на эти грабли, но решил проблему.

Вы какой командой устанавливаете ордер OrderSend() или OrderSendAsync()? 

OrderSend(). А в чем разница в этом случае?
 
Alexey Kozitsyn:
OrderSend()

Дело в том, что когда исполняется ордер, Вы не контролируете его исполнение и поэтому не блокируете OnTick() или OnBookEvent()

Что бы быстро контролировать исполненный ордер, нужно обрабатывать событие сделки в OnTradeTransaction()

Скоро выложу код, как это сделать... 

Причина обращения: