Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Bibliotheken

Universal Expert Advisor scheme - Bibliothek für den MetaTrader 4

Ansichten:
811
Rating:
(13)
Veröffentlicht:
2016.04.06 13:23
Aktualisiert:
2016.11.22 07:34
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Ab und zu bekomme ich neue Ideen für neue implementierbare Strategien, welche ich im Strategie-Tester testen möchte. Dazu habe ich früher immer meinen vorherigen EA geladen, jeden nicht benötigten Programmtext gelöscht
und anschließend meinen neuen Programmcode geschrieben womit ich dann einen neuen EA hatte. Vor einiger Zeit habe ich dafür nun eine neue Lösung gefunden. Ich habe eine Vorlage, bzw. ein Schema für meine zukünftigen EAs entwickelt.
Dieses ist entstanden, als ich darüber nachgedacht hatte verschiedene Strategien in einem EA zu programmieren und zwischen diesen hin und herschalten zu können, je nach Periode (trend, choppy,... ).
Ich benötigte ein EA Schema, welches es mir erlaubte den gesamten "Aktionscode" und den gesamten "Strategiecode" zusammen zu bringen. Letztendlich habe ich ein Schema gefunden, welches ich hier mit euch teilen möchte.

Die Hauptstruktur dieses EA ist die folgende:

ActionCode - Diese Bereich beinhaltet Code, der unabhängig von Strategien ist
StrategyCode - Dieser Bereich beinhaltet den Code für Strategien

Der Aktionscode wird über den Aufruf des Strategiecodes durchgeführt und der Rückgabewert kann wiederum von dem Aktionscode verarbeitet werden.

ActionCode Part

int   _STRATEGY_NUMBER              = 1;

#define     _OPEN_LONG                    1
#define     _OPEN_SHORT                   2
#define     _CLOSE_LONG                   3
#define     _CLOSE_SHORT                  4
#define     _GET_LONG_STOPLOSS_PRICE      5
#define     _GET_SHORT_STOPLOSS_PRICE     6
#define     _GET_LONG_TAKEPROFIT_PRICE    7
#define     _GET_SHORT_TAKEPROFIT_PRICE   8
#define     _GET_LOTS                     9
#define     _GET_TRAILED_STOPLOSS_PRICE   10
#define     _GET_TRAILED_TAKEPROFIT_PRICE 11
#define     _GET_TRADED_TIMEFRAME         12
#define     _OPEN_PENDING_BUY_STOP        13
#define     _OPEN_PENDING_SELL_STOP       14
#define     _OPEN_PENDING_BUY_LIMIT       15
#define     _OPEN_PENDING_SELL_LIMIT      16
#define     _GET_PENDING_BUY_STOP_PRICE   17
#define     _GET_PENDING_SELL_STOP_PRICE  18
#define     _GET_PENDING_ORDER_EXPIRATION 19

int start()
{
   double            Stoploss          = 0;
   double            TakeProfit        = 0;
   
   if(LastBarTraded())
      return(0);

   if(OrdersTotal() > 0)
   {
      Stoploss = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_STOPLOSS_PRICE);
      TakeProfit = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_TAKEPROFIT_PRICE);
   
      if(Stoploss != 0 || TakeProfit != 0)
         ModifyAllPositions(_MAGICNUMBER, Stoploss, TakeProfit);

      if(Strategy(_STRATEGY_NUMBER, _CLOSE_LONG) == 1)
         CloseAllLongPositions(_MAGICNUMBER);
      if(Strategy(_STRATEGY_NUMBER, _CLOSE_SHORT) == 1)
         CloseAllShortPositions(_MAGICNUMBER);
   }
   

   if(!TradeAllowed(1))
      return(0);

   if(Strategy(_STRATEGY_NUMBER, _OPEN_LONG) == 1)
      OpenPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), 
      Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER);
   if(Strategy(_STRATEGY_NUMBER, _OPEN_SHORT) == 1)
      OpenPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), 
      Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER);

   if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_BUY_STOP) == 1)
      OpenPendingPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_BUY_STOP_PRICE), 
      Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, 
      Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION));
   if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_SELL_STOP) == 1)
      OpenPendingPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_SELL_STOP_PRICE), 
      Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, 
      Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION));

   return(0);
}

StrategyCode part

double Strategy(int STRATEGY, int COMMAND)
{
   switch(STRATEGY)
   {
// Eine kurze Beschreibung der Strategie
      case 1:
      {
         return(Strategy_001(COMMAND));
      }
// Eine kurze Beschreibung der Strategie
      case 2:
      {
         return(Strategy_002(COMMAND));
      }

//...

<s0>// Eine kurze Beschreibung der Strategie
      case 99:
      {
         return(Strategy_099(COMMAND));
      }
   }

   return(0);
}


double Strategy_001(int COMMAND)
{
   string   _SYMBOL        = Symbol();
   int      _TIMEFRAME     = getStrategyTimeframeByNumber(_STRATEGY_TIMEFRAME);
         
   double   result         = 0;
   
   int      i;

   switch(COMMAND)
   {
      case _OPEN_LONG:
      {
//         break;

//         if(!OpenNewBar())
//            break;

         if(Open long condition is true)
            result = 1;

         break;
      }
      case _OPEN_SHORT:
      {
//         break;

//         if(!OpenNewBar())
//            break;

         if(Open short condition is true)
            result = 1;

         break;
      }
      case _CLOSE_LONG:
      {
//         break;

         if(Close long condition is true)
            result = 1;
            
            break;
      }
      case _CLOSE_SHORT:
      {
//         break;

         if(Close short condition is true)
            result = 1;
            
            break;
      }
      case _GET_LONG_STOPLOSS_PRICE:
      {
//         break;

         result = Long SL price
         
         break;
      }
      case _GET_SHORT_STOPLOSS_PRICE:
      {
//         break;

         result = Short SL price
         
         break;
      }
      case _OPEN_PENDING_BUY_STOP:
      {
         break;
      }
      case _OPEN_PENDING_SELL_STOP:
      {
         break;
      }
      case _GET_PENDING_BUY_STOP_PRICE:
      {
         break;
      }
      case _GET_PENDING_SELL_STOP_PRICE:
      {
         break;
      }
      case _GET_LONG_TAKEPROFIT_PRICE:
      {
         break;
      }
      case _GET_SHORT_TAKEPROFIT_PRICE:
      {
         break;
      }
      case _GET_TRAILED_STOPLOSS_PRICE:
      {
         break;
      }      
      case _GET_TRAILED_TAKEPROFIT_PRICE:
      {
         break;
      }
      case _GET_LOTS:
      {
         result = Lot amount;

         break;
      }
      case _GET_TRADED_TIMEFRAME:
      {
         result = _TIMEFRAME;

         break;
      }
      case _GET_PENDING_ORDER_EXPIRATION:
      {
         break;
      }
   }
      
   return(result);
}


Man kann deutlich sehen, dass die Implementierung von neuen Strategien in das selbe Schema sehr einfach ist. Fügen Sie lediglich ein neues CASE in die Strategy() Funktion ein und fügen Sie eine neue Funktion Strategy_NNN() mit den zugehörigen Strategie-Regeln hinzu.

Dieses Schema passt nur zu Strategien, die nur eine offene Positionen gleichzeitig erlauben und einen Standard-"Workflow" besitzen.

Als Beispiel habe ich Programmcode über nicht erfolgreiche Strategien hinzugefügt (diesen finden Sie im angehängten Code)

Ich hoffe, ich konnte damit einige von Euch inspirieren und vielleicht gibt es ja auch neue Ideen, die dieses Konzept weiter verbessern können.

Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/en/code/8625

STik STik

Ein weiterer Indikator, der den Tick Chart anzeigt, was wohl für die Pipsers interessant sein dürfte. Er hat einige Besonderheiten.

MySQL wrapper MySQL wrapper

Umwandler für das Lesen und Schreiben mit MySQL

Waddah Attar Weekly Fibo Waddah Attar Weekly Fibo

Ein weiterer Fibo Indikator.

Ryan_Jones_SM Ryan_Jones_SM

Dieser Indikator zeigt mit Pfeilen an, wo man kaufen und verkaufen sollte. In einem Markt mit einem Trend bringt dieser Indikator ein Profit, wenn es keinen Trend gibt dann gibt es leider auch keinen Profit.