ARTICLE · 1043281
趋势跟随类 EA源码分享:纯趋势逻辑,无加仓无马丁,布林轨道拐点识别 + 一次一单 + 动态追踪止盈 的趋势跟随 EA!
趋势跟随类 EA源码分享:纯趋势逻辑,无加仓无马丁,布林轨道拐点识别 + 一次一单 + 动态追踪止盈 的趋势跟随 EA!HI,大家好,周末EA分享日! 今天带来的是一款老版本的MT4的EA,基于 3 根 K 线的布林带轨道形变判断趋势拐点,搭配动态追踪止盈(移动止盈),单 K 线仅允许开一单,属于趋势跟随类 EA。
2. 开仓规则
- 单根 K 线只开一次仓
: if (Time[0] != OrderTime) OrderOpen = false;防止同一根 K 线反复重入、重复加仓; 持仓状态标记 OrderOpen,有持仓时不再触发新单,是一次一单 EA,不带马丁、不带加仓;可配置参数:手数 Lots、滑点Slippage、魔术号MagicNumber;开仓仅设置滑点,开仓时不预埋固定止损 / 止盈,盈亏控制靠后端动态移动止盈和条件平仓。
#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 = false;int 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);}}