Rückwärts analysierte Balken in EA - Seite 3

 
paranoyakX:

Danke für den Rat, hier ist eine sehr einfache Version meines Codes, das ist nicht mein richtiger Code, aber ich hoffe, dass dies klarer sein wird.

wie ich schon sagte, ist dies nicht der echte Code, das Finden von Mustern usw. ist nur ein Beispiel. der Grund, warum ich diesen Thread eröffnet habe, ist dieFunktion DetectExistingPattern()

Ich habe Ihnen bereits einen Beispielcode gegeben, wie man den Code beim ersten Aufruf von OnTick() ausführt, also aktualisieren Sie jetzt Ihren Codebeitrag entsprechend, so dass Ihr DetectExistingPattern() beim ersten Aufruf von OnTick() und nicht bei OnInit() ausgeführt wird.

Sie können auch nicht "Bars" verwenden, um einen neuen Bar zu erkennen. Das ist nicht korrekt. Sie sollten entweder "Time[0]" oder "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )" verwenden. Hier ist ein Beispiel:

bool isNewBar()
{
   static datetime last_time = WRONG_VALUE;
   datetime lastbar_time = (datetime) SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if( last_time != WRONG_VALUE )
   {
      if( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return( true );
      }
   }
   else
      last_time = lastbar_time;

   return( false );
}
 
FMIC:

Ich habe Ihnen bereits einen Beispielcode gegeben, wie Sie den Code beim ersten Aufruf von OnTick() ausführen können. Aktualisieren Sie nun Ihren Code entsprechend, so dass Ihr DetectExistingPattern() beim ersten Aufruf von OnTick() und nicht bei OnInit() ausgeführt wird.

Sie können auch nicht "Bars" verwenden, um einen neuen Bar zu erkennen. Das ist nicht korrekt. Sie sollten entweder "Time[0]" oder "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )" verwenden. Hier ist ein Beispiel:

Danke @FMIC, ich habe den einfachen Code hinzugefügt, weil @jjc danach gefragt hat. Übrigens habe ich die Verwendung von Balken von Anfang an gelernt, da ich mich erinnere, dass alle so schreiben, also habe ich es auch getan. Warum ist das falsch? Kann es unsachgemäß funktionieren?

ps: Ich benutze Metatrader 4, also ist es mql4 richtig ?

 
paranoyakX:

Danke @FMIC, ich habe den einfachen Code hinzugefügt, weil @jjc danach gefragt hat. Übrigens habe ich die Verwendung von Balken von Anfang an gelernt, wenn ich mich recht erinnere, hat jeder so geschrieben, also habe ich es auch getan. Warum ist das falsch? Kann es unsachgemäß funktionieren?

ps: Ich benutze Metatrader 4, also ist es mql4 richtig ?

Nein! Im Forum werden Sie feststellen, dass viele Benutzer gezeigt haben, dass die "Bars"-Methode sehr alt und unzuverlässig ist, weil die Anzahl der Bars durch die "Optionen" für Charts geändert werden kann oder konstant sein kann, wenn die maximale Anzahl von Bars pro Chart erreicht wurde. Daher ist es falsch, diese Methode zu verwenden. Verwenden Sie entweder "Time[0]" oder wenn Sie wollen, dass es auch mit MQL5 kompatibel ist, verwenden Sie "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Bitte sehen Sie sich mein Beispiel an.
 

FMIC:
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

wow, ich wusste nicht, dass ich Ihren Code verwenden werde, vielen Dank.
 
Bars ist unzuverlässig (ein Refresh/Reconnect kann die Anzahl der Bars auf dem Chart ändern) Volumen ist unzuverlässig (miss ticks) Verwenden Sie immer time. Neue Kerze - MQL4 forum
 
paranoyakX:

wie ich sagte, dies ist nicht der echte Code, finden Muster usw. ist nur ein Beispiel. der Grund, warum ich diesen Thread eröffnet istDetectExistingPattern() Funktion

Um auf Ihre ursprüngliche Frage zurückzukommen... In diesem Beispiel wäre eine Möglichkeit, dass Sie Ihre CheckTrendPattern()-Funktion so ändern, dass sie bei einem bestimmten Balken beginnen kann. Anstatt den festen Bereich von Balken 1 bis 10 zu verwenden, verwenden Sie stattdessen einen Offset von 1 bis 10 von einem bestimmten Startpunkt.

bool CheckTrendPattern(int StartAtBar){
 
  for(int i=StartAtBar + 10; i>=StartAtBar + 1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[StartAtBar + 10];
  LowestValue  = Low[StartAtBar + 1];
  
  return true;
};

Wenn es keine bestehende Order gibt und Sie prüfen wollen, ob das Muster aktuell erfüllt ist, verwenden Sie CheckTrendPattern(0) anstelle von CheckTrendPattern().

Wenn Sie beim Starten eine bestehende Order haben, können Sie wie folgt nach dem Muster suchen, das diese Order ausgelöst hat. Dies ist derselbe Vorschlag, den ich zu Beginn gemacht habe: Sie holen sich den Bar-Index, der der Eröffnungszeit der bestehenden Order entspricht, und beginnen von dort aus mit der Rückwärtssuche.

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

Wie FMIC jedoch sagt, ist es besser, diese Prüfung beim ersten Aufruf von OnTick() vorzunehmen als bei OnInit(). Meine eigenen Gründe für diesen Vorschlag haben nichts mit der "Verzögerung der Initialisierung" zu tun. Vielmehr würde ich mir Sorgen machen, dass Sie beim Neustart von MT4, wenn der EA bereits an einen Chart angehängt ist, noch nicht 100%ig zuverlässig über eine Orderliste des Brokers oder eine aktualisierte Balkenhistorie verfügen.

Eine weitere Überlegung, die Sie vielleicht in Betracht ziehen sollten, ist das folgende Szenario, das sich innerhalb der Zeitspanne eines einzigen Balkens abspielt:

  • Sie finden ein Muster und platzieren einen Trade.
  • Ihr offener Handel wird geschlossen, z. B. weil er einen Stop-Loss erreicht.
  • MT4 schließt sich (ob absichtlich oder nicht)
  • MT4 wird neu gestartet
  • Der EA findet das aktuelle Muster erneut und tätigt einen weiteren Handel im selben Balken, da es keinen offenen Handel gibt.

Um dies zu verhindern, sollten Sie nicht nur offene, sondern auch geschlossene Orders überprüfen.

 
@jjc, Ihre Vorschläge sind sehr gut. Danke, dass Sie Ihre Erfahrungen geteilt haben.
jjc:

Um auf Ihre ursprüngliche Frage zurückzukommen... In diesem Beispiel wäre eine Möglichkeit, dass Sie Ihre CheckTrendPattern()-Funktion so ändern, dass sie bei einem bestimmten Balken beginnen kann. Anstatt den festen Bereich von Balken 1 bis 10 zu verwenden, verwenden Sie stattdessen einen Offset von 1 bis 10 von einem bestimmten Startpunkt.

Wenn es keine bestehende Order gibt und Sie prüfen wollen, ob das Muster aktuell erfüllt ist, verwenden Sie CheckTrendPattern(0) anstelle von CheckTrendPattern().

Meine wirkliche Muster ist nicht diese, so gibt es nicht feste Zahlen (wie 10 Beispiel) es ist dynamisch, aber mein Muster-Check-Methode ist anders, so konnte ich nicht daran erinnern, und das ist wirklich stört mich, weil ich einen ähnlichen Code geschrieben, um Muster wieder zu finden. Problem ist, während EA läuft, ich nur überprüfen, die letzte bar, wenn mein Muster noch weiter und wenn es ist, dann ich nichts tun, wenn das Muster gebrochen ist, dann öffne ich eine Bestellung. So kann ich nicht verwenden, dass Code während der Suche nach dem Muster wieder, weil dieses Mal, ich habe zu gehen zurück auf Bars nicht vorwärts. Ich wollte auch nicht rückwärts nach dem Muster suchen, weil ich in diesem Fall immer wieder dieselben Balken überprüfen würde. Ich bin nur besorgt über Performance-Problem, aber wie ich sehe, wird es nicht ein Problem sein, so dass ich denke, meine Muster-Findungs-Methode zu ändern, so dass ich es auf beiden Start und während der Ausführung verwenden können, wie Sie sagten. dies wird auch verhindern, dass mögliche Probleme wie, wenn ich mein Muster zu ändern, würde ich zu ändern Re-Findung Muster Verfahren, das ich vergessen kann.thanks für das. Auch als @FMIC sagte, vielleicht sollte ich diesen Teil als Indikator (die ich nicht viel schreiben), so dass es nicht ein Problem sein, zu finden und wieder zu finden.
jjc:

Wenn Sie beim Starten eine bestehende Order haben, können Sie wie folgt nach dem Muster suchen, das diese Order ausgelöst hat. Dies ist derselbe Vorschlag, den ich zu Beginn gemacht habe: Sie holen sich den Bar-Index, der dem Eröffnungszeitpunkt der bestehenden Order entspricht, und beginnen von dort aus mit der Rückwärtssuche. Wie FMIC jedoch sagt, ist es besser, diese Prüfung beim ersten Aufruf von OnTick() und nicht in OnInit() durchzuführen. Meine eigenen Gründe für diesen Vorschlag haben nichts mit der "Verzögerung der Initialisierung" zu tun. Vielmehr würde ich mir Sorgen machen, dass Sie beim Neustart von MT4, wenn der EA bereits an einen Chart angehängt ist, noch nicht 100%ig zuverlässig über eine Orderliste des Brokers oder eine aktualisierte Balkenhistorie verfügen.

Eine weitere Überlegung, die Sie vielleicht in Betracht ziehen sollten, ist das folgende Szenario, das sich innerhalb der Zeitspanne eines einzigen Balkens abspielt:

  • Sie finden ein Muster und platzieren einen Trade.
  • Ihr offener Handel wird geschlossen, z. B. weil er einen Stop-Loss erreicht.
  • MT4 schließt sich (ob absichtlich oder nicht)
  • MT4 wird neu gestartet
  • Der EA findet das aktuelle Muster erneut und tätigt einen weiteren Handel im selben Balken, da es keinen offenen Handel gibt.

Jetzt ist es klarer, warum ich es in OnInit tun sollte, Zuverlässigkeit ist natürlich der wichtigste Punkt und ich habe nicht über Ihre Überlegung Warnung denken. dieser Teil ist wirklich wichtig, ich könnte redundante Aufträge öffnen, vielleicht selten, aber möglich. Ich muss das in irgendeiner Weise handhaben. wirklich vielen Dank.

@WHRoeder Ihr neues Bar Check Control ist so einfach und schön. Ich habe Ihre Methode zu meinem Code hinzugefügt, vielen Dank.

 

Hallo zusammen,

wie @FMIC beraten, ich schreibe und Indikator, der mein Muster findet, geben ein Signal und ein paar mehr Daten, die für meine Aufträge verwenden (ich könnte mehr als eine Bestellung zu unterschiedlichen Preisen öffnen). Jetzt möchte ich es in meinem EA verwenden, aber ich habe eine Frage, ich brauche Ihre Erfahrung tatsächlich. Wenn ich ein Signal von meinem Indikator erhalte, eröffne ich eine Order oder setze eine Order (Verkaufslimit oder Kauflimit usw.), wenn mein mt4 aus irgendeinem Grund abstürzt, wenn ich es wieder öffne, wie kann ich herausfinden, dass die geöffnete Order zu welchem Signal in meinem Indikator gehört. ist es in Ordnung, dafür eine Balkenverschiebung zu verwenden? wie wir zuvor gesprochen haben, kann ich den Zeitpunkt der Ordererstellung finden, dann finde ich diese Balkenverschiebung und sollte ich versuchen, den Indikatorwert mithilfe dieser Verschiebung zu erhalten? Wie kann ich diese Order und den Indikator-Shift abgleichen?

Danke.

 
paranoyakX: Hallo an alle, wie @FMIC beraten, ich schreibe und Indikator, der mein Muster findet, geben Sie ein Signal und ein paar weitere Daten, die für meine Aufträge verwenden (ich könnte mehr als eine Bestellung zu unterschiedlichen Preisen öffnen). Jetzt möchte ich es in meinem EA verwenden, aber ich habe eine Frage, ich brauche Ihre Erfahrung tatsächlich. Wenn ich ein Signal von meinem Indikator erhalte, eröffne ich eine Order oder setze eine Order (Verkaufslimit oder Kauflimit usw.), wenn mein mt4 aus irgendeinem Grund abstürzt, wenn ich es wieder öffne, wie kann ich herausfinden, dass die geöffnete Order zu welchem Signal in meinem Indikator gehört. ist es in Ordnung, dafür eine Balkenverschiebung zu verwenden? wie wir zuvor gesprochen haben, kann ich den Zeitpunkt der Ordererstellung finden, dann finde ich diese Balkenverschiebung und sollte ich versuchen, den Indikatorwert mithilfe dieser Verschiebung zu erhalten? Wie kann ich diese Order und den Indikator-Shift abgleichen?
Ja, Sie können iBarShift() verwenden, genau wie jjc Ihnen in einem früheren Beitrag erklärt hat, um dann die Daten Ihres Indikators über die Funktion iCustom() zu referenzieren.
 
FMIC:
Ja, Sie können iBarShift() verwenden, so wie jjc es Ihnen in einem früheren Beitrag erklärt hat, um dann die Daten Ihres Indikators über die Funktion iCustom() zu referenzieren.
Vielen Dank, @FMIC, die Verwendung von Shift ist also eine gute Lösung. Mein Muster als Indikator zu machen war ein wirklich guter Ratschlag. Ich werde natürlich meinen gesamten Code ändern, aber er wird konsistenter sein.