Einzelnen Beitrag anzeigen
  #6 (permalink)  
Alt 06.03.19
gpi gpi ist offline
Neues Mitglied
 
Registriert seit: Nov 2017
Beiträge: 8
gpi befindet sich auf einem aufstrebenden Ast
Thumbs up

Hallo Traderdok, hab's so eingebunden und funktioniert auch nicht korrekt. Der Fehler tritt nur im Backtest auf.

Code:
void OnTick(){
      
      //myComment = myCandleTrail(buySL,sellSL);
      //if(IsNewCandle()){
      if (OldTime != Time[0]) {
         //Kerzenabfrage
         
         CheckForTrade();
         mySignal = SignalLage();
         //CandleTrail Stopp nachziehen
         myComment = myCandleTrail(buySL,sellSL); //buySLPrice u. sellSLPrice aus Funktion wird übergeben
         Comment(myComment);
         Print(myComment);
      //}
     
        OldTime = Time[0];
      }    
     
     //Comment(myComment);
     if (SpeedControl == true)
         f_BackTestSpeed(mySpeed,myComment);
}
Progamm hat folgenden Ablauf:

Code:
Bei jedem Tick: Prüfung ob neue Kerze => Wenn nein, nichts

Wenn ja:  
  1. Prüfen ob neuer Trade zu machen ist  =>
     Wenn ja: 1. Trade wird eröffnet! Funktion CheckForTrade
                 Diese öffnet zuerst Trade und setzt danach TakeProfit und den initialten Stopp ist (sehr weit weg) mittel OrderModify
              2. Funktion: SignalLage Prüft bei jeder neuen Kerze ob ein Gegensignal vorliegt und speichert dis in mySignal.
                 Dann wird der Stopp näher gezogen als sonst. Siehe Funktion myCandleStop oben im Post Stopp letzets Tief der x-Kerzen
                 zB. noch kein Gebensignal 20 Kerzen und Gegensignal nur mehr 3 Kerzen
              3. Funktion myCandleTrail wird aufgerufen: diese ruft als 1. die Funktion myCandleStop auf und fragt
              
                      string myCandleTrail(double buySLPrice,double sellSLPrice){
                              myCandleStop(cBack,cBackRW,mySignal,buySL,sellSL,cBuyStop,cSellStop);
                              string myCom = ("\nbuySL: " + DoubleToString(buySL,Digits) + "  Kerze: " + IntegerToString(cBuyStop) +
                              "\nsellStop: " + DoubleToString(sellSL,Digits) + "  Kerze: " + IntegerToString(cSellStop) +
                              "\n\nSignal: " + mySignal);
                              //buy order section
                              for(int b=OrdersTotal()-1;b>=0;b--){
                                 if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
                                    if(OrderMagicNumber()==MagicNumber)
                                       if(OrderSymbol()==Symbol())
                                          if(OrderType()==OP_BUY)
                                             if(OrderStopLoss() < buySLPrice-PadAmount)
                                                //Print("GP: BuySL: ", buySL2-PadAmount2);
                                                if(!OrderModify(OrderTicket(),OrderOpenPrice(),buySLPrice-PadAmount,OrderTakeProfit(),0,CLR_NONE))
                                                   Print("error modifying buy order ",GetLastError());
                             }
                             //sell order section
                             for(int s=OrdersTotal()-1;s>=0;s--){
                             if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
                                 if(OrderMagicNumber()== MagicNumber)
                                    if(OrderSymbol()==Symbol())
                                       if(OrderType()==OP_SELL)
                                          if(OrderStopLoss()>sellSLPrice+PadAmount2)
                                          // Print("GP: sellSL: ", sellSL2);
                                             if(!OrderModify(OrderTicket(),OrderOpenPrice(),sellSLPrice+PadAmount2,OrderTakeProfit(),0,CLR_NONE))
                                                Print("error modifying sell order ",GetLastError());
                            }
                            return (myCom); //Rückgabe für Ausgabe auf Chart von welcher Kerze Nr. und Preis für beide Richtungen
Es passiert beim Backtest folgendes:

Neue Kerze => Trade wird eröffnet, =>
Inital-SL u. TP werden gesetzt, =>
SL wird falsch gesetzt, falls die letzte Kerze die höchste oder tiefste Kerze war, da die Berechnung des Stopps im Backtest anscheinend immer ab der vorletzten Kerze beginnt.

Der Shitfwert wird eigentlich von der Variable "i" aus der Funktion myCandleStop bestimmt.

Gruß

Günter