交易机器人在市场发布前必须经过的检验 - 页 3

 
Bogdan Bovykin:

我是说把它做成一个面板,然后用这种方式检查? 或者怎么做?

现在只需手动打开任何交易,该 EA 就会附加到图表上的开仓单。

好的

如果您自己编写了这个工具,您可以在 INIT 中的测试器中打开一个交易,助手会对其进行管理。

 

如果 Expert Advisor 通过了终端测试并打开了交易, 那么在自动检查中会写入一个错误,即没有打开任何交易(交易对和 TF 相同),分别是它没有通过 "自动检查"。

巧合吗?我不这么认为!

怎么办?

 
我最近也遇到了同样的错误,我不得不在 inite 中强制打开一个交易
 

MetaQuotes 是否有可能为开发人员生成一个模板?这将使开发人员更容易,也节省了 MetaQuotes检查 提交的 EA 所需的大量资金和资源。

在代码库中为开发人员提供模板

https://www.mql5.com/zh/code/mt4/experts/best

 
Alain Verleyen:

这是一篇有趣的文章,但遗憾的是,其中有太多错误(建议代码中的错字甚至逻辑错误),在某些地方可能会让更多人感到困惑,而不是有所帮助。

//+------------------------------------------------------------------+
//| 返回符号订单允许的最大交易量。
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- 获取订单的最大交易量限制
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- 通过一个符号获取对音量的限制
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- 通过一个符号获取开仓量
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)  There is no opened positions
     {
      //--- 如果我们已经用完了容量
      if(max_volume-opened_volume<=0)
         return(0);

      //--- 未平仓头寸的交易量不超过最大交易量
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

逻辑错误。如果尚未建仓,则仍需检查挂单量并计算允许成交量。如果没有建仓,而未考虑挂单,则该代码返回 allowed_volume=0,为什么?

在此代码中,我们也会检查挂单交易量
 
Alain Verleyen:


+缺少参数(PrintFormat 有 %,但只提供了 3 个参数)。

谢谢!已修复

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- 按机票选择订单
   if(orderinfo.Select(ticket))
     {
      //--- 挂单的点位大小和符号名称
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- 检查公开价格是否有变化
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- 检查止损水平是否有变化
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- 检查 Takeprofit 级别是否有变化
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- 如果级别有任何变化
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)
         return(true);  // 顺序可以修改 
      //--- 开仓、止损和获利水平没有变化
      else
      //--- 错误通知
         PrintFormat("Order #%d already has levels of Open=%.5f SL=%.5f TP=%.5f",
                     ticket,orderinfo.PriceOpen(),orderinfo.StopLoss(),orderinfo.TakeProfit());
     }
//------结束,顺序不变
   return(false);       // 没有必要修改 
  }
 
Alain Verleyen:

与上述第 2° 点的错误类似。

同样的错误也出现在 OrderModifyCheck() mql4 版本中。


全部修复,谢谢!

 
Alain Verleyen:

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- 按机票选择订单
   if(orderinfo.Select(ticket))
     {
      //--- 挂单的点位大小和符号名称
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- 检查公开价格是否有变化
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- 检查止损水平是否有变化
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);

其他逻辑错误。允许将 SL/TP 更改 1 点。应该是 >=

在我的记忆中,我们使用这种做法只是为了在我们的交易请求到达服务器时,不会因为价格变化 而被交易服务器拒绝。

这样做更安全。

 
Alain Verleyen:

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- 按机票选择订单
   if(orderinfo.Select(ticket))
     {
      //--- 挂单的点位大小和符号名称
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- 检查公开价格是否有变化
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- 检查止损水平是否有变化
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- 检查 Takeprofit 级别是否有变化
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- 如果级别有任何变化
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)

+错字,应为"-tp)>=point);"

谢谢!已修复
 
bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);

//--

bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-tp)>point);