my_squeeze
Download scriptOverview
The Bollinger Squeeze v9 is a technical analysis tool designed to identify periods of low volatility (market "squeezes") and signal potential breakouts in price action. It combines standard volatility measurements with various momentum oscillators to provide a more comprehensive view of market conditions than a single indicator could offer alone.
Core Logic & Mechanics
The script operates by analyzing two primary dimensions of the market: Volatility and Momentum.
1. The "Squeeze" Detection (Volatility)
The primary goal of this tool is to determine when the market is "compressing." It calculates the relationship between two different types of price movement:
- Standard Deviation: This measures how much the price fluctuates relative to its average.
- Average True Range (ATR): This measures the actual distance covered by price candles over a specific period.
By comparing these two values, the script identifies a "Squeeze." When the market is extremely quiet and the price is staying within a very tight range (the squeeze), the tool highlights this state. This is significant because, in trading, periods of extreme low volatility are often followed by sudden, explosive moves in either direction.
2. The Momentum Trigger
To help determine the potential direction of a breakout, the script incorporates one of five different momentum oscillators. Depending on your settings, you can choose which "trigger" defines the market's current lean:
- Stochastic: Measures the velocity of price changes relative to a range over time.
- CCI (Commodity Channel Index): Identifies new trends by comparing the current price to its average price.
- RSI (Relative Strength Index): Measures the speed and change of price movements to identify overbought or oversold conditions.
- MACD (Moving Average Convergence Divergence): Shows the relationship between two moving averages of different speeds.
- Momentum: A simple calculation of the rate of change in price over a specific period.
3. Combined Signal Processing
The script synthesizes these two components into a visual display:
- The Histogram: This represents the momentum trigger. It shows the strength and direction (up or down) of the market trend based on your selected oscillator.
- Squeeze Visualization: The script monitors whether the volatility is currently in a "squeeze" state.
- If a squeeze is detected, it adjusts how the momentum data is displayed.
- When the "squeeze" breaks (volatility expands), the tool signals that the price is moving out of its compressed state, which can serve as an entry point for traders looking to catch a breakout.
- Visual Alerts: The indicator includes specific visual markers (arrows) designed to highlight significant points where the squeeze conditions are met, helping the user quickly identify high-probability areas on the chart.
Summary for the User
In short, this script tells you when the market is about to "explode" (the Squeeze) and which direction it is leaning (the Momentum Trigger). By watching the histogram and the visual cues, you can see if the market is gathering energy in a tight range before potentially launching into a stronger move.
/*
*********************************************************************
Bollinger Squeeze v9
Original code by Nick Bilak
Modifications by Akuma99
Copyright © 2006 Akuma99
http://www.beginnertrader.com
For help on this indicator, tutorials and information
visit http://www.beginnertrader.com
Trigger types: 1-stochastic, 2-cci, 3-rsi, 4-macd, 5-momentum
*********************************************************************
*/
#property copyright "Copyright © 2006, Akuma99"
#property link "http://www.beginnertrader.com "
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 DarkGreen
#property indicator_color2 Maroon
#property indicator_color3 Blue
#property indicator_color4 Blue
#property indicator_color5 Maroon
#property indicator_color6 Navy
int bolPrd=20;
double bolDev=2.0;
int keltPrd=20;
double keltFactor=1.5;
extern int triggerType=4;
extern int stochPeriod_trigger1=14;
extern int cciPeriod_trigger2=50;
extern int rsiPeriod_trigger3=10;
extern int macd_fastEMA_trigger4=5;
extern int macd_slowEMA_trigger4=13;
extern int macd_macdEMA_trigger4=1;
extern int momentumPeriod_trigger5=14;
int cciPeriod=50;
double upB[];
double loB[];
double upB2[];
double loB2[];
double mm[];
double histoLine[];
double arrowBuffer[];
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;
int init() {
IndicatorBuffers(6);
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,4,indicator_color1);
SetIndexBuffer(0,upB);
SetIndexEmptyValue(0,EMPTY_VALUE);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,4,indicator_color2);
SetIndexBuffer(1,loB);
SetIndexEmptyValue(1,EMPTY_VALUE);
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,4,indicator_color3);
SetIndexBuffer(2,upB2);
SetIndexEmptyValue(2,EMPTY_VALUE);
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,4,indicator_color4);
SetIndexBuffer(3,loB2);
SetIndexEmptyValue(3,EMPTY_VALUE);
SetIndexStyle(5,DRAW_LINE,0,1,indicator_color5);
SetIndexBuffer(4,mm);
SetIndexStyle(5,DRAW_LINE,0,1,indicator_color6);
SetIndexBuffer(5,histoLine);
SetIndexStyle(6,DRAW_ARROW);
SetIndexArrow(6,159);
SetIndexBuffer(6,arrowBuffer);
return(0);
}
int deinit() {
SetLevelValue(1,NULL);
SetLevelValue(2,NULL);
SetLevelValue(3,NULL);
SetLevelValue(4,NULL);
}
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--) {
switch (triggerType) {
case 1:
d=iStochastic(NULL,0,stochPeriod_trigger1,3,3,MODE_SMA,0,MODE_MAIN,shift)-50;
SetLevelValue(1,30);
SetLevelValue(2,-30);
IndicatorShortName("Bollinger Squeeze with Stochastic ("+stochPeriod_trigger1+",3,3)");
break;
case 2:
d=iCCI(NULL,0,cciPeriod_trigger2,PRICE_CLOSE,shift);
SetLevelValue(1,-200);
SetLevelValue(2,-100);
SetLevelValue(3,100);
SetLevelValue(4,200);
IndicatorShortName("Bollinger Squeeze with CCI ("+cciPeriod_trigger2+",CLOSE)");
break;
case 3:
d=iRSI(NULL,0,rsiPeriod_trigger3,PRICE_CLOSE,shift)-50;
SetLevelValue(1,20);
SetLevelValue(2,-20);
IndicatorShortName("Bollinger Squeeze with RSI ("+rsiPeriod_trigger3+",CLOSE)");
break;
case 4:
d=iMACD(NULL,0,5,13,1,PRICE_CLOSE,MODE_MAIN,shift);
IndicatorShortName("Bollinger Squeeze with MACD (5,13,1,CLOSE)");
mm[shift]=iMACD(NULL,0,macd_fastEMA_trigger4,macd_slowEMA_trigger4,macd_macdEMA_trigger4,PRICE_CLOSE,MODE_SIGNAL,shift);
break;
case 5:
d=iMomentum(NULL,0,momentumPeriod_trigger5,PRICE_CLOSE,shift)-100;
SetLevelValue(1,1);
SetLevelValue(2,-1);
IndicatorShortName("Bollinger Squeeze with Momentum ("+momentumPeriod_trigger5+",CLOSE)");
break;
}
histoLine[shift]=d;
if(d>0) {
upB[shift]=d;
} else if (d<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) {
arrowBuffer[shift] = High[shift]+15*Point;
if (d > 0) {
upB2[shift]=d;
upB[shift]=0;
loB[shift]=0;
loB2[shift]=0;
} else {
loB2[shift]=d;
loB[shift]=0;
upB[shift]=0;
upB2[shift]=0;
}
} else {
if (d > 0) {
upB[shift]=d;
upB2[shift]=0;
loB[shift]=0;
loB2[shift]=0;
} else {
loB[shift]=d;
loB2[shift]=0;
upB[shift]=0;
upB2[shift]=0;
}
}
}
return(0);
}
Comments