Value of multiple indicators in one data window differ

Rhy Bezuidenhout  

Hi,

When I add two standard MACDs to the same indicator window (and hide the histogram so that I can only see the Signal line) then the values are different than if I have a totally new indicator which combines the two signal lines of the MACDs.  

Below is a sample of the issue.  The top "indicator" window has the two MACDs in the same window.  The green/faster MACD shows bigger moves and crosses the slower MACD signal line (red line) more often.  

The bottom indicator is a custom indicator based on the same MACD function, but the outcome varies and the faster MACD signal line (green line) is smoother and does not cross the slower MACD signal line.

Can anyone say what the issue is and possibly how to overcome it so that the bottom indicator can be fixed to look like the top one?  Is this an issue in MT4 which can be overcome?

Double MACD signal indicator 

Ian Venner  

The bottom indicator would look the like the top one if it was coded correctly to produce the same values as the top one. Obviously it is not.

Tran Dong Phat  

Bellow is the source code of (4). Is the code bellow is correctly when we code the  indicator to recognize the cross over of 2 MACD ?

 

/+------------------------------------------------------------------+

//|                                                       MACD 2.mq4 |

//|                        Copyright 2014, MetaQuotes Software Corp. |

//|                                              https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2014, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

#property  indicator_separate_window

#property  indicator_buffers 2

#property  indicator_color1  Lime

#property  indicator_color2  Red

#property  indicator_width1  2

#property  indicator_width2  2

//--- input parameters


extern string  NOTE0="--->FAST MACD<---";

extern int     MACD1FastEMA=5;

extern int     MACD1SlowEMA=8;

extern int     MACD1Signal=3;

extern int     enMACD1Mode=1;

extern int     enMACD1AppliedPrice=0;

extern string  NOTE1="--->SLOW MACD<---";

extern int     MACD2FastEMA=12;

extern int     MACD2SlowEMA=26;

extern int     MACD2Signal=9;

extern int     enMACD2Mode=1;

extern int     enMACD2AppliedPrice=0;

//--- indicator buffers

double         FastBuffer[];

double         SlowBuffer[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- indicator buffers mapping

   IndicatorDigits(Digits+1);

   SetIndexStyle(0,DRAW_LINE);

   SetIndexStyle(1,DRAW_LINE);

   SetIndexBuffer(0,FastBuffer);

   SetIndexBuffer(1,SlowBuffer);

   SetIndexLabel(0,"FAST");

   SetIndexLabel(1,"SLOW");


   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

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[])

  {


   int limit=rates_total-prev_calculated;

   for(int i=0;i<limit;i++)

   {

      FastBuffer[i]=iMACD(NULL,Period(),MACD1FastEMA,MACD1SlowEMA,MACD1Signal,enMACD1AppliedPrice,enMACD1Mode,i);

      SlowBuffer[i]=iMACD(NULL,Period(),MACD2FastEMA,MACD2SlowEMA,MACD2Signal,enMACD2AppliedPrice,enMACD2Mode,i);

   }


//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+

Syed Naufal Gaddafi  
Please edit and use SRC when posting codes. Can't really see what the codes are.
Tran Dong Phat  
/+------------------------------------------------------------------+

//|                                                       MACD 2.mq4 |

//|                        Copyright 2014, MetaQuotes Software Corp. |

//|                                              https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2014, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

#property  indicator_separate_window

#property  indicator_buffers 2

#property  indicator_color1  Lime

#property  indicator_color2  Red

#property  indicator_width1  2

#property  indicator_width2  2

//--- input parameters



extern string  NOTE0="--->FAST MACD<---";

extern int     MACD1FastEMA=5;

extern int     MACD1SlowEMA=8;

extern int     MACD1Signal=3;

extern int     enMACD1Mode=1;

extern int     enMACD1AppliedPrice=0;

extern string  NOTE1="--->SLOW MACD<---";

extern int     MACD2FastEMA=12;

extern int     MACD2SlowEMA=26;

extern int     MACD2Signal=9;

extern int     enMACD2Mode=1;

extern int     enMACD2AppliedPrice=0;

//--- indicator buffers

double         FastBuffer[];

double         SlowBuffer[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- indicator buffers mapping

   IndicatorDigits(Digits+1);

   SetIndexStyle(0,DRAW_LINE);

   SetIndexStyle(1,DRAW_LINE);

   SetIndexBuffer(0,FastBuffer);

   SetIndexBuffer(1,SlowBuffer);

   SetIndexLabel(0,"FAST");

   SetIndexLabel(1,"SLOW");



   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

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[])

  {



   int limit=rates_total-prev_calculated;

   for(int i=0;i<limit;i++)

   {

      FastBuffer[i]=iMACD(NULL,Period(),MACD1FastEMA,MACD1SlowEMA,MACD1Signal,enMACD1AppliedPrice,enMACD1Mode,i);

      SlowBuffer[i]=iMACD(NULL,Period(),MACD2FastEMA,MACD2SlowEMA,MACD2Signal,enMACD2AppliedPrice,enMACD2Mode,i);

   }



//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+
ngoc thach  

problem is scale value for each indicator are difference.

if set scale to fixed value for 2 indicator it will show correct.

I have test this indicator (MACD2) this is correct.

I have fixed scale for the same value and this is result.

 

Rhy Bezuidenhout  
rockyhoangdn:

problem is scale value for each indicator are difference.

if set scale to fixed value for 2 indicator it will show correct.

I have test this indicator (MACD2) this is correct.

I have fixed scale for the same value and this is result.

 

Thanks for the input so far everyone.  One workaround identified.

But what if I want the outcome of the new indicator to be like the two combined indi's with non fixed scales (as the faster MACD then has wider swings)?  How can that be achieved?

In short, I am looking for a custom indicator which drawns the two MACD signal lines on their own scales like if you had dropped two MACDs on one indicator window, which does not force a single scale for both lines. 

Is it possible to read the scale of the indicator window and then multiply the buffer value of the smaller indi to fit in?

Rhy Bezuidenhout  
raybez:

Thanks for the input so far everyone.  One workaround identified.

But what if I want the outcome of the new indicator to be like the two combined indi's with non fixed scales (as the faster MACD then has wider swings)?  How can that be achieved?

In short, I am looking for a custom indicator which drawns the two MACD signal lines on their own scales like if you had dropped two MACDs on one indicator window, which does not force a single scale for both lines. 

Is it possible to read the scale of the indicator window and then multiply the buffer value of the smaller indi to fit in?


OK, some further digging and I came across the WindowPriceMin() & WindowPriceMax() functions.  How can the code above provided by trandongphat be modified to make use of these additional functions so that the faster MACD signal line buffer can be "adjusted" to fit in with the slower MACD?
Rhy Bezuidenhout  
raybez:

OK, some further digging and I came across the WindowPriceMin() & WindowPriceMax() functions.  How can the code above provided by trandongphat be modified to make use of these additional functions so that the faster MACD signal line buffer can be "adjusted" to fit in with the slower MACD?

I found a possible partial work around on https://www.mql5.com/en/forum/142578, for those also looking for a solution.
Reason: