Download MetaTrader 5
To add comments, please log in or register
Use MQL5 Cloud Network. Test robots at a super speed!
Philipp Lemke
9
Philipp Lemke 2015.11.04 15:02 

Hello MT4 community,

I am relatively new to MT4 and during the course of the last weeks I tried to program a simple EA on my own. I am pretty sure I have all the parameters that are needed to make this EA work, however it does not take any trades in the backtester and I can´t seem to find the reason for it. The preinstalled sample MACD EA works just fine in the backtester and it has a similar structure. 

I´d be very thankful if someone had a look at it. Maybe I oversee the obvious again :/. Note: Variables are in German, however I indicated in English what each variable and function does.



extern double TakeProfit= 50;
extern double StopLoss= 25;
extern bool BreakevenBenutzen = true;        // Use Breakeven?
extern int WannZumBreakeven = 100;           // When to move to Breakeven
extern int PipsSichern =5;                   // Breakeven point + PipsSichern will equal new Stop Loss
extern bool TrailingStopBenutzen= true;      // Use Trailing Stop?
extern int WannAnfangenMitTrail= 100;        // When to start trail orders
extern int AbstandTrail = 50;                // How far behind should the Trailing Stop be

extern int SchnellerMa= 5;                   //Fast MA
extern int SchnellerMaAngewendetAuf= 0;
extern int SchnellerMaShift= 0;
extern int SchnellerMaMethode= 0;

extern int LangsamerMa= 21;                  //Slow MA
extern int LangsamerMaAngewendetAuf= 0;
extern int LangsamerMaShift= 0;
extern int LangsamerMaMethode= 0;

extern double LotSize= 0.1;
extern int MagicNumber= 123; // ID number of an EA 

double Pips= 0.0001;



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

                                                                 //Konvertierung von der richtigen Ticksize auf 3. bzw. 5 Digit Broker und anderen Währungspaaren
//Conversion of Digits for 3,4 and 5 Digit Broker
   double TickSize = MarketInfo(Symbol(),MODE_TICKSIZE);
   if (TickSize== 0.00001 || TickSize==0.001)
   Pips= TickSize*10;
   else Pips= TickSize;
  
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void Ontick()
  {
  
   if (OffeneOrderDiesesPaar(Symbol())>=1)             // Lässt die danach folgenden 2 If Statements nur laufen, wenn eine Order offen ist
   {
      if(BreakevenBenutzen)ZumBreakevenZiehen();          // Wenn man Breakeven auf true setzt, wird ZumBreakevenZiehen abgerufen                                              
      if(TrailingStopBenutzen)AnpassungTrailingStop();    // Wenn man Breakeven auf true setzt, wird AnpassungTrailingStop abgerufen
   }

   if (NeueKerze()==true)CheckForMaTrade();            //Wenn eine neue Kerze kommt, checke nach MA Signal


//END OF MAIN BODY
}

void ZumBreakevenZiehen ()                                     //Findet heraus, welche Orders von allen bereit zum Ziehen auf Breakeven sind, egal ob short oder long Position
{
//Breakeven for Buy Order
   for(int buy= OrdersTotal()-1; buy>=0; buy--)                   //Zählt alle Orders in einer Schleife runter bis zu >=0. B wird jedes mal um 1 verkleinert, um alle zu zählen.
   {
       if (OrderSelect(buy,SELECT_BY_POS,MODE_TRADES))             //Wenn am Anfang keine Position offen ist, würde b= -1 sein. Von daher muss dieser Filter eingebaut sein, um herauszufinden, ob überhaupt Positionen offen sind, bevor die Schleife weiter geht.
          if(OrderMagicNumber()==MagicNumber)                      //Identifiziert Orders, die zum Breakeven gezogen werden müssen anhand der Magic number
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)                               //Fragt nach Positionsrichtung
                   if (Bid-OrderOpenPrice()> WannZumBreakeven*Pips)   //Ist der jetzige Preis höher oder gleich dem Wert den wir oben für Breakeven gesetzt haben
                      if(OrderOpenPrice()>OrderStopLoss())            //Filtert die Orders, bei denen der ursprüngliche Stop noch aktiv ist. Wenn die Order schon zum Breakeven verschoben wurde müsste ja OrderStopLoss für diese Position größer bzw. genauso groß wie OrderOpenPrice sein.
                  
                 bool BreakevenLong = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+(PipsSichern*Pips),OrderTakeProfit(),0,clrNONE); //Modifikation der Long Orders+ Angabe zu Fehler, sollte diese nicht modifiziert werden
                      if(!BreakevenLong)
                       Print("Fehler bei Modifikation. Fehler Code=",GetLastError());
                      else
                       Print("Order erfolgreich modifiziert.");
   }
   
   
//Breakeven for Sell Order
   for (int sell=OrdersTotal()-1; sell>=0;sell--)
      {
         if(OrderSelect(sell,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_SELL)
                  if (OrderOpenPrice()-Ask>WannZumBreakeven*Pips)
                     if(OrderOpenPrice()<OrderStopLoss())
                  
                   bool BreakevenShort= OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-(PipsSichern*Pips),OrderTakeProfit(),0,clrNONE);
                        if(!BreakevenShort)
                         Print("Fehler bei Modifikation. Fehler Code=",GetLastError());
                        else
                         Print("Order erfolgreich modifiziert.");
      }
}



void AnpassungTrailingStop()
{

 //Trailing Stop for Buy Order
   for(int buy=OrdersTotal()-1;buy>=0;buy--)                      
   {
   if (OrderSelect(buy,SELECT_BY_POS,MODE_TRADES))
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_BUY)
               if(Bid-OrderOpenPrice()>WannAnfangenMitTrail*Pips)               
                 if(OrderStopLoss()<Bid-Pips*AbstandTrail)          //Guckt, ob der jetzige Stop bereits 50 Punkte oder weniger am Kurs dran ist
                   
                   bool NeuerTrailingStopBuyOrder=  OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(Pips*AbstandTrail),OrderTakeProfit(),0,clrNONE);
                        if(!NeuerTrailingStopBuyOrder)
                         Print("Fehler bei Buy Order Trailing Stop Modifikation. Fehler Code=",GetLastError());
                        else
                         Print("Buy Order Trailing Stop erfolgreich nachgezogen.");
   }
   
   
   
 //Trailing Stop for Sell Order
   for(int sell=OrdersTotal()-1;sell>=0;sell--)                      
   {
   if (OrderSelect(sell,SELECT_BY_POS,MODE_TRADES))
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_SELL)
               if(OrderOpenPrice()-Ask>WannAnfangenMitTrail*Pips)               
                 if(OrderStopLoss()>Ask+Pips*AbstandTrail|| OrderStopLoss()==0) // Der letzte Abschnitt in dieser Zeile muss eingebaut sein, damit die Schleife auch bei einem Stop Loss von 0 funktioniert  
    
                   bool NeuerTrailingStopSellOrder=  OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(Pips*AbstandTrail),OrderTakeProfit(),0,clrNONE);
                        if(!NeuerTrailingStopSellOrder)
                         Print("Fehler bei Sell Order Trailing Stop Modifikation. Fehler Code=",GetLastError());
                        else
                         Print("Sell Order Trailing Stop erfolgreich nachgezogen."); 
   
   
    }
}

// Checks for new candle
bool NeueKerze()                     //Kann überall eingefügt werden. Funktion zwingt die OrderEntry nur dann Trades einzugehen, wenn eine neue Kerze ensteht.
{
   static int KerzenAufChart= 0;    //Statische Funktionen werden nur einmal initialisiert. Dieser Abschnitt kontrolliert, wann eine neue Kerze abgeschlossen ist.
   if (Bars ==KerzenAufChart)
   return(false);
   KerzenAufChart = Bars;
   return(true);
}



                                                               //Spezifikationen der Moving Averages und Cross Signal

void CheckForMaTrade ()
{

int LongTrade;
int ShortTrade;


//MA Signals

double JetzigerSchneller   =  iMA(NULL,0,SchnellerMa,SchnellerMaShift,SchnellerMaMethode,SchnellerMaAngewendetAuf,1);
double VorherigerSchneller =  iMA(NULL,0,SchnellerMa,SchnellerMaShift,SchnellerMaMethode,SchnellerMaAngewendetAuf,2);

double JetzigerLangsamer   =  iMA(NULL,0,LangsamerMa,LangsamerMaShift,LangsamerMaMethode,LangsamerMaAngewendetAuf,1);
double VorherigerLangsamer =  iMA(NULL,0,LangsamerMa,LangsamerMaShift,LangsamerMaMethode,LangsamerMaAngewendetAuf,2);


//Order Entry Long
if(VorherigerSchneller<VorherigerLangsamer && JetzigerSchneller>JetzigerLangsamer && OffeneOrderDiesesPaar(Symbol())==0)
{
   LongTrade= OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),NULL,MagicNumber,0,Green);
      if (LongTrade>0)
      {
       if(OrderSelect(LongTrade,SELECT_BY_TICKET,MODE_TRADES))
               Print("BUY order opened : ",OrderOpenPrice());
       }
         else
            Print("Error opening BUY order : ",GetLastError());
         return;
}

//Order Entry Short
if(VorherigerSchneller>VorherigerLangsamer && JetzigerSchneller<JetzigerLangsamer && OffeneOrderDiesesPaar(Symbol()==0))
{
     ShortTrade= OrderSend(Symbol(),OP_SELL,LotSize,Bid,3,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),NULL,MagicNumber,0,Red);
         if (ShortTrade>0)
      {
            if(OrderSelect(ShortTrade,SELECT_BY_TICKET,MODE_TRADES))
               Print("Short order opened : ",OrderOpenPrice());
       }
         else
            Print("Error opening Short order : ",GetLastError());
         return;
}

}

//Check for open orders at the moment
int OffeneOrderDiesesPaar (string Paar)             //Kontrolliert offene Orders auf jedem Paar, auf das das EA angewendet wird und sendet diese an die Order Entry Funktion.
{
   int total=0;
      for (int i=OrdersTotal()-1; i>=0; i--)
      {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()== Paar) total++;
      }
      return (total);
      
}

   

    

whroeder1
13640
whroeder1 2015.11.04 15:09  
Sanka91: however it does not take any trades in the backtester and I can´t seem to find the reason for it.
  1. Are your books one column but two feet wide? No because that is unreadable. They are 6 inches, sometimes two columns, so you can read it easily. So should be your code. I'm not going to go scrolling (or moving my eyes) back and forth trying to read it. Edit the post with formatted code and you might get additional help.
  2. Since you're not getting an error message, it is your logic. Print out your variables, and find out why.
Philipp Lemke
9
Philipp Lemke 2015.11.04 15:32  
WHRoeder:
  1. Are your books one column but two feet wide? No because that is unreadable. They are 6 inches, sometimes two columns, so you can read it easily. So should be your code. I'm not going to go scrolling (or moving my eyes) back and forth trying to read it. Edit the post with formatted code and you might get additional help.
  2. Since you're not getting an error message, it is your logic. Print out your variables, and find out why.
Dear WHRoeder,

thanks for the input, I will try to find the error by printing the variables before I upload a new formatted code.
/
To add comments, please log in or register