RD-ForecastOsc_v5

Download script
Author: Copyright � 2005, Nick Bilak
RD-ForecastOsc_v5

The RD-ForecastOsc is a technical analysis tool designed to help traders visualize potential price trends by applying advanced mathematical modeling to historical data. Rather than simply showing where the price has been, this script focuses on creating a "forecast" oscillator that aims to smooth out market noise and reveal underlying momentum.

How the Logic Works

The core functionality of the script can be broken down into three main stages:

1. Weighted Data Smoothing The tool begins by analyzing a specific window of recent price history (defined by the regression parameter). Instead of treating every past price point as equally important, it applies a weighted calculation. It gives different importance to various points in the look-back period to ensure that the resulting "average" is more reflective of current momentum than old, irrelevant data.

2. Deviation Analysis (The Forecast Oscillator) Once the weighted average is established, the script calculates the difference between the actual current price and that weighted average. This difference is converted into a percentage. By doing this, the tool creates a "Forecast Oscillator"—a line that shows how far the market is currently stretching away from its calculated equilibrium.

3. Triple Exponential Smoothing (The Signal) To make the information actionable for a trader, the script applies a specialized smoothing technique known as T3 filtering. While the Forecast Oscillator provides the primary movement, the T3 filter processes this data multiple times to remove "jitter" and lag.

This creates two distinct visual lines:

  • The Primary Oscillator: Represents the core momentum and forecasted trend.
  • The Signal Line: A secondary, highly smoothed line that helps identify when the primary oscillator is reaching an extreme point or beginning to turn.

Practical Purpose for Trading

For a user watching the charts, this script acts as a momentum thermometer. By observing the relationship between the two lines, you can see how aggressively the market is moving relative to its historical average. When the gap between these lines widens or shifts direction, it suggests that the current price movement may be becoming overextended, potentially signaling a shift in the trend.

Miscellaneous
Implements a curve of type %1
14 Views
0 Downloads
0 Favorites
RD-ForecastOsc_v5
//+------------------------------------------------------------------+
//|                                               RD-ForecastOsc.mq4 |
//|                Copyright © 2005, Nick Bilak, beluck[AT]gmail.com |
//|                                    http://metatrader.50webs.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Nick Bilak"
#property link      "http://metatrader.50webs.com/"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_level1 0
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
int    Regress = 15;
int    T3 = 3;
double B = 0.7;
//---- buffers
double Osc[];
double Osct3[];
//----
double HiSig[];
double LoSig[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    SetIndexStyle(0, DRAW_LINE);
    SetIndexBuffer(0, Osc);
   
    SetIndexEmptyValue(0, 0);
    SetIndexStyle(1, DRAW_LINE);
    SetIndexBuffer(1, Osct3);
//----    
    return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
    return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars = IndicatorCounted(), limit;  
//----
    if(counted_bars < 0) 
        return(-1);
//----
    if(counted_bars > 0) 
        counted_bars--;   
    limit = Bars - counted_bars;
    ForecastOsc(0, limit, Osc, Osct3, Regress, T3, B);
    return (0);
  }
//+------------------------------------------------------------------+
//| Calc forecast buffers  from lastbar down to offset               |
//+------------------------------------------------------------------+
void ForecastOsc(int offset, int lastbar, double &osc[], double &osct3[], 
                 int regress, int t3, double b)
  {
    int shift, length;
    double b2, b3, c1, c2, c3, c4, w1, w2, n, WT,
           forecastosc, t3_fosc, sum,
           e1, e2, e3, e4, e5, e6, tmp, tmp2;
    lastbar = MathMin(Bars - 31 - regress, lastbar);    
//----
    for(shift = lastbar + 30; shift >= offset; shift--)   
      {
        b2 = b*b; 
        b3 = b2*b; 
        c1 = -b3; 
        c2 = (3*(b2 + b3)); 
        c3 = -3*(2*b2 + b + b3); 
        c4 = (1 + 3*b + b3 + 3*b2); 
        n = t3; 
        //----
        if(n < 1) 
            n = 1; 
        n = 1 + 0.5*(n - 1); 
        w1 = 2 / (n + 1); 
        w2 = 1 - w1; 
        length = regress; 
        sum = 0; 
        //----
        for(int i = length; i > 0; i--) 
          {
            tmp = length + 1;
            tmp = tmp / 3;
            tmp2 = i;
            tmp = tmp2 - tmp;
            sum = sum + tmp*Close[shift+length-i]; 
          }
        tmp = length;
        WT = sum*6 / (tmp*(tmp + 1)); 
        forecastosc = (Close[shift] - WT) / WT*100; 
        e1 = w1*forecastosc + w2*e1; 
        e2 = w1*e1 + w2*e2; 
        e3 = w1*e2 + w2*e3; 
        e4 = w1*e3 + w2*e4; 
        e5 = w1*e4 + w2*e5; 
        e6 = w1*e5 + w2*e6; 
        t3_fosc = c1*e6 + c2*e5 + c3*e4 + c4*e3; 
        if(shift <= lastbar) 
          {   
            // don't put swing in cycle into the signal buffers
            osc[shift] = forecastosc;
            osct3[shift] = t3_fosc;
          }
      
      }
    return(0);
  }
//+------------------------------------------------------------------+

Comments