ARTICLE · 1349739
【趋势过滤 + 均线突破】的顺势 EA源码分享!
【趋势过滤 + 均线突破】的顺势 EA源码分享!这是一套【趋势过滤 + 均线突破】的顺势 EA,不带内置止损 SL,采用单笔固定手数、同根 K 线只开一单、到达总盈利目标一键全平的逻辑;同时自带反向盈利单先行平仓,只留当前方向新单。
1. 趋势前置过滤做得比较严谨
不是简单金叉死叉,先用 EMA55 连续 10 根 K 线方向判定大趋势,过滤掉频繁无序的杂信号,优先只做持续趋势行情,思路是 “顺大周期趋势做短均线突破”,属于经典顺势框架,逻辑上贴合趋势交易理念。
2. 震荡过滤机制
布林带宽收缩就屏蔽信号,本意是避开区间震荡来回扫损,减少震荡里频繁开单挨打。
3. 无马丁、无加仓,固定手数
对比泛滥的马丁 EA,它不会越亏加倍,不会风险指数级放大,基础仓位风险可控,适合不喜欢网格马丁的交易者。
源码 :
//+------------------------------------------------------------------+//| 远古交易B法则.mq4 |//| 浪人EA |//| |//+------------------------------------------------------------------+#property copyright "浪哥微信:waihuipai"#property link ""//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+string TradeSignal="N/A";//交易信号,Buy,Sell,N/Aextern double FirstLots=0.1;extern double MaxOrderNum=50;extern double AimPointCloseAll=100;//extern double SL=100;extern int Slippage = 3;extern int MagicNumber = 888888;static int RecordTime;static bool done=false;intinit() {ObjectCreate("comment_label", OBJ_LABEL, 0, 0, 0);ObjectSet("comment_label", OBJPROP_XDISTANCE, 50);ObjectSet("comment_label", OBJPROP_YDISTANCE, 20);ObjectSetText("comment_label", "紅之匯【远古交易B法则】ATC", 9, "Arial", Red);return (0);}intdeinit() {ObjectDelete("comment_label");return (0);}//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+intstart(){//----SendTradeSignal();if(OrdersTotal()==MaxOrderNum&&GetTotalProfit()>AimPointCloseAll*Point*100000){CloseAllOrder();}if(Time[0]!=RecordTime){RecordTime=Time[0];done=false;}if (TradeSignal=="Buy" && done==false && OrdersTotal()<MaxOrderNum ){OrderSend(Symbol(), OP_BUY, FirstLots, NormalizeDouble(Ask, Digits),Slippage, 0, 0, "Order Buy", MagicNumber, 0, Red);CloseAllWinSell();done=true;}else if (TradeSignal=="Sell" && done==false && OrdersTotal()<MaxOrderNum ){OrderSend(Symbol(), OP_SELL, FirstLots, NormalizeDouble(Bid, Digits),Slippage, 0, 0, "Order Sell", MagicNumber, 0, Red);CloseAllWinBuy();done=true;}//----return(0);}//+------------------------------------------------------------------+/*函数:计算交易信号1、两条均线:EMA5 EMA552、两条布林线: 标准差2和标准差1,ma为203、EMA55向上,当5日均线上穿20日均线(布林中轨),发出做多Buy信号4、EMA55向下,当5日均线下穿20日均线,发出做空Sell信号5、55均线无明确方向,发出N/A信号6、布林线开口收缩小于10点,发出N/A信号*/stringSendTradeSignal(){//获取指标度数TradeSignal="N/A";double myMA_5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);//MA5double myBollong_Up=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,0);//布林20日上线double myBollong_Main=iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0);//布林20日主线double myBollong_Down=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,0);//布林20日下线//判断MA55的方向,10个蜡烛连续依次大于(小于)为向上(向下),否则,不交易string MA55_UpSignal,MA55_DownSignal;//MA55方向临时信号变量string Bolling_Signal;//布林带临时信号变量int i;//循环变量for (i=0;i<10;i++){double MA_55_now=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i);//MA55当前值double MA_55_pre=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i+1);//MA55前值if (MA_55_now>MA_55_pre) MA55_UpSignal="UP";//连续大于,给出向上信号if (MA_55_now<=MA_55_pre)//出现小于等于,给出不交易信号,中断判断循环{MA55_UpSignal="N/A";break;}}for (i=0;i<10;i++){MA_55_now=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i);//MA55当前值MA_55_pre=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i+1);//MA55前值if (MA_55_now<MA_55_pre) MA55_DownSignal="Down";//连续小于,给出向下信号if (MA_55_now>=MA_55_pre)//出现大于等于,给出不交易信号,中断判断循环{MA55_DownSignal="N/A";break;}}//EMA55向上,当5日均线上穿20日均线(布林中轨),发出做多Buy信号if (MA55_UpSignal=="UP" && (myMA_5>myBollong_Main)) TradeSignal="Buy";//EMA55向下,当5日均线下穿20日均线,发出做空Sell信号if (MA55_DownSignal=="Down" && (myMA_5<myBollong_Main)) TradeSignal="Sell";//判断布林线不交易信号if (MathAbs(myBollong_Up-myBollong_Down)<100*Point) TradeSignal="N/A";//文字显示、图表标注交易信号SetLable("信息栏","交易信号:"+TradeSignal,5,20,10,"Verdana",Olive);DrawTradPoint(TradeSignal,Close[0]);return(TradeSignal);//函数返回交易信号}/*函数:在屏幕上显示标签LableName:标签名称;LableDoc:文本内容;LableX:标签X位置;LableY:标签Y位置;DocSize:文本字号;DocStyle:文本字体;DocColor:文本颜色*/voidSetLable(string LableName,string LableDoc,int LableX,int LableY,int DocSize,string DocStyle,color DocColor){ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);ObjectSetText(LableName,LableDoc,DocSize,DocStyle,DocColor);ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);}/*函数:画出交易点,红箭头为卖出,绿箭头为买入,圆圈为突破点*/voidDrawTradPoint(string mySignal,double myPrice){if (mySignal=="Buy"){ObjectCreate("BuyPoint-"+Time[0],OBJ_ARROW,0,Time[0],myPrice);ObjectSet("BuyPoint-"+Time[0],OBJPROP_COLOR,Green);ObjectSet("BuyPoint-"+Time[0],OBJPROP_ARROWCODE,241);}if (mySignal=="Sell"){ObjectCreate("SellPoint-"+Time[0],OBJ_ARROW,0,Time[0],myPrice);ObjectSet("SellPoint-"+Time[0],OBJPROP_COLOR,Red);ObjectSet("SellPoint-"+Time[0],OBJPROP_ARROWCODE,242);}}voidCloseAllOrder(){bool SucceedClose = FALSE;for (int j= OrdersTotal() - 1; j >= 0; j--) {OrderSelect(j,SELECT_BY_POS, MODE_TRADES);if(OrderType()==OP_BUY)OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), Slippage, CLR_NONE);else if(OrderType()==OP_SELL)OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), Slippage, CLR_NONE);}}doubleGetTotalProfit(){double TotalProfit=0;for (int j= OrdersTotal() - 1; j >= 0; j--) {OrderSelect(j,SELECT_BY_POS, MODE_TRADES);if (OrderType() == OP_BUY || OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)TotalProfit += OrderProfit();}return (TotalProfit);}voidCloseAllWinSell(){bool SucceedClose = FALSE;for (int j= OrdersTotal() - 1; j >= 0; j--) {OrderSelect(j,SELECT_BY_POS, MODE_TRADES);if (OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber && OrderProfit()>0)SucceedClose=OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits),Slippage, CLR_NONE);}}voidCloseAllWinBuy(){bool SucceedClose = FALSE;for (int j= OrdersTotal() - 1; j >= 0; j--) {OrderSelect(j,SELECT_BY_POS, MODE_TRADES);if (OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber && OrderProfit()>0)SucceedClose=OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits),Slippage, CLR_NONE);}}















































































