学写的EA,策略原理参考《5分钟动量交易系统》

 

《5分钟动量交易系统》是关天豪、魏强斌所著的一本书,介绍了一种交易系统。

最近学写MQL4,就想将该系统写成EA自己来测试一下。于是按照书中的策略,为便于编程,略作修改如下:

1、进场条件1:汇价上穿21周期EMA

2、进场条件2:汇价上穿21周期EMA的同时(约5根MACD柱线内),MACD柱线上穿0轴,即开多单。
                        进场方式采用同时开2张单子,第1张设置止盈,第2张不设止盈。
3、出场:(1)设置保守性初始止损出场:进场点对应EMA均线值下方250点。该版系统采用该方式设置初始止损,止损默认250点。书中还有激进性初始止损点:该上涨波段起点处,即近期低点之下一点。(EA暂未采用)

               (2)第1张如止盈,则将第2张单子的止损点修改为开仓价位,然后开始移动止损,默认回撤250点止损。

有部分代码是参考了赵越老师的课程代码。

测试了一下,在有趋势行情时还是可以盈利的。

下面把做多的代码贴上来,请高手指点一下还存在哪些问题。

#property strict
int magic=2022111;
input double 下单量=0.01;
input int ema=21;
input int buyN=5; //入场触发条件有效K线根数
input int chushistop=250; //初始止损点数(书中为200点)
input int chushitp=300;  //初始止盈点数(书中等于初始止损点数)
input double TrailingStop = 250;  //移动止损点数
double EMA_0,EMA_1,EMA_2,MACD1,MACD2,MACD3;
double buychushi_tp=0; //初始止损变量
datetime buytime=0; //防止同一根bar反复开仓变量
datetime modifytime=0; //防止同一根bar反复修改止损变量
int CountL=0; //触发条件有效K线根数计数
int zhuizong=0;  //移动止损开关

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   EMA_0=iMA(NULL,0,ema,0,MODE_EMA,PRICE_CLOSE,0);
   EMA_1=iMA(NULL,0,ema,0,MODE_EMA,PRICE_CLOSE,1);
   EMA_2=iMA(NULL,0,ema,0,MODE_EMA,PRICE_CLOSE,2);
   MACD1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   MACD2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
   MACD3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3);
   
   if(Close[1]>=EMA_1 && Close[2]<EMA_2 && MACD1<0)
                {
                        CountL = Bars; //获取当前图表柱数。当价格上穿EMA,而MACD还为负值时,开始计数,用于控制开仓
                }

//如果持仓多单数=0,则进行初始开多单
   if(buydanshu()==0)
      {
        if(Close[1]>EMA_1 && MACD1>0 && Bars <= CountL+buyN)
          {
           if(buytime!=Time[0])
            {
              int a=0;
              double stop1=EMA_0-chushistop*Point;
              a=OrderSend(Symbol(),OP_BUY,下单量,Ask,20,stop1,Ask+chushitp*Point,Symbol()+"buy",magic,0,White);
              buychushi_tp=Ask+250*Point;
              if(OrderSend(Symbol(),OP_BUY,下单量,Ask,20,stop1,0,Symbol()+"buy1",magic,0,Blue)>0)  //第2单不设止盈
               {
                 buytime=Time[0];
               }
            }
          }
      }

   //价格达到多单初始止盈,修改第2张单子的止损价为开仓价
   if(Close[1]>buychushi_tp && zhuizong==0)
   {
      for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
         {
            string zhushi=(Symbol()+"buy1");
            if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderComment()==zhushi)
            {
               double sl=OrderOpenPrice();
               if(NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(sl,Digits))
               {
                  int a=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Green);
                  if(a>0)
                  {
                     zhuizong=1;
                     modifytime=Time[0];         
                  }
               }
            }
         }
      }
    }

//移动止损
    if(zhuizong==1 && TrailingStop>0 && modifytime!=Time[0])
      {
       for(int i=0;i<OrdersTotal();i++)
         {
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
            {
             string zhushi=(Symbol()+"buy1");
             if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderComment()==zhushi)
               {
                if(Bid-OrderOpenPrice()>Point*TrailingStop)
                  {
                   if(OrderStopLoss()<(Bid-Point*TrailingStop))
                     {
                      double sl=Bid-Point*TrailingStop;
                      if(NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(sl,Digits))
                        {
                         int a=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Green);
                         if(a>0) modifytime=Time[0];
                        }
                     }
                  }
               }
            }
         }
      }
    
    if(OrdersTotal()==0)
    {
      zhuizong=0;
    }
  }

//-----统计多单数量函数
int buydanshu()
  {
     int a=0;
     for(int i=0;i<OrdersTotal();i++)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
          {
            if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==magic)
              {
                a++;
              }
          }
      }
    return(a);
  }
 
如果您是刚刚开始学习编写,建议您从MT5开始学
 

谢谢版主建议,希望今后多多指教。

 
为什么要从MQL5开始学