ForecastOscillator

Download script
Author: Copyright � 2005, Nick Bilak, beluck[AT]gmail.com
ForecastOscillator

The Forecast Oscillator is a technical analysis tool designed to help traders anticipate price movements by calculating the relationship between current market prices and historical trends. Instead of simply showing where the price has been, this script attempts to project momentum and identify potential turning points in the market.

How the Logic Works

The indicator operates through a multi-stage mathematical process to filter out "noise" and highlight significant trends:

1. Weighted Trend Analysis The script first looks at a specific historical window (the regression period) to determine the underlying weight of price movements. It calculates a weighted average that gives more significance to certain data points, helping the tool distinguish between a temporary price spike and a sustained trend.

2. Forecast Calculation By comparing the most recent closing price against this weighted average, the script generates a "Forecast Oscillator." This value represents the percentage deviation of the current price from its established trend. In simple terms, it measures how far the market has stretched away from its "normal" path.

3. Triple Exponential Smoothing (T3) To prevent the indicator from reacting too wildly to every small fluctuation, the script applies a sophisticated smoothing technique known as T3. This process takes the raw forecast data and runs it through several layers of refinement. The result is a much smoother line that clarifies the overall direction of the momentum while remaining responsive enough to catch significant shifts.

4. Signal Generation The core utility of this script lies in its ability to generate visual signals based on the interaction between the primary oscillator and its smoothed version:

  • Buy Signals: These appear when the smoothed trend indicates a shift toward positive momentum, suggesting that the price may be starting to climb.
  • Sell Signals: These appear when the smoothed trend suggests a shift toward negative momentum, indicating a potential downward move.

Summary for Traders

Rather than providing a simple "up or down" arrow based on raw price alone, this tool evaluates the momentum of the trend. It filters out minor market fluctuations to provide a clearer picture of whether the current price movement is overextended or gaining strength in a specific direction. By observing where the smoothed forecast crosses certain thresholds, traders can better identify potential entry and exit points.

Miscellaneous
Implements a curve of type %1
8 Views
0 Downloads
0 Favorites
ForecastOscillator
//+------------------------------------------------------------------+
//|                                          Forecast Oscillator.mq4 |
//|                Copyright © 2005, Nick Bilak, beluck[AT]gmail.com |
//|                                    http://forexsystems.ru/phpBB/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Nick Bilak, beluck[AT]gmail.com"
#property link      "http://forexsystems.ru/phpBB/index.php"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_level1 0
#property indicator_color1 DarkTurquoise
#property indicator_color2 LawnGreen
#property indicator_color3 Magenta
#property indicator_color4 Aqua
//---- input parameters
extern int       regress=15;
extern int       t3=10;
extern double    b=0.7;
//---- buffers
double osc[];
double osct3[];
double hiSig[];
double loSig[];

int shift,limit,length;
double b2,b3,c1,c2,c3,c4,w1,w2,n,WT,forecastosc,t3_fosc,sum,e1,e2,e3,e4,e5,e6,tmp,tmp2;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,osc);
   SetIndexEmptyValue(0,0);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,osct3);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexBuffer(2,hiSig);
   SetIndexEmptyValue(2,EMPTY_VALUE);
   SetIndexArrow(2,159);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3,loSig);
   SetIndexEmptyValue(3,EMPTY_VALUE);
   SetIndexArrow(3,159);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
   
   if (counted_bars<0) return(-1);
   if (counted_bars>0) counted_bars--;
   limit=Bars-31;
   if(counted_bars>=31) limit=Bars-counted_bars+2;

   for (shift=limit+30;shift>=0;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; 

      osc[shift] = forecastosc;
      osct3[shift] = t3_fosc;
      
      if (osc[shift+1] > osct3[shift+2] && osc[shift+2] <= osct3[shift+3] && osct3[shift+1]<0) loSig[shift+1] = t3_fosc-0.05;
      if (osc[shift+1] < osct3[shift+2] && osc[shift+2] >= osct3[shift+3] && osct3[shift+1]>0) hiSig[shift+1] = t3_fosc+0.05;

   }
   Comment("WT=",WT);
   return(0);
  }
//+------------------------------------------------------------------+

Comments