夜雨聆风学习资料网

ARTICLE · 1133938

MA 双时间框架均线 EA源码分享:双周期共振思路,过滤杂波,灵活的止损止盈配置 + 跟踪止损

MA 双时间框架均线 EA源码分享:双周期共振思路,过滤杂波,灵活的止损止盈配置 + 跟踪止损
HI,大家好,国庆要结束了,是的,是到分享EA的时间了,

这款Ea的交易信号逻辑:双时间周期均线共振(但是我们没有做实际测试哈,建议大家模拟教学玩)

大周期(参数大时间框默认 15 分钟):60 周期 SMA 均线,判断趋势方向:大均线 1 > 大均线 2 → 大周期上升趋势(做多环境)大均线 1 < 大均线 2 → 大周期下降趋势(做空环境)

小周期(参数`小时间框`默认 5 分钟):4 周期 SMA 均线,抓短期拐点

做多条件:大周期向上 + 小均线 2 <小均线 3 + 小均线 1> 小均线 2(小均线拐头向上)做空条件:大周期向下 + 小均线 2 > 小均线 3 + 小均线 1 < 小均线 2(小均线拐头向下)

原理:大周期定趋势,小周期抓回调拐点,属于趋势 + 拐点思路

源码:
// 浪人EA 微信 :waihuipai //写法很标准,多处可借签.#define MAGICMA 20100604//+------------------------------------------------------------------+extern int    检查均线模式     = 2;                                                                      //1~4 种下单方式  1 仅开仓, 2 有止损无止赢, 3 有止赢无止损, 4 有止赢也有止损extern double 赢利目标         = 150;                                                                    //extern double 止损             = 30;                                                                     //extern double 最大风险         = 0.3;                                                                    //资金控制,控制下单量extern double 跟踪止损         = 10;                                                                     //extern int    最大开仓次数     = 1;                                                                      //最多开仓次数限制 extern double 最大手数         = 0.1;                                                                    //最多单仓持仓量限制 extern int    是否允许跟踪止赢 = 1;                                                                      //非零就允许跟踪止赢extern int    小时间框         = 5;extern int    大时间框         = 15;int 小均线周期=5,    大均线周期=30,    i,    p2,     xxx,    p1,     res;double 手数; datetime 最后时间;                                                                                       //时间控制, 仅当一个时间周期完成才检查条件//+----------------------初始化-------------------------------------+intinit()  {    手数 = 1;    最后时间 = NULL;   return(0);   }//+---------------------反初始化-------------------------------------+intdeinit(){ return(0); } //+---------------------主程序---------------------------------------+intstart()  {   开仓前检查子();                                                                                       //开仓 平仓 条件检查 和操作   if (是否允许跟踪止赢>0)   跟踪止损设置子();                                                                      //跟踪止赢   return(0);   }  if(Hour()<=7&&Hour()>=10)return;              //在22点到2点之间做单//+-------确定下单量 子函数()----------------------------------------+double 手数最佳化子() {double lot =手数;//MarketInfo(Symbol(),MODE_MINLOT);     相关信息//MarketInfo(Symbol(),MODE_MAXLOT);//MarketInfo(Symbol(),MODE_LOTSTEP);lot=NormalizeDouble(最大风险 * AccountBalance()/AccountLeverage(),1);                                    //开仓量计算if(lot<0.1)  lot=0.1;if(lot>最大手数)  lot=最大手数;return(lot);}//----------平买 单子函数()------------------------------------------+void 平买子(){if (OrdersTotal() > 0 )     {  for(i=OrdersTotal()-1; i>=0; i--)    {    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;    if(OrderType()==OP_BUY)       {      OrderClose(OrderTicket(),OrderLots(),Bid,3,White);      Sleep(5000);       }    }  }}//------------平卖 子函数()-------------------------------------------+void 平卖子(){if (OrdersTotal( ) > 0 )   {  for(i=OrdersTotal()-1;i>=0;i--)  {  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;  if(OrderType()==OP_SELL)     {    OrderClose(OrderTicket(),OrderLots(),Ask,3,White);    Sleep(5000);     }  }}}//-----------------买卖平条件 子函数()------------------------------------------------+int 买卖平条件子()                                                                                        // 在这个函数时可以更改设置你的交易信号 ( 这里使用MACD 和MA 做例子)   {    double 小均线1, 小均线2, 小均线3, 大均线1, 大均线2;             小均线1= iMA(NULL,小时间框,4, 0,MODE_SMA,PRICE_MEDIAN,1);             小均线2= iMA(NULL,小时间框,4, 0,MODE_SMA,PRICE_MEDIAN,2);             小均线3= iMA(NULL,小时间框,4, 0,MODE_SMA,PRICE_MEDIAN,3);             大均线1= iMA(NULL,大时间框,60,0,MODE_SMA,PRICE_MEDIAN,1);             大均线2= iMA(NULL,大时间框,60,0,MODE_SMA,PRICE_MEDIAN,2);   if(大均线1>大均线2  &&小均线2<小均线3  &&小均线1>小均线2)                                              // 买条件 大周期时间Ma在上升,小周期均线向上转折       return (1);                                                                                        // 返回信号值为1   if(大均线1<大均线2  &&小均线2>小均线3  &&小均线1<小均线2)                                              // 卖条件       return (-1);                                                                                       // 卖信号return (0);                                                                                               // 若上述信号值没有,则返回不交易信号0}//+---------------开仓前内容的检查 子函数()-------------------------+/////////////////////////////////*时间控制开仓///////////////////////////////    if(Hour()<=21&&Hour()>=2)return;              //在22点到2点之间做单int 现在买卖 = 0;void 开仓前检查子(){if (Time[0] == 最后时间 ) return;                                                                         // 如果现在开盘时间与最后时间不同,则将现在的开盘时间赋给最后时间最后时间 = Time[0];现在买卖 = 买卖平条件子();                                                                                //将变量赋为 获取买卖条件子函数的信号值if (现在买卖 == 1)                                                                                        //买 先结束已卖的    平卖子();if (现在买卖 == -1)                                                                                       //卖 先结束已买的    平买子();if (TimeDayOfWeek( TimeCurrent() )==1)                                                                    //如果 服务器时间的星期数为周一  {  if (TimeHour( TimeCurrent() ) <3 ) return;                                                              //且服务器的时间小时数在3点前,则不进行交易  }if (TimeDayOfWeek( TimeCurrent() )==5)  {  if (TimeHour( TimeCurrent() )>19 ) return;                                                              //周五晚19点后不做(服务器时间)  }if (OrdersTotal() >= 最大开仓次数) return ;                                                               //如果已持有开仓次数达到最大,不做  if (现在买卖==0) return;                                                                                  //如果交易信号值为0,不交易TradeOK();                                                                                                //去下单交易}//+------------------去下单交易 子函数()------------------------------+voidTradeOK(){int 错误 ;if (现在买卖 == 1)                                                                                        //买信号  {    switch (检查均线模式)    {    case 1:   res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, 0,              0,                  "",MAGICMA,0,Blue);break;    case 2:   res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, Ask-止损*Point, 0,                  "",MAGICMA,0,Blue);break;    case 3:   res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, 0,              Ask+赢利目标*Point, "",MAGICMA,0,Blue);break;    case 4:   res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, Ask-止损*Point, Ask+赢利目标*Point, "",MAGICMA,0,Blue);break;    default : res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, 0,              0,                  "",MAGICMA,0,Blue);break;    }    if (res <=0)    {    错误=GetLastError();    if(错误==134) Print("错误134 :没钱了!! ");     if(错误==135) RefreshRates();   // 价格已发生变化    }    Sleep(5000);     return ;     }if (现在买卖 == -1)                                                                                       //卖信号出现  {    switch (检查均线模式)    {    case 1:   res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, 0,              0,                 "",MAGICMA,0,Red); break;    case 2:   res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, Bid+止损*Point, 0,                 "",MAGICMA,0,Red); break;    case 3:   res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, 0,              Bid-赢利目标*Point,"",MAGICMA,0,Red); break;    case 4:   res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, Bid+止损*Point, Bid-赢利目标*Point,"",MAGICMA,0,Red); break;    default : res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, 0,              0,                 "",MAGICMA,0,Red); break;    }    if (res <=0)    {    错误=GetLastError();    if(错误==134) Print("错误134 :没钱了!!!! ");    if(错误==135) RefreshRates();                                                                         // 价格已发生变化,再刷新一下数据    }    Sleep(5000);                                                                                          //等待5秒                      return ;     }}//+---------------------//跟踪止损 子函数---------------------------------------------+void 跟踪止损设置子()   {bool 修改 = false;for (int i=0; i<OrdersTotal(); i++)  {  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;  if (OrderType()==OP_BUY)     {    if ((Bid -OrderOpenPrice()) > (跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT)))                       //开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置       {      if (OrderStopLoss() < Bid -跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT))          {          修改 = OrderModify(OrderTicket(),                            OrderOpenPrice(),                            Bid - 跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT),                           OrderTakeProfit(),                           0,                            Green);         }       }    }   else if (OrderType()==OP_SELL)     {    if ((OrderOpenPrice() -Ask) > (跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT)))                       //开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置       {        if ((OrderStopLoss()) > (Ask + 跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT)))           {                 修改 = OrderModify(OrderTicket(),                              OrderOpenPrice(),                             Ask + 跟踪止损*MarketInfo(OrderSymbol(),MODE_POINT),                              OrderTakeProfit(),                             0,                              Tan);           }       }    }  }} //+------------------------------------------------------------------+

相关学习资料