Rückwärts analysierte Balken in EA

 

Hallo zusammen,

Dies könnte eine wirklich dumme Frage sein, aber ich konnte wirklich nicht den Weg finden, es zu tun. Ich versuche, einen EA zu erstellen. nach der Analyse einige Bars, entscheidet es zu öffnen und um oder nicht. Sagen wir, es öffnet eine Bestellung. irgendwie, wenn mein EA stoppt oder metatrader heruntergefahren, wenn ich es wieder geöffnet, ich möchte die Bars, die Ursache, um die Bestellung zu öffnen zu finden. Ich suche also nach den Aufträgen und finde meinen Auftrag (den der EA gerade geöffnet hat) und möchte die Balken zurückanalysieren. Wie kann ich das tun? wie kann ich meine Aufträge finden geöffnet bar und gehen Sie zurück auf Bars.

z.B.:

Ich bin auf H1-Periode laufen und suchen Sie nach den Bars um 12:00, 13:00, 14:00 und 15:00 dann entscheide ich mich für eine Bestellung um 16:00 zu öffnen. die wichtigen Bars sind durch 12:00 bis 15:00 und ich möchte diese Bars wieder zu identifizieren. so, wenn neu ausführen der EA ersten werde ich die Bestellung zu finden und finden Sie seine geöffneten Datum, erkennen, welche Bar ist dieses Datum gehören, und starten Sie die gehen zurück auf Bars vor diesem Datum.

Ich dachte an die Verwendung von Time Array usw., aber während ich versuchte, die Balken zu finden, was würde passieren, wenn ein neuer Balken auftaucht? die Verschiebungen werden geändert und meine Suche wird unlogisch.

Ich möchte diese Informationen auch nicht in eine Datei schreiben. Das erfordert zu viel Zeit und eine Menge an Ausnahmebehandlung usw.

danke.

 
paranoyakX:

Ich dachte daran, Time Array usw. zu verwenden, aber während ich versuchte, die Balken zu finden, was würde passieren, wenn ein neuer Balken auftaucht? die Verschiebungen werden geändert und meine Suche wird unlogisch sein.


Ein neuer Balken sollte nicht auftauchen, während ein EA seinen Code ausführt. Er arbeitet mit den Daten, die beim Aufruf von OnTick() geladen werden.

Ich bin nicht sicher, was passieren würde, wenn RefreshRates() verwendet wird.

 
GumRai: Ich bin mir nicht sicher, was passieren würde, wenn RefreshRates() verwendet wird.

Obwohl es nicht oft vorkommt (in der Tat sehr selten), habe ich bei der Verwendung von RefreshRates() die Erfahrung gemacht, dass die Balken-Daten aufgrund der Bildung eines neuen Balkens verschoben werden. Um dieses Problem zu umgehen, versuche ich, alle erforderlichen Daten zu Beginn in Variablen zu kopieren und dann während der restlichen Ausführung des Ereignisses nicht mehr auf die History Data Arrays oder entsprechende Funktionen zurückzugreifen. Auf diese Weise kann ich, selbst wenn ich in meinem Code die RefreshRates() verwenden muss, immer noch sicher auf die Anfangsbedingungen verweisen.

@paranoyakX : Unabhängig von der Verwendung von RefreshRates() oder nicht, können Sie einen ähnlichen Ansatz versuchen. In der Tat haben Sie in MQL5 nicht die gleichen Möglichkeiten wie in MQL4 und MÜSSEN die Daten in Ihre eigenen Arrays kopieren, um sie zu verarbeiten. Wenn Sie so vorgehen, sind Sie tatsächlich ein paar Schritte weiter, um Ihren Code sowohl mit MQL4 als auch mit MQL5 kompatibel zu machen.

Die beste Lösung ist jedoch, all dies nicht im EA zu kodieren, sondern den größten Teil dieser Logik in einem Indikator zu kodieren, der nicht unter diesem Problem leidet, weil der Ansatz ein völlig anderer ist. Versuchen Sie, so viel wie möglich von der Signallogik in einem Indikator zu programmieren. Dies ist auch deshalb nützlich, weil Sie den Indikator dann visuell verwenden und testen können, bis er genau so funktioniert, wie Sie es wollen. Ein weiterer Vorteil der Indikatorlösung ist, dass sie die Signale nicht nur für den EA, sondern auch für den manuellen Handel bereitstellt. Der EA muss sich dann nur auf das Handelsmanagement und nicht auf die Signalgebung konzentrieren.

 
paranoyakX:

[...] Ich dachte daran, Time Array usw. zu verwenden, aber während ich versuchte, die Balken zu finden, was würde passieren, wenn ein neuer Balken auftaucht? Die Verschiebungen werden geändert und meine Suche wird unlogisch.

Was Sie fragen, ist potenziell so einfach, dass ich mich frage, ob ich den Punkt übersehe. Bei einer früheren OrderSelect() können Sie die mit der OrderOpenTime() verknüpfte Balkenverschiebung nachschlagen, indem Sie einfach Folgendes tun:

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);

Zum Beispiel:

  • H1-Diagramm
  • Dieaktuelle Zeit ist 16:32
  • Die Order wurde um 14:23 Uhr eröffnet
  • Der obige Code sollte BarShiftOfOrderOpen = 2 zurückgeben, d.h. der H1-Bar um 14:00, und Time[BarShiftOfOrderOpen] wird 14:00 sein.
 
jjc: Was Sie fragen, ist potenziell so einfach, dass ich mich frage, ob ich den Punkt übersehe. Bei einer früheren OrderSelect() können Sie die mit der OrderOpenTime() verbundene Bar-Shift nachschlagen, indem Sie einfach Folgendes tun:

Zum Beispiel:

  • H1-Diagramm
  • Die aktuelle Zeit ist 16:32
  • Die Order wurde um 14:23 Uhr eröffnet.
  • Der obige Code sollte BarShiftOfOrderOpen = 2 zurückgeben, d.h. der H1-Bar um 14:00, und Time[BarShiftOfOrderOpen] wird 14:00 sein

Ja, das ist genau das, was OP sagt, aber was er in Frage stellt, ist nicht, wie man es macht, sondern wie man verhindert, dass es ungültig wird, weil ein neuer Tick einen neuen Balken bildet, während er die Daten verarbeitet.

Das sollte jedoch NICHT passieren, außer wenn Sie RefreshRates() verwenden. Für diese Möglichkeit (die selten vorkommt), habe ich die alternativen Methoden vorgeschlagen, so wie es MQL5 macht.

 
FMIC:

aber wie kann man verhindern, dass er aufgrund einer Taktverschiebung ungültig wird, die durch einen neuen eingehenden Tick verursacht wird, der einen neuen Takt bildet?

Wo steht das im OP? Das könnte die Frage sein, aber ich glaube, Sie hören Hufgetrappel und denken eher an Zebras als an Pferde. Die Erwähnung der Speicherung des EA-Status in einer Datei über Neustarts von MT4 hinweg deutet für mich darauf hin, dass die Frage in Wirklichkeit viel, viel einfacher ist.
 

Hallo Leute,

vielen Dank für die Antworten,

@FMIC, interessanterweise habe ich nie daran gedacht, Indikatoren zu verwenden, und wie du sagst, könnte dies viel einfacher sein, wenn ich einen erstelle und verwende, aber natürlich wird dies neue Fragen mit sich bringen, wie z. B. wie ich den Indikatorwert finde, der mit meiner Bestellung übereinstimmt usw. Außerdem werde ich diesen Prozess nicht jedes Mal durchführen, sondern nur einmal bei OnInit(), so dass es vielleicht in Ordnung ist, dafür einen EA zu verwenden.

@jjc, vielen Dank auch für Ihre Lösung. Ich war tatsächlich ein wenig besorgt über die "neue Bar", aber wie Sie alle sagen, während EA läuft es wird nicht Schicht ändern (und ich bin nicht mit RefreshRates() Funktion), so kann ich Ihren Code zu verwenden. Ich bin nur neugierig, jetzt nach dem, was @FMIC sagte, wäre es schöner, wenn ich dies als ein Indikator erstellen?

 
jjc:
Wo steht das im OP? Das könnte die Frage sein, aber ich glaube, Sie hören Hufgetrappel und denken eher an Zebras als an Pferde. Die Erwähnung der Speicherung des EA-Status in einer Datei über Neustarts von MT4 hinweg deutet für mich darauf hin, dass die Frage in Wirklichkeit viel, viel einfacher ist.

Sogar GumRai hat das aufgegriffen und ihn zitiert, was ich hier noch einmal tun werde:

paranoyakX:

Ich dachte daran, Time Array usw. zu verwenden, aber während ich versuchte, die Balken zu finden, was würde passieren, wenn ein neuer Balken auftaucht? die Verschiebungen werden geändert und meine Suche wird unlogisch sein.

 
paranoyakX:

@FMIC, interessanterweise habe ich nie gedacht, mit Indikatoren und wie Sie sagen, dies könnte viel einfacher sein, wenn ich erstellen und verwenden Sie eine, aber natürlich wird dies neue Fragen bringen, wie wird der Indikator Wert, der Paare mit meiner Bestellung usw. finden. Außerdem werde ich diesen Prozess nicht jedes Mal durchführen, sondern nur einmal bei OnInit(), so dass es vielleicht in Ordnung ist, dafür einen EA zu verwenden.

@jjc, vielen Dank auch für Ihre Lösung. Ich war tatsächlich ein wenig besorgt über die "neue Bar", aber wie Sie alle sagen, während EA läuft es wird nicht Schicht ändern (und ich bin nicht mit RefreshRates() Funktion), so kann ich Ihren Code zu verwenden. Ich bin nur neugierig, jetzt nach dem, was @FMIC sagte, wäre es schöner, wenn ich dies als Indikator erstellen?

Nehmen Sie meinen Vorschlag nicht übel, wenn er Ihnen zu kompliziert ist! Machen Sie es so, wie es für Sie am einfachsten ist, und dann, wenn Sie sich damit wohler fühlen, versuchen Sie auch die andere Methode.

PS! Sie sollten keinen logischen Code in Ihr OnInit() einfügen, dort werden nur Dinge initialisiert, die nichts mit den Daten aus den Arrays der historischen Datenreihen zu tun haben. Ihre gesamte Logik und der Hauptcode sollten in OnTick() oder OnCalculate() enthalten sein.

 
FMIC:

Selbst GumRai hat das aufgegriffen und zitiert, was ich hier noch einmal tun werde:

Sie und Gumrai machen eine massive Annahme über die Bedeutung von "if a new bar comes up", die die Beweise noch nicht rechtfertigen. Der OP hat noch nicht gesagt "wenn ein neuer Balken beim OnStart auftaucht".

Ich vermute, dass paranoyakX Handels-/Signaldetails in globalen Variablen im EA speichert. Das Problem, so vermute ich, sind nicht neue Balken, die während eines Aufrufs von OnStart() entstehen, sondern neue Balken, diewährend der Lebensdauer des EA entstehen.

 
jjc:

Sie und Gumrai stellen eine massive Vermutung über die Bedeutung von "wenn ein neuer Balken auftaucht" auf, die durch die Beweise noch nicht gerechtfertigt ist. Der OP hat noch nicht gesagt "wenn ein neuer Balken während OnStart auftaucht".

Ich vermute, dass paranoyakX Handels-/Signaldetails in globalen Variablen im EA speichert. Das Problem, so vermute ich, sind nicht neue Balken, die sich während eines Aufrufs von OnStart() bilden, sondern neue Balken, die sichwährend der Lebensdauer des EAs bilden.

Es gibt kein OnStart() in EA's, aber ich verstehe, was Sie meinen. Allerdings sagte der OP selbst in Reaktion auf Ihre Kommentare und ich zitiere:

Ich war eigentlich ein wenig besorgt über die "neuen Balken", aber wie Sie alle sagen, während EA läuft, gibt es keine Verschiebung ändern (und ich bin nicht mit RefreshRates() Funktion)

Grund der Beschwerde: