//+------------------------------------------------------------------+
//| EMAPredictive3.mq4 |
//| Matthew ("Dr Chaos") Kennel |
//| ftp://lyapunov.ucsd.edu/pub/nonlinear |
//+------------------------------------------------------------------+
//
// Goal of this indicator:
//
// Given three EMA's of varying lengths, use their values
// for a estimator of "where we are now" or will be in the near future.
// This is a very simplistic method, better ones are probably found
// in the signal processing and target tracking literature.
// A Kalman filter has been known since the 1950's 1960's and there
// is better still. Nevertheless this is easily programmable in the
// typical environments of a retail trading application like Metatrader4.
//
// Method:
//
// An an exponential moving average (EMA) or a simple moving average (SMA), for that
// matter, have a bandwidth parameter 'L', the effective length of the window. This
// is in units of time or, really, inverse of frequency. Higher L means a lower
// frequency effect.
//
// With a parameter L, the weighted time index of the EMA and SMA is (L-1)/2. Example:
// take an SMA of the previous 5 values: -5 -4 -3 -2 -1 now. The average "amount of time"
// back in the past of the data which go in to the SMA is hence -3, or (L-1)/2. Same applies
// for an EMA. The standard parameterization makes this correspondence between EMA
// and SMA.
//
// Therefore the idea here is to take two different EMA's, a longer, and
// a shorter of lengths L1 and L2 (L2 0) counted_bars--;
limit=Bars-counted_bars;
//---- main loop
p1 = 2.0/(LongPeriod+1.0);
p3 = 2.0/(ShortPeriod+1.0);
t1 = (LongPeriod-1.0)/2.0;
t3 = (ShortPeriod-1.0)/2.0;
t = ShortPeriod + ExtraTimeForward;
ma1 = Close[limit-1];
ma3 = ma1;
for(int i=limit-1; i>= 0; i--) {
//---- ma_shift set to 0 because SetIndexShift called abowe
double val = Close[i];
double slope1, predict;
ma1 = p1*val + (1.0-p1)*ma1;
ma3 = p3*val + (1.0-p3)*ma3;
slope1 = (ma3-ma1)/(t1-t3);
predict = ma3 + slope1*t;
ExtBuffer[i]=predict;
}
//---- done
return(0);
}
//+------------------------------------------------------------------+