MT4自带的MACD Sample EA注释详解

诚万三 2022-11-02 852浏览 0评论

今天咱们继续说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;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
发表评论