夜雨聆风学习资料网

ARTICLE · 1043281

趋势跟随类 EA源码分享:纯趋势逻辑,无加仓无马丁,布林轨道拐点识别 + 一次一单 + 动态追踪止盈 的趋势跟随 EA!

趋势跟随类 EA源码分享:纯趋势逻辑,无加仓无马丁,布林轨道拐点识别 + 一次一单 + 动态追踪止盈 的趋势跟随 EA!
HI,大家好,周末EA分享日!
今天带来的是一款老版本的MT4的EA,基于 3 根 K 线的布林带轨道形变判断趋势拐点,搭配动态追踪止盈(移动止盈),单 K 线仅允许开一单,属于趋势跟随类 EA。

2. 开仓规则

  1. 单根 K 线只开一次仓
    if (Time[0] != OrderTime) OrderOpen = false; 防止同一根 K 线反复重入、重复加仓;
  2. 持仓状态标记OrderOpen有持仓时不再触发新单,是一次一单 EA,不带马丁、不带加仓;
  3. 可配置参数:手数Lots、滑点Slippage、魔术号MagicNumber
  4. 开仓仅设置滑点,开仓时不预埋固定止损 / 止盈,盈亏控制靠后端动态移动止盈和条件平仓。
#property copyright "浪人微信:waihuipai"#property link      ""extern double Lots = 0.1;extern int Slippage = 3;extern int MagicNumber = 999999;extern int Boll周期 = 20;extern int Boll偏差 = 2;bool OrderOpen = falseint OrderTime;int Ticket;int HoldingOrderType;double MaxBid = 0;double MinAsk = 0;double MovePoint = 0;double BollUpper1;double BollLower1;double BollMiddle1;double BollUpper2;double BollLower2;double BollMiddle2;double BollUpper3;double BollLower3;double BollMiddle3;intinit()  {   return(0);  }intdeinit()  {   return(0);  }intstart()  {//----       BollUpper1 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_UPPER , 1);       BollLower1 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_LOWER , 1);       BollMiddle1 = (BollUpper1 + BollLower1)/2;       BollUpper2 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_UPPER , 2);       BollLower2 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_LOWER , 2);       BollMiddle2 = (BollUpper2 + BollLower2)/2;       BollUpper3 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_UPPER , 3);       BollLower3 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_LOWER , 3);       BollMiddle3 = (BollUpper3 + BollLower3)/2;       if (Time[0] != OrderTime) OrderOpen = false//每根k线只能下单一次       if (Bid > MaxBid) MaxBid = Bid;        if (Ask < MinAsk) MinAsk = Ask;       if (HoldingOrderType == OP_BUY){           if (OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) == true){               if (MaxBid - OrderOpenPrice() < 150 * Point) MovePoint = 80 * Point ;   // 盈利小于15刀,定义止损止盈为回落8刀               if (MaxBid - OrderOpenPrice() >= 150 * Point)MovePoint = (MaxBid - OrderOpenPrice()) * 0.3 * Point ; // 盈利大于15刀,定义止损止盈为回落盈利的30%           }           if ((MaxBid - Bid >MovePoint) || (Close[2]>BollMiddle2 && Close[1]<BollMiddle1) ||  OrderProfit() > 10.0)CloseAllBuy();       }       if (HoldingOrderType == OP_SELL){           if (OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) == true){               if (OrderOpenPrice() - MinAsk < 150 * Point) MovePoint = 80 * Point ;               if (OrderOpenPrice() - MinAsk >= 150 * Point)MovePoint = (OrderOpenPrice() - MinAsk) * 0.3 * Point ;           }           if ((Ask - MinAsk > MovePoint) || (Close[2]<BollMiddle2 && Close[1]>BollMiddle1) ||  OrderProfit() > 10.0) CloseAllSell();       }       if(Boll(OP_BUY) == true && OrderOpen == false)  // 上轨 中轨 初次向上 下轨向下 买单        {           Ticket=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask, Digits),Slippage,0,0,"dummy-buy",MagicNumber,0,Red);           if(Ticket>0)           {              if (OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES))              {                 OrderOpen = true;                 OrderTime = Time[0];                 MaxBid = Bid;                 HoldingOrderType = OrderType();                 Print("Pivot dummy-buy order opened : ",OrderOpenPrice());              }              else              {                 Print("Error opening Pivot dummy-buy order : ",GetLastError());                 return(0);              }           }        }        else if(Boll(OP_SELL) == true && OrderOpen == false)  // 上轨 中轨 初次向下 下轨向上 卖单        {           Ticket=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid, Digits),Slippage,0,0,"dummy-sell",MagicNumber,0,Blue);           if(Ticket>0)           {              if (OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES))              {                 OrderOpen = true;                 OrderTime = Time[0];                 MinAsk = Ask;                 HoldingOrderType = OrderType();                 Print("Pivot dummy-sell order opened : ",OrderOpenPrice());              }              else              {                 Print("Error opening Pivot dummy-sell order : ",GetLastError());                 return(0);              }           }        }//----   return(0);  }//+------------------------------------------------------------------+boolBoll(int type){   BollUpper1 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_UPPER , 1);   BollLower1 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_LOWER , 1);   BollMiddle1 = (BollUpper1 + BollLower1)/2;   BollUpper2 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_UPPER , 2);   BollLower2 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_LOWER , 2);   BollMiddle2 = (BollUpper2 + BollLower2)/2;   BollUpper3 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_UPPER , 3);   BollLower3 = iBands(Symbol() , 0 , Boll周期 , Boll偏差 , 0 , PRICE_CLOSE , MODE_LOWER , 3);   BollMiddle3 = (BollUpper3 + BollLower3)/2;   switch(type)   {   case OP_BUY: // 上轨 中轨 初次向上 下轨向下    if((BollUpper2<BollUpper3&&BollUpper2<BollUpper1 && BollMiddle2<BollMiddle1 && BollLower1<BollLower2)||(BollUpper2<BollUpper1 &&  BollMiddle2<BollMiddle3&&BollMiddle2<BollMiddle1 && BollLower1<BollLower2))    {     return (true);    }else return(false);    break;   case OP_SELL: // 上轨 中轨 初次向下 下轨向上    if((BollUpper2>BollUpper3&&BollUpper2>BollUpper1 && BollMiddle2>BollMiddle1 && BollLower1>BollLower2)||(BollUpper2>BollUpper1 &&  BollMiddle2>BollMiddle3&&BollMiddle2>BollMiddle1 && BollLower1>BollLower2))    {     return (true);    }else return(false);    break;   }}voidCloseAllSell(){   bool CAS = FALSE;   for (int t=0; t<OrdersTotal(); t++)   {      OrderSelect(t, SELECT_BY_POS, MODE_TRADES);      if (OrderSymbol()==Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber )      CAS = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(OrderClosePrice(), Digits), Slippage, Yellow);   }}voidCloseAllBuy() {   bool CAB = FALSE;   for (int t=0; t<OrdersTotal(); t++)    {      OrderSelect(t, SELECT_BY_POS, MODE_TRADES);      if (OrderSymbol()==Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)      CAB = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(OrderClosePrice(), Digits), Slippage, Yellow);   }}

相关学习资料