Ind-GG01M1
Download scriptThe Ind-GG01 script is a technical analysis tool designed for the MetaTrader platform to identify specific market trends and potential entry points by synthesizing multiple mathematical indicators into a single visual signal.
Instead of relying on one single metric, the logic operates by cross-referencing four distinct types of market data: moving averages, volatility bands, parabolic trends, and custom smoothed momentum.
How the Logic Works
The tool analyzes the market using the following layered approach:
1. Trend and Momentum Smoothing The script calculates a primary moving average to smooth out "market noise." It then compares this against a secondary, custom-calculated smoothing buffer. By measuring the variance between these two values, the script determines whether the current price momentum is strengthening or weakening relative to recent history.
2. Volatility Assessment A key component of this logic is the monitoring of "Bollinger Band" width. The tool doesn't just look at the price; it looks at the distance between the upper and lower volatility boundaries. It specifically looks for instances where this gap is widening—indicating an expansion in market activity or a breakout from a period of consolidation.
3. Trend Directional Filtering To confirm the direction of the move, the script utilizes a Parabolic Stop and Reverse (SAR) calculation. This acts as a "ceiling" or "floor" filter:
- For potential upward moves, it ensures the price is maintaining position above the SAR line.
- For potential downward moves, it ensures the price is staying below the SAR line.
4. Signal Generation The tool generates visual markers (arrows) on the chart only when all of the following conditions align simultaneously:
- For Buy Signals: The primary moving average must be trending upward, the momentum buffer must confirm the shift, the volatility gap must be expanding significantly compared to the previous candle, and the price must be above the trend filter.
- For Sell Signals: The primary moving average must be trending downward, the momentum buffer must confirm the shift, the volatility gap must be expanding significantly, and the price must be below the trend filter.
Summary for the User
In simple terms, this script is designed to ignore "choppy" or sideways markets. It waits for a moment where momentum, volatility expansion, and trend direction all agree at the same time. When these conditions meet, it places a visual marker on your chart to highlight the potential trade opportunity.
//+------------------------------------------------------------------+
//| 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;
int barsToProcess=500;
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;
/*
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)
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;
// if (i==Bars-1)
// {
// CABuf[i]=ma0; continue;
// }
double v1, v2, k;
v1=MathPow(iStdDev(NULL, 0, period_ca, 0, method_, price_, i), 2);
v2=MathPow(CABuf[i+1] - ma0, 2);
if (v2 < v1 || v2==0) k=0; else k=1 - v1/v2;
CABuf[i]=CABuf[i+1] + k*(ma0-CABuf[i+1]);
k=0;
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