今天咱们继续说MT4自带的另一个EA:MACD Sample,是用Macd和均线两个指标配合进出场的策略。不多说了,直接上源码,有问题的小伙伴请在评论区留言。
//+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright 2005-2014, MetaQuotes Software Corp. | //| http://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "2005-2014, MetaQuotes Software Corp." #property link "http://www.mql4.com" input double TakeProfit =5000; //获利=50点 input double Lots =0.1; //每次下单量=01手 input double StopLoss =400; //初始止损=40点 input double TrailingStop =500; //移动止损=50点 input double MACDOpenLevel =3; //开仓水平=3点 input double MACDCloseLevel=2; //平仓水平=2点 input int MATrendPeriod =100; //均线趋势周期 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick(void) { double MacdCurrent,MacdPrevious; //定义变量-小数型:当前MACD柱、前次MACD柱 double SignalCurrent,SignalPrevious; //定义变量-小数型:当前MACD线、前次MACD线 double MaCurrent,MaPrevious; //定义变量-小数型:当前均线、前次均线 int cnt,ticket,total; //定义变量-整数型:cnt、tickt、total //--- // initial data checks初始条件检查 // it is important to make sure that the expert works with a normal这些参数与数值的设置,其重要性就是确保本软件能在主图中正常运行,并保障使用者不会产生错误 // chart and the user did not make any mistakes setting external // variables (Lots, StopLoss, TakeProfit, 还可以根据我们的要求进行改变参数(如:下单量、止损,止赢、移动止损),我们这里选择止赢 // TrailingStop) in our case, we check TakeProfit // on a chart of less than 100 bars主图中上的K线不少于100根 //--- if(Bars<100)//如果(K线数<100) { Print("bars less than 100"); //输出(“少于100根”) return; } if(TakeProfit<10) //如果(止赢<10点) { Print("TakeProfit less than 10"); //输出(“止赢小于10点”) return; } //--- to simplify the coding and speed up access data are put into internal variables进入加速度计算的基本编码 计算数据中的变量设置 //基本数据计算 MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); //当前MACD= MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); //前次MACD= SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); //当前信号= SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //前次信号= MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_SMA,PRICE_CLOSE,0); //当前MA= MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_SMA,PRICE_CLOSE,1); //前次MA= //帐户资金检查 total=OrdersTotal();//总数=仓单统计 if(total<1) //如果(总数<1) { //--- no opened orders identified没有开仓的情况 if(AccountFreeMargin()<(1000*Lots))//如果(帐户可用资金<1000*开仓量) { Print("We have no money. Free Margin = ",AccountFreeMargin());//输出(“没有足够的资金,可用保证金=”,帐户可用资金) return; } //--- check for long position (BUY) possibility 检查长期可能的(多头买入)方向 if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) //如果(当前MACD<0 且 当前MACD>当前信号 且前次MACD<前次信号且 取绝对值(当前MACD)>开仓水平*点 且当前均线>前次均线) //---MACD处于0轴以下(熊市)+MACD与信号形成金叉+MACD的绝对值>MACD开仓水平值*点数+均线上升--(条件:零下金叉+均线上行) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green); // ticket=发送订单(当前货币对,多仓,开仓量,卖价,滑点=3,无止损,止赢=卖价+止赢*点,“简单MACD”,订单号,限挂单=0,绿色箭头显示) if(ticket>0)//如果(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) //如果(定单选择(订单索引,选择模式,来自交易的订单-开单/挂单)) Print("BUY order opened : ",OrderOpenPrice()); //输出(“买单开仓价:”,开仓价) } else Print("Error opening BUY order : ",GetLastError()); //否则,输出(“多单开仓错误:”,错误信息) return; } //--- check for short position (SELL) possibility检查短期可能的(空头)方向 if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious) //如果(当前MACD>0 且 当前MACD<当前信号 且前次MACD>前次信号且 当前MACD>MACD水平*点 且当前MAC<前次MA) //----MACD处于0轴以上(牛市)+MACD与信号形成死叉+MACD值>MACD开仓水平值*点数+均线下降--(条件:零上死叉+均线下行) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red); // ticket=发送订单(当前货币对,空仓,开仓量,买价,滑点=3,无止损,止赢=买价-止赢*点,“简单MACD”,订单号,限挂单,红色箭头显示) if(ticket>0)//如果(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) //如果(定单选择(订单索引,选择模式,来自交易的订单-开单/挂单)) Print("SELL order opened : ",OrderOpenPrice()); //输出(“卖单开仓价:”,开仓价) } else Print("Error opening SELL order : ",GetLastError()); //否则,输出(“空单开仓错误:”,错误信息) } //--- exit from the "no opened orders" block return; } //--- it is important to enter the market correctly,这对于正确进行买卖是重要的but it is more important to exit it correctly但更重要的是对于正确退出市场... //仓单与挂单检查 for(cnt=0;cnt<total;cnt++) //循环查找(cnt=0;cnt<总数;cnt=cnt+1) { if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))//订单选择(订单索引号,查找模式,来自交易的订单-开单/挂单) continue; if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) // check for symbol { //--- —开仓是长期方向 if(OrderType()==OP_BUY) //如果(订单类型=多单) { //---查检是否应用平仓 //--- 多头平仓 if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) //如果(当前MACD>0 且 当前MACD<当前信号且 前次MACD>前次信号 且当前MACD>MACD平仓水平*点) //--MACD处于0轴上方+MACD与信号线形成死叉+当前MACD>MACD平仓水平*点 { if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError()); //--- 平仓(订单索引,订单持仓量,买价,滑点=3,紫罗兰色箭头) return; } //--- 多头移动止损并挂单修改 if(TrailingStop>0)//如果(移动止损>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) //如果(买价-订单开仓价>移动止损*点) { if(OrderStopLoss()<Bid-Point*TrailingStop) //如果(订单止损价<买价-移动止损*点) { //---修改订单(订单索引,开仓价,买价-移动止损*点,止赢价,限价单,绿色箭头显示) if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green)) Print("OrderModify error ",GetLastError()); return; } } } } else //否则 –就到短期方向 { //空头平仓 //--- /如果(当前MACD<0 且 当前MACD>当前信号且 前次MACD<前次信号 且 MACD与信号线形成金叉 且取绝对值(当前MACD)>MACD平仓水平*点) //----MACD处于0轴下方+MACD与信号出现金叉+当前MACD绝对值>MACD平仓点 if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) { //---平仓(订单编号,订单仓量,卖价,滑点=3,紫罗兰色箭头显示) if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("OrderClose error ",GetLastError()); return; } //--空头移动止损并挂单修改 if(TrailingStop>0)//如果(移动止损>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop))//如果(订单开仓价-卖价>移动止损*点) { //如果(订单止损价>卖价+移动止损*点 或 订单止损=0)---订单止损=0,代表不设止损价 if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { //--- 修改订单(订单编号,开仓价,卖价+移动止损*P,止赢,限价单,红色箭头显示) if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red)) Print("OrderModify error ",GetLastError()); return; } } } } } } } //+------------------------------------------------------------------+
发表评论