BolliToucher_001

Download script
BolliToucher_001

This 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.

Indicators Used
Moving average indicatorStandard Deviation indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
15 Views
0 Downloads
0 Favorites
BolliToucher_001
//+------------------------------------------------------------------+
//|                                                     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