EA - Problem mit Trailing Stop

 

Hallo zusammen,

ich bin relativ neu in der Programmierung in MQL5, habe aber ein paar Vorkenntnisse in C/C++.

Nun habe ich ein vermutlich einfach zu lösendes Problem, bei dem ich nicht weiterkomme.

Der EA soll unter bestimmten Bedingungen kaufen oder verkaufen (Unten Besipielhaft die Sell-Variante ohne die Bedingungen)

if (!(Trade.Sell(FixedVol, _Symbol, Bid))) {
            printf("Sorry, Something went wrong with your Entry \nErrorcode: " + _LastError);
            ResetLastError();
         }
         else 
            TrailingStop();   
      }

Die TrailingStop() Funktion sieht folgendermaßen aus:

void TrailingStop() {

   for (int i = PositionsTotal(); i > 0; i--) {
      if (PositionInfo.SelectByIndex(i)) {   
         PositionTicket = PositionGetInteger(POSITION_TICKET);   
      }
   }
              
   while (PositionSelect(_Symbol) && PositionInfo.Symbol() == Symbol() && PositionInfo.Magic() == MagicNumber) {
      
      CopyBuffer(SAR, 0, 0, 1, SARArray);

      if (!(Trade.PositionModify(PositionTicket, SARArray[0], 0))) {
         printf("Error while Position Modifying \nError: " + _LastError);
         ResetLastError();
      }
   }  
}
Der EA soll an den Trade, der zuvor ausgeführt wurde den Stop-Loss an den ParabolicSAR-Wert hängen bis der Trade in den Stop-Loss läuft.
Errors sind keine Vorhanden.

So, nun das Problem...
An den Einstiegskriterien kann es nicht liegen, dass er nur eine Position eröffnet (desswegen auch nicht gepostet) wird, da bei festen Stop-Loss, Take-Profit und ohne die TrailingStop() Funktion die Orders korrekt ausgeführt werden.
Der EA wird im DAX vom 1.1.16-31.10.17 getestet und geht diesen Trade immer am 13.9.17 ein. Vorher macht er keinen Trade, nur wenn ich wie oben erwähnt feste Stops usw. benutze. Danach macht er keinen Trade, weil kein Stop-Loss im Markt ist und der Trade bis zum Testende läuft.
Erwähnen sollte ich vielleicht noch, dass ich den Code mit dem TrailingStop (den oberen Teil bis zur while-Schleife) des öfteren im Internet gefunden habe

Ich hoffe ich habe euch alle Informationen gegeben und einer kann mir bei dem Problem behilflich sein. Dafür schon mal vielen Dank und noch einen schönen Abend :D
 
  1. Ich weiß nicht, ob ich Dir helfen kann, da ich (noch) nicht mit mt5 arbeite.
    Aber ;)
  2. Wenn Du Dir in TrailingStop() das Ticket holst, brauchst Du dann noch die while-Bedingung?
  3. Bist Du sicher, dass Du überhaupt in die while-Schleife kommst?
  4. Wenn ein EA im Tester nicht handelt, würde ich mir in Deinem Fall den SAR als Indikator auf den Chart holen, dann
  5. Schauen, wann er umschlägt und mir die
  6. relevanten Werte mit Comment() immer aktuell (revolvierender Array von Strings?) ausgeben lassen oder/und
  7. ab  kurz-vor  bis  kurz-nach mit einem Print die Werte ausgeben lassen.
 
Carl Schreiber:
  1. Ich weiß nicht, ob ich Dir helfen kann, da ich (noch) nicht mit mt5 arbeite.
    Aber ;)
  2. Wenn Du Dir in TrailingStop() das Ticket holst, brauchst Du dann noch die while-Bedingung?
  3. Bist Du sicher, dass Du überhaupt in die while-Schleife kommst?
  4. Wenn ein EA im Tester nicht handelt, würde ich mir in Deinem Fall den SAR als Indikator auf den Chart holen, dann
  5. Schauen, wann er umschlägt und mir die
  6. relevanten Werte mit Comment() immer aktuell (revolvierender Array von Strings?) ausgeben lassen oder/und
  7. ab  kurz-vor  bis  kurz-nach mit einem Print die Werte ausgeben lassen.

zu 2. Ich möchte die while-Schleife benutzen, damit der Stop immer den aktuellen Parabolic SAR Wert bekommt und da ich sowieso nur eine Position pro Markt eröffne, soll er den Stop solange nachziehen, bis keine Position mehr im Markt ist. (Mit dem Entry hab ich auch geklärt, ob der Stop-Loss bei einem Buy oder Sell benutzt wird. Also ein falscher Stop Loss kann es eigentlich nicht sein)

zu 3. Ich hab mal ein bisschen etwas verändert und du hast recht. Ich komme so nicht in die while-Schleife. Probeweise hab ich es mal so gemacht:

while (PositionSelect(_Symbol)) {

So komme ich in die while-Schleife rein, nur es wird im Tester dann ein Fehler ausgegeben, dass der Trade nicht modifiziert werden konnte.

Das spuckt das Journal aus:

2017.12.06 16:37:03.193    Core 1    2017.01.19 15:00:21   failed modify #2 sell 1.00 EURUSD sl: 1.07169, tp: 0.00000 -> sl: 1.07169, tp: 0.00000 [Invalid stops]
2017.12.06 16:37:03.193    Core 1    2017.01.19 15:00:21   CTrade::OrderSend: modify EURUSD (sl: 1.07169, tp: 0.00000) [invalid stops]
2017.12.06 16:37:03.193    Core 1    2017.01.19 15:00:21   Error while Position Modifying
2017.12.06 16:37:03.193    Core 1    2017.01.19 15:00:21   Error: 4756

Auch wenn ich eine TrailingStop Funktion für Sell und ein für Buy seperat benutze mit einem festen Abstand zur Position wird dieser Fehler ausgegeben.

Also z.B. für einen Sell:

if (!(Trade.PositionModify(PositionTicket, Ask + 250 * _Point, Ask - 250 * _Point)))

Ja, ich weiß, dass der niemals in einen Stop oder TP laufen wird in Kombination mit der while-Schleife. Jedoch bedeutet das für mich:

Irgendwas kann mit PositionTicket nicht stimmen. Ich weiß nur nicht was.

 

Lass Dir den aktuellen Preis ausgeben, denn:

  1. Vielleicht sind Deine Stopps zu nahe, oder
  2. auf der falschen Seite
  3. Wenn Du eine Kauf-Position hast gehst Du mit Ask 'rein und mit Bid (sl & tg) wieder raus!
  4. Denk nie: "Also ein falscher Stop Loss kann es eigentlich nicht sein" immer überprüfen, überprüfen, überprüfen,.. denn auch ein "eigentlich nicht" könnte einem blöden Denkfehler entsprungen sein!
Grund der Beschwerde: