基于CExpert的多空专属EA - MetaTrader 5交易高手

Mike 2014.07.31 20:40 32 0 0
附件

大家好!今天我们来聊聊一个非常实用的专家顾问(EA),它可以帮助我们在交易中选择只开多头、空头,或者同时开多空头。这个EA是基于CExpert类进行扩展的。

该工具提供了两种不同的文件:

  • LongShortExpertModified.mqh: 这个类对默认的CExpert进行了扩展,修改了CheckOpen()和CheckReverse()方法,以便只允许打开所需的订单类型;
  • LongShortExpertMACD.mq5: 这个EA是对内置的ExpertMACD.mq5类的简单修改,加入了开发的修改专家,以便根据输入参数只允许所需的订单类型,同时提供了示例以便于理解。

关于LongShortExpertModified

这个类修改了默认CExpert类的行为,仅根据以下枚举类型允许特定类型的订单:

enum ENUM_AVAILABLE_POSITIONS
  {
   LONG_POSITION,
   SHORT_POSITION,
   BOTH_POSITION
  };

这个枚举将作为输入参数用于最终的EA,决定允许哪种类型的订单。它在内部用于只打开所需的订单,并仅在允许两种订单类型时(BOTH_POSITION枚举值)处理订单反转。

为此,CheckOpen()和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()被修改为仅根据m_positions的值检查多头或空头头寸:

bool CLongShortExpertModified :: CheckOpen()
  {
   switch(m_positions)
     {
      case LONG_POSITION:
         return CheckOpenLong();         //只检查新的多头头寸
      case SHORT_POSITION:
         return CheckOpenShort();        //只检查新的空头头寸
      default:
         return CExpert::CheckOpen();    //默认行为
     }
  }

CheckReverse()被修改为仅在允许两种头寸类型时检查反转:

bool CLongShortExpertModified::CheckReverse()
  {
   switch(m_positions)
     {
      case LONG_POSITION:
      case SHORT_POSITION:
         return false;                    //不允许反转
      default:
         return CExpert::CheckReverse(); //默认行为
     }
  }

关于LongShortExpertMACD

这个类提供了基于前一个类使用的特定EA示例,基于MQL5分发中包含的默认ExpertMACD EA。

首先,必须包含具体的专家类,并添加相应的输入参数。同时,将外部专家与子类关联,而不是默认的CExpert:

#include <Expert\LongShortExpertModified.mqh>
//[...]
input ENUM_AVAILABLE_POSITIONS Inp_Allowed_Positions=BOTH_POSITION; //允许短/多/两种头寸
//[...]
CLongShortExpertModified ExtExpert;  //特定设计的CExpert子类

初始化专家后,参数必须根据输入值进行设置:

if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- 初始化失败
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }
   
   // 特定参数控制允许的头寸
   ExtExpert.SetAvailablePositions(Inp_Allowed_Positions);  

不需要额外的更改。以下图展示了专家的配置参数:

多空专属通用专家顾问

列表
评论 0