Danke für die Antwort Traderdoc. Es hat mir geholfen und ich hab es so umgesetzt. Er setzt jetzt schon zuerst beim Kreuzen die richtige Order - aber nach dem Teke Profit setzt er gleich die nächste Order ohne, dass tatsächlich eine Kreuzung stattgefunden hat (siehe Bild). Da kann ja nicht sein.
Beim kompilieren kommen aber nur noch Wrnhinweise 'implicit conversion from string to number'. Aber das kann doch nicht der Grund sein oder doch?
Code:
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
extern int MA_Periode_lang = 30;
extern int MA_Periode_kurz = 8;
extern double HandelsLots = 0.1, SL_prozent = 0.5, TP_prozent = 1.5;
extern int MagicNummer = 12345;
extern int OrdersTotal;
// Globale Variable
datetime PeriodenStartZeit;
bool NeuePeriodeBegonnen,LongSignal,ShortSignal;
int LongOrder, ShortOrder;
//void Sleep(int milliseconds);
//int TimeWaiting = 0;
int OnInit()
{
//---
PeriodenStartZeit = Time[0];
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
//void OnTick()
// {
//---
// }
//+------------------------------------------------------------------+
// expert function
int start ()
{
// Überprüfen ob neuer Periodenbeginn vorliegt
if(PeriodenStartZeit != Time[0])
{
NeuePeriodeBegonnen = true;
PeriodenStartZeit = Time[0];
}
else NeuePeriodeBegonnen = false;
// Marktdaten ermitteln
double MA_lang = iMA(NULL,0,MA_Periode_lang,0,0,0,1);
double MA_lang_Vorperiode = iMA(NULL,0,MA_Periode_lang,0,0,0,2);
double MA_kurz = iMA(NULL,0,MA_Periode_kurz,0,0,0,1);
double MA_kurz_Vorperiode = iMA(NULL,0,MA_Periode_kurz,0,0,0,2);
if (LongSignal == false && ShortSignal == false)
{
// Handelssignale ermitteln
if(NeuePeriodeBegonnen == true)
{
// Buy Signal
if(MA_lang < MA_kurz && MA_lang_Vorperiode >= MA_kurz_Vorperiode)
{
LongSignal = true;
}
else LongSignal = false;
// Sell Signal
if(MA_lang > MA_kurz && MA_lang_Vorperiode <= MA_kurz_Vorperiode)
{
ShortSignal = true;
}
else ShortSignal =false;
}
else
{
LongSignal = false;
ShortSignal = false;
}
}
// LongSignale umsetzen
if (LongSignal == true)
{
// eventuell Short Order schließen
if (ShortOrder>0)
{
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == 0)
{
bool ShortOrderGeclosed = OrderClose(ShortOrder,HandelsLots,Ask,10,Blue);
if (ShortOrderGeclosed == true) ShortOrder = 0;
}
}
while (LongOrder <= 0)
{
LongOrder = OrderSend(Symbol(),OP_BUY, HandelsLots,Ask,10,0,"MAXing Long",MagicNummer,0,Green);
}
}
if (ShortSignal == true)
{
// eventuell Long Order schließen
if (LongOrder>0)
{
if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
{
bool LongOrderGeclosed = OrderClose(LongOrder,HandelsLots,Bid,10,Blue);
if (LongOrderGeclosed == true) LongOrder = 0;
}
}
while (ShortOrder <= 0)
{
ShortOrder = OrderSend(Symbol(),OP_SELL, HandelsLots,Bid,10,0,"MAXing Short",MagicNummer,0,Red);
}
}
/* // SL Long Deals setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
{
if (OrderCloseTime() == 0 && OrderStopLoss()==0)
{
double StopLoss = NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits);
bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
}
}
// SL Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
{
if (OrderCloseTime() == 0 && OrderStopLoss()==0)
{
double StopLoss = NormalizeDouble(OrderOpenPrice()*(1+(SL_prozent/100)),Digits);
bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
}
} */
// TP Long Deals setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
{
if (OrderCloseTime() == 0 && OrderTakeProfit()==0)
{
double TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits);
bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
}
}
// TP Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
{
if (OrderCloseTime() == 0 && OrderTakeProfit()==0)
{
double TakeProfit = NormalizeDouble(OrderOpenPrice()/(1+(TP_prozent/100)),Digits);
bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
}
}
// Ticketnummern nach Closing zurücksetzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
{
if (OrderTicket()>0 && OrderCloseTime()>0) LongOrder = 0;
}
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
{
if (OrderTicket()>0 && OrderCloseTime()>0) ShortOrder = 0;
}
return(0);
}