Urgent: iMAOnArray and IMA?

 

Dear All,

Could anyone tell me how to declare a array and than use the iMAOnArray or IMA function and to program a moving average on indicators, like macd histogram or momentum?

Please help me. Urgent.I have spend few days on working this.

Thank you very much.

Victor

 

iMAOnArray

alanlaw:
Dear All,

Could anyone tell me how to declare a array and than use the iMAOnArray or IMA function and to program a moving average on indicators, like macd histogram or momentum?

Please help me. Urgent.I have spend few days on working this.

Thank you very much.

Victor

Hi Victor,

If I understood your problem correctly this code might help:

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

//| iMAOnArray Demo.mq4 |

//| Codersguru |

//| https://www.forex-tsd.com |

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

#property copyright "Codersguru"

#property link "https://www.forex-tsd.com"

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 Blue

//---- buffers

double ExtMapBuffer1[];

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

//| Custom indicator initialization function |

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

int init()

{

//---- indicators

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,ExtMapBuffer1);

string short_name = "iMAOnArray demo";

IndicatorShortName(short_name);

//----

return(1);

}

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

//| Custor indicator deinitialization function |

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

int deinit()

{

//----

//----

return(0);

}

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

//| Custom indicator iteration function |

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

int start()

{

int i,limit;

double MyArray[]; //declare an array

int counted_bars=IndicatorCounted();

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

ArrayResize( MyArray, limit); //resize the array to the number of bars

ArraySetAsSeries(MyArray,true); //reverse the array direction.

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

{

MyArray = iMA(NULL,0,13,8,MODE_EMA,PRICE_CLOSE,i);

Print("MyArray = ",MyArray);

}

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

{

ExtMapBuffer1 = iMAOnArray(MyArray,limit,13,8,MODE_EMA,i);

Print("ExtMapBuffer1 = " , ExtMapBuffer1);

}

return(0);

}

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

Please help. Problem in using ind_buffer

Dear Coders' Guru

Wa!!! it's amazing!!! Thank's to Coders' Guru.

I can display my moving average after adding

" ArrayResize( temp2, limit);

ArraySetAsSeries(temp2,true);

ArrayResize( temp3, limit);

ArraySetAsSeries(temp3,true); "

But what is the logic behide?

I still have a problem. 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 you help me solve 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);

}
 

For Codersguru.

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

//| iMAOnArray Demo.mq4 |

//| Codersguru |

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

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

#property copyright "Codersguru"

#property link "https://www.forex-tsd.com"

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 Blue

//---- buffers

double ExtMapBuffer1[];

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

//| Custom indicator initialization function |

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

int init()

{

//---- indicators

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,ExtMapBuffer1);

string short_name = "iMAOnArray demo";

IndicatorShortName(short_name);

//----

return(1);

}

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

//| Custor indicator deinitialization function |

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

int deinit()

{

//----

//----

return(0);

}

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

//| Custom indicator iteration function |

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

int start()

{

int i,limit;

double MyArray[]; //declare an array

int counted_bars=IndicatorCounted();

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

ArrayResize( MyArray, limit); //resize the array to the number of bars

ArraySetAsSeries(MyArray,true); //reverse the array direction.

/*

1. Why can not I do this: just copy the required data into

MyArray me using the ArrayCopySeries? Then, just count

MA with iMAOnArray and assign them to ExtMapBuffer1?

Constant output error:

series array cannot be used for iMAOnArray indicator?

2. Why in your example, since the beginning iMA calculated

and its values are recorded in MyArray and then, on these values,

again calculated by MA, only using the iMAOnArray and only then,

the result is stored in ExtMapBuffer1? Does not function iMAOnArray

calculates MA according to the custom array? If so, what's the

point in this function iMAOnArray? Is not it enough just iMA?

---

*/

/*

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

{

MyArray = iMA(NULL,0,13,8,MODE_EMA,PRICE_CLOSE,i);

Print("MyArray = ",MyArray);

}

*/

ArrayCopySeries (MyArray , MODE_CLOSE, NULL/*Symbol ()*/, 0/*Period ()*/);

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

{

ExtMapBuffer1 = iMAOnArray(MyArray,limit,13,8,MODE_EMA,i);

Print("ExtMapBuffer1 = " , ExtMapBuffer1);

}

return(0);

}

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

 

Hi,

I'm breaking my head around this but I realy can't understand what I'm doing wrong!!!

Can someone please look at this few lines and tell me where is the problem?!?

I'm trying to make a SMA of the difference between 2 SMA(fast and short):

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_color1 Red

#property indicator_color2 Lime

#property indicator_width1 2

#property indicator_width2 2

extern int Periodo_Rapida=5;

extern int Periodo_Lenta=50;

extern int Simples0_Exponencial1=0;

double ExtMapBuffer1[];

double ExtMapBuffer2[];

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

//| Custom indicator initialization function |

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

int init()

{

SetIndexStyle(0,DRAW_HISTOGRAM);

SetIndexBuffer(0,ExtMapBuffer1);

SetIndexStyle(1,DRAW_LINE);

SetIndexBuffer(1,ExtMapBuffer2);

IndicatorShortName("Cruzamentos MAs("+Periodo_Rapida+","+Periodo_Lenta+")");

return(0);

}

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

//| Custom indicator deinitialization function |

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

int deinit()

{

return(0);

}

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

//| Custom indicator iteration function |

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

int start()

{

int limit, i;

int counted_bars=IndicatorCounted();

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

if (counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

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

{

double a=iMA(NULL,0,Periodo_Rapida,0,0,0,i);

double b=iMA(NULL,0,Periodo_Lenta,0,0,0,i);

ExtMapBuffer1=(a-b);

}

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

{

ExtMapBuffer2=iMAOnArray(ExtMapBuffer1,Bars,14,0,0,i)

}

return(0);

}

Thank you SO SO SO Much!!

 

I face the same problem trying to code a MACD Histogram

I hope some Pro can help us here

 

...

This would be the OsMA (MACD histogram) of a close (it is of close price in order to keep it as simple as it can be and to show how iMAOnArray() should be used - the only trick is that IMAOnArray() must be applied on separate loop from the main loop, and when it comes to iMAOnArray() that is the only point you have to take care of)
#property indicator_separate_window

#property indicator_buffers 3

#property indicator_color1 DarkGray

#property indicator_color2 DarkGray

#property indicator_color3 Red

#property indicator_width1 2

#property indicator_width2 2

extern int FastEMA = 12;

extern int SlowEMA = 26;

extern int SignalEMA = 9;

//

//

//

double macd[];

double signal[];

double histo[];

int init()

{

SetIndexBuffer(0,histo); SetIndexStyle(0,DRAW_HISTOGRAM);

SetIndexBuffer(1,macd);

SetIndexBuffer(2,signal);

return(0);

}

int start()

{

int i,count,counted_bars=IndicatorCounted();

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

if(counted_bars>0) counted_bars--;

int limit = MathMin(Bars-counted_bars,Bars-1);

for(i = limit; i >= 0; i--) macd = iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);

for(i = limit; i >= 0; i--)

{

signal = iMAOnArray(macd,0,SignalEMA,0,MODE_EMA,i);

histo = macd-signal;

}

return(0);

}

Attaching the indicator too (this is what you get when you attach it to the chart)

osma_simple.mq4

kappari:
I face the same problem trying to code a MACD Histogram I hope some Pro can help us here
Files:
osma.gif  22 kb
Reason: