【MQL4】经典MACD代码

0
回复
4356
查看
[复制链接]

41

主题

32

回帖

248

积分

中级会员

积分
248
来源: 2019-10-14 23:21:47 显示全部楼层 |阅读模式
【MQL4】经典MACD代码


  1. //+------------------------------------------------------------------+
  2. //|                                                  MACD Sample.mq4 |
  3. //|                      Copyright © 2004, MetaQuotes Software Corp. |
  4. //|                                       http://www.metaquotes.net/ |
  5. //+------------------------------------------------------------------+

  6. extern double TakeProfit = 50;
  7. extern double Lots = 0.1;
  8. extern double TrailingStop = 30;
  9. extern double MACDOpenLevel=3;
  10. extern double MACDCloseLevel=2;
  11. extern double MATrendPeriod=26;
  12. double Points;
  13. //+------------------------------------------------------------------+
  14. //|                                                                  |
  15. //+------------------------------------------------------------------+
  16. int init ()
  17.   {
  18.    Points = MarketInfo (Symbol(), MODE_POINT);
  19. //----
  20.    return(0);
  21.   }
  22. //+------------------------------------------------------------------+
  23. //|                                                                  |
  24. //+------------------------------------------------------------------+
  25. int deinit()
  26.   {
  27.    return(0);
  28.   }
  29. //+------------------------------------------------------------------+
  30. //|                                                                  |
  31. //+------------------------------------------------------------------+
  32. int start()
  33.   {
  34.    double MacdCurrent=0, MacdPrevious=0, SignalCurrent=0;
  35.    double SignalPrevious=0, MaCurrent=0, MaPrevious=0;
  36.    int cnt=0, total;
  37. // первичные проверки данных
  38. // важно удостовериться что эксперт работает на нормальном графике и
  39. // пользователь правильно выставил внешние переменные (Lots, StopLoss,
  40. // TakeProfit, TrailingStop)
  41. // в нашем случае проверяем только TakeProfit
  42.    if(Bars<100)
  43.      {
  44.       Print("bars less than 100");
  45.       return(0);  // на графике менее 100 баров
  46.      }
  47.    if(TakeProfit<10)
  48.      {
  49.       Print("TakeProfit less than 10");
  50.       return(0);  // проверяем TakeProfit
  51.      }
  52. // ради упрощения и ускорения кода, сохраним необходимые
  53. // данные индикаторов во временных переменных
  54.    MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
  55.    MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
  56.    SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
  57.    SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
  58.    MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,0);
  59.    MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,1);
  60. // теперь надо определиться - в каком состоянии торговый терминал?
  61. // проверим, есть ли ранее открытые позиции или ордеры?
  62.    if(OrdersTotal()<1)
  63.      {
  64.       // нет ни одного открытого ордера
  65.       // на всякий случай проверим, если у нас свободные деньги на счету?
  66.       // значение 1000 взято для примера, обычно можно открыть 1 лот
  67.       if(AccountFreeMargin()<(1000*Lots))
  68.         {
  69.          Print("We have no money");
  70.          return(0);  // денег нет - выходим
  71.         }
  72.       // проверим, не слишком ли часто пытаемся открыться?
  73.       // если последний раз торговали менее чем 5 минут(5*60=300 сек)
  74.       // назад, то выходим
  75.       // If((CurTime-LastTradeTime)<300) { Exit }
  76.       // проверяем на возможность встать в длинную позицию (BUY)
  77.       if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
  78.          MathAbs(MacdCurrent)>(MACDOpenLevel*Points) && MaCurrent>MaPrevious)
  79.         {
  80.          OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Points,"macd sample",16384,0,Red); // исполняем
  81.          if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice());
  82.          return(0); // выходим, так как все равно после совершения торговой операции
  83.             // наступил 10-ти секундный таймаут на совершение торговых операций
  84.         }
  85.       // проверяем на возможность встать в короткую позицию (SELL)
  86.       if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
  87.          MacdCurrent>(MACDOpenLevel*Points) && MaCurrent<MaPrevious)
  88.         {
  89.          OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Points,"macd sample",16384,0,Red); // исполняем
  90.          if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice());
  91.          return(0); // выходим
  92.         };
  93.       // здесь мы завершили проверку на возможность открытия новых позиций.
  94.       // новые позиции открыты не были и просто выходим по Exit, так как
  95.       // все равно анализировать нечего
  96.       return(0);
  97.      };
  98.    // переходим к важной части эксперта - контролю открытых позиций
  99.    // 'важно правильно войти в рынок, но выйти - еще важнее...'
  100.    total=OrdersTotal();
  101.    for(cnt=0;cnt<total;cnt++)
  102.      {
  103.       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
  104.       if(OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или OP_SELL
  105.          OrderSymbol()==Symbol())    // инструмент совпадает?
  106.         {
  107.          if(OrderType()==OP_BUY)   // открыта длинная позиция
  108.            {
  109.             // проверим, может уже пора закрываться?
  110.             if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
  111.                MacdCurrent>(MACDCloseLevel*Points))
  112.                 {
  113.                  OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
  114.                  return(0); // выходим
  115.                 };
  116.             // проверим - может можно/нужно уже трейлинг стоп ставить?
  117.             if(TrailingStop>0)  // пользователь выставил в настройках трейлингстоп
  118.               {                 // значит мы идем его проверять
  119.                if(Bid-OrderOpenPrice()>Points*TrailingStop)
  120.                  {
  121.                   if(OrderStopLoss()<Bid-Points*TrailingStop)
  122.                     {
  123.                      OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Points*TrailingStop,OrderTakeProfit(),0,Red);
  124.                      return(0);
  125.                     }
  126.                  }
  127.               }
  128.            }
  129.          else // иначе это короткая позиция
  130.            {
  131.             // проверим, может уже пора закрываться?
  132.             if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
  133.                MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Points))
  134.               {
  135.                OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
  136.                return(0); // выходим
  137.               }
  138.             // проверим - может можно/нужно уже трейлинг стоп ставить?
  139.             if(TrailingStop>0)  // пользователь выставил в настройках трейлингстоп
  140.               {                 // значит мы идем его проверять
  141.                if((OrderOpenPrice()-Ask)>(Points*TrailingStop))
  142.                  {
  143.                   if(OrderStopLoss()==0.0 ||
  144.                      OrderStopLoss()>(Ask+Points*TrailingStop))
  145.                     {
  146.                      OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Points*TrailingStop,OrderTakeProfit(),0,Red);
  147.                      return(0);
  148.                     }
  149.                  }
  150.               }
  151.            }
  152.         }
  153.      }
  154.    return(0);
  155.   }
  156. // the end.
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册
关注微信