ФОРТС. Вопросы по исполнению - страница 7

 

Добрый день!

 Что-то не ладно в "Королевстве"

1 

Есть какой-то прогресс в работе? 

 
Mikalas:

Добрый день!

 Что-то не ладно в "Королевстве"

 

Есть какой-то прогресс в работе? 

Да, прогресс большой.

На этой неделе выпустим новый билд и когда серверы обновятся, то увидите ускорение. Работы и дальше продолжаются.

 
Renat:

Да, прогресс большой.

На этой неделе выпустим новый билд и когда серверы обновятся, то увидите ускорение. Работы и дальше продолжаются.

Молодцы! Ждём с нетерпением!
 

Добрый день, Ренат!

Кто-нибудь из брокеров в США использует МТ5 для

торговли фьючерсами? 

 
Еще нет.
 
Renat:
Еще нет.
А планы далёкие или в обозримом будующем?
 
Mikalas:
А планы далёкие или в обозримом будующем?
Как будут новости, мы опубликуем.
 

Добрый день, Ренат!

А стоит ли у Вас в планах доработать обработчик OnTradeTransaction?

 
Что именно вы имеете в виду?
 
Renat:
Что именно вы имеете в виду?

Добрый день!

На рисунке лог действия с отложенным ордером:

void OnTradeTransaction( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
  Print( "Type = ", EnumToString(trans.type), "; State = ", EnumToString( trans.order_state ), "; Retcode = ", result.retcode );
}

 

Установка --> модификация --> удаление

 

 

 Зачем дублирование (обведено красным)?

И нет кодов возврата.

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

Как узнать? 

Теперь рассмотрим установку отложенного ордера:

Отправив команду OrderSendAsync, мы получаем номер запроса req_id = result.request_id

if ( OrderSendAsync( request, result ) )
  {
    if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      req_id = result.request_id;
    }
  }

 В OnTradeTransaction мы сразу получаем ответ (result.retcode) установлен ли ордер (получаем его ticket) или нет

void OnTradeTransaction( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
 // Print( "Type = ", EnumToString(trans.type), "; State = ", EnumToString( trans.order_state ), "; Retcode = ", result.retcode );

  switch( trans.type )
  {
    case TRADE_TRANSACTION_REQUEST:      if ( trans.order_state == ORDER_STATE_STARTED )
                                         {
                                           if ( ( req_id != 0 ) && ( result.request_id == req_id ) )
                                           {
                                             if ( result.retcode == TRADE_RETCODE_PLACED )
                                             {
                                               ticket = result.order;
                                             }
                                             req_id = 0;   
                                           }
                                         }
                                         break; 
}    

 Зачем нам ещё 3 сообщения,

EI      0       20:45:15.932    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_ADD; State = ORDER_STATE_STARTED; Retcode = 0
GD      0       20:45:15.932    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_REQUEST_ADD; Retcode = 0
KI      0       20:45:15.961    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_PLACED; Retcode = 0

 

если мы уже всё выяснили?

 Далее, модификация.

зачем сообщение,

KI      0       20:45:36.879    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_REQUEST_MODIFY; Retcode = 0

 если нам всё-равно не известен результат этого действия (Retcode = 0)?

Отправив команду на модификацию ордера, мы, как и с случаем его установки, уже знаем, что он модифицируется (повторно получили билет и result.retcode == TRADE_RETCODE_PLACED 

Гораздо информативнее будет добавить Retcode = MODIFY_DONE в сообщение

RN      0       20:45:36.895    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_PLACED; Retcode = MODIFY_DONE
Ну и с удалением ордера та же история, получив TRADE_TRANSACTION_REQUEST и result.retcode == TRADE_RETCODE_PLACED мы уже знаем, что ордер в состоянии удаления.
Да и вообще, зачем знать переходные состояния ордера, если с ним, в этот момент, ничего нельзя сделать? 
Т.е для отслеживания команд и состояния ордера
достаточно Type = TRADE_TRANSACTION_REQUEST и  result.retcode == TRADE_RETCODE_PLACED для понимания, что команда исполнена и происходит действие
А для результата действия достаточно  Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_PLACED; Retcode = PLACE_DONE | MODIFY_DONE | CANCELED_DONE | OTHER_ERRORS
Причина обращения: