TTFsignal
Download scriptOverview of the TTF Signal Logic
This script is a custom technical analysis tool designed to track and visualize market momentum by comparing recent price extremes against historical data. Instead of looking at simple price movements, it calculates "Power" dynamics to determine which side of the market—buyers or sellers—is currently exerting more influence.
How the Logic Works
The indicator operates through three primary stages:
1. Data Collection (Recent vs. Older) The tool looks back at two distinct windows of time simultaneously: a short-term "Recent" window and a longer-term "Older" window. It identifies four key data points:
- The highest price in the recent window.
- The lowest price in the recent window.
- The highest price in the older window.
- The lowest price in the older window.
2. Power Calculation By comparing these four points, the script calculates two distinct values:
- Buy Power: The difference between the recent high and the older low. This measures how much "ground" buyers have gained recently compared to the past.
- Sell Power: The difference between the older high and the recent low. This measures how much "ground" sellers have gained recently compared to the past.
Using these two values, it calculates a percentage-based TTF (Total Trend Force). This number represents the net strength of the trend; if the value is positive, it suggests bullish momentum, while a negative value suggests bearish momentum.
3. Smoothing and Filtering To prevent the indicator from jumping erratically with every tiny price flicker, the script applies several layers of mathematical smoothing (similar to a moving average). This ensures that the resulting line represents a fluid trend rather than "noisy" data.
Visual Signals
The tool displays these calculations in a separate window on your chart:
- The Main Line: Displays the smoothed TTF value, showing you the current strength of the trend.
- Trend Signals: The script identifies specific thresholds (High and Low lines).
- When the trend force reaches the upper limit, it triggers an "Up" signal.
- When the trend force drops to the lower limit, it triggers a "Down" signal.
- If the trend force stays in the middle zone, no signal is displayed, helping you avoid entering trades during periods of indecision or consolidation.
//+------------------------------------------------------------------+
//| ttfsignal.mq4 |
//| Copyright © 2005, Nick Bilak |
//| corrected by Modest |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Nick Bilak"
#property link "beluck[at]gmail.com"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_level1 0.0
//---- input parameters
extern int TTFbars=8;
//15=default number of bars for computation
extern int TopLine=75;
extern int BottomLine=-75;
extern int t3_period=3;
extern double b=0.7;
//---- buffers
double MainBuffer[];
double SignalBufferUp[];
double SignalBufferDn[];
//----
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(3);
//---- indicator lines
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0, MainBuffer);
SetIndexStyle(1,DRAW_LINE,EMPTY, 3);
// SetIndexStyle(1,DRAW_HISTOGRAM,EMPTY, 1);
// SetIndexStyle(1,DRAW_ARROW);
// SetIndexArrow(1,159);
SetIndexBuffer(1, SignalBufferUp);
// SetIndexStyle(2,DRAW_HISTOGRAM,EMPTY, 1);
SetIndexStyle(2,DRAW_LINE,EMPTY, 3);
// SetIndexStyle(2,DRAW_ARROW);
// SetIndexArrow(2,159);
SetIndexBuffer(2, SignalBufferDn);
//---- name for DataWindow and indicator subwindow label
short_name="TTFsignal("+TTFbars;
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
SetIndexLabel(1,"Signal");
//----
draw_begin1=TTFbars*2+1;
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++) SignalBufferUp[Bars-i]=0;
for(i=1;i<=draw_begin2;i++) SignalBufferDn[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)];//High[Highest(MODE_HIGH,shift+TTFbars-1,TTFbars)];
HighestHighOlder =High[Highest(NULL,0,MODE_HIGH,TTFbars,i+TTFbars)];//High[Highest(MODE_HIGH,shift+TTFbars*2-1,TTFbars)];
LowestLowRecent =Low[Lowest(NULL,0,MODE_LOW,TTFbars,i)];//Low [Lowest (MODE_LOW ,shift+TTFbars-1,TTFbars)];
LowestLowOlder =Low[Lowest(NULL,0,MODE_LOW,TTFbars,i+TTFbars)];//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
// ----- corrected by Modest
/*for(i=0; i<limit; i++) {
if (MainBuffer[i]>=0)
SignalBuffer[i]=TopLine;
else
SignalBuffer[i]=BottomLine;
}*/
for(i=0; i<Bars-1; i++) {
if (MainBuffer[i]>=TopLine)
{SignalBufferUp[i]=TopLine;SignalBufferDn[i]=EMPTY_VALUE ;}
if (MainBuffer[i]<=BottomLine)
{SignalBufferDn[i]=BottomLine;SignalBufferUp[i]=EMPTY_VALUE; }
if (MainBuffer[i]>BottomLine && MainBuffer[i]<TopLine)
{SignalBufferUp[i]=EMPTY_VALUE; SignalBufferDn[i]=EMPTY_VALUE;}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments