BolliToucher_001
Download scriptThis script functions as a technical analysis tool designed to identify specific price action patterns known as "Gimme-Bars." It assists traders by highlighting potential reversal points where the market shows signs of exhaustion or a change in momentum.
Core Logic and Behavior
The primary goal of the script is to monitor price movements relative to volatility boundaries. Here is a breakdown of how it operates:
1. Volatility Boundary Calculation The script continuously calculates two dynamic boundary lines (similar to Bollinger Bands) based on the following:
- Simple Moving Average: It tracks the average closing price over a user-defined period (default is 20).
- Standard Deviation: It measures how much the price fluctuates away from that average.
- Deviation Limits: It projects upper and lower boundaries by multiplying the standard deviation by a specific factor (default is 2.0). These lines represent "normal" trading territory; prices moving outside these bounds are often considered overextended.
2. Identifying "Gimme-Bars" The script scans every price bar to see if it interacts with these boundaries. It looks for two specific conditions:
- Bearish Signals (Sell Opportunities): If the high of a price bar reaches or exceeds the upper boundary, the script identifies this as a potential area of exhaustion. It places a visual marker on the chart to highlight that the price has "stretched" too far upward.
- Bullish Signals (Buy Opportunities): If the low of a price bar reaches or drops below the lower boundary, the script identifies a potential oversold condition. It places a visual marker to highlight that the price has "stretched" too far downward.
3. Visual Feedback and Alerts To ensure the trader doesn't have to watch the screen constantly, the script provides real-time feedback:
- On-Chart Markers: It draws specific icons (arrows/dots) above or below the bars that touch the boundaries, making it easy to see historical "Gimme" moments.
- Dynamic Alerts: When a new bar opens and the price has touched a boundary, the script triggers an audible sound alert and a pop-up message on the screen. This notifies the user immediately that a potential reversal signal is occurring in real-time.
Summary for the User
Think of this tool as an "exhaustion monitor." It doesn't tell you exactly when to enter a trade, but it paints the picture of where the market is moving too fast and might be about to snap back in the opposite direction. By marking these specific high and low extremes, it helps you identify the highest-probability zones for potential price reversals.
//+------------------------------------------------------------------+
//| Gimmebar.mq4 |
//| See Joe Ross Trading Manual on Gimme-Bars (e.g. from the |
//| library on www.trading-naked.com)
//|Bolllitouch - yet another perky mod |
//+------------------------------------------------------------------+
#property copyright "by Shimodax, 2005"
#property link "http://www.strategybuilder.com"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 SlateBlue
#property indicator_color2 SlateBlue
#property indicator_color3 Pink
#property indicator_color4 LightBlue
#property indicator_color5 Pink
#property indicator_color6 LightBlue
//---- indicator parameters
extern int BobaPeriod= 20;
extern double UpperDeviations=2.0;
extern double LowerDeviations=2.0;
extern bool Alert_ON=true;
extern bool Use_Sound=true;
//---- indicator buffers
double BufferBand1[];
double BufferBand2[];
double BufferSell[];
double BufferBuy[];
double BufferSellEntry[];
double BufferBuyEntry[];
string UD="";
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
//---- 2 additional buffers are used for counting.
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
// two bollies
SetIndexBuffer(0,BufferBand1);
SetIndexStyle(0,DRAW_LINE);
SetIndexDrawBegin(0,BobaPeriod);
SetIndexBuffer(1,BufferBand2);
SetIndexStyle(1,DRAW_LINE);
SetIndexDrawBegin(1,BobaPeriod);
// marks for gimmees
SetIndexBuffer(2,BufferSell);
SetIndexStyle(2,DRAW_ARROW);
SetIndexDrawBegin(2,BobaPeriod);
SetIndexArrow(2, 167);
SetIndexEmptyValue(2, 0);
SetIndexBuffer(3,BufferBuy);
SetIndexStyle(3,DRAW_ARROW);
SetIndexDrawBegin(3,BobaPeriod);
SetIndexArrow(3, 167);
SetIndexEmptyValue(3, 0);
// marks for entries
SetIndexBuffer(4,BufferSellEntry);
SetIndexStyle(4,DRAW_ARROW);
SetIndexDrawBegin(4,BobaPeriod);
SetIndexArrow(4, 238);
SetIndexEmptyValue(4, 0);
SetIndexBuffer(5,BufferBuyEntry);
SetIndexStyle(5,DRAW_ARROW);
SetIndexDrawBegin(5,BobaPeriod);
SetIndexArrow(5, 236);
SetIndexEmptyValue(5, 0);
//---- name for DataWindow and indicator subwindow label
// IndicatorShortName("GimmeBar ");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars= IndicatorCounted(),
lastbar;
if (counted_bars>0)
counted_bars--;
lastbar= Bars - counted_bars;
GimmeeBar(0, lastbar, BufferSell, BufferBuy, BufferSellEntry, BufferBuyEntry, BufferBand1, BufferBand2, BobaPeriod, UpperDeviations, LowerDeviations);
return (0);
}
//+------------------------------------------------------------------+
//| Mark Gimmee-Bars and mark possible entries for deals |
//+------------------------------------------------------------------+
double GimmeeBar(int offset, int lastbar, double &sellbuf[], double &buybuf[], double &sellbuf2[], double &buybuf2[],
double &band1buf[], double&band2buf[], int period, double deviationUp, double deviationDown)
{
double band1, band2;
int markerdist= 5; // distance between bars and marker dots
lastbar= MathMin(Bars-period, lastbar);
//---- main loop
for(int i= lastbar; i>=offset; i--){
sellbuf[i]= 0;
buybuf[i]=0;
sellbuf2[i]= 0;
buybuf2[i]=0;
double ma = iMA(NULL,0,period,0,MODE_SMA,PRICE_CLOSE,i);
double stdDev = iStdDev(NULL,0,period,0,MODE_SMA,PRICE_CLOSE,i);
band1= ma+stdDev*deviationUp;
band2= ma-stdDev*deviationDown;
band1buf[i]= band1;
band2buf[i]= band2;
// 1. Prices were rising.
// 2. Prices touched the upper band.
// 3. The price bar closed lower than it
// opened when prices were previously rising.
// or vice versa
if (High[i]>=band1) {
sellbuf[i]= High[i] + markerdist*Point;
if (i < 2 )
{
UD="m Down";
DoAlert(UD);
}
}
if (Low[i]<=band2) {
buybuf[i]= Low[i] - markerdist*Point;
if (i < 2 )
{
UD="m Up.";
DoAlert(UD);
}
}
// Should such a price bar occur, a sell short order is to be executed
// one tick below the low of the Gimmee bar.
// if (sellbuf[i+1]!=0 && Low[i]<Low[i+1]-1*Point) {
// sellbuf2[i]= Low[i+1]-1*Point;
// }
// if (buybuf[i+1]!=0 && High[i]>High[i+1]+1*Point) {
// buybuf2[i]= High[i+1]+1*Point;
// }
}
/*
if (DebugLogger)
Print(TimeOffset(offset), "BG-GimmeBar ", "");
*/
return (0);
}
//+------------------------------------------------------------------+
void DoAlert(string UD)
{
if (!NewBar() || !Use_Sound)
return;
if(Alert_ON==true)Alert("Alert ! Line Touched "+Symbol()+" M"+Period()+" @ "+DoubleToStr(Bid,Digits)+"");
PlaySound ("Alert2");
}
bool NewBar()
{
static datetime dt = 0;
if (dt != Time[0])
{
dt = Time[0];
return(true);
}
}
Comments