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