TTF_look-ahead_v1
Download scriptThis technical indicator is designed to measure market momentum by analyzing the relative strength between recent price movements and older price actions. It functions by creating a visual representation of "Buying Power" versus "Selling Power," allowing traders to identify shifts in sentiment through a specialized mathematical formula.
Core Logic and Methodology
The script operates on a comparative analysis of price extremes. To determine the current market state, it looks at two distinct timeframes:
- Recent Activity: It identifies the highest highs and lowest lows over a specific number of bars (defined by the user).
- Historical Reference: It simultaneously identifies the highest highs and lowest lows from an adjacent period immediately preceding the recent data.
By calculating the difference between these two areas, the indicator derives two primary values:
- Buy Power: The distance between the current recent high and the older low.
- Sell Power: The distance between the older high and the current recent low.
Momentum Calculation
The indicator then calculates a percentage value based on the relationship between these two powers. If Buy Power significantly outweighs Sell Power, the resulting value trends upward; conversely, if Sell Power is dominant, the value trends downward.
To ensure the data is smooth and readable for a human user—rather than erratic and jagged—the script applies a multi-stage smoothing process. It passes the raw momentum value through a series of weighted calculations (similar to an exponential moving average) multiple times. This filters out market "noise" and highlights the underlying trend more clearly.
Visual Representation
The tool produces two distinct lines on a separate window below the main price chart:
- Main Trend Line: This represents the processed momentum value. It shows the fluctuating balance of power in the market.
- Signal Line: This serves as a binary "threshold" indicator. It monitors the Main Trend Line and reacts to whether the momentum is positive or negative. When the momentum stays above zero, the signal remains at a high level (Top Line); when it drops below zero, it moves to a low level (Bottom Line).
Summary for Traders
Essentially, this script tells you who is winning the "tug-of-war" between buyers and sellers. It looks at how much further the price has pushed in the recent past compared to the past, smooths that data to remove distractions, and provides a clear signal based on whether the prevailing momentum is currently bullish or bearish.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| 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