Hallo liebe User,
habe folgendes Problem, das mir beim Backtest im MT4 nach einer neuen Kerze die Werte der letzten Kerze nicht zurückgegeben werden.
weder mit High[1] noch mit iHigh()
hier mein Code
Code:
void OnTick(){
//myComment = myCandleTrail(buySL,sellSL);
if(isNewBar()){
CheckForNewTrade(); //Eröffnet neue Trades
mySignal = SignalLage(); //Prüft ob ein Gegensignal vorliegt
//CandleTrail Stopp nachziehen
myComment = myCandleTrail(buySL,sellSL); //buySLPrice u. sellSLPrice aus Funktion wird übergeben
Comment(myComment);
Print(myComment);
}
//Comment(myComment);
if (SpeedControl == true)
f_BackTestSpeed(mySpeed,myComment);
}
isNewBar Funktion Methode 1:
Code:
bool isNewBar(){
static datetime lastTime= 0;
if(lastTime == 0)
lastTime = Time[0]; // Initialisierung beim ersten Tick
if(Time[0] == lastTime)
return(false);
else {
lastTime= Time[0];
return(true);
}
}
Funktion isNewBar Methode 2:
Code:
bool IsNewBar()
{
static int BarsOnChart=0;
if (Bars == BarsOnChart)
return (false);
BarsOnChart = Bars;
return(true);
}
Ich bekomme immer die Werte der vorletzten Kerze!
bei i = 2 bei i = 1 und bei i=0
Diesen kommischen Fehler bekomme ich beim Tester.
Funktion TrailingStopp:
Code:
//+------------------------------------------------------------------+
//| Funktion myCandleStop! |
//+------------------------------------------------------------------+
// Funktion myCandleStop gibt folgende Werte zurück
// buySLPrice = Stoppkurs für Kauforder, sellSLPrice = Stoppkurx für Sellorder
// cBuySL = Kerze des Stopps für Kauforder, cSellSL = Kerze des Stopps für SellOrder
// cB = ist der Wert
void myCandleStop(int cB,int cBRW, string mySig, double & buySLPrice, double & sellSLPrice, int & cBuySL, int & cSellSL){
int i = 1;
if (mySig=="Long"){
//int i = 1; //Shiftwert von der alktuellen Kerze
// gibt die Stoppkurse zurück
buySLPrice=iLow(_Symbol,_Period,iLowest(_Symbol,_Period,MODE_LOW,cB,i));
sellSLPrice=iHigh(_Symbol,_Period,iHighest(_Symbol,_Period,MODE_HIGH,cBRW,i));
// gibt die Kerze von der der Stoppkurs berechnet wurde zurück
cBuySL = iLowest(_Symbol,_Period,MODE_LOW,cB,i);
cSellSL = iHighest(_Symbol,_Period,MODE_HIGH,cBRW,i);
if (High[i]<sellSLPrice) sellSLPrice=High[i];
}
if (mySig=="Short"){
//int i = 1; //Shiftwert von der alktuellen Kerze
// gibt die Stoppkurse zurück
buySLPrice=iLow(_Symbol,_Period,iLowest(_Symbol,_Period,MODE_LOW,cBRW,i));
sellSLPrice=iHigh(_Symbol,_Period,iHighest(_Symbol,_Period,MODE_HIGH,cB,i));
// gibt die Kerze von der der Stoppkurs berechnet wurde zurück
cBuySL = iLowest(_Symbol,_Period,MODE_LOW,cBRW,i);
cSellSL = iHighest(_Symbol,_Period,MODE_HIGH,cB,i);
if (High[i]<sellSLPrice) sellSLPrice=High[i];
}
//return (0);
}
Ich hab diesen zusätztlichen Unsinn:
"if (High[i]<sellSLPrice) sellSLPrice=High[i];"
mal testweise in die Funktion zusätzlich eingesetzt.
Da nicht die Werte der letzten Kerze zurückgegeben werden, entstehen unnötige Fehltrades, wenn die letzte Kerze höher, bzw. tiefer als die vorletzte Kerze war.
Siehe Nr. 1 und 2 auf angehängter Grafik "NewBar".
Für Infos wäre ich dankbar.
Gruß
Günter