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:

Commento 0