RefreshRates()的更新内容 - 页 6

 
Mikhail Nazarenko:

MT4是一个暗箱,我只能通过在真实条件下的测试来判断那里发生了什么。最初我根本没有使用睡眠,但当我在一些小时条上得到废话时,我加入了睡眠,问题消失了。我不知道MT4的时间序列是 以什么顺序和方式更新 的。我不知道该怎么做,我将把它作为一个机会来解决我的问题,并与其他人分享。

我自己也遇到了这个问题,在策略测试器中一切正常,但在真实市场上却什么都没有。

我从周一开始运行专家顾问,我很惊讶。

我曾开过几次有利可图的口子,然后又去买而不是卖,反之亦然。

关于交易、自动交易系统和策略测试的论坛

新手对MQL4和MQL5的任何问题,或对算法和代码的任何提示和讨论

Vitaly Muzichenko, 2021.02.15 21:48

我已经开始用MQL4工作,以检查我的算法。

我从来没有试过,我不会知道如何使用它,因为我已经工作了很多年,我仍然在使用它,正如我上面描述的那样。简单的代码,只有2个指标缓冲区



代码非常简单

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }
 
Vitaly Muzichenko:

我自己也遇到过这种情况,在测试器中一切正常,但在真实的市场中却很糟糕。

我从周一开始运行该EA,感到很惊讶。

我很惊讶,有些开口是正确的,但之后我又是买入而不是卖出,反之亦然。


指标代码很简单。

这也是我在开始这个话题之前遇到的问题。我做了上面的isRefresh()函数。试试吧。对我来说,它工作得很好。

而且这不是滑坡吗?

 
Vitaly Muzichenko:

该指标的代码很简单

该指标是否开放交易?

箭头是一样的--问题出在EA代码上。

 
Mikhail Nazarenko:

如果你开始教,那么就帮助,用代码、测试、论坛主题的链接或文档来确认。其他一切都只是大脑自慰。

请澄清仍然不清楚的地方。读完后,似乎主要问题已经解决了,唯一剩下的就是讨论4的过时程度了)。

在插入这样的时间框架后,我没有任何问题。

bool HistoryCheck(int TF)
  {
   int err=0;   
   int i=0;
   datetime d1=0,d2=0;
   while(i<10)
    { 
    if((d1=iTime(NULL,TF,0))==0 || (d2=iTime(NULL,TF,InpPeriod*2))==0)          
        PrintFormat("itime=0, %s, %s", TimeToString(d1),TimeToString(d2)) ; 
   err=GetLastError();    
   if(err==4066)    
    {
    	PrintFormat("Error=4066") ; 
    	 Sleep(500);     	
    }
   else break;	
      SleepA(100);
      i++;                 
    } // while
   if(i==10)
	 { Comment("Update failed. Go to the next attempt."); return(false); }
   PrintFormat("HistoryCheck %d , %s, %s",i,TimeToString(d1),TimeToString(d2)) ;
   Comment(""); 
   return(true);
  }

如果你需要很少和不定期地访问时间框架,你应该(但不一定是在图表打开的 情况下)在检查之前再次执行这个加载。

  if((iTime(NULL,TF,0)+PeriodSeconds(TF))<TimeCurrent()
   || (iTime(NULL,TF,1)+PeriodSeconds(TF)*2)<TimeCurrent())
   HistoryCheck(TF)
Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
ChartOpen - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

这也是我在开这个话题之前遇到的事情。由于某些原因,终端给出的是真实的过时数据,我在上面写了isRefresh()函数。试试吧。对我来说,它工作得很好。

但这不是滑坡?

不,它是在一个新的0条上打开的,信号是在关闭的条上寻找的,也就是1。

这就是有时EA没有通过iCustom()获得预期的情况。还是那句话:有时,但不是经常。

这里有另一个--一个新鲜的例子。我根据信号正确地开了一个买入头寸,指标的下一个信号也是买入(下面的箭头)。 但是EA通过iCustom()收到了一个卖出信号,关闭了买入头寸,开了卖出头寸,尽管应该还有一个买入 头寸。

时间序列有问题,我还没有理解,这是4天前发现的,我可能不会尝试去改变它。我在测试器中没有看到任何问题

就在此时。

--- 而且我刚刚发现


 

还有,但已经不是卖出,而是买入了。正如我所说,这并不经常发生,但它发生了。

该指标的代码很简单--没有复杂的 "不 "字。


 
Aleksey Mavrin:

请澄清仍然不清楚的地方。看完之后,似乎主要的问题已经解决了,我们只剩下讨论4的过时程度了)

在像这样插入时间框架加载后,我没有遇到问题

如果你需要很少和不定期地访问一个时间框架,你应该(但不一定是在图表打开的 情况下)在检查前再次做这个加载,或者这样的检查将有助于

这是正确的。

这是帮助中的内容。

指标和时间序列数据的访问独立于所请求的数据已经准备好的事实(所谓的异步访问)。这对自定义指标的计算至关重要,所以如果没有要求的数据,像Copy...()这样的函数会立即返回一个错误。然而,当从专家顾问和脚本访问时,会多次尝试接收数据,并有一个小的停顿,目的是提供必要的时间来下载所需的时间序列或计算指标值。


如果要求从另一个图表中获取信息(工具名称和/或时间框架值与当前图表不同),可能会出现这样的情况,即客户终端没有打开合适的图表,必须从服务器中获取必要的数据。在这种情况下,错误ERR_HISTORY_WILL_UPDATED(4066 - 请求的历史数据处于更新状态)将被放在_Last_error变量中,请求必须在一段时间后重试(见ArrayCopySeries()例子)。

 
Vitaly Muzichenko:

还有,但已经不是卖出,而是买入了。正如我所说,这并不经常发生,但它发生了。

该指标的代码很简单--没有任何错综复杂的问题。


最可靠的方法是写日志。在每个交易中,将关键变量的值写入文件中。根据经验:不严格的条件<=0而不是<0引入了一个可怕的曲率。

 
Vitaly Muzichenko:

我自己也遇到过这种情况,在测试器中一切正常,但在真实的市场中却很糟糕。

我从周一开始运行该EA,感到很惊讶。

我很惊讶,有些开口是正确的,但之后我又是买入而不是卖出,反之亦然。


该指标的代码很简单

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }


我为什么要在[i + 0]上加0?

 
Aleksey Mavrin:

请澄清仍然不清楚的地方。看完之后,似乎主要问题已经解决了,我们仍然需要讨论4的过时程度)

在插入以这种方式加载的时间段后,我没有遇到任何问题

如果你很少和不定期地需要参考时间框架,那么在检查之前应该(但不一定是在图表打开的 情况下)再次进行这种加载,或者这种检查会有帮助

谢谢你,这才是重点。在通过iTime访问一个未更新的时间序列后,终端真的会出现4066错误吗?我遇到过iClose给出未更新的信息而不是零。