//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+