forecast osc-30M_v1

Download script
Author: Copyright � 2005, Nick Bilak
forecast osc-30M_v1

This tool is designed to help traders visualize and anticipate price momentum by calculating a "forecast" of market oscillations. Rather than simply looking at where the price has been, the logic focuses on smoothing out market noise to identify underlying trends and potential turning points.

How the Logic Works

1. Weighted Data Analysis The script begins by analyzing a specific window of recent historical prices (the regression period). It doesn't treat all past data equally; instead, it uses a weighted calculation to determine a "Weighted Trend." By giving different importance to various price points within this window, the tool creates a more stable baseline of the current market movement.

2. The Forecast Calculation Once the trend is established, the script calculates a "Forecast Oscillator." This value represents the percentage difference between the current market price and the weighted trend. Essentially, it tells you how far the price has strayed from its average path. If the price is significantly higher or lower than this calculated trend, the oscillator reflects that deviation.

3. Smoothing and Prediction To make the data readable and prevent "jittery" signals caused by minor market fluctuations, the script applies a multi-layered smoothing process (similar to a Triple Exponential Moving Average). It takes the forecast results and runs them through a series of mathematical filters to create a secondary line. This secondary line represents the smoothed momentum, making it easier to see the broader direction of the market.

4. Visual Signal Generation The ultimate goal of this logic is to identify specific entry or exit opportunities. The script automatically scans the relationship between the raw forecast and the smoothed trend:

  • Buy Signals: When the price momentum shows a specific crossover pattern relative to the trend line while in a negative territory, it marks a potential upward reversal.
  • Sell Signals: When the price momentum crosses back over the trend line from a positive territory, it suggests a potential downward turn.

Summary for the Trader

Instead of making you guess where the price is going next, this script does the heavy lifting by calculating the "gap" between current prices and historical trends. It then smooths that data to filter out distractions, providing clear visual markers when the market momentum appears to be shifting direction.

Miscellaneous
Implements a curve of type %1
9 Views
0 Downloads
0 Favorites
forecast osc-30M_v1
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                 forecast osc.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 4
#property indicator_level1 0
#property indicator_color1 SteelBlue
#property indicator_color2 Red
#property indicator_color3 White
#property indicator_color4 White
//---- input parameters
extern int       regress=15;
extern int       t3=3;
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_HISTOGRAM);
   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;

   }
   return(0);
  }
//+------------------------------------------------------------------+

Comments