Asesores Expertos: Long Short only EA based on CExpert

 

Long Short only EA based on CExpert:

Es un Asesor Experto a base de CExpert que permite abrir sólo las órdenes largas o cortas.

Expert Advisor que genera sólo las órdenes cortas/largas

Autor: Jose

 
Gracias.
Muy claro.
 

Disculpe autor. EA sin reverse y con lote seleccionable.

EA con lote seleccionable -> cambios en 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"
//+------------------------------------------------------------------+
//| Include|
//+------------------------------------------------------------------+
#include <Expert\LongShortExpertModified.mqh>
#include <Expert\Signal\SignalMACD.mqh>
#include <Expert\Trailing\TrailingNone.mqh>
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Entradas|
//+------------------------------------------------------------------+
//--- entradas para el experto
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; /corto/largo/ambas posiciones permitidas

//--- entradas MACDExpert por defecto
input int    Inp_Signal_MACD_PeriodFast  =12;                       // Periodo MACD rápido
input int    Inp_Signal_MACD_PeriodSlow  =24;                       // Periodo MACD lento
input int    Inp_Signal_MACD_PeriodSignal=9;                        // Señal Periodo MACD
input double Inp_Money_Lot               =0.5;                      // Valor del lote
input int    Inp_Signal_MACD_TakeProfit  =50;                       // Valor de Take Profit
input int    Inp_Signal_MACD_StopLoss    =20;                       // Valor Stop Loss
//+------------------------------------------------------------------+
//| Objeto experto global|
//+------------------------------------------------------------------+
CLongShortExpertModified ExtExpert;  //diseño específico Subclase CExpert
//+------------------------------------------------------------------+
//| Función de inicialización del experto|
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- Inicializando experto
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- fallido
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }   
   // Parámetro específico que controla las posiciones permitidas
   ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);  

//--- Creación del objeto señal
   CSignalMACD *signal=new CSignalMACD;
   if(signal==NULL)
     {
      //--- fallido
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//--- Añadir señal a experto (se borrará automáticamente))
   if(!ExtExpert.InitSignal(signal))
     {
      //--- fallido
      printf(__FUNCTION__+": error initializing signal");
      ExtExpert.Deinit();
      return(-3);
     }
//--- Establecer parámetros de señal
   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);   
//--- Comprobar parámetros de señal
   if(!signal.ValidationSettings())
     {
      //--- fallido
      printf(__FUNCTION__+": error signal parameters");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Creación del objeto final
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- fallido
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Añadir final a experto (se borrará automáticamente))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- fallido
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Establecer parámetros finales
//--- Comprueba los parámetros finales
   if(!trailing.ValidationSettings())
     {
      //--- fallido
      printf(__FUNCTION__+": error trailing parameters");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Creación del objeto dinero
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- fallido
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-8);
     }
//--- Añadir dinero a experto (se borrará automáticamente))
   if(!ExtExpert.InitMoney(money))
     {
      //--- fallido
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-9);
     }
//--- Establecer parámetros monetarios 
   money.Lots(Inp_Money_Lot);
//--- Comprobar parámetros de dinero
   if(!money.ValidationSettings())
     {
      //--- fallido
      printf(__FUNCTION__+": error money parameters");
      ExtExpert.Deinit();
      return(-10);
     }
//--- Ajuste de todos los indicadores necesarios
   if(!ExtExpert.InitIndicators())
     {
      //--- fallido
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-11);
     }
//--- tener éxito
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización del experto|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| Función-manejador de eventos "tick"|
//+------------------------------------------------------------------+
void OnTick(void)
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| Función-manejador de eventos "comercio"|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| Controlador de función-evento "temporizador"|
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

EA sin reverse -> cambios en LongShortExpertModified.mqh:

//+------------------------------------------------------------------+
//|LongShortExpertModified.mqh |
//|Copyright 2013, jlwarrior |
//| https://login.mql5.com/en/users/jlwarrior |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//+------------------------------------------------------------------+
//| enumeración para controlar si las posiciones largas / cortas o ambas son||
//| permitido abrir|
//+------------------------------------------------------------------+
//--- 
enum ENUM_AVAILABLE_POSITIONS
  {
   LONG_POSITION,
   SHORT_POSITION,
   BOTH_POSITION
  };
//+------------------------------------------------------------------+
//| Clase CLongShortExpertModified.|
//| Propósito: Permite abrir sólo posiciones largas / cortas / ambas || //| Propósito: Permite abrir sólo posiciones largas / cortas / ambas.
//| Deriva de la clase CExpert (modifica sólo los métodos Open / Reverse)||
//+------------------------------------------------------------------+
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;};
  };
//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
CLongShortExpertModified ::CLongShortExpertModified(void) : m_positions(BOTH_POSITION)
  {
  }
//+------------------------------------------------------------------+
//| Destructor|
//+------------------------------------------------------------------+
CLongShortExpertModified ::~CLongShortExpertModified(void)
  {
  }
//+------------------------------------------------------------------+
//| Comprobar posiciones abiertas permitidas|
//+------------------------------------------------------------------+
bool CLongShortExpertModified :: CheckOpen()
  {
   switch(m_positions)
     {
      case LONG_POSITION:
         return CheckOpenLong();         //comprueba sólo las nuevas posiciones largas
      case SHORT_POSITION:
         return CheckOpenShort();        //comprueba sólo las nuevas posiciones cortas
      default:
         return CExpert::CheckOpen();    //comportamiento por defecto
     }
  }
//+------------------------------------------------------------------+
 
¿dónde está el campo para introducir el código de acción para Largo x corto?