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

 

谢谢,这篇文章非常有用。

我不是很清楚,在"限制一个符号的手数 " 的副标题中,PositionVolume() 函数的代码被给出了两次。
就在下面是NewOrderAllowedVolume() 函数及其调用的说明:

double orders_volume_on_symbol=PendingsVolume(symbol);

文章中只有PendingsVolume() 函数的说明。

如果错误地将PendingsVolume() 函数改为PositionVolume() 函数,请予以更正。

 
好吧,谷歌,如何通过验证,不,不是这样的,我需要一个可以 100% 通过验证的简单 EA 的例子,以便研究它的代码,并与我自己的代码进行比较,找出可能存在的错误。
 

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

//+------------------------------------------------------------------+
//| 返回符号订单允许的最大交易量。
//+------------------------------------------------------------------+
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)
     {
      //--- 如果我们已经用完了容量
      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,而不考虑挂单。

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.StopLoss(),orderinfo.TakeProfit());
     }
//------结束,顺序不变
   return(false);       // 没有必要修改 
  }

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

+错字,应为"-tp)>=point);" + 缺少参数(打印 格式)。

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

bool PositionModifyCheck(ulong ticket,double sl,double tp)

与上述 2° 类似的错误。

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

感谢您修复了这些错误,请注意我没有深入查看所有文章,因此可能还有更多错误。

 

关于这篇文章的其他一些评论,但这次与错误无关,更多的是我的个人观点:

Access violation

当试图寻址被拒绝访问的内存时会出现此错误。在每种情况下,都有必要通过 "个人资料 "中的 "服务台 "或 "联系人"页面联系开发人员。
  • 有趣的是,这与关于用户(程序员)错误的文章无关。违反访问权限意味着 Metaquotes 代码出错

这种类型的错误相对较少,许多错误都有现成的代码,可帮助查找原因。

常数 说明
err_internal_error 4001 意外内部错误
错误内部参数 4002 客户终端函数内部调用中的参数错误
  • 错误代码是用来提供帮助的,但 "意外内部错误 "完全没用,而 "客户终端函数内部调用中的错误参数 "则非常令人费解(至少对我来说是这样)。

建议新手阅读所有关于错误处理的文章, 并在论坛和文章评论中提问。其他更有经验的 MQL5.community 成员会帮助您解决任何不清楚的问题。我们希望文章中收集的信息能帮助您在更短的时间内创建更可靠的交易机器人。

  • 我完全不同意这种做法,市场是 Metaquotes 提供的商业服务,他们应该承担支持,而不是依赖社区。在我看来,这不是专业的做法。

尽管有批评意见,但我还是要感谢 Metaquotes 在 MT4/MT5 上所做的大量工作,并鼓励他们继续提高质量和专业水平。

 
Andrey Barinov:

这部分引发了疑问:

为什么要求保证金是与股本相比,而不是与自由保证金相比?

http://prntscr.com/dgd6s4

现在怎么了?

检查保证金,没有足够的钱,不交易,但不让你提高猫头鹰。

Снимка на екрана
Снимка на екрана
  • prnt.sc
Снимано с Lightshot
 
请告诉我怎么做!我想推出一款产品 - Expert Advisor Assistant,它必须绑定开仓交易才能运行。如果不绑定,测试器中就不会有交易,也就无法通过测试。
 
你试过吗? 还是只是随口一说?
 
Vladislav Andruschenko:
你试过吗?
我试过了,结果显示无法结账 没有猫头鹰开过任何交易! 如果他是助手,就不会开!
 
Bogdan Bovykin:
我试过了!我收到了一条消息,说它没有通过验证,一笔交易都没有打开!如果是辅助工具,就不会打开。

如果是实用程序,版主会亲自检查 EA。

可以将实用程序设置为测试者至少打开几笔交易,并作为助手陪伴他们。这不是问题。

 
Vladislav Andruschenko:

如果是实用程序,则由版主亲自检查 EA。

可以将该工具设置为让测试者至少打开几笔交易,并作为助手陪伴他们。这不是问题。

我的意思是,你想把它做成一个面板,然后进行检查?

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