Was RefreshRates() aktualisiert - Seite 6

 
Mikhail Nazarenko:

MT4 ist eine dunkle Kiste, und ich kann nur beurteilen, was dort unter realen Bedingungen passiert. Anfangs benutzte ich Schlaf überhaupt nicht, aber als ich bei einigen Stundenbalken Blödsinn machte, fügte ich Schlaf hinzu und das Problem verschwand. Ich weiß nicht, in welcher Reihenfolge und wie die MT4-Zeitreihen aktualisiert werden. Ich bin mir nicht sicher, was ich damit anfangen soll. Ich werde es als Gelegenheit nutzen, mein Problem zu lösen und es mit anderen zu teilen.

Ich habe dieses Problem selbst erlebt, im Testgerät ist alles in Ordnung, aber auf dem realen Markt ist es nichts.

Ich habe den Expert Advisor seit Montag im Einsatz und bin überrascht.

Ich habe mehrere gewinnbringende Eröffnungen eröffnet und bin dann zurückgegangen, um zu kaufen statt zu verkaufen, und umgekehrt.

Forum für Handel, automatisierte Handelssysteme und Strategietests

Fragen von Neulingen zu MQL4 und MQL5, oder Tipps und Diskussionen zu Algorithmen und Codes

Vitaly Muzichenko, 2021.02.15 21:48

Ich habe bereits begonnen, mit MQL4 zu arbeiten, um meinen Algorithmus zu überprüfen.

Ich habe es noch nie ausprobiert, aber ich habe einen solchen Algorithmus noch nie richtig gesehen. Einfacher Code, nur 2 Indikatorpuffer



Der Code ist sehr einfach

   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:

Ich habe das selbst erlebt: Im Testgerät ist alles in Ordnung, aber auf dem echten Markt ist es Mist.

Ich habe den EA seit Montag laufen und bin überrascht.

Ich bin überrascht. Einige Eröffnungen sind richtig, aber danach kaufe ich wieder, anstatt zu verkaufen und umgekehrt.


Der Indikatorcode ist einfach.

Das ist das gleiche Problem, das ich hatte, bevor ich diesen Thread startete. Ich habe oben die Funktion isRefresh() erstellt. Versuchen Sie es. Bei mir hat es gut funktioniert.

Aber es ist kein Schlupf?

 
Vitaly Muzichenko:

Der Code des Indikators ist einfach

Eröffnet der Indikator den Handel?

die Pfeile sind die gleichen - das Problem liegt im EA-Code

 
Mikhail Nazarenko:

Wenn Sie anfangen zu lehren, dann helfen Sie, bestätigen Sie mit Code, Tests, einem Link zu einem Forumsthema oder einer Dokumentation. Alles andere ist reine Selbstbefriedigung.

Bitte klären Sie, was unklar bleibt. Nach der Lektüre schien es, dass die Hauptfrage gelöst ist und es bleibt zu diskutieren, wie veraltet 4 ist).

Ich hatte keine Probleme nach dem Einfügen eines solchen Zeitrahmens beim Laden

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);
  }

Wenn Sie nur selten und unregelmäßig auf den Zeitrahmen zugreifen müssen, sollten Sie (aber nicht unbedingt, wenn der Chart geöffnet ist) dieses Laden erneut durchführen, bevor Sie prüfen

  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:

Das ist das Gleiche, was mir vor der Eröffnung dieses Threads aufgefallen ist. Aus irgendeinem Grund gibt Terminal veraltete Daten auf real, ich schrieb isRefresh() Funktion oben. Versuchen Sie es. Bei mir hat es gut funktioniert.

Aber es ist kein Schlupf?

Nein, er wird auf einem neuen 0-Balken geöffnet und das Signal wird auf dem geschlossenen Balken, d.h. 1, gesucht.

Das ist manchmal der Fall, wenn ein EA nicht das bekommt, was durch iCustom() erwartet wird. Auch hier gilt: manchmal, aber nicht oft.

Hier ist eine weitere - eine neue. Ich habe korrekt eine Kaufposition gemäß dem Signal eröffnet und das nächste Signal vom Indikator ist auch Kauf (Pfeil unten). Aber der EA überiCustom() hat ein Verkaufssignal erhalten und die Kaufposition geschlossen und die Verkaufsposition eröffnet, obwohl eine weitere Kaufposition geöffnet sein sollte.

Irgendetwas stimmt nicht mit den Zeitreihen, ich habe es noch nicht verstanden, es wurde vor 4 Tagen gefunden und ich werde wahrscheinlich nicht versuchen, es herauszufinden. Ich habe im Tester keine Probleme festgestellt.

In diesem Moment.

--- Und ich habe gerade


 

Und auch, aber schon statt eines Verkaufs, ist ein Kauf offen. Wie gesagt, es passiert nicht oft, aber es kommt vor.

Der Code des Indikators ist einfach - es gibt keine komplizierten


 
Aleksey Mavrin:

Bitte klären Sie, was unklar bleibt. Nach der Lektüre dieses Textes scheint die Hauptfrage gelöst zu sein, und es bleibt zu diskutieren, wie veraltet 4 ist)

Ich hatte keine Probleme nach dem Einfügen von Zeitrahmen laden wie folgt

Wenn Sie nur selten und unregelmäßig auf einen Zeitrahmen zugreifen müssen, sollten Sie (aber nicht unbedingt, wenn der Chart geöffnet ist) dieses Laden vor der Überprüfung noch einmal durchführen, oder eine solche Überprüfung ist hilfreich

Das ist richtig,

Dies ist aus der Hilfe:

Der Zugriff auf die Indikator- und Zeitreihendaten erfolgt unabhängig von der Tatsache, dass die angeforderten Daten bereitstehen (sog. asynchroner Zugriff). Dies ist für die Berechnung von benutzerdefinierten Indikatoren von entscheidender Bedeutung, so dass Funktionen wie Copy...() sofort einen Fehler zurückgeben, wenn die angeforderten Daten nicht vorhanden sind. Beim Zugriff über Expert Advisors und Skripte werden jedoch mehrere Versuche unternommen, Daten zu empfangen, wobei eine kleine Pause eingelegt wird, um die nötige Zeit zum Herunterladen der erforderlichen Zeitreihen oder zur Berechnung der Indikatorwerte zu gewinnen.


Wenn Informationen aus einem anderen Chart angefordert werden (Instrumentenname und/oder Zeitrahmenwert unterscheiden sich vom aktuellen), kann die Situation eintreten, dass im Client-Terminal kein passender Chart geöffnet ist und die erforderlichen Daten vom Server angefordert werden müssen. In diesem Fall wird der Fehler ERR_HISTORY_WILL_UPDATED (4066 - angeforderte History-Daten im Update-Status) in die _Last_error-Variable eingetragen und die Anfrage muss nach einiger Zeit erneut versucht werden (siehe ArrayCopySeries() Beispiel).

 
Vitaly Muzichenko:

Und auch, aber schon statt eines Verkaufs, ist ein Kauf offen. Wie gesagt, es passiert nicht oft, aber es kommt vor.

Der Code des Indikators ist einfach - es gibt keine Feinheiten


Die zuverlässigste Methode ist das Schreiben des Protokolls. Schreiben Sie bei jeder Transaktion die Werte der Schlüsselvariablen in die Datei. Aus Erfahrung: die nicht strenge Bedingung <=0 statt <0 führte zu einer schrecklichen Krümmung.

 
Vitaly Muzichenko:

Ich habe das selbst erlebt: Im Testgerät ist alles in Ordnung, aber auf dem echten Markt ist es Mist.

Ich habe den EA seit Montag laufen und bin überrascht.

Ich bin überrascht. Einige Eröffnungen sind richtig, aber danach kaufe ich wieder, anstatt zu verkaufen und umgekehrt.


Der Code des Indikators ist einfach

   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;
   }


Warum sollte ich 0 zu [i + 0] hinzufügen?

 
Aleksey Mavrin:

Bitte klären Sie, was unklar bleibt. Nach der Lektüre dieses Artikels scheint die Hauptfrage gelöst zu sein, und wir müssen immer noch darüber diskutieren, wie veraltet 4 ist)

Ich hatte keine Probleme nach dem Einfügen von Zeitrahmen geladen wie folgt

Wenn Sie nur selten und unregelmäßig auf den Zeitrahmen zurückgreifen müssen, sollte dieses Laden (aber nicht unbedingt, wenn der Chart geöffnet ist) vor der Überprüfung erneut durchgeführt werden, oder eine solche Überprüfung wäre hilfreich

Danke, genau das ist der Punkt. Gibt das Terminal nach dem Zugriff auf eine nicht aktualisierte Zeitreihe über iTime wirklich einen 4066-Fehler aus? Ich habe festgestellt, dass iClose nicht aktualisierte Informationen anstelle von Null anzeigt.

Grund der Beschwerde: