EA: 基于 CExpert 的多空单边 EA

 

基于 CExpert 的多空单边 EA:

这个 CExpert 子类只允许多/空订单的单边交易, 显示其与 MACD 示例的用法。

多/空单边智能系统

作者: Jose

 
谢谢。
非常清楚。
 

对不起,作者。不带反向和可选手数的 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 空头股票代码的字段在哪里?