被错误困扰的是没有交易业务 - 页 5

 
Alexey Viktorov:

这不是因为我重新编译了它,而是因为测试是从不同的日期开始的。而且我注意到了这个bug,如果你放进已经存在的东西,那么测试就不会发生,而是立即给出之前的测试结果。所以不要被这种拐杖所迷惑。试着让它变得正常。如果有东西丢失或参数无效,通过打印报告,一切都会正确。

如果只是由于不同的日期,那么我的检查就会发现它(缺失的小节等),但问题不在于日期。如果我不能重建自动验证所发现的错误,那么我就更容易溜之大吉,并希望有买家的复仇者能找到问题所在(如果有的话)。这种验证的实现并没有让我完全理解在哪里寻找错误。而印刷品 对我来说已经被推到了所有的地方。

Alexey Viktorov:

我注意到这样一个问题,如果我粘贴已经是,那么测试就不会发生,并立即给出以前的测试结果。

而不是为了得到以前的测试结果,我必须改变一些东西,甚至添加一个空字符串(我是说 "重新编译")。

 
Roman Gergert:

我终于想明白了,也许有人可以帮忙,一般来说,苏联只检查了最小手数,当MM被启用时,所以硬核设置手数=0.01,好了,在验证器存款原来是1美元(在一个主题中发现这个信息),分别使用手数0.001(或左右)来交易,由于我总是在一个地方是很多0.01,他因此没有足够的钱,机器人不交易)

确切地说,罗曼,验证器正在用1美元的存款进行测试。

在EA中有很多规范化的功能。如果它返回0,交易甚至不会尝试打开。

      if((Auto() && (b==0 || (b>0 && BuyPriceMin-Ask>(b==1?iPointOrderStep_1:iPointOrderStep_2)*Point()))) || buy) {
         BuyLot=buy && LotFromPanel()>0 ? LotFromPanel() : BuyLot;
         double norm_lot=NormalizeLots(_Symbol,BuyLot);
         if(norm_lot>0.0) {  
            int ticket=OrderSend(Symbol(),OP_BUY,norm_lot,NormalizeDouble(Ask,_Digits),30,0,0,
                        "NZT-48",iMagicNumber,0,clrGreen);
            if(ticket>0) {
                ObjectSetInteger(0,"V_5_buy",OBJPROP_STATE,false);
                buy=false;
            }
            else  
               Print("Order Send error #",GetLastError());
         } else Print("Not enough money for the minimum lot");   
      }

但不清楚的是,这个EA的手数正常化功能是如何将0.2手送入开仓的。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
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;
   return(_lot);
}

毕竟,如果第0.2批来检查,并且从日志中判断的利润率是645,那么表达式的这一部分应该是真的

if(is_margin && _lot*margin>free)  _lot=0.0;     //0.2*645>0.95

而该函数将发送0.0,但不发送0.2。它只能发送0.2,如果它

MarketInfo(symbol,MODE_MARGINREQUIRED);

返回0或一个可忽略不计的值。我完全不明白这个验证器是如何工作的。

亲爱的MQL开发人员,请给我们发送测试日志,而不是三行的干巴巴的验证错误报告。对于我们这些卑微的程序员来说,理解代码错误并修复它们会容易得多。你可以把它作为档案发送到电子邮件,你可能会想到一个方法))

P.S. 有趣的情况。第5天,我试图在市场上推出一个专家顾问,它在测试器和现实生活中都能完美运行。
 
Andrey Kaunov:

正是如此,罗曼,验证器以1美元的存款进行测试。

在EA中有很多规范化的功能。如果它返回0,交易甚至不会尝试打开。

但不清楚的是,这个EA的手数正常化功能是如何将0.2手送入开仓的。

毕竟,如果第0.2批来检查,并且从日志中判断的利润率是645,那么表达式的这一部分应该是真的

而该函数将发送0.0,但不发送0.2。它只能发送0.2,如果它

返回0或一个可忽略不计的值。我完全不明白这个验证器是如何工作的。

亲爱的MQL开发人员,请给我们发送测试日志,而不是三行的干巴巴的验证错误报告。对于我们这些卑微的程序员来说,理解代码错误并修复它们会容易得多。你可以把它们作为档案发送到电子邮件,你可能会想到一个办法:))))。

P.S. 有趣的情况。第5天,我试图在市场上推出一个专家顾问,它在测试器和现实生活中都能完美运行。

看起来你的杠杆率与市场上的不同,可能是1:500。

只需改变代码中的一行,就能将手数计算到1k100。

margin= AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

而市场的最小手数是0.1,我想....。
 

你生活在你自己的某种有限的世界里。在一个正常的世界里,最小手数可能与0.01非常不同

接收:阅读并再次阅读《哪些检查必须通过......》一文。

在发送交易指令 之前,你必须检查它是否会通过,是否有足够的保证金......。


总的来说,到目前为止,验证器已经完成了它的主要任务:从市场中筛选出不完整的代码。

 
Renat Akhtyamov:

看起来你的杠杆率与市场上的不同,可能是1:500。

只需改变代码中的一行,就能使手数计算达到1k100的杠杆率。

margin= AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

雷纳特,谢谢你的建议,我会试一试的。

Vladimir Karputov:

你生活在你自己的一些有限的世界里。在一个正常的世界里,最小手数可能与0.01非常不同

接收:阅读并再次阅读《哪些检查必须通过......》一文。

在发送交易指令 之前,你必须检查它是否会通过,是否有足够的保证金......。


总的来说,到目前为止,验证器已经应对了它的主要任务:从市场中筛选出不完整的代码。

弗拉基米尔,你能建设性地理解这个问题吗!?我不是要检查该地段的保证金和其他东西吗?必须通过哪些检查...... "这篇文章对我来说已经像一本圣经 了。我在上面发布了代码片段。我已经根据你在文章中的建议修改了代码,完全符合要求。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

但我仍然得到 "没有交易"。

好吧,如果函数总是发送0.0手并且不允许打开交易,我把它改为发送最小手数。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

而我得到的历史记录显示,交易确实发生了(见下面的屏幕截图)。但是,最低的一批当然来的很奇怪,但是让它来吧。但交易是存在的!

在这种情况下,非常奇怪的事情是验证器,使最低手数为0.2的存款1美元。


自然,不会有任何交易!而 这是用一个完全足够的代码。顺便说一下,我已经删除了指标等的所有条件,以便测试。一旦EA启动,交易就会开始进行。

Vladimir Karputov:

...

到目前为止,验证器已经应对了它的主要任务:从市场中筛选出不完整的代码。

那么,验证器是如何处理的呢?我看不出它除了把程序员的脑袋炸开之外还能做什么!"。

请注意,我没有要求你改变验证器中的任何东西。我们可以简单地看到测试日志。我们将了解测试是在什么参数下运行的,以及在什么存款上。最后,我们至少可以用打印来检查代码中的错误所在,并尽可能快地修复它。我们不会在整整一个星期内将手指指向天空,只试图将一个错误定位。我们不是在对着干,是吗?我理解,我们正在努力共同赚取一些东西。

 
Andrey Kaunov:

......这不像是我们在对着干!我理解,我们是想一起赚取一些东西。

安德鲁,我在周末遇到了一次服务器冻结的情况。

这意味着它只是不会吃MarketInfo(...)。

我几乎无法让它工作。

所以,如果你明白你不能吞下Market,那就得想想如何让验证器不发誓。

例如,我问--什么是杠杆?

上面写着0。

我在代码中添加了--如果是0,则表示100

如果逻辑清晰,就会成功,祝你好运!"。

 

我明白了,雷纳特,谢谢你。

我已经做了很多的拐杖,但在一些地方我却走到了死胡同。而且我希望充分的代码能得到充分的测试。此外,在没有测试日志的情况下,要找到问题也不是不可能,但这是非常费力的。

也许验证器也能得到升级,那就更好了。我不是唯一遇到这种问题的人。

 
Andrey Kaunov:

我明白了,雷纳特,谢谢你。

我已经做了很多的拐杖,但在一些地方我却走到了死胡同。而且我希望充分的代码能得到充分的测试。此外,在没有测试日志的情况下,要找到问题也不是不可能,但这是非常费力的。

也许验证器也能得到升级,那就更好了。我不是唯一遇到这种问题的人。

是的,你不是唯一面临这个问题的人,在下一个主题中,还有一个人面临这个问题--你已经是两个了。

另外,看看每天有多少EA被贴在市场上而没有任何问题,这就叫 "专业水平"。

 

维塔利,如果你和其他 "专业人士 "能够在第一次就通过验证,我只能鼓掌。但是,关于一个类似的问题,远不止两个主题。另外,不是每个人都写,有些人只是读。顺便说一下,这个专家顾问不是我的。我在市场上为客户准备。但这并不能否定上述的问题。如果你仔细阅读我的帖子,也许作为一个 "专业人士",你可以提出一个解决问题的办法。沿着 "你很笨,我很聪明 "的思路发一个帖子,并不需要太多的知识。

这里有另一个问题给你。为什么在OnTick()的开头加入了5分钟内以最小手数无条件 连续开仓5笔交易,验证器也给我一个"无交易操作"的信息。

void OnTick() { 
   static int test_ticket[2]={0,0};
   if(test_ticket[1]<5 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend(_Symbol,OP_BUY,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),NormalizeDouble(Ask,_Digits),30,0.0,0.0,"NZT-48_test",33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
   }   
   if(OrderSelect(test_ticket[0],SELECT_BY_TICKET))
      if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
         if(OrderClose(test_ticket[0],NormalizeDouble(OrderLots(),2),NormalizeDouble(Bid,_Digits),30,clrNONE)) {
            printf("Test order closed, ticket #%d",test_ticket[0]);
            test_ticket[0]=0;
         }   
...
}
 
Andrey Kaunov:

维塔利,如果你和其他 "专业人士 "能够在第一次就通过验证,我只能鼓掌。但是,关于一个类似的问题,远不止两个主题。另外,不是每个人都写,有些人只是读。顺便说一下,这个专家顾问不是我的。我在市场上为客户准备。但这并不能否定上述的问题。如果你仔细阅读我的帖子,也许作为一个 "专业人士",你可以提出一个解决问题的办法。沿着 "你很笨,我很聪明 "的思路发一个帖子,并不需要太多的知识。

这里有另一个问题给你。为什么我在OnTick()的开头加入了5分钟内以最小手数无条件 开仓5笔交易,验证器却给我"没有交易操作"?

而且你应该首先在这里发布验证者的完整回应

而你凭什么认为验证机是按照你发明的原理来设置票据的?

打开5个交易,你需要计算打开的交易数量,而不是票据的数量。