Wieso führt mein EA keine Orders aus?

 

Hallo, liebe Community,

Um mich in EA's einzuarbeiten habe ich den EA aus der Playlist im Anhang nachgebaut bzw. versucht nachzubauen. Oben musste ich jedoch die folgenden globalen Variablen definieren, um fehlerfrei durch das Kompilieren zu gelangen (was der Videoersteller nicht tun musste).

bool OrderAngepasst;

double StopLoss, TakeProfit;

Mein Problem im Strategietester ist nun:

1) Zum einen sehe ich keine zeitraum-Einstekllungen (für den Backtest) in meinem Strategietester (was wahrscheinlich an der version liegen wird (Version 5.00 build 1601))

2) Zum anderen, & das ist das eigentliche Problem, zeigt der EA im Strategietester keine Tradesignal oder irgendwas brauchbares ausser den normalen chart an (Ich weiß, Moving Averages muss man natürlich selbst zufügen) Hoffe ich darf den code hier Posten:

//globale externe Variablen
extern int MA_lang =200;
extern int MA_kurz =50;
extern double SL_prozent =0.666, HandelsLots =0.01, TP_prozent=1.5;
extern int MagicNummer = 12345;

//globale Variablen
datetime PeriodenStartzeit;
bool NeuePeriodeBegonnen,LongSignal,ShortSignal,OrderAngepasst;
int LongOrder,ShortOrder;
double StopLoss, TakeProfit;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PeriodenStartzeit = Time[0];
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
int start()
{

//Überprüfen ob neuer Periodenbeginn vorliegt
if (PeriodenStartzeit !=Time[0])
    {NeuePeriodeBegonnen =true;
     PeriodenStartzeit =Time[0];
     }
     else NeuePeriodeBegonnen =false;
     

//Marktdaten überprüfen
double MAlang =iMA (NULL,0,MA_lang,0, MODE_SMA, PRICE_CLOSE,1);
double MAlangVorperiode =iMA(NULL,0,MA_lang,0, MODE_SMA, PRICE_CLOSE,2);
double MAkurz =iMA(NULL ,0,MA_kurz,0, MODE_SMA, PRICE_CLOSE,1);
double MAkurzVorperiode =iMA (NULL ,0,MA_kurz,0, MODE_SMA, PRICE_CLOSE,2);

//handelssignale ermitteln
   if(NeuePeriodeBegonnen == true)
      {
     //Buy Signal
      if (MAkurz>MAlang && MAkurzVorperiode<=MAlangVorperiode) 
         {LongSignal =true;}
         else LongSignal =false;
      }

     //Sell Signal
      if (MAkurz<MAlang && MAkurzVorperiode>=MAlangVorperiode)
         {ShortSignal = true;}
         else {ShortSignal = false;LongSignal =false;}

//Long Signale umsetzen
if (LongSignal == true)

 //Evtl. Short Order schließen
   if (ShortOrder>0)
      {
      if (OrderSelect(ShortOrder, SELECT_BY_TICKET)==true)
         {
         bool ShortOrderGeclosed = OrderClose (ShortOrder,OrderLots(),Ask,10,Blue);
         if (ShortOrderGeclosed ==true) ShortOrder =0;
         }
      }

   
   {while (LongOrder<=0)
      {
      LongOrder = OrderSend (Symbol(),OP_BUY,HandelsLots,Ask,10,0,0,"einfach Long",MagicNummer,0,Green);
      }  }
      
      
//Short Signale umsetzen
if (ShortSignal == true)

  //Evtl. Long Order schließen
   if (LongOrder>0)
   {
   if(OrderSelect(LongOrder, SELECT_BY_TICKET)==true)
      {
      bool LongOrderGeclosed = OrderClose (LongOrder,OrderLots(),Bid,10,Blue);
      if (LongOrderGeclosed ==true) LongOrder =0;
      }
   }
  
   //Short Order eröffnen
   {while (ShortOrder<=0)
      {
      ShortOrder = OrderSend (Symbol(),OP_SELL,HandelsLots,Bid,10,0,0,"einfach Short",MagicNummer,0,Red);
      }

   }

//SL Long Deals setzen
if (OrderSelect (LongOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderStopLoss()==0)
      {
     StopLoss = NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits);
     OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
      }
   }
   
 //SL Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderStopLoss()==0)
      {
      StopLoss= NormalizeDouble(OrderOpenPrice()*(1+(SL_prozent/100)),Digits);
      OrderAngepasst =OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
      }
   }

//TP Long Deals setzen
if (OrderSelect (LongOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderTakeProfit()==0)
      {
    TakeProfit= NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits);
     OrderAngepasst =OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      }
   }
   
//TP Short Deals setzen
if (OrderSelect (ShortOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderTakeProfit()==0)
      {
     TakeProfit= NormalizeDouble(OrderOpenPrice()/(1+(TP_prozent/100)),Digits);
     OrderAngepasst =OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      }
   }
   
//Ticketnummern nach Closing 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;
   }

return (0);
//
}
EA Selbst Programmieren - Schritt für Schritt Videoserie (36+ Videos)
EA Selbst Programmieren - Schritt für Schritt Videoserie (36+ Videos)
  • www.youtube.com
Wie Sie selbst Schritt für Schritt einen einfachen Expert Advisor EA für MetaTrader 4 MT4 programmieren können, erklärt Ihnen Cristof Ensslin von mindful FX,...
 
Baynez:


Falls mein Beitrag doppelt erscheint, sorry- hatte eben geantwortet und sehe die Antwort hier nicht.


Du hast eine Funktion start() definiert aber nicht im OnTick aufgerufen.

Mit F2 brauchst Du vor dem Test natürlich Historiendaten, welche Du herunterladen musst.

Das Strategiefenster müsstest Du größer ziehen, die Zeitdaten (Test-Zeitraum und TF) müssen auf jeden Fall da sein.


//SNIP:::::::::::::::::::
//--- input parameters
//globale externe Variablen
extern int MA_lang =200;
extern int MA_kurz =50;
extern double SL_prozent =0.666, HandelsLots =0.01, TP_prozent=1.5;
extern int MagicNummer = 12345;

//globale Variablen
datetime PeriodenStartzeit;
bool NeuePeriodeBegonnen,LongSignal,ShortSignal,OrderAngepasst;
int LongOrder,ShortOrder;
double StopLoss, TakeProfit;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PeriodenStartzeit = Time[0];
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   
//Überprüfen ob neuer Periodenbeginn vorliegt
if (PeriodenStartzeit !=Time[0])
    {NeuePeriodeBegonnen =true;
     PeriodenStartzeit =Time[0];
     }
     else NeuePeriodeBegonnen =false;
     

//Marktdaten überprüfen
double MAlang =iMA (NULL,0,MA_lang,0, MODE_SMA, PRICE_CLOSE,1);
double MAlangVorperiode =iMA(NULL,0,MA_lang,0, MODE_SMA, PRICE_CLOSE,2);
double MAkurz =iMA(NULL ,0,MA_kurz,0, MODE_SMA, PRICE_CLOSE,1);
double MAkurzVorperiode =iMA (NULL ,0,MA_kurz,0, MODE_SMA, PRICE_CLOSE,2);

//handelssignale ermitteln
   if(NeuePeriodeBegonnen == true)
      {
     //Buy Signal
      if (MAkurz>MAlang && MAkurzVorperiode<=MAlangVorperiode) 
         {LongSignal =true;}
         else LongSignal =false;
      }

     //Sell Signal
      if (MAkurz<MAlang && MAkurzVorperiode>=MAlangVorperiode)
         {ShortSignal = true;}
         else {ShortSignal = false;LongSignal =false;}

//Long Signale umsetzen
if (LongSignal == true)

 //Evtl. Short Order schließen
   if (ShortOrder>0)
      {
      if (OrderSelect(ShortOrder, SELECT_BY_TICKET)==true)
         {
         bool ShortOrderGeclosed = OrderClose (ShortOrder,OrderLots(),Ask,10,Blue);
         if (ShortOrderGeclosed ==true) ShortOrder =0;
         }
      }

   
   {while (LongOrder<=0)
      {
      LongOrder = OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,10,0,0,"einfach Long",MagicNummer,0,Green);
      }  }
      
      
//Short Signale umsetzen
if (ShortSignal == true)

  //Evtl. Long Order schließen
   if (LongOrder>0)
   {
   if(OrderSelect(LongOrder, SELECT_BY_TICKET)==true)
      {
      bool LongOrderGeclosed = OrderClose(LongOrder,OrderLots(),Bid,10,Blue);
      if (LongOrderGeclosed ==true) LongOrder =0;
      }
   }
  
   //Short Order eröffnen
   {while (ShortOrder<=0)
      {
      ShortOrder = OrderSend(Symbol(),OP_SELL,HandelsLots,Bid,10,0,0,"einfach Short",MagicNummer,0,Red);
      }

   }

//SL Long Deals setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderStopLoss()==0)
      {
     StopLoss = NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits);
     OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
      }
   }
   
 //SL Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderStopLoss()==0)
      {
      StopLoss=NormalizeDouble(OrderOpenPrice()*(1+(SL_prozent/100)),Digits);
      OrderAngepasst=OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
      }
   }

//TP Long Deals setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderTakeProfit()==0)
      {
    TakeProfit=NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits);
     OrderAngepasst=OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      }
   }
   
//TP Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
   {
   if (OrderCloseTime()==0 && OrderTakeProfit()==0)
      {
     TakeProfit=NormalizeDouble(OrderOpenPrice()/(1+(TP_prozent/100)),Digits);
     OrderAngepasst=OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      }
   }
   
//Ticketnummern nach Closing 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;
   }

//return ();
//
}
//SNAP:::::::::::::::::
 

Ich vermute mal Du arbeitest mit einem MT5, die aktuelle Version des MT5 ist aber build 1881 (nicht 1601).

  1. Wenn Du bei einem Broker (bei MT5 kann es auch Metaquotes sein) eingeloggt wärst, würde sich das Terminal selbst updaten (inkl. allem anderen).
  2. Allerdings ohne Brokerverbindung gibt es keine historischen Daten inkl. allem Anderem wie Kontraktspezifikationen (kommen eben von dem) und damit keine Backtests.
  3. Wenn was nicht läuft wie erwartet, schau erst einmal nach was die Logs erzählen: (im Terminal die Tabs "Experten" und "Journal" und der des Strategietesters ("Journal").
 
Carl Schreiber:

Ich vermute mal Du arbeitest mit einem MT5, die aktuelle Version des MT5 ist aber build 1881 (nicht 1601).

  1. Wenn Du bei einem Broker (bei MT5 kann es auch Metaquotes sein) eingeloggt wärst, würde sich das Terminal selbst updaten (inkl. allem anderen).
  2. Allerdings ohne Brokerverbindung gibt es keine historischen Daten inkl. allem Anderem wie Kontraktspezifikationen (kommen eben von dem) und damit keine Backtests.
  3. Wenn was nicht läuft wie erwartet, schau erst einmal nach was die Logs erzählen: (im Terminal die Tabs "Experten" und "Journal" und der des Strategietesters ("Journal").

Hi Carl,

er verweist auf MT4 Anleitungen (Video-Playlist). Code ist mql4.

Ich habe es compiliert und getestet - auf Version 4.00, Build 1090.

Und jetzt kommen wir dem Problem auf die Schliche: 
Wahrscheinlich versucht er gerade, eine mql4 Anleitung mit mql4 Code auf MT5 zum Laufen zu bekommen...

Nun ja... 

Dateien:
Video.mq4  11 kb
Video.ex4  11 kb
 
Danke euch beiden, lag nicht an der Version, war bereits im MT4, sondern lag an der start(). Kann mir ungefähr jemand den unterschied von OnTick() zur start() erklären?
 

Fehler

Irgendwie scheint der Code fehlerhaft zu sein...

1.Woran liegt es, dass sich beim ersten Pfeil eine Order öffnet (obwohl doch gar kein Crossing entsteht)? und

2. Was kann man gegen die unzähligen Orders tun die sich beim Zweiten Pfeil öffnen und nach wenigen ticks wieder schließen (das Crossing wird wohl zulange als Crossing gezählt bzw. die Linien liegen zulange aufeinander)?

Die Stop Losses & Take Profits scheinen gar nicht erst zu funktionieren, wie man sieht die order läuft tagelang weiter bis zum nächsten Crossing...

Wie kann ich verhindern dass die Orders geschlossen werden wenn der Preis am Crossing hoch und runter schwankt?
 
Baynez:

Irgendwie scheint der Code fehlerhaft zu sein...

1.Woran liegt es, dass sich beim ersten Pfeil eine Order öffnet (obwohl doch gar kein Crossing entsteht)? und

2. Was kann man gegen die unzähligen Orders tun die sich beim Zweiten Pfeil öffnen und nach wenigen ticks wieder schließen (das Crossing wird wohl zulange als Crossing gezählt bzw. die Linien liegen zulange aufeinander)?

Die Stop Losses & Take Profits scheinen gar nicht erst zu funktionieren, wie man sieht die order läuft tagelang weiter bis zum nächsten Crossing...

Wie kann ich verhindern dass die Orders geschlossen werden wenn der Preis am Crossing hoch und runter schwankt?

Zu 1, die indicator repainten auch im backtest, da kann eine kreuzung gewesen sein

zz 2, dazu misst den code durchsuchen, generell weil er vermutlich schaut ob aktuell eine kreuzung ist, das ändert sich mitunter vei jedem tick

 

Hmm,
ist doch alles gut ;-)

Dieser Code ist so etwas sinnfrei, weil es keine äussere Bedingung gibt öffnet er immer mindestens einen Longtrade.
Die äusseren Klammern haben keine Bedeutung.
Wenn Du keine Margin mehr hast würde diese While-Schleife permanent versuchen einen Trade zu öffnen; Der Broker wird sich freuen wenn das Logbuch unnötig aufgeblasen wird ;-)
So geht das nicht vernünftig.

OnTick() wird dauernd durchlaufen, bei jedem Wert der reinkommt und Start() nur einmal bei der Initialisierung. Wurde ja auch gut korrigiert.
Witzigerweise kann man so einen EA, selbst wenn er funktionieren würde nur zum Spielen verwenden, da er mit Echtgeld mit dieser Strategie früher oder später das Konto plättet. Vermute es ist nur ein Versuch?!

Das Programm macht nur das was der Progger angestellt hat ;-)

Gruß Joe

   {while (LongOrder<=0)
      {
      LongOrder = OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,10,0,0,"einfach Long",MagicNummer,0,Green);
      }  }
Grund der Beschwerde: