堡垒。执法问题 - 页 7

 

下午好!

王国》有些不对劲。

1

工作是否有任何进展?

 
Mikalas:

下午好!

王国有些不对劲的地方

工作是否有任何进展?

是的,有很多进展。

我们本周将发布一个新的构建,当服务器更新时,你将看到一个加速。这项工作仍在进行中。

 
Renat:

是的,进步是伟大的。

我们将在本周发布一个新的构建,当服务器被更新时,你将看到加速的效果。这项工作仍在进行中。

干得好!期待着!
 

下午好,Renat!

在美国是否有经纪商使用MT5进行交易?

期货交易?

 
还没有。
 
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),无论订单是否被设置(我们得到其票据)。

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
原因: