EA Long Short: Guida all'Utilizzo del CExpert per MetaTrader 5

Mike 2014.07.31 20:40 14 0 0
Allegato

Hai mai pensato di limitare le tue operazioni di trading solo a posizioni long o short? Oggi ti parlo di un Expert Advisor che ti permette di farlo, basato sulla classe CExpert.

Questo EA è estremamente flessibile e viene fornito con due file distinti:

  • LongShortExpertModified.mqh: Questa classe estende la classe CExpert modificando i metodi CheckOpen() e CheckReverse() per permettere solo gli ordini desiderati;
  • LongShortExpertMACD.mq5: Questo EA è una semplice modifica della classe ExpertMACD.mq5, includendo l'expert modificato per consentire solo il tipo di ordine desiderato in base a un parametro d'input.

LongShortExpertModified

Questa classe modifica il comportamento della classe CExpert per consentire solo un certo tipo di ordine, secondo il seguente enum:

enum ENUM_AVAILABLE_POSITIONS
  {
   LONG_POSITION,
   SHORT_POSITION,
   BOTH_POSITION
  };

Questo enum viene utilizzato come parametro d'input per l'EA finale per determinare quali tipi di ordini saranno consentiti. Inoltre, viene utilizzato internamente per aprire solo gli ordini desiderati e per gestire le inversioni degli ordini solo se sono consentiti entrambi i tipi di posizione (valore enum BOTH_POSITION).

Per implementarlo, i metodi CheckOpen() e CheckReverse() sono stati riscritti:

class CLongShortExpertModified : public CExpert
  {
protected:
   ENUM_AVAILABLE_POSITIONS m_positions;
public:
                     CLongShortExpertModified(void);
                    ~CLongShortExpertModified(void);
   virtual bool      CheckOpen(void);
   virtual bool      CheckReverse(void);
   void SetAvailablePositions(ENUM_AVAILABLE_POSITIONS newValue){m_positions=newValue;};
  };

Il metodo CheckOpen() è modificato per controllare solo le posizioni long o short in base al valore di m_positions:

bool CLongShortExpertModified :: CheckOpen()
  {
   switch(m_positions)
     {
      case LONG_POSITION:
         return CheckOpenLong();         //controlla solo nuove posizioni long
      case SHORT_POSITION:
         return CheckOpenShort();        //controlla solo nuove posizioni short
      default:
         return CExpert::CheckOpen();    //comportamento predefinito
     }
  }

Il metodo CheckReverse() è modificato per controllare l'inversione della posizione solo se entrambi i tipi di posizione sono consentiti:

bool CLongShortExpertModified::CheckReverse()
  {
   switch(m_positions)
     {
      case LONG_POSITION:
      case SHORT_POSITION:
         return false;                    // nessuna inversione è consentita
      default:
         return CExpert::CheckReverse(); //comportamento predefinito
     }
  }

LongShortExpertMACD

Questa classe fornisce un esempio pratico di utilizzo della classe precedente, basata sul classico ExpertMACD incluso nella distribuzione MQL5.

Per prima cosa, devi includere la classe Expert concreta e aggiungere il parametro d'input corrispondente. Inoltre, l'expert esterno è associato alla sottoclasse, invece della classe predefinita CExpert:

#include <Expert\LongShortExpertModified.mqh>
//[...]
input ENUM_AVAILABLE_POSITIONS Inp_Allowed_Positions=BOTH_POSITION; //consenti posizioni short / long / entrambe
//[...]
CLongShortExpertModified ExtExpert;  //sottoclasse CExpert specificamente progettata

Dopo aver inizializzato l'expert, il parametro deve essere impostato secondo il valore d'input:

if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- fallito
      printf(__FUNCTION__+": errore durante l'inizializzazione dell'expert");
      ExtExpert.Deinit();
      return(-1);
     }
   
   // Parametro specifico che controlla quali posizioni sono consentite
   ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);  

Nessuna modifica aggiuntiva è necessaria. La seguente figura mostra i parametri di configurazione per l'expert:

Long/Short solo Expert Advisor

Elenco
Commento 0