Bollinger Squeeze Basic

Download script
Author: Copyright � 2005, Nick Bilak
Bollinger Squeeze Basic

This script is designed as a custom technical indicator for the MetaTrader platform. Its primary purpose is to analyze market momentum and volatility to identify specific trading opportunities, specifically looking for "squeezes" where market movement becomes unusually constrained before potentially breaking out.

Core Logic Overview

The script operates by processing three distinct layers of market data: Momentum Direction, Trend Strength, and Volatility Analysis.

1. Momentum Tracking The indicator first calculates the current momentum of the price. It looks at how fast the price is moving over a specific period and determines its direction (upward or downward).

  • Positive Momentum: If the price is moving up and gaining speed, the script highlights this trend.
  • Negative Momentum: If the price is moving down and gaining speed, it tracks that decline.
  • Visual Feedback: These movements are represented as colored histograms, allowing you to see at a glance whether the market is accelerating in one direction or another.

2. Volatility and "The Squeeze" This is the heart of the script’s logic. It compares two different types of market activity:

  • Average True Range (ATR): This measures how much the price typically moves on average.
  • Standard Deviation: This measures how much the current price is deviating from its recent average.

By dividing the standard deviation by the average range, the script calculates a "BB Squeeze" value. When this value falls below a certain threshold (meaning volatility is extremely low compared to the usual movement), it signals a high-probability environment for a breakout.

3. Signal Generation & Alerts When the script detects that the market is in a "squeeze"—meaning prices are consolidating tightly and energy is building up—it triggers visual cues on the chart.

  • Visual Markers: The script can place arrows or specific indicators to notify you of these squeeze conditions.
  • Notifications: Depending on your settings, the script can provide real-time alerts through pop-up boxes on your screen or via audio signals.

Summary for the User

Essentially, this tool helps you filter out "noisy" market noise by identifying periods of intense consolidation. It highlights when the market is "winding up," suggesting that a significant move in one direction (either up or down) may be imminent. By using momentum to see which way the pressure is leaning and the squeeze logic to see when energy is building, it provides a clearer picture of where the next major price movement might occur.

Indicators Used
Momentum indicatorIndicator of the average true rangeStandard Deviation indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt plays sound alerts
20 Views
0 Downloads
0 Favorites
Bollinger Squeeze Basic
//+------------------------------------------------------------------+
//|                                                    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 6
#property indicator_color1 LimeGreen
#property indicator_color2 IndianRed
#property indicator_color3 LightGreen
#property indicator_color4 LightPink
#property indicator_color5 Blue
#property indicator_color6 Red

//---- input parameters
extern int       totalBars=300;
extern int       bolPrd=20;
extern double    bolDev=2.0;
extern int       keltPrd=20;
extern double    keltFactor=1.5;
extern int       momPrd=12;
extern bool    alertBox=false;
extern bool    audioAlert=false;

//---- buffers
double upB[];
double loB[];
double upK[];
double loK[];
double upB2[];
double loB2[];

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,0,2);
   SetIndexBuffer(0,upB);
   SetIndexEmptyValue(0,0);
   
   SetIndexStyle(1,DRAW_HISTOGRAM,0,2);
   SetIndexBuffer(1,loB);
   SetIndexEmptyValue(1,0);

   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4,upK);
   SetIndexEmptyValue(42,0);
   SetIndexArrow(4,167);
   
   SetIndexStyle(5,DRAW_ARROW);
   SetIndexBuffer(5,loK);
   SetIndexEmptyValue(5,EMPTY_VALUE);
   SetIndexArrow(5,167);
   
   SetIndexStyle(2,DRAW_HISTOGRAM,0,2);
   SetIndexBuffer(2,upB2);
   SetIndexEmptyValue(2,0);
   
   SetIndexStyle(3,DRAW_HISTOGRAM,0,2);
   SetIndexBuffer(3,loB2);
   SetIndexEmptyValue(3,0);
//----
   return(0);
  }


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;*/
   
   if (counted_bars<0) return(-1);
   limit=totalBars; //Bars-31;
   
   ArrayResize(d,limit);

   for (shift=limit;shift>=0;shift--)   {
   
      /*upB[shift]=0;
      upB2[shift]=0;
      loB[shift]=0;
      loB2[shift]=0;*/
            
      d[shift]=iMomentum(NULL,0,momPrd,PRICE_CLOSE,shift)-100; // - iMomentum(NULL,0,momPrd,PRICE_CLOSE,shift+1));
      //d[shift]=LinearRegressionValue(momPrd,shift);
      //d[shift]=0;//FindDirection(shift);
      
      if(d[shift]>0) {
         if (d[shift] >= d[shift+1]) {
            upB[shift]=d[shift];
            upB2[shift]=0;
         } else {
            upB2[shift]=d[shift];
            upB[shift]=0;
         }
         
         loB[shift]=0;
         loB2[shift]=0;
      } else if (d[shift] < 0) {
         
         if (d[shift] <= d[shift+1]) {
            loB[shift]=d[shift];
            loB2[shift]=0;
         } else {
            loB2[shift]=d[shift];
            loB[shift]=0;
         }
         upB[shift]=0;
         upB2[shift]=0;
      } else {
         upB[shift]=0.01;
         upB2[shift]=0.01;
         loB[shift]=-0.01;
         loB2[shift]=-0.01;
      }
      
		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;
         
         if (alertBox == true && shift == 0) Alert("Warning for ", Symbol(), " on ", Period(), " chart!");
         if (audioAlert == true && shift == 0) PlaySound("alert.wav");
            
      } else {
         loK[shift]=0;
         upK[shift]=EMPTY_VALUE;
      }
   }
   return(0);
  }


Comments