28个!!!货币对,1个专家。另一个圣杯,但这个我认为没有人展示过。+ 试用账户 - 页 12

 
Rosh:
我已经按照你的要求测试了 "欧元兑美元在2007.07.10 至2007.07.14的范围内,以及分别在2007.07.09 至2007.07.14的范围内",没有任何区别。


我也不得不更新到最新版本。:-)的确,时间上的问题已经消失了,这很好。然而,事实证明,故事并没有就此结束。

我在同一时期运行了该EA--在M1和H1/D1的高低点之间没有区别。注意 - 我在我正常的、未受伤害的数据上进行了测试。 没有同步,等等。所以这不可能是差异的原因。

然后我决定在另一个间歇期试试,以防万一(嗯,我的坏脾气)。而事实证明,这还没有结束。

试试从2007.08.062007.08.11 的区间,这实际上是最后一个星期。而且不是与D1比较,而是与H1比较。在专家顾问的文本中,有4个运算符应该被注释掉,还有4个运算符应该被取消注释。这并不是说刺探未来的可能性已经被证明,不是。但这个故障是存在的。

既然看来每周 没有问题并不能保证完全没有问题,也许我们应该在更长的时间间隔内进行测试,例如一年或六个月?

 
我已经审查了你的 "简单反省 "EA的代码。不幸的是,它并不是完美无缺的,所以我把它修理了一下。

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {   
//----
  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
 
  mm = TimeMinute(TimeCurrent());
  hh = TimeHour(TimeCurrent());
  dd = TimeDay(TimeCurrent());
  if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
        {  
           Print("Новые сутки наступили");
           curHi=NormalizeDouble(Bid,Digits);
           curLo=NormalizeDouble(Bid,Digits);
           curD1=dd;
        }
        //curHi=NormalizeDouble(Bid,Digits);
        //curLo=NormalizeDouble(Bid,Digits);
        curH1=hh;
     }
     curM1=mm;
  }
  if (NormalizeDouble(Bid,Digits)==0) Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),"  Bid=",Bid);
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);
  //LoH1 =  iLow(NULL,PERIOD_H1,0);
  HiH1 = iHigh(NULL,PERIOD_D1,0);
  LoH1 =  iLow(NULL,PERIOD_D1,0);
  HiH1 = NormalizeDouble(HiH1,Digits);
  LoH1 = NormalizeDouble(LoH1,Digits);
 
  str = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
  mHi = ", curHi=" + DoubleToStr(curHi,Digits);
  mLo = ", curLo=" + DoubleToStr(curLo,Digits);
  hHi = ", HiH1="  + DoubleToStr(HiH1, Digits);
  hLo = ", LoH1="  + DoubleToStr(LoH1, Digits);
  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
 
  if (HiH1!=curHi||LoH1!=curLo) 
  {  //Print(str,mHi,hHi,mLo,hLo);
     if (handle>0) FileWrite(handle,TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),curHi,HiH1,curLo,LoH1);
  }
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{  Print("Работа закончена");
   if (handle>0)
      {FileWrite(handle,"записано ",TimeToStr(TimeLocal()));
      FileClose(handle);
      } 
//---- done
   return(0);
}
新的一天的事实在你的代码中被固定得太晚了,实际上是在第二天,而模拟的正确性检查在测试开始后就开始了。为了排除这种不对称性,我引入了一个布尔变量start,用它将所有的测试值固定在测试的开始。

  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
正如你所看到的,它只起一次作用,不再影响EA。 接下来,一切都按照你的算法发生。 如果你不做初级初始化,那么检查字符串

  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
将给出curLo=0的值,而curHi不等于零。解释很简单:两个变量curLo和curHi最初都等于0,因为它们是未初始化的。在第一次打勾时,条件是

  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
被触发,并且curHi已经与0不同,因为当前的Bid大于0。同时,当前的Bid不能小于零(curLo没有被初始化,因此是零),因此条件是

  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
不能以任何方式改变CurLo。自己运行我的专家顾问版本,检查错误文件Fu.xls将只包含一行--测试器中最后一次模拟报价的时间。

完整的代码附在帖子后面,最好下载,因为它不适合在帖子里。
附加的文件:
 

当然,感谢Rosh 的修改,但我认为这没有必要。

也许你没有注意到,在我的代码中,在函数init()中,有以下块。

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

由于执行了这个区块,在EA开始执行时没有一个条件不能满足。

if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
 

因此,无论EA在历史的哪个位置开始,都是新的一分钟,新的一小时,或新的一天。而上述区块的第一对运算符解释了为什么你说:"解释起来很简单:两个变量curLo和curHi最初都等于0,因为它们是未初始化的。由于第一个勾股价大于零,但小于1000,两个相应的条件语句必然被触发,变量curLo和curHi得到与你在if(开始)块{...}中分配给它们的初始值相同。

你的版本也一样好用,但它不会以任何方式影响算法。因此,这种改变对错误的存在或不存在没有影响。

再次注意我之前的帖子。问题不是在过渡到新的一天,也不是在EA的开始,而是在测试t/f H1时发生的。这个问题在这个区间只发生过一次,即2007年8月10日,从17:00到17:03持续了3分钟。在这段时间内,产生了28次M1和H1的高值分歧。我正在给你看适当的图片。

如果这对你来说不难,请在我要求的那个区间内运行EA(你修正的代码)。只是纠正评论的使用。现在在你的代码中,它与t/f D1进行比较,在这种模式下没有错误。我需要它来与H1进行比较。

 

我改变了一些代码,以保持在特别病态情况下的正确性(我在2007.01.01的M1上只有一个蜡烛,H1和D1也是如此)。我从2007.01.01到2007.08.11进行了测试,D1有4个错误的案例,H1有2个。所有的错误都发生在过渡到一个较高的TF上的新蜡烛。那些想自己看的人。

它没有给我们展望未来的可能性。至少在我检查的窥视变体中是如此。

附加的文件:
future-2h.mq4  4 kb
 
Yurixx:

当然,感谢Rosh 的修改,但我认为这没有必要。

也许你没有注意到,在我的代码中的init()函数中,有以下块。

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

如果这对你来说不难,在我要求的时间间隔内运行EA(你修正的代码)。只是纠正评论的使用。现在在你的代码中,它与t/f D1进行比较,在这种模式下没有错误。我需要它来与H1进行比较。


你最好自己把代码贴出来。如果你注意到了,在H1上测试我的代码时,值不会被初始化。
  if (Period()>PERIOD_M1)
  {  Print("Период тестирования не соответствует задаче");
     return(-1);
  }
  Print("Период тестирования ",Period()," минут");
  FileWrite(handle,"Date","Time","curHi","HiH1","curLo","LoH1");
  nn=D'2007.07.12 23:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:02:00';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
 
  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

也就是说,它将与我写的一模一样。如果你很难把代码摆出来,让我不去猜测它的内容,那么你自己应该明白,除了练习心灵感应,我还有其他事情要做。
 

真的,我不明白你为什么会感到恼火。

正如我在上一页发布EA与结果时写的那样,它的目的是为了测试 专属 在M1上。同时,它将自己产生的高点和低点与较高的t/f的高点和低点进行比较,这可能是H1或D1,取决于此。 在start()程序的文本中如何安排注释。

坦率地说,我认为init() 程序中的return(-1); 将停止EA的工作,因此将有可能只在M1上启动它。然而,现在,由于你的帖子,我确信它可以在任何TF上运行。 这个EA背后的想法是试图从较低的t/f(特别是M1)到较高的t/f(特别是H1或D1)刺探未来。.因此,它只应该在M1上运行。对H1的测试可能显示什么,我甚至不知道。

我在你的帖子之前发布了EA代码。 这个代码可以直接用于比较M1数据和H1数据。在EA的文本中,明确指出了需要做出的(基本)改变,以便将M1数据与D1数据进行比较。所以在这里,我也不知道你有什么不高兴的。

最后一件事。你的代码和我的一样适合于测试人员的运行。这只是一个完成任务的问题。

如果你有其他事情要做,我就不打扰你了。我并不是以个人请求的方式对你说话,而是作为MQ的代表,就可能发现测试器中的一些故障而对你说话。

 
Yurixx:

真的,我不明白你为什么会感到恼火。

正如我在上一页发布EA与结果时写的那样,它的目的是为了测试 专属 在M1上。同时,它将自己产生的高点和低点与较高的T/F的高点和低点进行比较,这可能是H1或D1,取决于此。 在start()程序的文本中如何安排注释。

坦率地说,我认为init() 程序中的return(-1); 将停止EA的工作,因此将有可能只在M1上启动它。然而,现在,由于你的帖子,我确信它可以在任何TF上运行。 这个EA背后的想法是试图从较低的t/f(特别是M1)到较高的t/f(特别是H1或D1)刺探未来。.因此,它只应该在M1上运行。对H1的测试可能显示什么,我甚至不知道。

我在你的帖子之前发布了EA代码。 这个代码可以直接用于比较M1数据和H1数据。在EA的文本中,明确指出了需要做出的(基本)改变,以便将M1数据与D1数据进行比较。所以在这里,我也不知道你有什么不高兴的。

最后一件事。你的代码和我的一样适合于测试人员的运行。这只是一个完成任务的问题。

如果你有其他事情要做,我就不打扰你了。我并不是以个人请求的方式对你说话,而是作为MQ的代表,就可能发现测试器中的一些故障而对你说话。

我不明白我应该用什么时间框架来执行这个测试。我在三个时间框架上运行了它,没有干预代码。

2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: 工作完成了
2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: 2007.08.10 23:59:59, curHi=1.3693, HiH1=1.3702, curLo=1.3693, LoH1=1.3689
2007.08.14 16:29:02 2007.08.03 23:59 EURUSD,日线:2007.08.03 23:59:59, curHi=1.3773, HiH1=1.3787, curLo=1.3773, LoH1=1.3772
2007.08.14 16:29:02 2007.07.27 23:59 EURUSD,日线:2007.07.27 23:59:59, curHi=1.3635, HiH1=1.3641, curLo=1.3635, LoH1=1.3627
2007.08.14 16:29:02 2007.07.20 23:59:59 欧元兑美元,日线:2007.07.20 23:59:59, curHi=1.3826, HiH1=1.3827, curLo=1.3826, LoH1=1.3821
2007.08.14 16:29:01 2007.07.16 23:59:59 欧元兑美元,日线:2007.07.16 23:59:59, curHi=1.3772, HiH1=1.3773, curLo=1.3772, LoH1=1.3772
2007.08.14 16:29:01 2007.07.13 23:59:59 欧元兑美元,日线:2007.07.13 23:59:59, curHi=1.3782, HiH1=1.3787, curLo=1.3782, LoH1=1.3780
2007.08.14 16:29:01 2007.07.06 23:59:59 欧元兑美元,日线:2007.07.06 23:59:59, curHi=1.3625, HiH1=1.3630, curLo=1.3625, LoH1=1.3623
2007.08.14 16:29:01 2007.07.02 00:00 EURUSD,Daily: 测试周期不合适
2007.08.14 16:29:01 future-2h开始测试
2007.08.14 16:28:34 2007.08.10 22:59 future-2h EURUSD,H1: 工作完成了
2007.08.14 16:28:32 2007.07.02 00:00 future-2h EURUSD,H1: 测试周期不合适
2007.08.14 16:28:32 future-2h开始测试
2007.08.14 16:28:22 2007.08.10 22:59 future-2h EURUSD,M1: 工作完成了
2007.08.14 16:28:19 2007.07.02 00:00 future-2h EURUSD,M1: 测试周期为1分钟
2007.08.14 16:28:19 future-2h开始测试
2007.08.14 16:24:28 2007.08.10 22:59 future-2h EURUSD,M1: 工作完成了
2007.08.14 16:24:28 2007.08.06 00:00 future-2h EURUSD,M1: 测试周期为1分钟
 
现在改变
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1



  else if (hh!=curH1)
  {  //curHi=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     //curLo=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     curH1=hh;
     curM1=mm;
  }
  else if (mm!=curM1) curM1=mm;
  
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
2007.07.01至2007.08.11同一时间区间的三个时段 再次测试:
<br/ translate="no">
2007.08.14 16:32:03 2007.08.10 23:59 future-2h EURUSD,Daily: Work Finished
2007.08.14 16:32:03 2007.07.27 23:59 future-2h EURUSD,Daily: 2007.07.27 23:59:59, curHi=1.3753, HiH1=1.3753, curLo=1。3627, LoH1=1.3626
2007.08.14 16:32:01 2007.07.02 00:00 future-2h EURUSD,Daily: 测试周期不合适
2007.08.14 16:32:01 future-2h 开始进行测试
2007.08.14 16:31:56 2007.08.10 22:59 future-2h EURUSD,H1: 工作完成
2007.08.14 16:31:54 2007.07.02 00:00 future-2h EURUSD,H1: 测试期不符合任务
2007.08.14 16:31:54 future-2h开始测试
2007.2007.08.14 16:31:48 2007.08.10 22:59 future-2h EURUSD,M1: 工作完成
2007.08.14 16:31:46 2007.07.02 00:00 future-2h EURUSD,M1: 测试期1分钟
2007.08.14 16:31:46 future-2h 开始测试
它说的是什么?我必须再次分析代码 中是否存在错误。
 

我明白了。你所做的一切都是正确的。而这个EA必须只在M1上运行。我想我写得很清楚。 专家顾问在M1上运行,它将测试M1时期的高低数据与H1或D1时期的重合度。如果可以窥视未来,那么高级的T/F数据会让你在M1上达到这些高点和低点之前知道高和低。就这样了。

你的D1测试结果与我的一致,在D1的这个区间我也没有得到任何错误。但H1测试并没有证实我得到的和早些时候发布的内容。没有必要对代码进行分析。正如你所看到的,它证实了测试器的正常运行。

如果你认为这已经足够了,你可以到此为止。 如果你想确定这不是偶然的,不是因为周期太小,那么就在更长的周期上运行同样的两个测试。例如,一年多来,或自2007年初以来。

PS

为了以防万一,我再重复一遍。测试 仅在M1期间. 只有在所有刻度线模式下.

谢谢你的参与。

 
谢谢你提供的测试EA,有时你很难想出自己的方法,因为有这么多的测试选项,你不一定知道该测试什么。而烦人的是...你知道,你更经常地对自己的人感到厌烦,因为你期望他们能理解。你无意中变得更强硬,在你原谅别人的地方,你会对你的人感到沮丧。我很抱歉。

这些测试确实有助于改进MetaTrader 4测试器。特别是源代码。