SetIndexBuffer!
alanlaw,
You forgot to set the SetIndexBufferfor ind_buffer6
Change this line:
To:
And tell me what do you think?
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
![MQL5 - Language of trade strategies built-in the MetaTrader 5 client terminal](https://c.mql5.com/i/registerlandings/logo-2.png)
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
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);
}