OrderCheck

OrderCheck()函数检测是否有足够的钱执行需要的交易操作。检测结果在MqlTradeCheckResult结构域中。

bool  OrderCheck(
   MqlTradeRequest&       request,      // 请求结构
   MqlTradeCheckResult&   result        // 结果结构
   );

参量

request

[in]  执行 MqlTradeRequest 结构类型,该类型表述必要的操作活动。

result

[in,out]  指针指向 MqlTradeCheckResult 结构类型,显示检测结果。

返回值

如果操作时资金不足,或者错误填满了参量,函数返回false,如果成功检测了结构基础(检测指针),返回true-这并不表示要求的交易操作已经成功执行了。更多函数执行结果的细节描述,都分析在result结构域中。

为了获得有关错误的信息,调用 GetLastError() 函数。

示例:

#define   DEVIATION     5              // 允许的价格偏差
#define   VOLUME        1.0            // 订单交易量
#define   EXPERT_MAGIC  123            // 幻数
#define   DIRECTION     ORDER_TYPE_BUY // 开启的仓位方向 (ORDER_TYPE_BUY 或 ORDER_TYPE_SELL)
 
//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 声明并初始化请求,验证和结果结构
   MqlTradeRequest     request={};
   MqlTradeCheckResult check  ={};
   MqlTradeResult      result ={};
   
//--- 准备交易请求参数
   PrepareRequest(_SymbolDIRECTIONVOLUMErequest);
   
//--- 检查交易请求的参数
   ResetLastError();
   bool res=OrderCheck(requestcheck);
   if(!res)
     {
      PrintFormat("Trade request verification completed with error %d\nServer retcode: %u, comment: %s"GetLastError(), check.retcodecheck.comment);
      return;
     }
     
//--- 交易请求检查成功 - 显示交易请求验证结构栏位的描述
   Print("Trade request verification completed successfully");
   MqlTradeCheckResultPrint(check14);
   
//--- 发送交易请求
   if(!OrderSend(requestresult))
      Print("OrderSend error "GetLastError());    // 如果无法发送请求, 显示错误代码
      
//--- 有关操作的信息
   PrintFormat("Trade request result: retcode=%u, deal=%I64u, order=%I64u"result.retcoderesult.dealresult.order);
   /*
   result with disabled auto trading in the client terminal:
   Trade request verification completed with error 4752
   Server retcode10027commentAutoTrading disabled by client
   
   enable auto trading and check again on a closed market:
   Experts   automated trading is enabled
   Trade request verification completed successfully
   Retcode:      0
   Balance:      10779.50 USD
   Equity:       10779.50 USD
   Profit:       0.00 USD
   Margin:       1104.79 USD
   Margin free:  9674.71 USD
   Margin level975.71 %
   Comment:      Done
   OrderSend error 4756
   Trade request resultretcode=10018deal=0order=0
   
   check on the open market:
   Trade request verification completed successfully
   Retcode:      0
   Balance:      10779.50 USD
   Equity:       10779.50 USD
   Profit:       0.00 USD
   Margin:       110.46 USD
   Margin free:  10669.04 USD
   Margin level9758.74 %
   Comment:      Done
   Trade request resultretcode=10009deal=2777010968order=2802818813
   */
  }
//+------------------------------------------------------------------+
//| 准备用于交易请求的参数                                              |
//+------------------------------------------------------------------+
void PrepareRequest(const string symbolconst ENUM_ORDER_TYPE order_typeconst double volumeMqlTradeRequest &request)
  {
   ENUM_ORDER_TYPE type=(DIRECTION !=ORDER_TYPE_BUY ? ORDER_TYPE_SELL : DIRECTION);
   double price=(DIRECTION==ORDER_TYPE_BUY ? SymbolInfoDouble(Symbol(), SYMBOL_ASK) : SymbolInfoDouble(Symbol(), SYMBOL_BID));
//--- 请求参数
   request.action    = TRADE_ACTION_DEAL// 交易操作类型
   request.symbol    = symbol;            // 交易品种
   request.volume    = volume;            // 交易量
   request.type      = type;              // 订单类型
   request.price     = price;             // 开单价格
   request.deviation = DEVIATION;         // 允许的价格偏差
   request.magic     = EXPERT_MAGIC;      // 订单幻数
  }
//+------------------------------------------------------------------+
//| 在日志中打印交易请求                                                |
//| 验证结果的栏位                                                     |
//+------------------------------------------------------------------+
void MqlTradeCheckResultPrint(const MqlTradeCheckResult &checkconst uint header_width=0)
  {
//--- 取得账户货币和账户货币的小数点位数
   string currency=AccountInfoString(ACCOUNT_CURRENCY);
   int    digits  =(int)AccountInfoInteger(ACCOUNT_CURRENCY_DIGITS);
   
//--- 定义标题文字和标题栏位的宽度
//--- 如果传给函数的标题宽度为0, 则宽度为标题文字行的大小+1
   string header="Retcode:";
   uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- 在日志中以指定的标题宽度显示返回代码
   PrintFormat("%-*s%-u"wheadercheck.retcode);
   
//--- 在日志中显示执行交易操作后的余额值
   header="Balance:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.balancecurrency);
   
//--- 在日志中显示执行交易后的净值数值
   header="Equity:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.equitycurrency);
      
//--- 在日志中显示执行了交易操作后的浮动利润值
   header="Profit:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.profitcurrency);      
      
//--- 在日志中显示必要交易操作所需的保证金金额
   header="Margin:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.margincurrency);      
      
//--- 在日志中显示执行了一项交易操作后剩余的净值数值
   header="Margin free:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.margin_freecurrency);      
      
//--- 在日志中显示在完成所请求的交易操作后的保证金水平
   header="Margin level:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.2f %%"wheadercheck.margin_level);      
      
//--- 在日志中显示相应代码的注释和错误描述
   header="Comment:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-s"wheadercheck.comment);      
  }

另见

OrderSend()交易操作类型交易请求结构检测结果请求结构交易请求结果结构