EA öffnet Trades nicht wie programmiert
Hallo Leute
Mein EA läuft in einem Offline Chart und es gibt 2 Probleme
-Es werden Trades außerhalb des Zeitfensters geöffnet
-Im Zeitfenster werden Trades manchmal geöffnet und manchmal nicht
Weiters teste ich den EA mit 2 Brokern und teils bemerke ich, dass er bei Broker A den Trade um 10 Uhr öffnet und bei Broker B nicht, obwohl die Bedingungen ebenfalls erfüllt wären.
Ich sende nachfolgend die komplette onTick() Methode (Ich habe auf anderen Seiten gelesen, dass es mit dieser Methode in Offline Charts zu Problemen kommen kann, verstehe dies jedoch nicht, da es sonst ja zu keinen Trades kommen dürfte oder?). Wir haben einen 5-digit-broker mit einer anderen Zeitzone als jener in der wir leben (FXCM und GKFX). Dies haben wir jedoch berücksichtigt.
Desweiteren erfolgen bei Währungspaaren mit JPY keinerlei Einstiege, was mir auch noch ein Rätsel ist.
Ich vermute einen Fehler in den Teilen LongTrade/ShortTrade öffnen, sende jedoch zur Sicherheit die komplette onTick() Methode.
PHP-Code:
void OnTick()
{
//Initialisierung
ValueOfLastUpperBB = iBands(NULL, 0, 12, 2, 0, PRICE_CLOSE, MODE_UPPER, 1);
ValueOfLastLowerBB = iBands(NULL, 0, 12, 2, 0, PRICE_CLOSE, MODE_LOWER, 1);
ValueOfLastMainBB = iBands(NULL, 0, 12, 2, 0, PRICE_CLOSE, MODE_MAIN, 1);
ValueOfLastMACD = iCustom(NULL, 0, "MACD nrp", 12, 26, 9, 0, 0, 1);
ValueOfLastSignal = iCustom(NULL, 0, "MACD nrp", 12, 26, 9, 0, 3, 1);
//Berechnung der Lotgrößen bei gegebenen Risiko
AllowedValuePerPoint = RisikoProTradeInBasiswaehrung/StopLoss*10;
ValuePerPointAndLotInBasisCurrency = 0.0001/Ask*100000;
LotSize = AllowedValuePerPoint/ValuePerPointAndLotInBasisCurrency;
//Bedingung für Zeitfenster
if(((starttimeVM()<=TimeCurrent())&&(TimeCurrent()<endtimeVM())) || ((starttimeNM()<=TimeCurrent())&&(TimeCurrent()<endtimeNM())))
{
//Kein Trade wenn Trend schon besteht!
if(FirstTickInTime==true)
{
if((ValueOfLastMACD>0) && (ValueOfLastMACD>ValueOfLastSignal))
{
TradePossible = false;
}
if((ValueOfLastMACD<0) && (ValueOfLastMACD<ValueOfLastSignal))
{
TradePossible = false;
}
FirstTickInTime = false;
}
//Trade wieder möglich machen wenn Trend gebrochen wird!
if(TradePossible == false)
{
if((ValueOfLastMACD>0) && (ValueOfLastMACD<ValueOfLastSignal))
{
TradePossible = true;
}
if((ValueOfLastMACD<0) && (ValueOfLastMACD>ValueOfLastSignal))
{
TradePossible = true;
}
}
//Bedingungen für Long Trade öffnen!
if((ValueOfLastMACD>0) && (ValueOfLastMACD>ValueOfLastSignal) && (MarketInfo(NULL, MODE_ASK)>=ValueOfLastUpperBB) && (LongTradeAllowed==true) && (LongTradeAllowedInThisSection==true) && (TradePossible == true))
{
LongTradeStarted = Ask;
LongLotSize = LotSize;
LongOrderTicketNumber = OrderSend(NULL, OP_BUY, LongLotSize, LongTradeStarted, 3, (LongTradeStarted - StopLoss*Point),
(LongTradeStarted + TakeProfit*Point), NULL, 1234, 0, clrGreen);
if(LongOrderTicketNumber<1)
{
error=GetLastError();
Print("Error = ",ErrorDescription(error));
}
else
{
OrderSelect(LongOrderTicketNumber,SELECT_BY_TICKET);
OrderModify(LongOrderTicketNumber,OrderOpenPrice(),(LongTradeStarted - StopLoss*Point), (LongTradeStarted + TakeProfit*Point),0,clrGreen);
OrderPrint();
}
LongTradeAllowed = false;
LongTradeAllowedInThisSection = false;
LongStopShifted = false;
}
//Bedingungen für Short Trade öffnen!
if((ValueOfLastMACD<0) && (ValueOfLastMACD<ValueOfLastSignal) && (MarketInfo(NULL, MODE_BID)<=ValueOfLastLowerBB) && (ShortTradeAllowed==true) && (ShortTradeAllowedInThisSection==true) && (TradePossible == true))
{
ShortTradeStarted = Bid;
ShortLotSize = LotSize;
ShortOrderTicketNumber = OrderSend(NULL, OP_SELL, ShortLotSize, ShortTradeStarted, 3, (ShortTradeStarted + StopLoss*Point),
(ShortTradeStarted - TakeProfit*Point), NULL, 1234, 0, clrRed);
if(ShortOrderTicketNumber<1)
{
error=GetLastError();
Print("Error = ",ErrorDescription(error));
}
else
{
OrderSelect(ShortOrderTicketNumber,SELECT_BY_TICKET);
OrderModify(ShortOrderTicketNumber,OrderOpenPrice(),(ShortTradeStarted - StopLoss*Point), (ShortTradeStarted + TakeProfit*Point),0,clrRed);
OrderPrint();
}
ShortTradeAllowed = false;
ShortTradeAllowedInThisSection = false;
ShortStopShifted = false;
}
}
//Bedingungen für Long Trade schließen
if(LongTradeAllowed==false)
{
//Stop nachsetzen!
if(LongStopShifted==false)
{
if((MarketInfo(NULL, MODE_ASK)>=(LongTradeStarted + StopLoss*Point)) || (ValueOfLastMainBB >= LongTradeStarted))
{
LongSpreadAtShift = MarketInfo(NULL, MODE_SPREAD)*Point;
LongOrderSuccessfulModified = OrderModify(LongOrderTicketNumber, OrderOpenPrice(), (LongTradeStarted+LongSpreadAtShift), (LongTradeStarted+TakeProfit*Point),
0, clrBlue);
LongStopShifted = true;
}
}
//Trend wird verlassen!
if((ValueOfLastMACD<0) || (ValueOfLastMACD<ValueOfLastSignal))
{
LongOrderSuccessfulClosed = OrderClose(LongOrderTicketNumber, LongLotSize, MarketInfo(NULL, MODE_BID), 3, clrRed);
LongTradeAllowed = true;
LongTradeAllowedInThisSection = true;
}
//Trade wurde durch SL oder TP beendet!
if(LongStopShifted==false)
{
if((MarketInfo(NULL, MODE_BID)>=(LongTradeStarted + TakeProfit*Point)) || (MarketInfo(NULL, MODE_BID)<=(LongTradeStarted - StopLoss*Point)))
{
LongTradeAllowed=true;
}
}
if(LongStopShifted==true)
{
if((MarketInfo(NULL, MODE_BID)>=(LongTradeStarted + TakeProfit*Point)) || (MarketInfo(NULL, MODE_BID)<=(LongTradeStarted + LongSpreadAtShift)))
{
LongTradeAllowed=true;
}
}
}
//Bedingungen für Short Trade schließen
if(ShortTradeAllowed==false)
{
//Stop nachsetzen!
if(ShortStopShifted==false)
{
if((MarketInfo(NULL, MODE_BID)<= (ShortTradeStarted - StopLoss*Point)) || ((ValueOfLastMainBB <= ShortTradeStarted)))
{
ShortSpreadAtShift = MarketInfo(NULL, MODE_SPREAD)*Point;
ShortOrderSuccessfulModified = OrderModify(ShortOrderTicketNumber, OrderOpenPrice(), (ShortTradeStarted-ShortSpreadAtShift), (ShortTradeStarted-TakeProfit*Point),
0, clrBlue);
ShortStopShifted = true;
}
}
//Trend wird verlassen!
if((ValueOfLastMACD>0) || (ValueOfLastMACD>ValueOfLastSignal))
{
ShortOrderSuccessfulClosed = OrderClose(ShortOrderTicketNumber, ShortLotSize, MarketInfo(NULL, MODE_ASK), 3, clrGreen);
ShortTradeAllowed = true;
ShortTradeAllowedInThisSection = true;
}
//Trade wurde durch SL oder TP beendet!
if(ShortStopShifted==false)
{
if((MarketInfo(NULL, MODE_ASK)<=(ShortTradeStarted - TakeProfit*Point)) || (MarketInfo(NULL, MODE_ASK)>=(ShortTradeStarted + StopLoss*Point))) //Aufpassen weil ShortTradeStarted von wirklichen Kaufpreis abweichen kann!!
{
ShortTradeAllowed=true;
}
}
if(ShortStopShifted==true)
{
if((MarketInfo(NULL, MODE_ASK)<=(ShortTradeStarted - TakeProfit*Point)) || (MarketInfo(NULL, MODE_ASK)>=(ShortTradeStarted - ShortSpreadAtShift)))
{
ShortTradeAllowed=true;
}
}
}
//Long Trades wieder erlauben, wenn Trend gebrochen wird!
if(LongTradeAllowedInThisSection==false)
{
if((ValueOfLastMACD<ValueOfLastSignal) || (ValueOfLastMACD<0))
{
LongTradeAllowedInThisSection = true;
}
}
//Short Trades wieder erlauben, wenn Trend gebrochen wird!
if(ShortTradeAllowedInThisSection==false)
{
if((ValueOfLastMACD>ValueOfLastSignal) || (ValueOfLastMACD>0))
{
ShortTradeAllowedInThisSection = true;
}
}
//Trades schließen nach Handelszeit
if(((LSVM()<=TimeCurrent())&&(TimeCurrent()<(LSVM()+180))) ||
((LSNM()<=TimeCurrent())&&(TimeCurrent()<(LSNM()+180))))
{
if(LongTradeAllowed==false)
{
LastShortOrderSuccessfulClosed = OrderClose(LongOrderTicketNumber, LongLotSize, MarketInfo(NULL, MODE_BID), 3, clrRed);
}
if(ShortTradeAllowed==false)
{
LastShortOrderSuccessfulClosed = OrderClose(ShortOrderTicketNumber, ShortLotSize, MarketInfo(NULL, MODE_ASK), 3, clrGreen);
}
LongTradeAllowed = true;
ShortTradeAllowed = true;
LongTradeAllowedInThisSection = true;
ShortTradeAllowedInThisSection = true;
LongStopShifted = false;
ShortStopShifted = false;
FirstTickInTime = true;
TradePossible = true;
}
}
datetime starttimeVM()
{ string currentdatestr=TimeToString(TimeCurrent(),TIME_DATE);
string datetimenow=currentdatestr+" " + StartVM;
return StringToTime(datetimenow);
}
datetime starttimeNM()
{ string currentdatestr=TimeToString(TimeCurrent(),TIME_DATE);
string datetimenow=currentdatestr+" " + StartNM;
return StringToTime(datetimenow);
}
datetime endtimeVM()
{ string currentdatestr=TimeToString(TimeCurrent(),TIME_DATE);
string datetimenow=currentdatestr+" " + EndeVM;
return StringToTime(datetimenow);
}
datetime endtimeNM()
{ string currentdatestr=TimeToString(TimeCurrent(),TIME_DATE);
string datetimenow=currentdatestr+" " + EndeNM;
return StringToTime(datetimenow);
}
datetime LSVM()
{ string currentdatestr=TimeToString(TimeCurrent(),TIME_DATE);
string datetimenow=currentdatestr+" " + LetzterTradeSchliessenVM;
return StringToTime(datetimenow);
}
datetime LSNM()
{ string currentdatestr=TimeToString(TimeCurrent(),TIME_DATE);
string datetimenow=currentdatestr+" " + LetzterTradeSchliessenNM;
return StringToTime(datetimenow);
}
bool checktime(datetime start,datetime end)
{
datetime dt=TimeCurrent(); // current time
if(start<end) if(dt>=start && dt<end) return(true); // check if we are in the range
if(start>=end) if(dt>=start|| dt<end) return(true);
return(false);
}
|