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); // 返回信号值为1if(大均线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);}}}}}//+------------------------------------------------------------------+