交易请求结果结构 (MqlTradeResult)

交易请求结果,交易服务器返回有关交易要求处理结果的相关数据来作为类型的MqlTradeResult 特殊预定义结构。

struct MqlTradeResult
  {
   uint     retcode;          // 操作返回代码
   ulong    deal;             // 交易订单号,如果完成的话
   ulong    order;            // 订单号,如果下订单的话
   double   volume;           // 交易交易量,经纪人确认的
   double   price;            // 交易价格,经纪人确认的
   double   bid;              // 当前买入价
   double   ask;              // 当前卖出价
   string   comment;          // 经纪人操作注释 (默认填充操作描述)
   uint     request_id;       // 分派期间通过程序端设置Request ID 
   int      retcode_external// 返回外部交易系统代码
  };

域描述

描述

retcode

交易服务器的返回代码

deal

交易 标签,如果执行订单,对于 TRADE_ACTION_DEAL 交易操作类型来说是可行的

order

订单 标签,如果安置标签,对于 TRADE_ACTION_PENDING 交易操作类型来说是可行的

volume

交易成交量,由经纪人确认,取决于 订单填充类型

price

订单价格,由经纪人确认,取决于误差域 交易请求 和/或 交易操作

bid

当前市场买价(请求报价)

ask

当前市场卖价(请求报价)

comment

经纪人评论操作(通过操作描述默认填满)

request_id

发送至交易服务器时通过程序端设置Request ID

retcode_external

通过外部交易系统返回的错误代码。这些错误的使用和类型取决于交易操作发送的交易商和外部交易系统

交易操作结果返回到MqlTradeResult类型变量,以第二秒参量 OrderSend() 去执行 交易操作

程序端修正了当使用OrdersSend() 和 OrderSendAsync()函数发送至交易服务器时的request_id字段的 requestID。程序端接收来自交易服务器的执行交易的信息,并通过含有以下组件作为参数的OnTradeTransaction()函数提交它们用于处理:

  • MqlTradeTransaction结构的交易事务说明;
  • OrderSend() 或 OrdersSendAsync() 函数发送的交易请求的说明。Request ID由程序端向交易服务器发送,而该请求本身及其request_id被存储在程序端存储器中;
  • 交易请求执行结果为MqlTradeResult 结构,request_id字段包含该请求的ID。

OnTradeTransaction()函数接收三个输入参数,但后两个仅适用于有TRADE_TRANSACTION_REQUEST 类型的交易分析。在所有其他情况下,不填写有关交易请求及其执行结果的数据。参数分析的例子可以在交易请求结构找到。

当将交易请求发送至服务器时通过程序端为其设置request_id ,主要介绍用于OrderSendAsync() 异步函数工作。该标识符允许将执行的操作与此操作发送到OnTradeTransaction()的结果相关联(OrderSend 或 OrderSendAsync 函数调用)。

示例:

//+------------------------------------------------------------------+
//| 随着处理结果发送交易请求                                            |
//+------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
  {
//--- 重置最后一个错误代码到零
   ResetLastError();
//--- 发送请求
   bool success=OrderSend(request,result);
//--- 如果结果失败-找出为什么
   if(!success)
     {
      int answer=result.retcode;
      Print("TradeLog: Trade request failed. Error = ",GetLastError());
      switch(answer)
        {
         //--- 重新报价
         case 10004:
           {
            Print("TRADE_RETCODE_REQUOTE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- 订单没有被服务器接受
         case 10006:
           {
            Print("TRADE_RETCODE_REJECT");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- 无效价格
         case 10015:
           {
            Print("TRADE_RETCODE_INVALID_PRICE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- 无效 SL and/or TP
         case 10016:
           {
            Print("TRADE_RETCODE_INVALID_STOPS");
            Print("request.sl = ",request.sl," request.tp = ",request.tp);
            Print("result.ask = ",result.ask," result.bid = ",result.bid);
            break;
           }
         //--- 无效交易量
         case 10014:
           {
            Print("TRADE_RETCODE_INVALID_VOLUME");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume);
            break;
           }
         //--- 无足够的钱进行交易操作 
         case 10019:
           {
            Print("TRADE_RETCODE_NO_MONEY");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume,"   result.comment = ",result.comment);
            break;
           }
         //--- 一些其他的原因, 输出服务器响应码 
         default:
           {
            Print("Other answer = ",answer);
           }
        }
      //--- 通过返回错误值通知服务器请求的不成功结果
      return(false);
     }
//--- 发送命令 () 返回真值 - 复制答案
   return(true);
  }