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); virtualbool CheckOpen(void); virtualbool 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: returnfalse; // 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