I would think that you are getting an array out of range error with main and signal, you have not set them as buffers.
Thank you for having a look, but i don't get errors and i use all the arrays as buffers.
Only the 3d one and i have set it as buffer.
for(i=0; i<rates_total-main_period; i--) { signal[i] = NormalizeDouble(iMAOnArray(main, 0, signal_period, 0, MODE_LWMA, i),6); }I think that should be i++
I think that should be i++
Thanks again GumRai.
Although you are right this thing isn't working.
I really think it has to do, somehow, with the iMAOnarray() function and the latest update of MT4.
Cause it was working properly but after a recompilation stop working properly.
The key word is properly. No errors, no nothing.
It is still working but the data that it returns are false.
Have a look at the previous one.
They are almost identical. The small changes came from my tries to repair it, just like the i-- that i forgot to reverse it back again to i++ :) .
#property copyright "Konstantinos Maleas" #property link "" #property version "1.00" #property strict #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Green ///--- input parameter extern int scen = 0; int main_period = 12; extern int signal_period = 3; ///--- buffers double main[100000], signal[100000], dif[1000]; int OnInit() { string short_name, short_name1, short_name2, short_name3; impulse_ma_period(scen,ChartPeriod()); ///--- indicator line SetIndexStyle(0,DRAW_LINE,EMPTY,2,clrGreen); SetIndexBuffer(0,dif); ///--- name for DataWindow and indicator subwindow label short_name1 = "Dif ("+main_period+")"; IndicatorShortName(short_name1); SetIndexLabel(0,short_name1); /////--- check for input parameter if(main_period<=0) { Print("Wrong input parameter Momentum Period = ",main_period); return(INIT_FAILED); } SetIndexDrawBegin(0,main_period); SetIndexDrawBegin(1,signal_period); return(INIT_SUCCEEDED); } 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 i,limit, pos = main_period; ////--- check for bars count and input parameter if(rates_total<=main_period || signal_period<=0) return(0); ///--- counting from 0 to rates_total ArraySetAsSeries(main,true); ArraySetAsSeries(signal,true); ArraySetAsSeries(dif,true); ///--- initial zero if(prev_calculated<=0) { for(i=0; i<main_period; i++) main[i]=0.0; limit=main_period; } else limit=prev_calculated-1; for(i=0; i<rates_total; i++) { main[i] = NormalizeDouble(iMA(Symbol(),0,main_period,0,MODE_LWMA,PRICE_MEDIAN,i),6); } for(i=0; i<rates_total; i++) { signal[i] = NormalizeDouble(iMAOnArray(main, 0, signal_period, 0, MODE_LWMA, i),6); } for(i=0; i<rates_total; i++) { dif[i] = NormalizeDouble((main[i] - signal[i]) * 1000,6); } return(rates_total); } ///----- Moving Average Installation ----------------------------------------------------------------------------------------------- int impulse_ma_period(int ma_imp, int tf) { if ( ma_imp == 0 ) switch(tf) { case 1 : main_period = 15; break; case 5 : main_period = 12; break; case 15 : main_period = 16; break; case 30 : main_period = 12; break; case 60 : main_period = 12; break; case 240 : main_period = 15; break; case 1440 : main_period = 22; break; case 10080 : main_period = 13; break; case 43200 : main_period = 12; break; } if ( ma_imp == 1 ) switch(tf) { case 1 : main_period = 10; break; case 5 : main_period = 8; break; case 15 : main_period = 11; break; case 30 : main_period = 8; break; case 60 : main_period = 8; break; case 240 : main_period = 10; break; case 1440 : main_period = 15; break; case 10080 : main_period = 9; break; case 43200 : main_period = 8; break; } if ( ma_imp == 2 ) switch(tf) { case 1 : main_period = 7; break; case 5 : main_period = 6; break; case 15 : main_period = 8; break; case 30 : main_period = 6; break; case 60 : main_period = 6; break; case 240 : main_period = 7; break; case 1440 : main_period = 6; break; case 10080 : main_period = 7; break; case 43200 : main_period = 7; break; } if ( ma_imp == 3 ) switch(tf) { case 1 : main_period = 5; break; case 5 : main_period = 4; break; case 15 : main_period = 5; break; case 30 : main_period = 4; break; case 60 : main_period = 4; break; case 240 : main_period = 5; break; case 1440 : main_period = 5; break; case 10080 : main_period = 4; break; case 43200 : main_period = 4; break; } if ( ma_imp >= 4 ) switch(tf) { case 1 : main_period = 3; break; case 5 : main_period = 2; break; case 15 : main_period = 3; break; case 30 : main_period = 2; break; case 60 : main_period = 2; break; case 240 : main_period = 3; break; case 1440 : main_period = 3; break; case 10080 : main_period = 3; break; case 43200 : main_period = 2; break; } return(main_period); }
///--- buffers double main[100000], signal[100000], dif[1000]; ///--- counting from 0 to rates_total ArraySetAsSeries(main,true); ArraySetAsSeries(signal,true); ArraySetAsSeries(dif,true);
The AS_SERIES flag can't be set for multi-dimensional arrays or static arrays (arrays, whose size in square brackets is preset already on the compilation stage). ;)
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello everybody,
I made this simple indicator couple of months before and it working fine from the very first time, until yesterday that i recompile it.
For some reason the signal array seems that calculates only the first time and then keeps the same numbers for all others loops.
Like the iMAOnArray() Function isn't working properly.
Can anyone help me?
Thanks in Advance