Expert Advisors: Long Short only EA basierend auf CExpert

 

Long Short only EA basierend auf CExpert:

Diese CExpert Unterklasse erlaubt es nur Long/Short-Aufträge zu eröffnen, dies wird an einem MACD-Beispiel gezeigt.

Long/Short only general Expert Advisor

Autor: Jose

 
Danke.
Sehr klar.
 

Verzeihung, Autor. EA ohne Reverse und mit wählbarem Lot.

EA mit wählbarem Lot -> Änderungen in LongShortExpertMACD.mq5:

//+------------------------------------------------------------------+
//|LongShortExpertMACD.mq5 |
//| Copyright 2009-2013, MetaQuotes Software Corp. - 2013, jlwarrior |
//| https://login.mql5.com/en/users/jlwarrior |
//+------------------------------------------------------------------+
#property copyright "2009-2013, MetaQuotes Software Corp - 2013, jlwarrior"
#property link      "https://login.mql5.com/en/users/jlwarrior"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Inklusive|
//+------------------------------------------------------------------+
#include <Expert\LongShortExpertModified.mqh>
#include <Expert\Signal\SignalMACD.mqh>
#include <Expert\Trailing\TrailingNone.mqh>
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Eingaben|
//+------------------------------------------------------------------+
//--- Eingaben für Experten
input string Inp_Expert_Title            ="Long/Short ExpertMACD";
int          Expert_MagicNumber          =10981;
bool         Expert_EveryTick            =false;
input ENUM_AVAILABLE_POSITIONS Inp_Allowed_Positions=BOTH_POSITION; //kurz / lang / beide Positionen erlaubt

//--- Standard-MACDExpert-Eingaben
input int    Inp_Signal_MACD_PeriodFast  =12;                       // Schneller MACD-Zeitraum
input int    Inp_Signal_MACD_PeriodSlow  =24;                       // Langsamer MACD-Zeitraum
input int    Inp_Signal_MACD_PeriodSignal=9;                        // Signal MACD Zeitraum
input double Inp_Money_Lot               =0.5;                      // Wert der Partie
input int    Inp_Signal_MACD_TakeProfit  =50;                       // Gewinnmitnahme-Wert
input int    Inp_Signal_MACD_StopLoss    =20;                       // Stop-Loss-Wert
//+------------------------------------------------------------------+
//| Globales Expertenobjekt|
//+------------------------------------------------------------------+
CLongShortExpertModified ExtExpert;  //spezifisch gestaltete CExpert Unterklasse
//+------------------------------------------------------------------+
//| Initialisierungsfunktion des Experten|
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- Initialisierung des Experten
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }   
   // Spezifischer Parameter, der bestimmt, welche Positionen zulässig sind
   ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);  

//--- Erstellung eines Signalobjekts
   CSignalMACD *signal=new CSignalMACD;
   if(signal==NULL)
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//--- Signal zu Experte hinzufügen (wird automatisch gelöscht))
   if(!ExtExpert.InitSignal(signal))
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error initializing signal");
      ExtExpert.Deinit();
      return(-3);
     }
//--- Signalparameter einstellen
   signal.PeriodFast(Inp_Signal_MACD_PeriodFast);
   signal.PeriodSlow(Inp_Signal_MACD_PeriodSlow);
   signal.PeriodSignal(Inp_Signal_MACD_PeriodSignal);
   signal.TakeLevel(Inp_Signal_MACD_TakeProfit);
   signal.StopLevel(Inp_Signal_MACD_StopLoss);   
//--- Signalparameter prüfen
   if(!signal.ValidationSettings())
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error signal parameters");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Erstellung eines Nachlaufobjekts
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Hinzufügen eines Nachsatzes zum Experten (wird automatisch gelöscht))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Schleppende Parameter einstellen
//--- Nachfolgende Parameter prüfen
   if(!trailing.ValidationSettings())
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error trailing parameters");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Erstellung eines Geldobjekts
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-8);
     }
//--- Geld zum Experten hinzufügen (wird automatisch gelöscht))
   if(!ExtExpert.InitMoney(money))
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-9);
     }
//--- Geldparameter einstellen 
   money.Lots(Inp_Money_Lot);
//--- Geldparameter prüfen
   if(!money.ValidationSettings())
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error money parameters");
      ExtExpert.Deinit();
      return(-10);
     }
//--- Abstimmung aller erforderlichen Indikatoren
   if(!ExtExpert.InitIndicators())
     {
      //--- fehlgeschlagen
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-11);
     }
//--- erfolgreich
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialisierungsfunktion des Experten|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| Funktions-Ereignishandler "tick"|
//+------------------------------------------------------------------+
void OnTick(void)
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| Funktions-Ereignis-Handler "Handel"|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| Funktions-Ereignishandler "Timer"|
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

EA ohne Reverse -> Änderungen in LongShortExpertModified.mqh:

//+------------------------------------------------------------------+
//|LongShortExpertModified.mqh |
//|Copyright 2013, jlwarrior |
//| https://login.mql5.com/en/users/jlwarrior |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//+------------------------------------------------------------------+
//| Aufzählung zur Steuerung, ob long / short oder beide Positionen sind
//| darf geöffnet werden|
//+------------------------------------------------------------------+
//--- 
enum ENUM_AVAILABLE_POSITIONS
  {
   LONG_POSITION,
   SHORT_POSITION,
   BOTH_POSITION
  };
//+------------------------------------------------------------------+
//| Klasse CLongShortExpertModified.|
//| Zweck: Erlaubt nur die Eröffnung von Long- / Short- / Both-Positionen |
//| Abgeleitet von der Klasse CExpert (modifiziert nur Open / Reverse Methoden)|.
//+------------------------------------------------------------------+
class CLongShortExpertModified : public CExpert
  {
protected:
   ENUM_AVAILABLE_POSITIONS m_positions;
public:
                     CLongShortExpertModified(void);
                    ~CLongShortExpertModified(void);
   virtual bool      CheckOpen(void);
   void SetAvailablePositions(ENUM_AVAILABLE_POSITIONS newValue){m_positions=newValue;};
  };
//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
CLongShortExpertModified ::CLongShortExpertModified(void) : m_positions(BOTH_POSITION)
  {
  }
//+------------------------------------------------------------------+
//| Destruktor|
//+------------------------------------------------------------------+
CLongShortExpertModified ::~CLongShortExpertModified(void)
  {
  }
//+------------------------------------------------------------------+
//| Offen auf erlaubte Positionen prüfen|
//+------------------------------------------------------------------+
bool CLongShortExpertModified :: CheckOpen()
  {
   switch(m_positions)
     {
      case LONG_POSITION:
         return CheckOpenLong();         //nur neue Long-Positionen prüfen
      case SHORT_POSITION:
         return CheckOpenShort();        //nur neue Short-Positionen prüfen
      default:
         return CExpert::CheckOpen();    //Standardverhalten
     }
  }
//+------------------------------------------------------------------+
 
Wo befindet sich das Feld für die Eingabe des Aktiencodes für Long x Short?