//+------------------------------------------------------------------+ //| EMAPredictive3.mq5 | //| Copyright © 2007, 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 rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора { limit=rates_total-min_rates_total-1-begin; // стартовый номер для расчета всех баров //---- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total+begin); int start=limit+1; ma1_=price[start]; ma3_=price[start]; } else limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(price,true); //---- восстановление значений переменных ma1=ma1_; ma3=ma3_; //---- основной цикл расчета индикатора for(int bar=limit; bar>=0 && !IsStopped(); bar--) { val=price[bar]; ma1=p1*val+(1.0-p1)*ma1; ma3=p3*val+(1.0-p3)*ma3; slope1=(ma3-ma1)/(t1-t3); IndBuffer[bar]=ma3+slope1*t; //---- сохранение значений переменных if(bar) { ma1_=ma1; ma3_=ma3; } } //---- return(rates_total); } //+------------------------------------------------------------------+