夜雨聆风学习资料网

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 EMA55      2、两条布林线: 标准差2和标准差1,ma为20      3、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);//MA5   double 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);    }}

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料