Especialistas: EA Long Short only baseado na CExpert

 

EA Long Short only baseado na CExpert:

Esta subclasse da CExpert permite abrir ordens somente long/short, mostrando seu uso com um exemplo MACD.

Parâmetros de entrada do Expert Advisor Long/Short only

Autor: Jose

 
Obrigado.
Muito claro.
 

Desculpe-me, autor. EA sem reversão e com lote selecionável.

EA com lote selecionável -> alterações em 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"
//+------------------------------------------------------------------+
//| Incluir|
//+------------------------------------------------------------------+
#include <Expert\LongShortExpertModified.mqh>
#include <Expert\Signal\SignalMACD.mqh>
#include <Expert\Trailing\TrailingNone.mqh>
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Entradas|
//+------------------------------------------------------------------+
//--- entradas para especialista
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; //curto / longo / ambas as posições permitidas

//--- entradas padrão do MACDExpert
input int    Inp_Signal_MACD_PeriodFast  =12;                       // Período MACD rápido
input int    Inp_Signal_MACD_PeriodSlow  =24;                       // Período do Slow MACD
input int    Inp_Signal_MACD_PeriodSignal=9;                        // Período do sinal MACD
input double Inp_Money_Lot               =0.5;                      // Valor do lote
input int    Inp_Signal_MACD_TakeProfit  =50;                       // Valor do take profit
input int    Inp_Signal_MACD_StopLoss    =20;                       // Valor do stop loss
//+------------------------------------------------------------------+
//| Objeto especialista global|
//+------------------------------------------------------------------+
CLongShortExpertModified ExtExpert;  //subclasse CExpert projetada especificamente
//+------------------------------------------------------------------+
//| Função de inicialização do especialista|
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- Especialista em inicialização
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- falhou
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }   
   // Parâmetro específico que controla quais posições são permitidas
   ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);  

//--- Criação do objeto de sinal
   CSignalMACD *signal=new CSignalMACD;
   if(signal==NULL)
     {
      //--- falhou
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//--- Adicionar sinal ao especialista (será excluído automaticamente))
   if(!ExtExpert.InitSignal(signal))
     {
      //--- falhou
      printf(__FUNCTION__+": error initializing signal");
      ExtExpert.Deinit();
      return(-3);
     }
//--- Definir parâmetros de sinal
   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);   
//--- Verificar parâmetros de sinal
   if(!signal.ValidationSettings())
     {
      //--- falhou
      printf(__FUNCTION__+": error signal parameters");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Criação do objeto final
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- falhou
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Adicione o final ao expert (será excluído automaticamente))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- falhou
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Definir parâmetros finais
//--- Verificar parâmetros finais
   if(!trailing.ValidationSettings())
     {
      //--- falhou
      printf(__FUNCTION__+": error trailing parameters");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Criação do objeto dinheiro
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- falhou
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-8);
     }
//--- Adicionar dinheiro ao especialista (será excluído automaticamente))
   if(!ExtExpert.InitMoney(money))
     {
      //--- falhou
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-9);
     }
//--- Definir parâmetros monetários 
   money.Lots(Inp_Money_Lot);
//--- Verificar parâmetros monetários
   if(!money.ValidationSettings())
     {
      //--- falhou
      printf(__FUNCTION__+": error money parameters");
      ExtExpert.Deinit();
      return(-10);
     }
//--- Ajuste de todos os indicadores necessários
   if(!ExtExpert.InitIndicators())
     {
      //--- falhou
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-11);
     }
//--- bem-sucedido
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização do especialista|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| Manipulador de evento de função "tick"|
//+------------------------------------------------------------------+
void OnTick(void)
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| Manipulador de eventos de função "trade"|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| Manipulador de eventos de função "timer"|
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

EA sem reversão -> alterações em LongShortExpertModified.mqh:

//+------------------------------------------------------------------+
//|LongShortExpertModified.mqh
//|Direitos autorais 2013, jlwarrior |
//| https://login.mql5.com/en/users/jlwarrior |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//+------------------------------------------------------------------+
//| enumeração para controlar se as posições longas, curtas ou ambas são
//| permissão para ser aberto|
//+------------------------------------------------------------------+
//--- 
enum ENUM_AVAILABLE_POSITIONS
  {
   LONG_POSITION,
   SHORT_POSITION,
   BOTH_POSITION
  };
//+------------------------------------------------------------------+
//| Classe CLongShortExpertModified.|
//| Finalidade: permite que apenas posições longas, curtas ou ambas sejam abertas.
//| Deriva da classe CExpert (modifica apenas os 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;};
  };
//+------------------------------------------------------------------+
//| Construtor|
//+------------------------------------------------------------------+
CLongShortExpertModified ::CLongShortExpertModified(void) : m_positions(BOTH_POSITION)
  {
  }
//+------------------------------------------------------------------+
//| Destruidor|
//+------------------------------------------------------------------+
CLongShortExpertModified ::~CLongShortExpertModified(void)
  {
  }
//+------------------------------------------------------------------+
//| Verificar a abertura para posições permitidas|
//+------------------------------------------------------------------+
bool CLongShortExpertModified :: CheckOpen()
  {
   switch(m_positions)
     {
      case LONG_POSITION:
         return CheckOpenLong();         //verificar apenas as novas posições longas
      case SHORT_POSITION:
         return CheckOpenShort();        //verificar apenas as novas posições vendidas
      default:
         return CExpert::CheckOpen();    //comportamento padrão
     }
  }
//+------------------------------------------------------------------+
 
onde esta o campo pra por o codigo da açao pra Long x short