Code:
// GLOBALE VARIABLEN --- UM SIE IN ALLEN FUNKTIONEN ZU VERWENDEN!!!
//+------------------------------------------------------------------+
// --- Variablen vom Benutzer Festlegen: (Global)
//+------------------------------------------------------------------+
extern double HandelsLots = 0.1; // Größe der Handels Lots
extern double SL_Prozent = 0.5; // StopLoos in Prozent
extern double TP_Prozent = 1.5; // TakeProfit in Prozent
extern int MagicNummer = 12345;
//+------------------------------------------------------------------+
// --- Variablen fest Festlegen: (Global)
//+------------------------------------------------------------------+
datetime PeriondenStartZeit; // zum feststellen einer neuen Perionde
bool NeuePeriodeBegonnen;
bool LongSignal;
bool ShortSignal;
int LongOrder;
int ShortOrder;
// --- Strings für Symbole des Dax30 festlegen
string syDax = "EUREX.FDX";
//+------------------------------------------------------------------+
//| Expert initialization function - Start von EA |
//+------------------------------------------------------------------+
int OnInit()
{
//---
PeriondenStartZeit = Time[0];
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function - Ausführen beim Ende von EA |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function (StartZeit |
//+------------------------------------------------------------------+
void OnTick()
{
//---
double StoppLoss;
double TakeProfit;
bool OrderAngepasst;
int TP;
int SL;
double NachkommaTP;
double NachkommaSL;
// Überprüfen ob ein neuer Periodenbeginn vorliegt
if (PeriondenStartZeit != Time[0])
{
NeuePeriodeBegonnen = true;
PeriondenStartZeit = Time[0];
}
else NeuePeriodeBegonnen = false;
// --- MA20 für Dax Abfragen - Symbole durch die Strings ersetzt
double maDAX = iMA(syDax,0,20,0,MODE_SMA,PRICE_CLOSE,0);
// ---Aktuellen BID für Dax Abfragen
double bidDax = MarketInfo(syDax, MODE_BID);
//+------------------------------------------------------------------+
//| Berechnung AnzahlMA20 |
//+------------------------------------------------------------------+
double AnzahlMA20 = bidDax - maDAX;
// Anzeige auf Bildschirm
Comment("DAX =",AnzahlMA20);
//+------------------------------------------------------------------+
//| HandelsSignale ermitteln |
//+------------------------------------------------------------------+
if (NeuePeriodeBegonnen == true)
{
// --- Kauf Signal ---
if (bidDax>maDAX)
{
LongSignal = true;
}
else LongSignal = false;
// --- Verkauf Signal ---
if (bidDax<maDAX)
{
ShortSignal = true;
}
else ShortSignal = false;
}
else
{
LongSignal = false;
ShortSignal = false;
}
//+------------------------------------------------------------------+
//| Kauf / Verkauf Signal umsetzen |
//+------------------------------------------------------------------+
// Kaufen
if(LongSignal == true)
{
// Evtl Short Order vorher Schließen
if(ShortOrder>0)
{
if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true)
{
bool ShortOrderGeschlossen = OrderClose(ShortOrder,OrderLots(),Ask,10,Blue);
if (ShortOrderGeschlossen==true) ShortOrder=0;
Print("Short Order geschlossen bei ",AnzahlMA20);
}
}
// Jetzt erst Long Order eröffnen
while(LongOrder<=0)
{
LongOrder = OrderSend(syDax,OP_BUY,HandelsLots,Ask,10,0,0,"Dax30 LONG",MagicNummer,0,Green);
Print("Long Order geöffnet bei ",AnzahlMA20);
}
}
// Verkaufen
if (ShortSignal == true)
{
// Evtl Long Order vorher Schließen
if (LongOrder>0)
{
if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
{
bool LongOrderGeschlossen = OrderClose(LongOrder,OrderLots(),Bid,10,Blue);
if (LongOrderGeschlossen==true) LongOrder=0;
Print("Long Order geschlossen bei ",AnzahlMA20);
}
}
// Verkaufs Order jetzt eröffnen
while(ShortOrder<=0)
{
ShortOrder = OrderSend(syDax,OP_SELL,HandelsLots,Bid,10,0,0,"Dax30 SHORT",MagicNummer,0,Red);
Print("Short Order geöffnet bei ",AnzahlMA20);
}
}
//+------------------------------------------------------------------+
//|StopLoos und TakeProfit setzen |
//+------------------------------------------------------------------+
// SL bei Long Deals setzen - Erst aber umrechnung für 0,25 Schritt Broker
// Umrechnung SL_Prozent in 0,25er Schritten
StoppLoss = NormalizeDouble(OrderOpenPrice()/(1+(SL_Prozent/100.0)),2);
SL = (int)StoppLoss; //zur Sicherheit!
NachkommaSL = StoppLoss - SL;
if (NachkommaSL <= 0.12) StoppLoss = SL;
if (NachkommaSL > 0.12 && NachkommaSL <= 0.37) StoppLoss = SL + 0.25;
if (NachkommaSL > 0.37 && NachkommaSL <= 0.62) StoppLoss = SL + 0.5;
if (NachkommaSL > 0.62 && NachkommaSL <= 0.87) StoppLoss = SL + 0.75;
if (NachkommaSL > 0.87) StoppLoss = SL + 1.0;
// SL bei Long Deals setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
{
if(OrderCloseTime()==0 && OrderStopLoss()==0)
{
OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StoppLoss,OrderTakeProfit(),0,Yellow);
Print("SL für Long Order gesetzt bei = ",StoppLoss);
}
}
// SL bei Short Deals setzen - Erst aber umrechnung für 0,25 Schritt Broker
// Umrechnung SL_Prozent in 0,25er Schritten
StoppLoss = NormalizeDouble(OrderOpenPrice()*(1+(SL_Prozent/100.0)),2);
SL = (int)StoppLoss; //zur Sicherheit!
NachkommaSL = StoppLoss - SL;
if (NachkommaSL <= 0.12) StoppLoss = SL;
if (NachkommaSL > 0.12 && NachkommaSL <= 0.37) StoppLoss = SL + 0.25;
if (NachkommaSL > 0.37 && NachkommaSL <= 0.62) StoppLoss = SL + 0.5;
if (NachkommaSL > 0.62 && NachkommaSL <= 0.87) StoppLoss = SL + 0.75;
if (NachkommaSL > 0.87) StoppLoss = SL + 1.0;
// SL bei Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET)==true)
{
if(OrderCloseTime()==0 && OrderStopLoss()==0)
{
OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StoppLoss,OrderTakeProfit(),0,Yellow);
Print("SL für Short Order gesetzt bei = ",StoppLoss);
}
}
// TP bei Long Deals setzen - Erst aber umrechnung für 0,25 Schritt Broker
// Umrechnung TP_Prozent in 0,25er Schritten
TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_Prozent/100.0)),2);
TP = (int)TakeProfit; //zur Sicherheit!
NachkommaTP = TakeProfit - TP;
if (NachkommaTP <= 0.12) TakeProfit = TP;
if (NachkommaTP > 0.12 && NachkommaTP <= 0.37) TakeProfit = TP + 0.25;
if (NachkommaTP > 0.37 && NachkommaTP <= 0.62) TakeProfit = TP + 0.5;
if (NachkommaTP > 0.62 && NachkommaTP <= 0.87) TakeProfit = TP + 0.75;
if (NachkommaTP > 0.87) TakeProfit = TP + 1.0;
// TP bei Long Deals setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
{
if(OrderCloseTime()==0 && OrderTakeProfit()==0)
{
OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
Print("TP für Long Order gesetzt bei = ",TakeProfit);
}
}
// TP bei Short Deals setzen - Erst aber umrechnung für 0,25 Schritt Broker
// Umrechnung TP_Prozent in 0,25er Schritten
TakeProfit = NormalizeDouble(OrderOpenPrice()/(1+(TP_Prozent/100.0)),2);
TP = (int)TakeProfit; //zur Sicherheit!
NachkommaTP = TakeProfit - TP;
if (NachkommaTP <= 0.12) TakeProfit = TP;
if (NachkommaTP > 0.12 && NachkommaTP <= 0.37) TakeProfit = TP + 0.25;
if (NachkommaTP > 0.37 && NachkommaTP <= 0.62) TakeProfit = TP + 0.5;
if (NachkommaTP > 0.62 && NachkommaTP <= 0.87) TakeProfit = TP + 0.75;
if (NachkommaTP > 0.87) TakeProfit = TP + 1.0;
// TP bei Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET)==true)
{
if(OrderCloseTime()==0 && OrderTakeProfit()==0)
{
OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
Print("TP für Short Order gesetzt bei = ",TakeProfit);
}
}
// Ticketnummern nach schließen auf 0 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;
}
//+------------------------------------------------------------------+
}