向市场发布交易机器人时出现验证错误。 - 页 6

 
Andrey Kaunov:

你以为我不检查。地段大小在一个单独的函数中检查

这里不需要限制,因为止损和止盈在交易开始时都等于零。RefreshRates()在计算手数时更新数据。当然,在每个条目之前没有检查连接等,但这不是重点。如果OrderSend发送了一个请求,会有一个具体的错误:130、131,等等。但我所拥有的是。

根本不是想发一个订单来开。甚至在最后一次测试中,当我在OnInit()函数 中设置一个检查位置时。


这是有可能的。但我已经仔细检查了一切。我不知道下一步该去哪里。

在批量归一化功能中,你在对批量进行检查后将其四舍五入到最大/最小值。
 
Artyom Trishkin:
在批量归一化功能中,你在对批量进行检查后将其四舍五入到最大/最小值。

嗯,是的,我知道。

MathRound();
P.S. 我认为你必须从输入参数中挖掘,因为恰好它通过了。对每个参数做一个 "万无一失 "的检查。
 
我不是在说验证器的测试日志。但至少那些没有被验证的参数可能会被发送。根本就没有什么可抓的,可以修复代码。我理解选择测试参数的可变性可能是无限的。你可以将一个int类型的变量设置为+50000或-45000。但我不能简单地将一些输入参数限制在某个值的范围内。不同的工具会有不同的情况。
 
Andrey Kaunov:
我甚至不是在谈论验证者的测试日志。但至少那些没有被验证的参数可能会被发送。根本就没有什么可抓的,可以修复代码。我理解选择测试参数的可变性可能是无限的。你可以将一个int类型的变量设置为+50000或-45000。但我不能简单地将一些输入参数限制在某个数值范围 内,因为对于不同的乐器来说,它将是不同的。

你需要确保交易批次在所有情况下都是有效的。我指出,在你的代码中,在检查了有效的尺寸范围后,你改变了地段,这不是没有道理的。

而且是必须对绝对愚蠢的输入参数进行检查。

 

该地段没有任何问题。它被检查为最大/最小。在四舍五入之前,它被除以步骤,然后四舍五入的整数 再乘以步骤。我们获得了一个完全正确的批次。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   double free = AccountFreeMargin()*0.95;
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   if(is_margin && _lot*margin>free)  _lot=0.0; //MathFloor(free/margin/step)*step;
   return(_lot);
}

_lot(0.568)/step(0.01)=56.8

MathRound(56.8)=57

57*step(0.01)=0.57

接下来,它检查是否有足够的自由保证金来打开。验证人根本没有说很多脏话。它没有看到交易功能,显然是由于输入参数不正确。专家顾问根本就没有用某种组合来做交易!这并不像我有一个无条件的马丁,或者一个在每个烛台上都能打开的网格锁。 我如何向验证者解释,EA在逻辑上不做某些参数的交易?

 
Andrey Kaunov:

该地段没有任何问题。它被检查为最大/最小。在四舍五入之前,它被除以步骤,然后四舍五入的整数 再乘以步骤。我们获得了一个完全正确的批次。

_lot(0.568)/step(0.01)=56.8

MathRound(56.8)=57

57*step(0.01)=0.57

接下来,要检查是否有足够的自由保证金来打开。验证人根本没有骂人的意思。它没有看到交易功能,显然是由于输入参数不正确。专家顾问根本就没有用某种组合来做交易!这并不像我有一个无条件的马丁,或者一个在每个烛台上都能打开的网格锁。 我如何向验证者解释EA在逻辑上不使用某些参数进行交易?

不要解释,而是让EA纠正错误的输入参数。最好是向期刊提供关于其无效值和修正为有效值的信息。

而且,如果出于某种原因,你想让用户对在现实世界中输入不正确的参数负责,应该通知用户不正确的参数。
但是对于测试人员来说,他们也需要被纠正--这样EA才会交易

 

那么,如果有一些参数适用于欧元兑美元,而另一些则适用于黄金,例如,如何调整它们。现在,默认设置对主要货币对来说或多或少是可以容忍的,但对黄金来说,它们将完全不起作用。那里将没有交易。这就是参数存在的原因(按我的理解),以使它们适应每件乐器。如果一切都那么简单,我就会把所有的参数嵌入到专家顾问中,而不会向外部发送任何东西。

验证器的另一个错误是,它根本看不到其他时间框架。我已经绕过了它,但在一定程度上损害了算法。专家顾问从其他时间段获取数据,从周、D1、H4等到M1。但数据是空的,正如我通过无数次的实验发现的那样。我们对此无能为力,我们只能绕过它。为什么我们要修改专家顾问而损害了算法?难道不是相反吗? 验证器应该适应测试。否则,测试一个完美工作的EA就会变成一种艰苦的劳动!

 
Andrey Kaunov:
那么,如果有一些参数适用于欧元兑美元,而另一些则适用于黄金,例如,如何调整它们。现在,默认设置对主要货币对来说或多或少是可以容忍的,但对黄金来说,它们将完全不起作用。那里将没有交易。这就是参数存在的原因(按我的理解),以使它们适应每件乐器。如果一切都那么简单,我就会把所有的参数嵌入到专家顾问中,而不会向外部发送任何东西。
你在OrderSend 之前放了一个除以0的除法--出现了这样的错误。因此,它到达了OrderSend,但没有打开。也就是说,地段/保证金/限额/价格,其中有些东西是无法计算的
 
Maxim Kuznetsov:
你已经在OrderSend之前输入了除以0,而且出现了这种错误。所以它进入了OrderSend,但没有打开。因此,地段/利润/限制/价格,其中一些没有被计算在内

马克西姆,如果这些东西中的任何一项没有得到说明,验证者会给出一个 非常明确的错误:130、131、134、145等等。这里的情况不是这样的!

P.S. 相信我,我在4天内已经发送了一百多份验证,并尝试了很多选项。

 

是的,它立即达到除以0(因此是OrderSend)。并且产生了一个错误。

但是,如果我发送检查专家顾问的代码中没有除以0,它不知何故神奇地设置了参数,在指定的时期内根本没有打开交易,并返回一个错误。这是我对正在发生的事情的看法,但显然与事实相差无几。