找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
首页论坛EAHub 外汇论坛
查看: 5|回复: 0

【漂亮的MT5双线MACD指标[源码]】双色交叉变色

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-26 20:54:00 | 显示全部楼层 |阅读模式
最后由 m1800 于 2026-1-28 19:34 编辑

漂亮的MT5双线MACD指标,交叉变色.附源码.


多多点赞,会变好看,多多留言,会变有钱.





//+------------------------------------------------------------------+
//|                                                   MACDDouble.mq5 |
//|                   Copyright 2009-2026, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009-2026, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Moving Average of Oscillator Double Line"
#property description "MACD Double Line"
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_plots   3
#property indicator_label1  "MACD"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrLime,clrRed
#property indicator_width1  3

#property indicator_label2  "DIF"
#property indicator_type2   DRAW_COLOR_LINE
#property indicator_color2  clrDodgerBlue,clrMagenta
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

#property indicator_label3  "DEA"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrYellow
#property indicator_style3  STYLE_DOT
#property indicator_width3  1


//--- input parameters
input int                InpFastEMAPeriod = 12;       // Fast EMA period
input int                InpSlowEMAPeriod = 26;       // Slow EMA period
input int                InpSignalSMAPeriod = 9;      // Signal SMA period
input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE; // Applied price
//--- indicator buffers
double                   ExtMACDBuffer[];
double                   ExtMACDColorBuffer[];
double                   ExtDifBuffer[];
double                   ExtDifColorBuffer[];
double                   ExtDeaBuffer[];
double                   ExtSignalBuffer[];
double                   ExtFastMaBuffer[];
double                   ExtSlowMaBuffer[];
//--- MA handles
int                      ExtFastMaHandle;
int                      ExtSlowMaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, ExtMACDBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, ExtMACDColorBuffer, INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2, ExtDifBuffer, INDICATOR_DATA);
   SetIndexBuffer(3, ExtDifColorBuffer, INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4, ExtDeaBuffer, INDICATOR_DATA);
   SetIndexBuffer(5, ExtFastMaBuffer, INDICATOR_CALCULATIONS);
   SetIndexBuffer(6, ExtSlowMaBuffer, INDICATOR_CALCULATIONS);
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits + 2);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, InpSlowEMAPeriod + InpSignalSMAPeriod - 2);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME, "MACD Double Line(" + string(InpFastEMAPeriod) + "," + string(InpSlowEMAPeriod) + "," + string(InpSignalSMAPeriod) + ")");
   PlotIndexSetString(0, PLOT_LABEL, "MACD");
   PlotIndexSetString(1, PLOT_LABEL, "DIF");
   PlotIndexSetString(2, PLOT_LABEL, "DEA");
//--- get MAs handles
   ExtFastMaHandle = iMA(NULL, 0, InpFastEMAPeriod, 0, MODE_EMA, InpAppliedPrice);
   ExtSlowMaHandle = iMA(NULL, 0, InpSlowEMAPeriod, 0, MODE_EMA, InpAppliedPrice);
//--- initialization done
  }
//+------------------------------------------------------------------+
//|  Moving Average of Oscillator                                    |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(rates_total < InpSignalSMAPeriod)
      return(0);
//--- not all data may be calculated
   int calculated = BarsCalculated(ExtFastMaHandle);
   if(calculated < rates_total)
     {
      Print("Not all data of ExtFastMaHandle is calculated (", calculated, "bars ). Error", GetLastError());
      return(0);
     }
   calculated = BarsCalculated(ExtSlowMaHandle);
   if(calculated < rates_total)
     {
      Print("Not all data of ExtSlowMaHandle is calculated (", calculated, "bars ). Error", GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated > rates_total || prev_calculated < 0)
      to_copy = rates_total;
   else
     {
      to_copy = rates_total - prev_calculated;
      if(prev_calculated > 0)
         to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped())
      return(0); //Checking for stop flag
   if(CopyBuffer(ExtFastMaHandle, 0, 0, to_copy, ExtFastMaBuffer) <= 0)
     {
      Print("Getting fast EMA is failed! Error", GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped())
      return(0); //Checking for stop flag
   if(CopyBuffer(ExtSlowMaHandle, 0, 0, to_copy, ExtSlowMaBuffer) <= 0)
     {
      Print("Getting slow SMA is failed! Error", GetLastError());
      return(0);
     }
//---
   int i, limit;
   if(prev_calculated == 0)
      limit = 0;
   else
      limit = prev_calculated - 1;
//--- the main loop of calculations
   for(i = limit; i < rates_total; i++)
     {
      //--- calculate Dif
      ExtDifBuffer = ExtFastMaBuffer - ExtSlowMaBuffer;
     }
//--- calculate Signal
   SimpleMAOnBuffer(rates_total, prev_calculated, 0, InpSignalSMAPeriod, ExtDifBuffer, ExtDeaBuffer);
   for(i = limit; i < rates_total; i++)
     {
      if(i == 0)
        {
         ExtDifColorBuffer = 0;
        }
      else
         if(ExtDifBuffer > ExtDeaBuffer)
           {
            ExtDifColorBuffer = 0;
           }
         else
           {
            ExtDifColorBuffer = 1;
           }
     }
//--- calculate MACD
   for(i = limit; i < rates_total && !IsStopped(); i++)
     {
      ExtMACDBuffer = (ExtDifBuffer - ExtDeaBuffer) * 2;
      if(i == 0)
        {
         ExtMACDColorBuffer = 0;
        }
      else
         if(ExtMACDBuffer > ExtMACDBuffer[i - 1])
           {
            ExtMACDColorBuffer = 0;
           }
         else
           {
            ExtMACDColorBuffer = 1;
           }
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EAHub外汇论坛

GMT+8, 2026-10-11 02:04 , Processed in 0.104411 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表