Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 1850

 
Aleksey Vyazmikin:

Sind Sie damit einverstanden, dass zum Zeitpunkt der Eröffnung des Minutenbalkens der OI für den vorherigen Eintrag genommen werden sollte? Zum Beispiel nehmen wir die Öffnung um 10:00 Uhr als 23:49:55 Uhr an.

Ich denke, es ist besser, den Indikator auf M1 zu verwenden und alle notwendigen Informationen aus dem Null-Balken zu nehmen und verschiedene Vergleiche im Expert Advisor unter Berücksichtigung der Informationsanforderung aus dem Indikatorpuffer mit dem erforderlichen Offset durchzuführen.

Was ist der dritte Wert in der Datei - der erste ist das Datum, der zweite ist OM und der dritte ist OI? Ich dachte, es sei ein Delta, aber es funktioniert nicht.

Ich habe versucht, den Indikator zu ändern, wie ich oben geschrieben habe, er liest und zeigt OM an, die Arbeitsgeschwindigkeit ist jetzt viel schneller, probieren Sie es einfach aus.

Ja, und das Lesen aus der Datei sollte im Falle einer Datenunterbrechung und des Vorhandenseins von Daten in der Datei funktionieren, aber der Markt ist geschlossen und ich habe es nicht überprüft.

Das spielt eigentlich keine Rolle. Es ist wichtig, dass die geschriebenen Daten immer korrekt in den Indikator geladen werden. Das Problem ist, dass solche Fehler erlaubt sind, bevor die Trainingsdatei gespeichert wurde. Wenn wir diese Regel festlegen, dann soll es so sein, das Wichtigste ist, dass der echte Indikator diese Regel korrekt ausführt.

Alexey, danke für den Indikator, aber ich habe eine Frage zu einem Echtzeit-Expert Advisor. Wenn sie nicht verwendet wird, wird jede Minute gespeichert und nicht jeder OM-Wechsel innerhalb einer Minute.

Ich verwende bei meiner Arbeit keinen Nullstrich. Außerdem führe ich alle Berechnungen 30 Sekunden nach dem Signal des ersten Balkens durch. Folglich werden keine Berechnungen zwischen den Signalen durchgeführt. Aber das Signal am ersten Balken in 30 Sekunden gilt für alle Indikatoren, die am Modell teilnehmen, und theoretisch sollten diese Indikatoren die gesamte Historie von der letzten Referenz (Signal) bis zur aktuellen berechnen, unter der Bedingung, dass sie nicht im Chart sind. Dies ist das Loch, das der Indikator aus der Datei lesen sollte, um den aktuellen Wert genau zu ermitteln.

Der Punkt ist, dass ich zitatabhängige Daten verwende (ich habe sie selbst so genannt :-)), die für Lücken und Löcher in der Geschichte empfindlich sind.

Bitte helfen Sie mir dabei, den Code der von mir verwendeten Indikatoren mitzubringen, und ich werde mich bei Ihnen mit ein paar wichtigen Ideen für die Vorbereitung von Schulungskits bedanken. + Ich habe 37 Pfund auf meinem Konto, die ich Ihnen ohne Probleme geben werde. Allerdings nur unter der Voraussetzung, dass die volle Zuverlässigkeit der Daten im realen Handel gewährleistet ist.

Das Hauptproblem, das ich habe, ist, dass ich, wenn ich meinen EA mit AI auf einem Chart füttere und ein neues Signal erhalte, ihn neu kompilieren muss und er dann entsprechende Daten von den Indikatoren anfordert. Das Problem liegt jedoch bei den Indikatoren. Wenn ich sie an ein Diagramm sende, wird der Verlauf korrekt angezeigt und die Daten werden weiterhin dargestellt. Ich kompiliere es nach einiger Zeit neu, und der Schwanz, der auf dem echten Konto gezeichnet wurde, ändert seine Werte.

Es gibt auch einen kumulativen Delta-Indikator, der korrekt im Verhältnis zu den Balken berechnet wird. Wenn jedoch die Historie dieses Indikators lang ist, d.h. 3 Monate auf М5, hat er keine Zeit, um für einen Zyklus berechnet zu werden, da er die Daten von copitic übernimmt, das selbst weiß, wie viele Zyklen es bekommt.

Seit kurzem frisst das Update bei der Erstellung einer Trainingsdatei Speicherplatz, da es für 14 Instrumente in einem Zeitraum von 3-6 Monaten angefordert wird. Daher sind 8 Gigabyte RAM einfach nicht genug. Und dieser Indikator erzeugt Null-Balken in Echtzeit, was ich nicht brauche. Es genügt mir, nur den ersten zu laden, wenn der Nullbalken erscheint.

Wenn Sie helfen wollen, schreiben Sie uns eine persönliche Nachricht und stimmen Sie ihr zu. Danke!!!!

Dateien:
CumDelta.mq5  55 kb
 
Mihail Marchukajtes:

Das spielt eigentlich keine Rolle. Wichtig ist, dass die aufgezeichneten Daten immer korrekt in den Indikator geladen werden. Es geht darum, dass solche Fehler zulässig sind, bevor die Trainingsdatei gespeichert wird. Wenn wir diese Regel festlegen, dann soll es so sein, das Wichtigste ist, dass der echte Indikator diese Regel korrekt ausführt.

Alexey, danke für den Indikator, aber ich habe eine Frage zu einem Echtzeit-Expert Advisor. Wenn sie nicht verwendet wird, wird sie jede Minute gespeichert und nicht jedes Mal, wenn sich der OI innerhalb einer Minute ändert?

Ich verwende bei meiner Arbeit keinen Nullstrich. Außerdem führe ich alle Berechnungen 30 Sekunden nach dem Signal des ersten Balkens durch. Folglich gibt es keine Berechnungen zwischen den Signalen. Aber das Signal am ersten Balken in 30 Sekunden gilt für alle Indikatoren, die am Modell teilnehmen, und theoretisch sollten diese Indikatoren die gesamte Historie von der letzten Referenz (Signal) bis zur aktuellen berechnen, unter der Bedingung, dass sie nicht im Chart sind. Dies ist das Loch, das der Indikator aus der Datei lesen sollte, um den aktuellen Wert angemessen zu erhalten.

Der Punkt ist, dass wir die Ausbildung und die Bewerbung nicht perfekt reproduzieren können, insbesondere auf dem schnellen Markt. Nun stellt sich heraus, dass die Verzögerung bis zu 10 Sekunden in Bezug auf die neuen Daten beträgt (wenn wir über die Historie sprechen), und wenn wir nur die Balkeneröffnung analysieren, wird die Verzögerung 60 Sekunden oder mehr betragen. Wenn wir mit Daten arbeiten, die bei der Eröffnung des Balkens gewonnen wurden (nicht verschoben), wird es einen Fehler im Indikator geben, d.h. wir können einen Blick in die Zukunft werfen. Generell müssen wir noch einmal über die Ideologie nachdenken, jetzt, wo die Daten aktueller sind, aber es ist alles nur Theorie. Es kann genügen, die Daten zu nehmen, die aufgezeichnet werden, wenn ein neuer Balken erscheint, und damit zu trainieren.

Nun, wir können ein Skript erstellen, das überflüssige Zeilen einfach innerhalb einer Minute entfernt und die Dateigröße um das Zehnfache verringert.

Mihail Marchukajtes:

Das Hauptproblem ist, dass, wenn ich EA mit AI an den Chart sende und ein neues Signal erhalte, es neu kompiliert werden muss und dann entsprechende Daten von Indikatoren anfordert. Das Problem liegt jedoch bei den Indikatoren. Wenn ich sie an ein Diagramm sende, wird der Verlauf korrekt angezeigt und die Daten werden weiterhin dargestellt. Ich kompiliere es nach einiger Zeit neu, und der Schwanz, der auf dem echten Konto gezeichnet wurde, ändert seine Werte.

Probieren Sie die von mir angegebene Version des Indikators aus. Wenn das Problem weiterhin besteht, liegt es wahrscheinlich am EA und nicht an den Indikatoren. Bitte zeigen Sie den Code zum Abrufen der Daten aus dem Indikator.

 
Mihail Marchukajtes:
Wenn die Unterbrechung vom Broker global ist, können wir nichts dagegen tun. Der Berater für die Speicherung der Daten liegt auf dem UPU-Server und die Daten wurden ohne Verluste geschrieben.

Jetzt wird erwartet, dass der Berater die Daten parallel zur Arbeit des Indikators und des Handelsberaters speichert, so dass, wenn die Verbindung unterbrochen oder das Terminal geschlossen wird, die neuen historischen Daten aus der Datei entnommen werden, es wird erlauben, die Arbeit dringend fortzusetzen und dann die Datei mit VPS zu ersetzen und den Berater neu zu starten.

 
Mihail Marchukajtes:

\Alexey, danke für den Indikator, aber ich habe eine Frage zum Expert Advisor. Ist es möglich, das Gerät minutenweise schreiben zu lassen, aber nicht bei jedem Wechsel des OM innerhalb einer Minute?

Wenn Sie nicht zu viel denken, prüfen Sie diese Variante

   MqlTick last_tick;
   if(SymbolInfoTick(Name_instrFS,last_tick))
      StartDate=last_tick.time;
   else StartDate=TimeCurrent();
   if(isNewBar(Name_instrFS,0,PERIOD_M1))
   {
      for (int i=0; i<100 && !IsStopped(); i++)
      {
         h=FileOpen("OpenI\\"+Name_instr+"_OI.csv",FILE_WRITE|FILE_READ|FILE_ANSI|FILE_CSV|FILE_COMMON|FILE_SHARE_READ,",");
         if(h!=INVALID_HANDLE)
         {

            FileSeek(h,0,SEEK_END);
            FileWrite(h,StartDate,DoubleToString(interest,0));
            FileClose(h);
            Sleep(100);
            break;
         }
      }
      //inter=interest;
      // byOR=byORD;
      // sellOR=sellORD;
   }
 
Aleksey Vyazmikin:

Wenn es nicht zu viel Mühe macht, sollten Sie es ausprobieren.

Alexey, ich danke dir sehr. Ich werde das sicher überprüfen und Sie über die Ergebnisse informieren. Was den Blick in die Zukunft anbelangt, so spielt es keine Rolle und wird auch nicht passieren, wenn der EA auf die gleiche Weise schreibt wie der Indikator. Wenn es keinen Unterschied zwischen den beiden gibt, spielt es keine Rolle. Alternativ können wir bei einem neuen Balken die erste Änderung des OI abwarten und den neuen Wert für den ersten vorherigen Balken aufzeichnen. Wir können auch keinen neuen Wert aufzeichnen, sondern den alten, der zuletzt für den ersten Balken galt. Das heißt, wir beginnen mit dem Schreiben am Ende des vorherigen Taktes.

Wichtig ist nicht der OI, den wir dem Minutenbalken zuweisen, sondern wie der Indikator aus der Datei gelesen wird.

 
Mihail Marchukajtes:

Alexej, ich danke Ihnen vielmals. Ich werde auf jeden Fall alles überprüfen und Sie über das Ergebnis informieren. Was den Blick in die Zukunft angeht, so ist dies absolut unwichtig und wird nicht passieren, wenn der EA so schreibt, wie der Indikator liest. Wenn es keinen Unterschied zwischen ihnen gibt, spielt das keine Rolle. Alternativ können wir bei einem neuen Balken die erste Änderung des OI abwarten und den neuen Wert für den ersten vorherigen Balken aufzeichnen. Wir können auch keinen neuen Wert aufzeichnen, sondern den alten, der zuletzt für den ersten Balken galt. Das heißt, wir beginnen mit dem Schreiben am Ende des vorherigen Taktes.

Das Wichtigste ist nicht der OI, den wir dem Minutenbalken zuweisen, sondern wie der Indikator aus der Datei gelesen wird.

Bitte sehen Sie sich den vollständigen Code an und fragen Sie

interest=SymbolInfoDouble(Name_instrFS,SYMBOL_SESSION_INTEREST); 


  if ((interest!=inter))
  {

   MqlTick last_tick;
   /*if(SymbolInfoTick(Name_instrFS,last_tick)) 
    StartDate=last_tick.time;
    else StartDate=TimeCurrent();*/
    StartDate=iTime(Name_instrFS,PERIOD_M1,1);
  if(isNewBar(Name_instrFS,0,PERIOD_M1))
   {  
    for (int i=0;i<100 && !IsStopped();i++)
    { 
      h=FileOpen("OpenI\\"+Name_instr+"_OI.csv",FILE_WRITE|FILE_READ|FILE_ANSI|FILE_CSV|FILE_COMMON|FILE_SHARE_READ,",");
       if(h!=INVALID_HANDLE)                                                         
       {  
         
         FileSeek(h,0,SEEK_END);
         FileWrite(h,StartDate,DoubleToString(inter,0)); 
         FileClose(h); 
         Sleep(100);
         break; 
       }
    }   
    inter=interest;
   // byOR=byORD;
   // sellOR=sellORD;
  }
}


Wenn ein neuer Balken geöffnet wird und es innerhalb von 5 Ticks keine OI-Änderung gibt, wird dann die neue Balkenbedingung eingegeben?

Ich denke, es sollte, weil es der erste Aufruf der neuen bar-Funktion und nur nach, dass das Ergebnis in ein falsh geändert werden wird? Oder?

 
Ich habe die Arbeit des Codes in meinem Kopf simuliert und einen Engpass gefunden. Der letzte Balken der gestrigen Sitzung wird bei der ersten Änderung zur Eröffnung des Minutenbalkens der heutigen Sitzung geschrieben, im Falle einer Neuinitialisierung des EA geht der OI-Wert verloren, was zu einem unangenehmen Nulleintrag im letzten Balken der gestrigen Sitzung führt. Ich denke, die Lösung ist immer noch, nicht den vorherigen OM-Wert in den ersten Balken zu schreiben, sondern genau den aktuellen OM-Wert, d.h. den, der im neuen Balken als erster erscheint. Ok, ich wollte sie perfekt synchronisieren, aber ich denke, es wird reichen, wie es ist... Also... nur mal laut gedacht...
 
Aleksey Vyazmikin:

Das ist es ja, man kann die Ausbildung und die Bewerbung nicht perfekt reproduzieren, vor allem nicht auf einem schnellen Markt. Nun stellt sich heraus, dass die Verzögerung bis zu 10 Sekunden in Bezug auf die neuen Daten beträgt (wenn wir über die Historie sprechen), und wenn wir nur die Balkeneröffnung verwenden, wird die Verzögerung 60 Sekunden oder mehr betragen. Wenn wir mit Daten arbeiten, die bei der Eröffnung des Balkens gewonnen wurden (nicht verschoben), wird es einen Fehler im Indikator geben, d.h. wir können einen Blick in die Zukunft werfen. Generell müssen wir noch einmal über die Ideologie nachdenken, jetzt, wo die Daten aktueller sind, aber es ist alles nur Theorie. Es kann genügen, die Daten zu nehmen, die aufgezeichnet werden, wenn ein neuer Balken erscheint, und damit zu trainieren.

Nun, wir können ein Skript erstellen, das überflüssige Zeilen einfach innerhalb einer Minute entfernt und die Dateigröße um das Zehnfache verringert.

Probieren Sie die von mir angegebene Version des Indikators aus. Wenn das Problem weiterhin besteht, liegt es wahrscheinlich am EA und nicht an den Indikatoren. Bitte zeigen Sie den Code zum Abrufen der Daten aus dem Indikator.

Ich habe den Indikator in der Historie überprüft und bin auf einen Fehler gestoßen. Das Problem ist, dass die erste einminütige Kerze die Zeit 10:00 im Kursfenster hat, aber der Wert für diese Kerze wird von der vorherigen Kerze übernommen. Das heißt, die Kerze öffnete um 10:00:00 und schloss um 10:00:59. Das ist der Wert, der geschrieben werden muss, nicht wahr? Und der Indikator während der Konstruktion nimmt den Wert des Balkens von 23:59:59.
 
Mihail Marchukajtes:
Ich habe den Indikator in der Historie überprüft und der Fehler ist offensichtlich. Das Problem ist, dass die erste einminütige Kerze die Zeit 10:00 im Kursfenster hat, aber der Wert für diese Kerze wird von der vorherigen Kerze übernommen. Das bedeutet, dass die Kerze um 10:00:00 Uhr geöffnet und um 10:00:59 Uhr geschlossen wurde. Das ist der Wert, den wir schreiben müssen, nicht wahr? Und der Indikator nimmt den Wert von 23:59:59 Uhr, wenn er den Balken aufzeichnet.
Ich habe es getan. Jetzt ist es egal, ob die Datei pro Minute oder pro Tick geschrieben wird, es werden die richtigen Werte für die Kerze geschrieben. Das heißt, wenn eine Kerze eine offene Zeit hat, schreiben wir den Wert beim Schließen dieser Kerze hinein...
 
Mihail Marchukajtes:
Ich habe den Indikator in der Historie überprüft und der Fehler ist offensichtlich. Das Problem ist, dass die erste einminütige Kerze die Zeit 10:00 im Kursfenster hat, aber der Wert für diese Kerze wird von der vorherigen Kerze übernommen. Das heißt, die Kerze wurde um 10:00:00 Uhr eröffnet und um 10:00:59 Uhr geschlossen. Das ist doch der Wert, der geschrieben werden muss, oder? Und der Indikator nimmt den Wert von 23:59:59 Uhr, wenn er den Balken konstruiert.

Wenn der EA mit der Eröffnung des Balkens arbeitet, auch wenn dies mit einer Verzögerung geschieht, ist es dann richtig, ihn mit den Daten des Kerzenschlusses zu füttern, d.h. in die Zukunft zu schauen? Aus diesem Grund werden die frischesten Daten vor dieser Kerze verwendet, d. h. eine kleine Verzögerung, anstatt vorauszugehen.


Mihail Marchukajtes:

Bitte prüfen Sie den vollständigen Code und fragen Sie


Wenn ein neuer Balken geöffnet wird und sich die OI innerhalb von 5 Ticks nicht ändert, wird dann die Bedingung eines neuen Balkens erfüllt?

Ich denke, es sollte, weil es der erste Aufruf der Funktion der neuen Bar sein wird und erst danach wird das Ergebnis zu einem falsh ändern? Richtig?

Wo ist hier die Zählung der 5 Zecken? Es kann vorkommen, dass innerhalb einer Minute keine Transaktion stattfindet, und dann verpasst man den Balken, und deshalb habe ich den Vergleich für OI-Änderungen entfernt, damit die Daten sofort bei der Eröffnung einer neuen Kerze geschrieben werden. Vielleicht habe ich es vergessen, ich muss es mit Daten testen, aber gestern hatte ich keine, und es sind Wochentage :(

Grund der Beschwerde: