Recentemente, um novo Expert Advisor (EA) foi lançado, permitindo que você escolha a abertura de posições apenas longas, curtas ou ambas, baseado na extensão da classe CExpert.
Dois arquivos diferentes estão disponíveis para você:
- LongShortExpertModified.mqh: Esta classe amplia a classe padrão CExpert, modificando os métodos CheckOpen() e CheckReverse() para permitir apenas as ordens desejadas;
- LongShortExpertMACD.mq5: Este EA é uma modificação simples da classe ExpertMACD.mq5, incluindo o expert modificado para permitir apenas o tipo de ordem desejado de acordo com um parâmetro de entrada, facilitando sua utilização.
LongShortExpertModified
Esta classe altera o comportamento da classe padrão CExpert, permitindo apenas um certo tipo de ordem de acordo com o seguinte enum:
enum ENUM_AVAILABLE_POSITIONS
{
LONG_POSITION,
SHORT_POSITION,
BOTH_POSITION
};
Esse enum será utilizado como parâmetro de entrada para o EA final, determinando quais tipos de ordens serão permitidos. Ele é usado internamente para abrir apenas as ordens desejadas e processar reversões de ordens somente se ambos os tipos de posição forem permitidos (valor do enum BOTH_POSITION).
Para isso, os métodos CheckOpen() e CheckReverse() foram reescritos:
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;}; };
O método CheckOpen() foi alterado para verificar apenas posições longas ou curtas de acordo com o valor de m_positions:
bool CLongShortExpertModified :: CheckOpen() { switch(m_positions) { case LONG_POSITION: return CheckOpenLong(); // verifica apenas novas posições longas case SHORT_POSITION: return CheckOpenShort(); // verifica apenas novas posições curtas default: return CExpert::CheckOpen(); // comportamento padrão } }
O método CheckReverse() foi modificado para checar a reversão de posição apenas se ambos os tipos de posição forem permitidos:
bool CLongShortExpertModified::CheckReverse() { switch(m_positions) { case LONG_POSITION: case SHORT_POSITION: return false; // reversão não é permitida default: return CExpert::CheckReverse(); // comportamento padrão } }
LongShortExpertMACD
Esta classe fornece um exemplo específico de uso do EA anterior, baseado no EA padrão ExpertMACD incluído na distribuição do MQL5.
Primeiramente, a classe Expert concreta deve ser incluída, e o parâmetro de entrada correspondente adicionado. Além disso, o expert externo é associado à subclasse, em vez da CExpert padrão:
#include <Expert\LongShortExpertModified.mqh> //[...] input ENUM_AVAILABLE_POSITIONS Inp_Allowed_Positions=BOTH_POSITION; // posições curtas / longas / ambas permitidas //[...] CLongShortExpertModified ExtExpert; // Subclasse CExpert projetada especificamente
Após inicializar o expert, o parâmetro deve ser definido de acordo com o valor de entrada:
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) { //--- falha printf(__FUNCTION__+": erro ao inicializar o expert"); ExtExpert.Deinit(); return(-1); } // Parâmetro específico controlando quais posições são permitidas ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);
Não são necessárias alterações adicionais. A figura abaixo mostra os parâmetros de configuração para o expert:

Comentário 0