Author: GGekko
Ind-GG01M

This technical indicator is designed to identify specific market momentum shifts by synthesizing multiple mathematical layers of price action. Instead of relying on a single metric, the logic functions as a multi-filter system that requires several independent conditions to be met simultaneously before providing a visual signal on your chart.

The Core Logic Components

The script analyzes the market using four primary data streams:

  • Moving Averages: It tracks the smoothed average price to identify the general direction of the trend.
  • Parabolic SAR: This is used as a "trailing" volatility indicator to determine whether the current price is pushing above or below its recent historical resistance/support levels.
  • Bollinger Bands: The script specifically measures the "width" (the distance between the upper and lower bands). It looks for instances where this width is expanding, which suggests a surge in market volatility.
  • Custom Smoothed Calculation: The script performs a specific mathematical calculation to compare current price deviations against historical averages, creating a unique baseline to judge whether a move is significant enough to act upon.

How the Signals are Generated

The indicator does not fire signals based on every minor price wiggle. It looks for "confluence"—where all of the following conditions happen at once:

For Sell Signals:

  1. The short-term moving average must be trending downward (lower than its previous position).
  2. The price must be trading below the Parabolic SAR level.
  3. The market volatility (Bollinger Band width) must be significantly high and currently increasing.
  4. The moving average must fall below the custom calculated baseline.

For Buy Signals:

  1. The short-term moving average must be trending upward (higher than its previous position).
  2. The price must be trading above the Parabolic SAR level.
  3. The market volatility (Bollinger Band width) must be significantly high and currently increasing.
  4. The moving average must rise above the custom calculated baseline.

Visual Representation

  • Arrows: When all conditions for a Buy or Sell are met, the indicator places an arrow on the chart to alert you to the potential move.
  • Trend Line: The script also maintains a continuous line on your chart that tracks the moving average. If no specific buy or sell signal is active, it displays this line to help you visualize the underlying trend of the market.

In summary, this tool is designed to filter out "noisy" sideways markets by requiring high volatility and specific directional momentum before showing you a signal, aiming to highlight moments where the market is making a decisive move in a specific direction.

Indicators Used
Moving average indicatorParabolic Stop and Reverse systemBollinger bands indicatorStandard Deviation indicator
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
Ind-GG01M
//+------------------------------------------------------------------+
//|                                                     Ind-GG01.mq4 |
//|                                                           GGekko |
//|                                                                  |
//+------------------------------------------------------------------+
//mod 2009fxtsd 

#property copyright "GGekko"
#property link      ""

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Lime
#property indicator_color3 Gold
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double CABuf[];

double ma0,ma1;
double ca;
double psar;
double boll_upper0,boll_upper1;
double boll_lower0,boll_lower1;
double bollingerdiff0,bollingerdiff1;

extern int period_ma=5;
extern int period_ca=5;
extern int method_=MODE_SMMA;
extern int price_=PRICE_CLOSE;
extern double step_psar=0.01;
extern double max_psar=0.3;
extern int period_boll=14;
extern int dev_boll=2;
extern int bolldiff=15;

extern int barsToProcess=500;
/*
PRICE_CLOSE	0	Close price.
PRICE_OPEN	1	Open price.
PRICE_HIGH	2	High price.
PRICE_LOW	3	Low price.
PRICE_MEDIAN	4	Median price, (high+low)/2.
PRICE_TYPICAL	5	Typical price, (high+low+close)/3.
PRICE_WEIGHTED	6	Weighted close price, (high+low+close+close)/4.

MODE_SMA	0	Simple moving average,
MODE_EMA	1	Exponential moving average,
MODE_SMMA	2	Smoothed moving average,
MODE_LWMA	3	Linear weighted moving average.
*/

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(4);

   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,242);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,EMPTY_VALUE);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,241);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,EMPTY_VALUE);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,115);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexEmptyValue(2,EMPTY_VALUE);
   SetIndexBuffer(3, CABuf);
   
   IndicatorShortName("GG01 ("+period_ma+","+period_ca+","+bolldiff+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted(), limit;
   int i=0; 
   if(counted_bars<0) return(-1);
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars;
         limit=MathMin(limit,barsToProcess);
   for (i=limit-1; i>= 0; i--)
   
   {
   
   ma0=iMA(NULL,0,period_ma,0,method_,price_,i);
   ma1=iMA(NULL,0,period_ma,0,method_,price_,i+1);
   
// ca=iCustom(NULL,0,"i-CAi",period_ca,method_,price_,0,i);
   
   psar=iSAR(NULL,0,step_psar,max_psar,i);
   boll_lower0=iBands(NULL,0,period_boll,dev_boll,0,PRICE_CLOSE,MODE_LOWER,i);
   boll_upper0=iBands(NULL,0,period_boll,dev_boll,0,PRICE_CLOSE,MODE_UPPER,i);
   bollingerdiff0=(boll_upper0-boll_lower0)/Point;
   boll_lower1=iBands(NULL,0,period_boll,dev_boll,0,PRICE_CLOSE,MODE_LOWER,i+1);
   boll_upper1=iBands(NULL,0,period_boll,dev_boll,0,PRICE_CLOSE,MODE_UPPER,i+1);
   bollingerdiff1=(boll_upper1-boll_lower1)/Point; 
   
      double v1, v2, k;

      v1=MathPow(iStdDev(NULL, 0, period_ca, 0, method_, price_, i), 2);
      v2=MathPow(CABuf[i+1] - ma0, 2);
      k=0;
      if (v2 < v1 || v2==0) k=0; else k=1 - v1/v2;

      CABuf[i]=CABuf[i+1] + k*(ma0-CABuf[i+1]);
      ca=CABuf[i];
      
   //SELL SIGNAL
   if(ma0<ca && ma0<=ma1 && psar>Close[i] && bollingerdiff0>bolldiff && bollingerdiff0>bollingerdiff1)
      ExtMapBuffer1[i]=ma0;
   else ExtMapBuffer1[i]=EMPTY_VALUE;
      
   
   //BUY SIGNAL   
   if(ma0>ca && ma0>=ma1 && psar<Close[i] && bollingerdiff0>bolldiff && bollingerdiff0>bollingerdiff1)
      ExtMapBuffer2[i]=ma0; 
   else ExtMapBuffer2[i]=EMPTY_VALUE;   
      
      
   if(ExtMapBuffer1[i]==EMPTY_VALUE && ExtMapBuffer2[i]==EMPTY_VALUE)
      ExtMapBuffer3[i]=ma0; 
   else ExtMapBuffer3[i]=EMPTY_VALUE;    
   
      
                
//   i++;
   }
   
   Comment("GG01 ("+period_ma+","+period_ca+","+bolldiff+")");
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments