大家好!今天我们来聊聊一个非常实用的专家顾问(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