El actual Asesor Experto (EA) te permite seleccionar la apertura de posiciones solo largas, cortas o ambas, basándose en una extensión de la clase CExpert.
Se proporcionan dos archivos diferentes:
- LongShortExpertModified.mqh: Esta clase extiende la clase CExpert por defecto, modificando los métodos CheckOpen() y CheckReverse() para permitir solo las órdenes que desees abrir;
- LongShortExpertMACD.mq5: Este EA es una modificación simple sobre la clase ExpertMACD.mq5, incluyendo el experto modificado para permitir solo el tipo de orden deseado según un parámetro de entrada, y se proporciona para aclarar el uso del experto.
LongShortExpertModified
Esta clase modifica el comportamiento de la clase CExpert, permitiendo solo un tipo específico de orden según el siguiente enum:
enum ENUM_AVAILABLE_POSITIONS
{
LONG_POSITION,
SHORT_POSITION,
BOTH_POSITION
};
Este enum se utilizará como parámetro de entrada para el EA final, determinando qué tipo de órdenes se permitirán, y se usa internamente para abrir solo las órdenes deseadas y procesar las inversiones de órdenes solo si se permiten ambos tipos de posición (valor enum BOTH_POSITION).
Para ello, se reescriben los métodos CheckOpen() y CheckReverse():
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;}; };
CheckOpen() se modifica para verificar solo posiciones largas o cortas según el valor de m_positions:
bool CLongShortExpertModified :: CheckOpen() { switch(m_positions) { case LONG_POSITION: return CheckOpenLong(); //verificar solo nuevas posiciones largas case SHORT_POSITION: return CheckOpenShort(); //verificar solo nuevas posiciones cortas default: return CExpert::CheckOpen(); //comportamiento por defecto } }
CheckReverse() se modifica para comprobar la reversión de la posición solo si se permiten ambos tipos de posición:
bool CLongShortExpertModified::CheckReverse() { switch(m_positions) { case LONG_POSITION: case SHORT_POSITION: return false // no se permite la reversión default: return CExpert::CheckReverse(); //comportamiento por defecto } }
LongShortExpertMACD
Esta clase proporciona un ejemplo específico de uso del EA anterior, basado en el EA ExpertMACD por defecto incluido en la distribución de MQL5.
Primero, se debe incluir la clase Expert concreta y agregar el parámetro de entrada correspondiente. Además, el experto externo se asocia con la subclase, en lugar de con el CExpert por defecto:
#include <Expert\LongShortExpertModified.mqh> //[...] input ENUM_AVAILABLE_POSITIONS Inp_Allowed_Positions=BOTH_POSITION; //se permiten posiciones cortas/largas/ambas //[...] CLongShortExpertModified ExtExpert; //subclase CExpert diseñada específicamente
Después de inicializar el experto, el parámetro debe establecerse según el valor de entrada:
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) { //--- error printf(__FUNCTION__+": error initializing expert"); ExtExpert.Deinit(); return(-1); } // Parámetro específico que controla qué posiciones están permitidas ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);
No se requieren cambios adicionales. La siguiente figura muestra los parámetros de configuración para el experto:

Comentarios 0