Problem in using ind_buffer

 

Dear all

I try to add a moving average to macd histogram. The color of the line will change if the histogram cross this line. So, I use two arrays, ind_buffer5 and ind_buffer6 to hold the moving average values. I don't why my indicator can only show the value in ind_buffer5 and the value of ind_buffer6 is always zero. Therefore, I simple subsitute different value to ind_buffer6,e.g. ind_buffer6=0.01*i. But the result is still the same. All the values in ind_buffer6 are zero. I kown that the maximun number of indicator_buffer is 8. I didn't exceed its limit. Why this happen??

Could anyone help me solving these problem?

thank you very much

Victor

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

//| Custom MACD.mq4 |

//| Copyright ?2004, MetaQuotes Software Corp. |

//| http://www.metaquotes.net/ |

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

#property copyright "Copyright ?2004, MetaQuotes Software Corp."

#property link "http://www.metaquotes.net/"

//---- indicator settings

#property indicator_separate_window

#property indicator_buffers 6

#property indicator_color1 OrangeRed

#property indicator_color2 Yellow

#property indicator_color3 Lime

#property indicator_color4 OrangeRed

#property indicator_color5 Aqua

#property indicator_color6 Red

//int indicator_color3;

//---- indicator parameters

extern int FastEMA=19;

extern int SlowEMA=89;

extern int SignalSMA=13;

extern int HisEMA=5;

//extern double Interval=0.001;

//---- indicator buffers

double ind_buffer1[];

double ind_buffer2[];

double ind_buffer3[];

double ind_buffer4[];

double ind_buffer5[];

double ind_buffer6[];

double temp,temp1;

double temp2[],temp3[];

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

//| Custom indicator initialization function |

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

int init()

{

//---- drawing settings

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);

SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1);

SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,1);

SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,1);

SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,1);

SetIndexStyle(5,DRAW_LINE,STYLE_SOLID,1);

SetIndexDrawBegin(1,SignalSMA);

IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1 );

//---- indicator buffers mapping

if(!SetIndexBuffer(0,ind_buffer1) && !SetIndexBuffer(1,ind_buffer2)&& !SetIndexBuffer(2,ind_buffer3)&& !SetIndexBuffer(3,ind_buffer4)&& !SetIndexBuffer(4,ind_buffer5))

Print("cannot set indicator buffers!");

//---- name for DataWindow and indicator subwindow label

IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");

SetIndexLabel(0,"MACD");

SetIndexLabel(1,"Signal");

//---- initialization done

return(0);

}

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

//| Moving Averages Convergence/Divergence |

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

int start()

{

int limit;

int counted_bars=IndicatorCounted();

//---- check for possible errors

if(counted_bars<0) return(-1);

//---- last counted bar will be recounted

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

ArrayResize( temp2, limit);

ArraySetAsSeries(temp2,true);

ArrayResize( temp3, limit);

ArraySetAsSeries(temp3,true);

//---- macd counted in the 1-st buffer

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

ind_buffer1=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);

//---- signal line counted in the 2-nd buffer

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

ind_buffer2=iMAOnArray(ind_buffer1,Bars,SignalSMA,0,MODE_SMA, i);

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

{

temp=3.8*(ind_buffer1-ind_buffer2);

temp1=(ind_buffer1-ind_buffer2)-(ind_buffer1-ind_buffer2 );

if(temp1>0) {ind_buffer3=temp;ind_buffer4=0;}

else {ind_buffer3=0;ind_buffer4=temp;}

}

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

{

temp2=3.8*(ind_buffer1-ind_buffer2);

}

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

{

temp3=iMAOnArray(temp2,Bars,HisEMA,0,MODE_EMA,i);

if(temp2>temp3) {ind_buffer5=temp3;ind_buffer6=0;}

else {ind_buffer5=0;ind_buffer6=temp3;}

}

//---- done

return(0);

}

 

Add this to the init() function:

SetIndexBuffer(0,ind_buffer1);

SetIndexBuffer(1,ind_buffer2);

SetIndexBuffer(2,ind_buffer3);

SetIndexBuffer(3,ind_buffer4);

SetIndexBuffer(4,ind_buffer5);

SetIndexBuffer(5,ind_buffer6);

 

SetIndexBuffer!

alanlaw,

You forgot to set the SetIndexBufferfor ind_buffer6

Change this line:

if(!SetIndexBuffer(0,ind_buffer1) && !SetIndexBuffer(1,ind_buffer2)&& !SetIndexBuffer(2,ind_buffer3)&& !SetIndexBuffer(3,ind_buffer4)&& !SetIndexBuffer(4,ind_buffer5))[/PHP]

To:

if(!SetIndexBuffer(0,ind_buffer1) && !SetIndexBuffer(1,ind_buffer2)&& !SetIndexBuffer(2,ind_buffer3)&& !SetIndexBuffer(3,ind_buffer4)&& !SetIndexBuffer(4,ind_buffer5) && !SetIndexBuffer(5,ind_buffer6))

And tell me what do you think?

alanlaw:
Dear all

I try to add a moving average to macd histogram. The color of the line will change if the histogram cross this line. So, I use two arrays, ind_buffer5 and ind_buffer6 to hold the moving average values. I don't why my indicator can only show the value in ind_buffer5 and the value of ind_buffer6 is always zero. Therefore, I simple subsitute different value to ind_buffer6,e.g. ind_buffer6=0.01*i. But the result is still the same. All the values in ind_buffer6 are zero. I kown that the maximun number of indicator_buffer is 8. I didn't exceed its limit. Why this happen??

Could anyone help me solving these problem?

thank you very much

Victor

[PHP]//+------------------------------------------------------------------+

//| Custom MACD.mq4 |

//| Copyright ?2004, MetaQuotes Software Corp. |

//| http://www.metaquotes.net/ |

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

#property copyright "Copyright ?2004, MetaQuotes Software Corp."

#property link "http://www.metaquotes.net/"

//---- indicator settings

#property indicator_separate_window

#property indicator_buffers 6

#property indicator_color1 OrangeRed

#property indicator_color2 Yellow

#property indicator_color3 Lime

#property indicator_color4 OrangeRed

#property indicator_color5 Aqua

#property indicator_color6 Red

//int indicator_color3;

//---- indicator parameters

extern int FastEMA=19;

extern int SlowEMA=89;

extern int SignalSMA=13;

extern int HisEMA=5;

//extern double Interval=0.001;

//---- indicator buffers

double ind_buffer1[];

double ind_buffer2[];

double ind_buffer3[];

double ind_buffer4[];

double ind_buffer5[];

double ind_buffer6[];

double temp,temp1;

double temp2[],temp3[];

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

//| Custom indicator initialization function |

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

int init()

{

//---- drawing settings

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);

SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1);

SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,1);

SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,1);

SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,1);

SetIndexStyle(5,DRAW_LINE,STYLE_SOLID,1);

SetIndexDrawBegin(1,SignalSMA);

IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1 );

//---- indicator buffers mapping

if(!SetIndexBuffer(0,ind_buffer1) && !SetIndexBuffer(1,ind_buffer2)&& !SetIndexBuffer(2,ind_buffer3)&& !SetIndexBuffer(3,ind_buffer4)&& !SetIndexBuffer(4,ind_buffer5))

Print("cannot set indicator buffers!");

//---- name for DataWindow and indicator subwindow label

IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");

SetIndexLabel(0,"MACD");

SetIndexLabel(1,"Signal");

//---- initialization done

return(0);

}

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

//| Moving Averages Convergence/Divergence |

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

int start()

{

int limit;

int counted_bars=IndicatorCounted();

//---- check for possible errors

if(counted_bars<0) return(-1);

//---- last counted bar will be recounted

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

ArrayResize( temp2, limit);

ArraySetAsSeries(temp2,true);

ArrayResize( temp3, limit);

ArraySetAsSeries(temp3,true);

//---- macd counted in the 1-st buffer

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

ind_buffer1=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);

//---- signal line counted in the 2-nd buffer

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

ind_buffer2=iMAOnArray(ind_buffer1,Bars,SignalSMA,0,MODE_SMA, i);

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

{

temp=3.8*(ind_buffer1-ind_buffer2);

temp1=(ind_buffer1-ind_buffer2)-(ind_buffer1-ind_buffer2 );

if(temp1>0) {ind_buffer3=temp;ind_buffer4=0;}

else {ind_buffer3=0;ind_buffer4=temp;}

}

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

{

temp2=3.8*(ind_buffer1-ind_buffer2);

}

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

{

temp3=iMAOnArray(temp2,Bars,HisEMA,0,MODE_EMA,i);

if(temp2>temp3) {ind_buffer5=temp3;ind_buffer6=0;}

else {ind_buffer5=0;ind_buffer6=temp3;}

}

//---- done

return(0);

}

 

Thanks to Beerhunter and codersguru

Dear Beerhunter and codersguru

My problem is solved after following your suggestion. Thank you very much for your reply titled "IMA and IMAOnArray" and "Problem in ind_buffer". I know how to program C++ before, but I face many difficulties in programming MQL4. I can't program my MACD sucessfully without your help. Let me say thanks once again.

Thank you very much.

Best Regards

Victor

Reason: