This technical script is designed to function as a visual trading indicator that identifies specific market conditions, primarily focusing on periods of extreme price volatility and directional trends. It operates by analyzing historical price data to calculate two distinct types of market information: momentum (the "push" behind the price) and volatility (the "expansion" or "squeezing" of price movement).
Core Analytical Logic
The logic behind this indicator can be broken down into three main components:
1. Trend Directionality The script first determines whether the market is moving in an upward or downward direction. It does this by calculating a custom linear regression value. Unlike a simple moving average, this calculation looks at the relationship between current prices and historical highs/lows over a specific period.
- If the resulting value is positive, the indicator identifies an upward trend.
- If the resulting value is negative, it identifies a downward trend.
2. Volatility Measurement (The "Squeeze") Simultaneously, the script measures how much the price is "stretching" or "compressing." It compares two different types of variability:
- Average True Range (ATR): This measures the actual movement distance between high and low prices.
- Standard Deviation: This measures how much the price deviates from its average mean.
By comparing these two metrics against a user-defined threshold, the script determines if the market is in a state of "expansion" (high volatility) or "compression" (a squeeze).
3. Visual Signaling The final output of the script is a visual representation on the trading chart:
- Trend Indicators: The script uses colored histograms to represent the calculated momentum, showing you the strength and direction of the current move.
- Volatility Alerts: When the market hits a specific threshold of volatility—indicating that a "squeeze" is potentially releasing into a larger move—the script places specific markers (arrows) on the chart. These act as signals for traders to notice when price movement is becoming abnormally intense or changing phase.
Summary for the User
In plain terms, this tool acts like a dual-filter system. It watches the market to see which way it wants to go (Trend) while simultaneously monitoring how tightly the price is "coiled" like a spring (Volatility). When the coil is tight and a trend begins to emerge, the indicator provides visual cues to help traders identify these specific moments in the market cycle.
//+------------------------------------------------------------------+
//| bbsqueeze.mq4 |
//| Copyright © 2005, Nick Bilak, beluck[AT]gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Nick Bilak"
#property link "http://metatrader.50webs.com/"
//----
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Magenta
#property indicator_color4 Aqua
//---- input parameters
extern int bolPrd=20;
extern double bolDev=2.0;
extern int keltPrd=20;
extern double keltFactor=1.5;
extern int momPrd=12;
//---- buffers
double upB[];
double loB[];
double upK[];
double loK[];
//----
int i,j,slippage=3;
double breakpoint=0.0;
double ema=0.0;
int peakf=0;
int peaks=0;
int valleyf=0;
int valleys=0, limit=0;
double ccis[61],ccif[61];
double delta=0;
double ugol=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,upB);
SetIndexEmptyValue(0,EMPTY_VALUE);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexBuffer(1,loB);
SetIndexEmptyValue(1,EMPTY_VALUE);
SetIndexStyle(2,DRAW_ARROW);
SetIndexBuffer(2,upK);
SetIndexEmptyValue(2,EMPTY_VALUE);
SetIndexArrow(2,159);
SetIndexStyle(3,DRAW_ARROW);
SetIndexBuffer(3,loK);
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();
int shift,limit;
double diff,d,std,bbs;
//----
if (counted_bars<0) return(-1);
if (counted_bars>0) counted_bars--;
limit=Bars-31;
if(counted_bars>=31) limit=Bars-counted_bars-1;
for(shift=limit;shift>=0;shift--)
{
//d=iMomentum(NULL,0,momPrd,PRICE_CLOSE,shift);
d=LinearRegressionValue(bolPrd,shift);
if(d>0)
{
upB[shift]=d;
loB[shift]=0;
}
else
{
upB[shift]=0;
loB[shift]=d;
}
diff=iATR(NULL,0,keltPrd,shift)*keltFactor;
std=iStdDev(NULL,0,bolPrd,MODE_SMA,0,PRICE_CLOSE,shift);
bbs=bolDev * std/diff;
if(bbs<1)
{
upK[shift]=0;
loK[shift]=EMPTY_VALUE;
}
else
{
loK[shift]=0;
upK[shift]=EMPTY_VALUE;
}
}
return(0);
}
//+------------------------------------------------------------------+
double LinearRegressionValue(int Len,int shift)
{
double SumBars=0;
double SumSqrBars=0;
double SumY=0;
double Sum1=0;
double Sum2=0;
double Slope=0;
//----
SumBars=Len * (Len-1) * 0.5;
SumSqrBars=(Len - 1) * Len * (2 * Len - 1)/6;
//----
for(int x=0; x<=Len-1;x++)
{
double HH=Low[x+shift];
double LL=High[x+shift];
for(int y=x; y<=(x+Len)-1; y++)
{
HH=MathMax(HH, High[y+shift]);
LL=MathMin(LL, Low[y+shift]);
}
Sum1+=x* (Close[x+shift]-((HH+LL)/2 + iMA(NULL,0,Len,0,MODE_EMA,PRICE_CLOSE,x+shift))/2);
SumY+=(Close[x+shift]-((HH+LL)/2 + iMA(NULL,0,Len,0,MODE_EMA,PRICE_CLOSE,x+shift))/2);
}
Sum2=SumBars * SumY;
double Num1=Len * Sum1 - Sum2;
double Num2=SumBars * SumBars-Len * SumSqrBars;
//----
if (Num2!=0.0)
{
Slope=Num1/Num2;
}
else
{
Slope=0;
}
double Intercept=(SumY - Slope*SumBars) /Len;
//debugPrintln(Intercept+" : "+Slope);
double LinearRegValue=Intercept+Slope * (Len - 1);
return(LinearRegValue);
}
//+------------------------------------------------------------------+
Comments