TTF_look-ahead

Download script
Author: Copyright � 2005, Nick Bilak
TTF_look-ahead

This tool is designed to provide a visual representation of market sentiment by calculating the relative "power" between buying and selling pressures. Rather than simply following price, it analyzes specific price extremes over a set timeframe to determine which side of the market is currently dominating.

Core Logic and Mechanism

1. Identifying Price Extremes The indicator looks at two distinct groups of historical data simultaneously:

  • It identifies the highest highs and lowest lows from a "recent" window of bars.
  • It identifies the highest highs and lowest lows from an "older" window of bars.

By comparing these two windows, the tool measures how much price has moved or "stretched" in one direction relative to the other.

2. Measuring Buying vs. Selling Power The script calculates two distinct values:

  • Buy Power: The distance between recent highs and older lows.
  • Sell Power: The distance between older highs and recent lows.

These two values are then combined into a single percentage-based oscillator. This helps clarify whether the market is trending strongly toward a breakout (higher buy power) or if it is being suppressed by selling pressure.

3. Smoothing and Refinement To prevent the data from appearing too erratic or "jumpy," the tool applies a multi-stage smoothing process. It uses a weighted calculation (based on mathematical constants related to the Fibonacci sequence) to filter out minor market noise. This ensures that the resulting line represents a cleaner, more reliable trend of market momentum.

4. Visual Output and Signal Generation The indicator produces two distinct lines in a separate window:

  • Main Line (Trend): This shows the smoothed momentum value. It fluctuates based on the shifting balance between buyers and sellers.
  • Signal Line (Binary Threshold): This acts as a simple binary guide. When the momentum is positive (above zero), the signal line moves to a pre-defined top boundary; when it is negative (below zero), it moves to a bottom boundary. This provides a clear visual cue for the overall "state" of the market momentum at any given time.
Miscellaneous
Implements a curve of type %1
12 Views
0 Downloads
0 Favorites
TTF_look-ahead
//+------------------------------------------------------------------+
//|                                                   ttf.mq4        |
//|                      Copyright © 2005, Nick Bilak                |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Nick Bilak"
#property link      "beluck[at]gmail.com"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
//---- input parameters
extern int TTFbars=7;
//15=default number of bars for computation
extern int TopLine=100;
extern int BottomLine=-100;
extern int t3_period=6;
extern double b=1.618;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
//----
int draw_begin1=0;
int draw_begin2=0;
double b2=0;
double b3=0;
double c1=0;
double c2=0;
double c3=0;
double c4=0;
double r=0;
double w1=0;
double w2=0;
double e1 = 0;
double e2 = 0;
double e3 = 0;
double e4 = 0;
double e5 = 0;
double e6 = 0;
double  HighestHighRecent=0;
double  HighestHighOlder =0;
double  LowestLowRecent =0;
double  LowestLowOlder =0;
double  BuyPower =0;
double  SellPower=0;
double  TTF=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(2);
//---- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, MainBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, SignalBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="TTF_look-ahead ("+TTFbars+") ";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"Signal");
//----
   draw_begin1=TTFbars*2+1+TTFbars*3;
   draw_begin2=draw_begin1;
   SetIndexDrawBegin(0,draw_begin1);
   SetIndexDrawBegin(1,draw_begin2);
   
   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);

   r=t3_period;

   if (r<1) r=1;
   r = 1 + 0.5*(r-1);
   w1 = 2 / (r + 1);
   w2 = 1 - w1;
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| ttf                                            |
//+------------------------------------------------------------------+
int start()
  {
   int    i,k;
   int    counted_bars=IndicatorCounted();
   double price;
//----
   if(Bars<=draw_begin2) return(0);
//---- initial zero
   if(counted_bars<1)
     {
      for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0;
      for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0;
     }
//---- %K line
   i=Bars-draw_begin1;
   if(counted_bars>draw_begin1) i=Bars-counted_bars-1;
   while(i>=0)
     {
     
     
  HighestHighRecent=High[Highest(NULL,0,MODE_HIGH,TTFbars,i-TTFbars+1)];//High[Highest(MODE_HIGH,shift+TTFbars-1,TTFbars)];
  HighestHighOlder =High[Highest(NULL,0,MODE_HIGH,TTFbars,i+1)];//High[Highest(MODE_HIGH,shift+TTFbars*2-1,TTFbars)];
  LowestLowRecent =Low[Lowest(NULL,0,MODE_LOW,TTFbars,i-TTFbars+1)];//Low [Lowest (MODE_LOW ,shift+TTFbars-1,TTFbars)];
  LowestLowOlder =Low[Lowest(NULL,0,MODE_LOW,TTFbars,i+1)];//Low [Lowest (MODE_LOW ,shift+TTFbars*2-1,TTFbars)];
  BuyPower =HighestHighRecent-LowestLowOlder;
  SellPower=HighestHighOlder -LowestLowRecent;
  TTF=(BuyPower-SellPower)/(0.5*(BuyPower+SellPower))*100;

  e1 = w1*TTF + 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;

  TTF = c1*e6 + c2*e5 + c3*e4 + c4*e3;

  MainBuffer[i]=TTF;
  i--;
 }
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
//---- signal line is simple movimg average
   for(i=0; i<limit; i++) {
      if (MainBuffer[i]>=0) 
         SignalBuffer[i]=TopLine;
      else
         SignalBuffer[i]=BottomLine;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments