Author: Copyright � 2005, Nick Bilak
bbsqueeze

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.

Indicators Used
Indicator of the average true rangeStandard Deviation indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
bbsqueeze
//+------------------------------------------------------------------+
//|                                                    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