- #property strict
- int magic=2022111;
- input double 下单量=0.01;
- input int ema=21;
- input int buyN=5; //入场触发条件有效K线根数
- input int chushistop=250; //初始止损点数(书中为200点)
- input int chushitp=300; //初始止盈点数(书中等于初始止损点数)
- input double TrailingStop = 250; //移动止损点数
- double EMA_0,EMA_1,EMA_2,MACD1,MACD2,MACD3;
- double buychushi_tp=0; //初始止损变量
- datetime buytime=0; //防止同一根bar反复开仓变量
- datetime modifytime=0; //防止同一根bar反复修改止损变量
- int CountL=0; //触发条件有效K线根数计数
- int zhuizong=0; //移动止损开关
- //+------------------------------------------------------------------+
- //| Expert initialization function |
- //+------------------------------------------------------------------+
- int OnInit()
- {
- return(INIT_SUCCEEDED);
- }
- //+------------------------------------------------------------------+
- //| Expert deinitialization function |
- //+------------------------------------------------------------------+
- void OnDeinit(const int reason)
- {
- }
- //+------------------------------------------------------------------+
- //| Expert tick function |
- //+------------------------------------------------------------------+
- void OnTick()
- {
- EMA_0=iMA(NULL,0,ema,0,MODE_EMA,PRICE_CLOSE,0);
- EMA_1=iMA(NULL,0,ema,0,MODE_EMA,PRICE_CLOSE,1);
- EMA_2=iMA(NULL,0,ema,0,MODE_EMA,PRICE_CLOSE,2);
- MACD1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
- MACD2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
- MACD3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3);
-
- if(Close[1]>=EMA_1 && Close[2]<EMA_2 && MACD1<0)
- {
- CountL = Bars; //获取当前图表柱数。当价格上穿EMA,而MACD还为负值时,开始计数,用于控制开仓
- }
- //如果持仓多单数=0,则进行初始开多单
- if(buydanshu()==0)
- {
- if(Close[1]>EMA_1 && MACD1>0 && Bars <= CountL+buyN)
- {
- if(buytime!=Time[0])
- {
- int a=0;
- double stop1=EMA_0-chushistop*Point;
- a=OrderSend(Symbol(),OP_BUY,下单量,Ask,20,stop1,Ask+chushitp*Point,Symbol()+"buy",magic,0,White);
- buychushi_tp=Ask+250*Point;
- if(OrderSend(Symbol(),OP_BUY,下单量,Ask,20,stop1,0,Symbol()+"buy1",magic,0,Blue)>0) //第2单不设止盈
- {
- buytime=Time[0];
- }
- }
- }
- }
- //价格达到多单初始止盈,修改第2张单子的止损价为开仓价
- if(Close[1]>buychushi_tp && zhuizong==0)
- {
- for(int i=0;i<OrdersTotal();i++)
- {
- if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
- {
- string zhushi=(Symbol()+"buy1");
- if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderComment()==zhushi)
- {
- double sl=OrderOpenPrice();
- if(NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(sl,Digits))
- {
- int a=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Green);
- if(a>0)
- {
- zhuizong=1;
- modifytime=Time[0];
- }
- }
- }
- }
- }
- }
- //移动止损
- if(zhuizong==1 && TrailingStop>0 && modifytime!=Time[0])
- {
- for(int i=0;i<OrdersTotal();i++)
- {
- if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
- {
- string zhushi=(Symbol()+"buy1");
- if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderComment()==zhushi)
- {
- if(Bid-OrderOpenPrice()>Point*TrailingStop)
- {
- if(OrderStopLoss()<(Bid-Point*TrailingStop))
- {
- double sl=Bid-Point*TrailingStop;
- if(NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(sl,Digits))
- {
- int a=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Green);
- if(a>0) modifytime=Time[0];
- }
- }
- }
- }
- }
- }
- }
-
- if(OrdersTotal()==0)
- {
- zhuizong=0;
- }
- }
- //-----统计多单数量函数
- int buydanshu()
- {
- int a=0;
- for(int i=0;i<OrdersTotal();i++)
- {
- if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
- {
- if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==magic)
- {
- a++;
- }
- }
- }
- return(a);
- }
复制代码
|