AusgestoppteBuy und ausgestoppte Sell zählen lassen

 

Hallo zusammen,

 

für meinen RSI EA möchte ich Positionen, die in den fixen Stop-Loss laufen begrenzen. Maximal soll er ein zweites oder drittes Mal hintereinander eine Position derselben Richtung (buy oder sell) eröffnen dürfen, wenn die vorherige Position(en) negativ ausgestoppt wurden. Beim RSI kann das nämlich dann relativ schnell passieren, wenn der Markt pausenlos fällt oder steigt ohne Korrektur. Ein normaler RSI-EA öffnet dann ständig Positionen, die zigmal hintereinander negativ ausgestoppt werden...

Welcher Aufruf gibt mir welchen Wert zurück, wenn eine Position ausgestoppt wird? Das würde ich dann gerne über eine Schleife Zählen lassen, damit die Neueröffnungen begrenzen und erst bei einem Richtungswechsel auf Null zurücksezten, so der Plan

Wer kennt sich aus?


Danke vorab.

 

Schau mal hier: https://www.mql5.com/de/articles/6921

Hier ist eine umfangreiche Bibliothek für mq4 und mq5, die auch das bieten sollte, was Du brauchst.

Eventuell musst Du Dir einen Teil kopieren und anpassen.

Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XI). Kompatibilität mit MQL4 - Ereignisse des Schließens von Positionen
Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XI). Kompatibilität mit MQL4 - Ereignisse des Schließens von Positionen
  • www.mql5.com
Bei der Arbeit an der Definition von Ereignissen fiel mir auf, dass in MQL5 alle Zeitparameter in Millisekunden eingestellt sind. MQL4 verfügt über keine derartigen Auftrags- und Positionseigenschaften, aber nichts hindert uns daran, die Zeit in Sekunden, ausgedrückt in Millisekunden, für MQL4 zu verwenden. Mit anderen Worten, jede Zeit in...
 

In den Close Attributen hast du auch SL

du musst nur die history in einem gewissen zeitraum checken und dann kannst du die orders zählen

 

Hallo zusammen,

danke, das hat mir schon mal weitergeholfen, ich habe es jetzt wie folgt umgesetzt (MQL5):


void OnTick()
  {
     
     bool history = HistorySelectByPosition(positionInfo.Ticket());
     for(int y=HistoryDealsTotal()-1;y>=0;y--)     
      if(historyOrderInfo.SelectByIndex(y))
        if(historyOrderInfo.Symbol()==symbolInfo.Name() && historyOrderInfo.Magic()==MagicNr) 
          if(historyOrderInfo.TypeReason() == ORDER_REASON_SL)
            if(historyOrderInfo.OrderType() == ORDER_TYPE_BUY) {          

              countSL_Sell++;
              
            }else if (historyOrderInfo.OrderType() == ORDER_TYPE_SELL) {
               
              countSL_Buy++;
            }

...


habe dafür extra die historyOrderInfo.mqh um die Methode "TypeReason" erweitert, denn die konnte das nicht.

ENUM_ORDER_REASON TypeReason(void) const;

ENUM_ORDER_REASON CHistoryOrderInfo::TypeReason(void) const
  {
   return((ENUM_ORDER_REASON)HistoryOrderGetInteger(m_ticket,ORDER_REASON));
  }


Er zählt jetzt die ersten Tage im Tester so wie er soll pro Stop-Loss einen auf den jeweiligen Zähler, läuft dann aber nach drei vier Tagen amok und schlägt mir in einem einzigen Tick bei einem einzigen Deal mit ORDER_REASON_SL auf einen Schlg zwischen 9-ca.22 auf den Zähler drauf...

Im Protokoll wird aber wie gesgt nur ein nerer SL-bedingter Deal aufgeführt.

Was stimmt da nicht?

 
Tobse24:

Hallo zusammen,

danke, das hat mir schon mal weitergeholfen, ich habe es jetzt wie folgt umgesetzt (MQL5):



habe dafür extra die historyOrderInfo.mqh um die Methode "TypeReason" erweitert, denn die konnte das nicht.


Er zählt jetzt die ersten Tage im Tester so wie er soll pro Stop-Loss einen auf den jeweiligen Zähler, läuft dann aber nach drei vier Tagen amok und schlägt mir in einem einzigen Tick bei einem einzigen Deal mit ORDER_REASON_SL auf einen Schlg zwischen 9-ca.22 auf den Zähler drauf...

Im Protokoll wird aber wie gesgt nur ein nerer SL-bedingter Deal aufgeführt.

Was stimmt da nicht?

Du musst den zeitraum angeben in dem du suchen willst, das machst du mit HistorySelect

 

Hi amando, und wieder gebührt Dir mein Dank, das funktioniert jetzt mit der HistorySelect(0,TimeCurrent());

Aber er zählt jetzt blöderweise immer weiter hoch, selbst wenn ich meinen Zähler zwischenzeitlich auf 0 zurück setze check er ja bei jedem Tick die ganze Historie durch und trägt dann wieder alle Stopps ein, die darin vorkommen.

Wie sage ich ihm, dass er ab dem zweiten ausgelösten Stopp-Loss in einer Richtung die alte Historie vergessen/löschen soll und erst ab diesem Zeitpunkt mit einer Neuen beginnen darf?

Kann das ja nicht von der vergangenen Zeit in Sekunden oder Minuten abhängig machen…

 
Tobse24:

Hi amando, und wieder gebührt Dir mein Dank, das funktioniert jetzt mit der HistorySelect(0,TimeCurrent());

Aber er zählt jetzt blöderweise immer weiter hoch, selbst wenn ich meinen Zähler zwischenzeitlich auf 0 zurück setze check er ja bei jedem Tick die ganze Historie durch und trägt dann wieder alle Stopps ein, die darin vorkommen.

Wie sage ich ihm, dass er ab dem zweiten ausgelösten Stopp-Loss in einer Richtung die alte Historie vergessen/löschen soll und erst ab diesem Zeitpunkt mit einer Neuen beginnen darf?

Kann das ja nicht von der vergangenen Zeit in Sekunden oder Minuten abhängig machen…

Relativ einfach, setz den zähler vor der schleife einfach auf 0

dann beginnt er immer bei 0 und du bekommst das gewünschte ergebnis

 
amando:

Relativ einfach, setz den zähler vor der schleife einfach auf 0

dann beginnt er immer bei 0 und du bekommst das gewünschte ergebnis

Hi amando,


also das klappt nicht, da er sofort nach dem O-setzen ja wieder die ganze Historie durchcheckt und den Zähler dann wieder auf den Höchststand setzt.


habs jetzt so gelöst:


HistorySelect(start_time,TimeCurrent());


Die Variable start_time wird mit 0 initialisiert und bei bestimmten if-Kriterien einfach auf TimeCurrent() gesetzt und er zählt damit nur noch ab dem gewünschten Zeitpunkt. Die Zähler werden dann automatisch auf Null zurückgesetzt.


Der Profitfaktor hat sich durch die Methode nochmal erhöht

Grund der Beschwerde: