28 !!! Währungspaare, 1 Experte. Ein weiterer Gral, aber ich glaube, den hat noch niemand gezeigt. + DEMO-KONTO - Seite 12

 
Rosh:
Ich habe getestet "EURUSD über den Bereich 2007.07.10 bis 2007.07.14, und separat über den Bereich 2007.07.09 bis 2007.07.14", wie Sie gefragt haben, gibt es keinen Unterschied.


Ich musste auch auf den neuesten Build aktualisieren. :-) Die Probleme mit der Zeit sind in der Tat verschwunden, das ist schön. Doch wie sich herausstellt, ist die Geschichte damit noch nicht zu Ende.

Ich habe den EA im gleichen Zeitraum laufen lassen - kein Unterschied zwischen High und Low auf M1 und auf H1/D1. Hinweis: Ich habe den Test mit meinen normalen, unversehrten Daten durchgeführt, ohne Synchronisierung usw. Das kann also nicht der Grund für die Diskrepanz sein.

Dann beschloss ich, es vorsichtshalber mit einem anderen Intervall zu versuchen (na ja, schlechte Laune von mir). Und es stellt sich heraus, dass es noch nicht vorbei ist.

Versuchen Sie den Zeitraum vom 06.08.2007 bis zum 11.08.2007, also die letzte Woche. Und der Vergleich ist nicht mit D1, sondern mit H1. Im Text des Expert Advisors gibt es 4 Operatoren, die auskommentiert werden sollten, und 4 Operatoren, die unkommentiert bleiben sollten. Es geht nicht darum, dass die Möglichkeit des Ausspionierens in die Zukunft bewiesen ist, nein. Aber die Störung ist vorhanden.

Und da sich gezeigt hat, dass das Ausbleiben von Problemen in einem wöchentlichen Intervall keine Garantie dafür ist, dass es überhaupt keine Probleme gibt, sollten wir den Test vielleicht in einem viel längeren Intervall durchführen, zum Beispiel in einem Jahr oder in sechs Monaten?

 
Ich habe den Code Ihres Simple Prospection EA überprüft. Leider war sie nicht fehlerfrei, also habe ich sie ein wenig ausgebessert:

 
//+------------------------------------------------------------------+
//| 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);
}
Die Tatsache, dass es einen neuen Tag gibt, wird in Ihrem Code zu spät festgelegt, nämlich erst am zweiten Tag, während die Überprüfung der Korrektheit der Simulation gleich nach dem Start des Tests beginnt. Um diese Asymmetrie auszuschließen, habe ich eine boolesche Variable start eingeführt, mit der ich alle Testwerte auf den Beginn des Tests festgelegt habe.

  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
Wie Sie sehen, funktioniert das nur einmal und hat keinen Einfluss mehr auf den EA. Im weiteren Verlauf geschieht alles nach Ihrem Algorithmus. Wenn Sie keine Primärinitialisierung durchführen, dann prüfen Sie die Strings

  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
ergibt den Wert curLo=0, während curHi ungleich Null ist. Die Erklärung ist einfach: Die beiden Variablen curLo und curHi sind anfangs gleich Null, da sie nicht initialisiert sind. Beim ersten Häkchen wird die Bedingung

  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
ausgelöst wird und curHi bereits von Null abweicht, weil das aktuelle Bid größer als Null ist. Gleichzeitig kann das aktuelle Bid nicht kleiner als Null sein (curLo wurde nicht initialisiert und ist daher Null), so dass die Bedingung

  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
kann curLo in keiner Weise verändern. Führen Sie meine Version des Expert Advisors selbst aus und überprüfen Sie, ob die Fehlerdatei Fu.xls nur eine Zeile enthält - die Zeit des letzten simulierten Kurses im Tester.

Der vollständige Code ist an den Beitrag angehängt, laden Sie ihn besser herunter, da er nicht in den Beitrag passt.
 

Natürlich danke ich Rosh für die Überarbeitung, aber ich glaube nicht, dass sie notwendig war.

Vielleicht haben Sie es nicht bemerkt, aber in meinem Code in der Funktion init() gibt es den folgenden Block:

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

Als Ergebnis der Ausführung dieses Blocks kann keine der Bedingungen zu Beginn der Ausführung des EA erfüllt sein.

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

Daher ist es egal, an welcher Stelle der Geschichte der EA beginnt, es wird immer eine neue Minute, eine neue Stunde oder ein neuer Tag sein. Und das erste Operatorenpaar des genannten Blocks erklärt, warum Ihre Aussage: "Es ist einfach erklärt: beide Variablen curLo und curHi sind anfangs gleich Null, weil sie nicht initialisiert sind. Da Bid beim ersten Tick größer als Null, aber kleiner als 1000 ist, werden beide entsprechenden bedingten Anweisungen zwangsläufig ausgelöst und die Variablen curLo und curHi erhalten die gleichen Anfangswerte, die Sie ihnen im if (start) Block {...} zuweisen.

Ihre Version funktioniert genauso gut, aber sie beeinflusst den Algorithmus in keiner Weise. Diese Änderung hat also keinen Einfluss auf das Vorhandensein oder Nichtvorhandensein von Fehlern.

Beachten Sie noch einmal meinen vorherigen Beitrag. Das Problem tritt nicht beim Übergang zu einem neuen Tag und nicht beim Start des EA auf, sondern beim Testen des t/f H1. Das Problem tritt in diesem Zeitraum nur einmal auf, am 10.08.2007, und dauert 3 Minuten von 17:00 bis 17:03. Während dieser Zeit werden 28 Ticks mit Divergenz der High-Werte für M1 und H1 erzeugt. Ich zeige Ihnen das entsprechende Bild.

Wenn es Ihnen nichts ausmacht, führen Sie bitte den EA (den von Ihnen korrigierten Code) in dem von mir gewünschten Intervall aus. Korrigieren Sie einfach die Verwendung von Kommentaren. In Ihrem Code wird nun mit t/f D1 verglichen, und in diesem Modus treten keine Fehler auf. Ich brauche sie zum Vergleich mit H1.

 

Ich habe den Code ein wenig geändert, um die Korrektheit in besonders pathologischen Fällen zu erhalten (ich habe nur eine Kerze auf M1 für 2007.01.01, dasselbe gilt für H1 und D1). Ich habe den Test vom 01.01.2007 bis zum 08.08.2007 durchgeführt. Ich erhielt 4 fehlerhafte Fälle für D1 und 2 für H1. Alle Fehler passieren beim Übergang zu einer neuen Kerze auf einer höheren TF. Diejenigen, die sich selbst überzeugen wollen.

Sie gibt uns keine Möglichkeit, in die Zukunft zu blicken. Zumindest bei der von mir geprüften Variante.

Dateien:
future-2h.mq4  4 kb
 
Yurixx:

Natürlich danke ich Rosh für die Überarbeitung, aber ich glaube nicht, dass sie notwendig war.

Vielleicht haben Sie es nicht bemerkt, aber in meinem Code in der Funktion init() gibt es den folgenden Block:

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

Wenn es Ihnen nicht schwerfällt, führen Sie den EA (den von Ihnen korrigierten Code) in dem von mir gewünschten Intervall aus. Korrigieren Sie einfach die Verwendung von Kommentaren. In Ihrem Code wird nun mit t/f D1 verglichen, und in diesem Modus treten keine Fehler auf. Ich brauche sie zum Vergleich mit H1.


Sie sollten den Code besser selbst posten. Wenn Sie meinen Code auf H1 testen, werden die Werte nicht initialisiert:
  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;

Das heißt, es wird genau so sein, wie ich es geschrieben habe. Wenn es Ihnen schwer fällt, den Code so zu formulieren, dass ich nicht errate, worum es geht, dann sollten Sie das selbst erledigen, ich habe anderes zu tun, als Telepathie zu betreiben.
 

Ich verstehe wirklich nicht, warum Sie sich darüber aufregen.

Wie ich auf der letzten Seite geschrieben habe, als ich den EA mit den Ergebnissen gepostet habe, ist er zum Testen gedacht ausschließlich auf M1. Gleichzeitig vergleicht er das Hoch und Tief, das er selbst erzeugt, mit dem Hoch und Tief des übergeordneten t/f, das je nach dem H1 oder D1 sein kann, wie die Kommentare im Text der start()-Prozedur angeordnet sind.

Ehrlich gesagt, dachte ich, dass return(-1); in der init()- Prozedur die Arbeit des EA stoppen wird und es daher möglich sein wird, ihn nur auf M1 zu starten. Dank Ihres Beitrags bin ich nun aber überzeugt, dass es auf jeder TF laufen kann: Die Idee hinter diesem EA ist zu versuchen, die Zukunft von einem niedrigeren t / f (insbesondere M1) auf einem höheren t / f (insbesondere H1 oder D1) zu spionieren. Daher sollte sie nur auf M1 ausgeführt werden. Ich weiß nicht einmal, was ein Test auf H1 ergeben könnte.

Ich habe den EA-Code kurz vor Ihrem Beitrag gepostet. Dieser Code kann direkt verwendet werden, um M1-Daten mit H1-Daten zu vergleichen. Im Text der EA gibt es klare Hinweise auf die (elementaren) Änderungen, die vorgenommen werden müssen, damit sie M1-Daten mit D1-Daten vergleichen kann. Auch hier bin ich mir nicht sicher, worüber Sie unglücklich sind.

Eine letzte Sache. Ihr Code ist für einen Testlauf ebenso geeignet wie meiner. Es geht nur darum, es zu schaffen.

Wenn Sie andere Dinge zu tun haben, werde ich Sie nicht stören. Ich habe mich nicht als persönliche Anfrage an Sie gewandt, sondern als Vertreter von MQ in Bezug auf die mögliche Entdeckung einiger Fehler im Tester.

 
Yurixx:

Ich verstehe wirklich nicht, warum Sie sich darüber aufregen.

Wie ich auf der letzten Seite geschrieben habe, als ich den EA mit den Ergebnissen gepostet habe, ist er zum Testen gedacht ausschließlich auf M1. Gleichzeitig vergleicht er das Hoch und Tief, das er selbst erzeugt, mit dem Hoch und Tief des übergeordneten t/f, das je nach dem H1 oder D1 sein kann, wie die Kommentare im Text der start()-Prozedur angeordnet sind.

Ehrlich gesagt, dachte ich , dass die Arbeit des Expert Advisors dadurch gestoppt wird und er nur auf M1 gestartet werden kann. Dank Ihres Beitrags bin ich nun aber überzeugt, dass es auf jedem TF laufen kann: Die Idee hinter diesem EA ist zu versuchen, die Zukunft von einem niedrigeren t / f (insbesondere M1) zu einem höheren t / f (insbesondere H1 oder D1) zu spionieren. Daher sollte sie nur auf M1 ausgeführt werden. Ich weiß nicht einmal, was ein Test auf H1 ergeben könnte.

Ich habe den EA-Code kurz vor Ihrem Beitrag gepostet. Dieser Code kann direkt verwendet werden, um M1-Daten mit H1-Daten zu vergleichen. Im Text der EA gibt es klare Hinweise auf die (elementaren) Änderungen, die vorgenommen werden müssen, damit sie M1-Daten mit D1-Daten vergleichen kann. Auch hier bin ich mir nicht sicher, worüber Sie unglücklich sind.

Eine letzte Sache. Ihr Code ist für einen Testlauf ebenso geeignet wie meiner. Es geht nur darum, es zu schaffen.

Wenn Sie andere Dinge zu tun haben, werde ich Sie nicht stören. Ich habe mich nicht als persönliche Anfrage an Sie gewandt, sondern als Vertreter von MQ in Bezug auf die mögliche Entdeckung einiger Fehler im Tester.

Ich verstehe nicht, welchen Zeitrahmen ich für die Durchführung dieses Tests verwenden sollte. Ich habe es auf drei Zeitrahmen angewendet, ohne in den Code einzugreifen.

2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: Arbeit beendet
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,Daily: 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,Täglich: 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 EURUSD,Daily: 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 EURUSD,Täglich: 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 EURUSD,Daily: 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 EURUSD,Täglich: 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: Der Testzeitraum ist nicht angemessen
2007.08.14 16:29:01 future-2h zum Testen gestartet
2007.08.14 16:28:34 2007.08.10 22:59 future-2h EURUSD,H1: Arbeit beendet
2007.08.14 16:28:32 2007.07.02 00:00 future-2h EURUSD,H1: Der Testzeitraum ist nicht angemessen
2007.08.14 16:28:32 future-2h zum Testen gestartet
2007.08.14 16:28:22 2007.08.10 22:59 future-2h EURUSD,M1: Arbeit beendet
2007.08.14 16:28:19 2007.07.02 00:00 future-2h EURUSD,M1: Testperiode von 1 Minute
2007.08.14 16:28:19 future-2h zum Testen gestartet
2007.08.14 16:24:28 2007.08.10 22:59 future-2h EURUSD,M1: Arbeit beendet
2007.08.14 16:24:28 2007.08.06 00:00 future-2h EURUSD,M1: Testperiode von 1 Minute
 
Ändern Sie nun
  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

zu

  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
und testete es erneut für drei Perioden des gleichen Zeitraums 2007.07.01 bis 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: Der Testzeitraum ist nicht angemessen
2007.08.14 16:32:01 future-2h zum Testen gestartet
2007.08.14 16:31:56 2007.08.10 22:59 future-2h EURUSD,H1: Arbeit beendet
2007.08.14 16:31:54 2007.07.02 00:00 future-2h EURUSD,H1: Testzeitraum entspricht nicht der Aufgabe
2007.08.14 16:31:54 future-2h für Test gestartet
2007.2007.08.14 16:31:48 2007.08.10 22:59 future-2h EURUSD,M1: Arbeit abgeschlossen
2007.08.14 16:31:46 2007.07.02 00:00 future-2h EURUSD,M1: Testzeitraum 1 Minute
2007.08.14 16:31:46 future-2h für Test gestartet
Was steht dort? Ich muss den Code erneut auf das Vorhandensein bzw. Nichtvorhandensein von Fehlern analysieren.
 

Ich verstehe. Sie haben alles richtig gemacht. Und dieser EA darf nur auf M1 ausgeführt werden. Der Expert Advisor wird auf M1 ausgeführt und testet das Zusammentreffen der Hoch- und Tiefstwerte der M1-Periode mit der H1- oder D1-Periode. Wenn es einen Blick in die Zukunft gäbe, dann würden die älteren t/f-Daten die Höchst- und Tiefstwerte verraten, bevor diese auf M1 erreicht werden. Das war's.

Das Ergebnis Ihres D1-Tests stimmt mit meinem überein, bei diesem Intervall für D1 habe ich auch keine Fehler erhalten. Aber der H1-Test bestätigt nicht, was ich erhalten und etwas früher gepostet habe. Es besteht keine Notwendigkeit, den Code zu analysieren. Wie Sie sehen, bestätigt dies den normalen Betrieb des Prüfgeräts.

Wenn Sie der Meinung sind, dass dies ausreicht, können Sie hier aufhören. Wenn Sie sichergehen wollen, dass es sich nicht um einen Zufall handelt, weil der Zeitraum zu klein ist, dann führen Sie die gleichen beiden Tests mit einem längeren Zeitraum durch. Über ein Jahr, zum Beispiel, oder seit Anfang 2007.

PS

Für alle Fälle wiederhole ich. Test nur im Zeitraum M1. Nur im Modus Alle Zecken.

Wir danken Ihnen für Ihre Teilnahme.

 
Danke für die Test-EAs, manchmal ist es schwer, eigene zu entwickeln, da es so viele Testmöglichkeiten gibt und man nicht immer weiß, was man testen soll. Und das Ärgernis... Wissen Sie, man ärgert sich öfter über seine eigenen Leute, weil man erwartet, dass sie es verstehen. Man wird ungewollt härter, und wo man anderen verzeiht, ist man bei den eigenen frustriert. Es tut mir leid.

Diese Tests helfen wirklich, den MetaTrader 4-Tester zu verbessern. Insbesondere bei Quellcode.
Grund der Beschwerde: