谢谢。
非常清楚。
非常清楚。
对不起,作者。不带反向和可选手数的 EA。
带可选择手数的 EA->LongShortExpertMACD.mq5 中的更改:
//+------------------------------------------------------------------+ //|LongShortExpertMACD.mq5 //| 版权所有 2009-2013, MetaQuotes Software Corp. //| 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 <Expert\LongShortExpertModified.mqh> #include <Expert\Signal\SignalMACD.mqh> #include <Expert\Trailing\TrailingNone.mqh> #include <Expert\Money\MoneyFixedLot.mqh> //+------------------------------------------------------------------+ //| 输入| //+------------------------------------------------------------------+ //--- 专家输入 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; //空头/多头/允许两种仓位 //--- 默认的 MACDExpert 输入 input int Inp_Signal_MACD_PeriodFast =12; // 快速 MACD 周期 input int Inp_Signal_MACD_PeriodSlow =24; // 慢速 MACD 周期 input int Inp_Signal_MACD_PeriodSignal=9; // 信号 MACD 周期 input double Inp_Money_Lot =0.5; // 地段价值 input int Inp_Signal_MACD_TakeProfit =50; // 止盈值 input int Inp_Signal_MACD_StopLoss =20; // 止损值 //+------------------------------------------------------------------+ //| 全局专家对象| //+------------------------------------------------------------------+ CLongShortExpertModified ExtExpert; // 专门设计的 CExpert 子类 //+------------------------------------------------------------------+ //| 专家初始化函数| //+------------------------------------------------------------------+ int OnInit(void) { //--- 专家初始化 if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) { //--- 失败 printf(__FUNCTION__+": error initializing expert"); ExtExpert.Deinit(); return(-1); } // 控制允许哪些位置的特定参数 ExtExpert.SetAvailablePositions(Inp_Allowed_Positions); //--- 创建信号对象 CSignalMACD *signal=new CSignalMACD; if(signal==NULL) { //--- 失败 printf(__FUNCTION__+": error creating signal"); ExtExpert.Deinit(); return(-2); } //--- 向专家添加信号(将自动删除)) if(!ExtExpert.InitSignal(signal)) { //--- 失败 printf(__FUNCTION__+": error initializing signal"); ExtExpert.Deinit(); return(-3); } //--- 设置信号参数 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); //--- 检查信号参数 if(!signal.ValidationSettings()) { //--- 失败 printf(__FUNCTION__+": error signal parameters"); ExtExpert.Deinit(); return(-4); } //--- 创建尾部对象 CTrailingNone *trailing=new CTrailingNone; if(trailing==NULL) { //--- 失败 printf(__FUNCTION__+": error creating trailing"); ExtExpert.Deinit(); return(-5); } //--- 为专家添加尾部(将自动删除)) if(!ExtExpert.InitTrailing(trailing)) { //--- 失败 printf(__FUNCTION__+": error initializing trailing"); ExtExpert.Deinit(); return(-6); } //--- 设置尾部参数 //--- 检查尾部参数 if(!trailing.ValidationSettings()) { //--- 失败 printf(__FUNCTION__+": error trailing parameters"); ExtExpert.Deinit(); return(-7); } //--- 创建货币对象 CMoneyFixedLot *money=new CMoneyFixedLot; if(money==NULL) { //--- 失败 printf(__FUNCTION__+": error creating money"); ExtExpert.Deinit(); return(-8); } //--- 为专家添加资金(将自动删除)) if(!ExtExpert.InitMoney(money)) { //--- 失败 printf(__FUNCTION__+": error initializing money"); ExtExpert.Deinit(); return(-9); } //--- 设置资金参数 money.Lots(Inp_Money_Lot); //--- 检查资金参数 if(!money.ValidationSettings()) { //--- 失败 printf(__FUNCTION__+": error money parameters"); ExtExpert.Deinit(); return(-10); } //--- 调整所有必要的指标 if(!ExtExpert.InitIndicators()) { //--- 失败 printf(__FUNCTION__+": error initializing indicators"); ExtExpert.Deinit(); return(-11); } //--- 成功 return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 专家的去初始化功能| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ExtExpert.Deinit(); } //+------------------------------------------------------------------+ //| 函数事件处理程序 "tick"| //+------------------------------------------------------------------+ void OnTick(void) { ExtExpert.OnTick(); } //+------------------------------------------------------------------+ //| 函数事件处理程序 "交易"| //+------------------------------------------------------------------+ void OnTrade(void) { ExtExpert.OnTrade(); } //+------------------------------------------------------------------+ //| 函数事件处理程序 "定时器"| //+------------------------------------------------------------------+ void OnTimer(void) { ExtExpert.OnTimer(); } //+------------------------------------------------------------------+
不带反向的 EA->LongShortExpertModified.mqh 中的更改:
//+------------------------------------------------------------------+ //|LongShortExpertModified.mqh //|版权所有 2013, jlwarrior | //| https://login.mql5.com/en/users/jlwarrior | //+------------------------------------------------------------------+ #include <Expert\Expert.mqh> //+------------------------------------------------------------------+ //枚举用于控制多头/空头或同时持有头寸。 //| 允许打开| //+------------------------------------------------------------------+ //--- enum ENUM_AVAILABLE_POSITIONS { LONG_POSITION, SHORT_POSITION, BOTH_POSITION }; //+------------------------------------------------------------------+ //| 类 CLongShortExpertModified。| //| 目的:只允许打开多头/空头/两者头寸。 //| 源自 CExpert 类(仅修改 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;}; }; //+------------------------------------------------------------------+ //| 构造函数| //+------------------------------------------------------------------+ CLongShortExpertModified ::CLongShortExpertModified(void) : m_positions(BOTH_POSITION) { } //+------------------------------------------------------------------+ //| 销毁器| //+------------------------------------------------------------------+ CLongShortExpertModified ::~CLongShortExpertModified(void) { } //+------------------------------------------------------------------+ //| 检查允许的开放位置| //+------------------------------------------------------------------+ bool CLongShortExpertModified :: CheckOpen() { switch(m_positions) { case LONG_POSITION: return CheckOpenLong(); //只检查新的多头头寸 case SHORT_POSITION: return CheckOpenShort(); //只检查新的空头头寸 default: return CExpert::CheckOpen(); //默认行为 } } //+------------------------------------------------------------------+
输入多头 x 空头股票代码的字段在哪里?
基于 CExpert 的多空单边 EA:
这个 CExpert 子类只允许多/空订单的单边交易, 显示其与 MACD 示例的用法。
作者: Jose