Search code examples
mql4

MQL4 iCustom returns always the same (wrong) value (0x7FFFFFFF)


I wrote a custom indicator Speed.mq4 as follows:

double         SpeedBuffer[];                     // a Custom Indicator BUFFER
int OnInit() {
    SetIndexBuffer( 0, SpeedBuffer );             // an access INDEX 0->BUFFER
    ...
    }
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 start;
   if (   prev_calculated == 0 ) start = 1;
   else                          start = prev_calculated - 1;

   for ( int i = start; i < rates_total - 1 ; i++ ) {                   // CPU-WASTED BY AN INEFFICIENT BACK-STEPPING IN TIME
         double curTypical  = typical( high[i],  low[i],  close[i]   );
         double prevTypical = typical( high[i+1],low[i+1],close[i+1] ); // CPU-WASTED, NO NEED TO RECALC ...
         double curSpeed    = curTypical - prevTypical;
         SpeedBuffer[i]     = curSpeed;
     }
//--- return value of prev_calculated for next call
   return( rates_total );
  }

The indicator works fine in the application and the chart is plotted correctly.

When I try retrieving the last value in the ExpertAdvisor I always receive the same value:

double speed = iCustom( NULL, 0, "Speed", 2, 0, 0 );
Print( "speed is: " + speed );

prints:

speed is: 2147483647

It's always the same number. I'm not sure where's the problem.

from the Print in the indicator I can see the values are calculated correctly. but when I use iCustom I receive only that value.


Solution

  • I reviewed my code and finally figured that:

     double speed=iCustom(NULL,0,"Speed",2,0,0);
    

    was using the last value, which was not yet calculated by the custom indicator,

    changing it to:

     double speed=iCustom(NULL,0,"Speed",2,0,1);
    

    did the trick.