This indicator is designed to provide visual trading signals on a MetaTrader chart by analyzing the relationship between three core technical components: Exponential Moving Averages (EMA), the Parabolic SAR (Stop and Reverse) indicator, and price action.
Instead of just showing these lines, the script identifies specific "trigger moments" where these indicators interact in significant ways, marking them on your chart with various shapes and arrows. Here is a breakdown of the logic:
Core Technical Logic
The script constantly monitors the following conditions to determine when to place a signal:
1. Moving Average Crosses (Trend Shifts)
- Bullish Signal: The script looks for a "Golden Cross" scenario, where a fast-moving average (10-period) crosses upward over a slower-moving average (40-period). This identifies a potential shift into an upward trend.
- Bearish Signal: Conversely, it monitors for a "Death Cross," where the fast average crosses downward below the slow average, indicating a potential move into a downtrend.
2. Parabolic SAR Interactions The script tracks the Parabolic SAR to identify momentum shifts:
- Trend Flips: It marks points where the SAR flips from being below the price (bullish) to above the price (bearish), and vice versa.
- SAR vs. Long-Term Trend: It also detects unique moments when the SAR crosses the 40-period EMA. This helps identify when short-term momentum is moving against the long-term average.
3. The "Quality" Filter (Advanced Timing) The logic includes a sophisticated filtering system to ensure signals are not generated during "noisy" market conditions:
- Time Duration: The script tracks how many periods the SAR has remained in a specific position (above or below the price).
- Trend Stability: It uses a counter to measure the time elapsed since the last Moving Average cross.
- Validation: For certain "Box" signals, the script requires the trend to have been stable for at least 7 periods. This ensures that the indicator only marks signals during established moves rather than volatile, flickering price action.
Visual Representation on Chart
Rather than cluttering your screen with lines, the script converts these mathematical triggers into clear visual markers:
- Arrows: Used to highlight primary trend reversals from the Moving Average crosses and Parabolic SAR flips.
- Boxes/Special Markers: Used to highlight "qualified" signals—those that meet the specific stability requirements (the 7-period rule), helping you distinguish between high-probability trend continuations and standard price fluctuations.
//+------------------------------------------------------------------+
//| 5 Min RSI 12-period qual INDICATOR |
//+------------------------------------------------------------------+
#property copyright "Ron T"
#property link "http://www.lightpatch.com"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 HotPink
#property indicator_color3 Red
#property indicator_color4 MistyRose
#property indicator_color5 White
#property indicator_color6 LightGray
#property indicator_color7 White
#property indicator_color8 DarkGray
//---- buffers
double Buffer1[];
double Buffer2[];
double Buffer3[];
double Buffer4[];
double Buffer5[];
double Buffer6[];
double Buffer7[];
double Buffer8[];
// User Input
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//|------------------------------------------------------------------|
int init()
{
// 233 up arrow
// 234 down arrow
// 159 big dot
// 168 open square
// 120 box with X
SetIndexStyle(0,DRAW_ARROW);
SetIndexBuffer(0, Buffer1);
SetIndexArrow(0,159); //up
SetIndexStyle(1,DRAW_ARROW);
SetIndexBuffer(1, Buffer2);
SetIndexArrow(1,159); //down
SetIndexStyle(2,DRAW_ARROW);
SetIndexBuffer(2, Buffer3);
SetIndexArrow(2,120);
SetIndexStyle(3,DRAW_ARROW);
SetIndexBuffer(3, Buffer4);
SetIndexArrow(3,159);
SetIndexStyle(4,DRAW_ARROW);
SetIndexBuffer(4, Buffer5);
SetIndexArrow(4,159);
SetIndexStyle(5,DRAW_ARROW);
SetIndexBuffer(5, Buffer6);
SetIndexArrow(5,159);
SetIndexStyle(6,DRAW_ARROW);
SetIndexBuffer(6, Buffer7);
SetIndexArrow(6,120);
SetIndexStyle(7,DRAW_ARROW);
SetIndexBuffer(7, Buffer8);
SetIndexArrow(7,159);
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
int i;
for( i=0; i<Bars; i++ ) Buffer1[i]=0;
for( i=0; i<Bars; i++ ) Buffer2[i]=0;
for( i=0; i<Bars; i++ ) Buffer3[i]=0;
for( i=0; i<Bars; i++ ) Buffer4[i]=0;
for( i=0; i<Bars; i++ ) Buffer5[i]=0;
for( i=0; i<Bars; i++ ) Buffer6[i]=0;
for( i=0; i<Bars; i++ ) Buffer7[i]=0;
for( i=0; i<Bars; i++ ) Buffer8[i]=0;
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
// Current position if 55/45 or over/under. Does any of
// the previous 'qual' period ever fall below55/above45? (last11)
//
// If qual*2 periods have been above55/below45
// then lets not try to transact any more (last22)
int start()
{
int pos=Bars-100; // leave room for moving average periods
double cEMA10=0, pEMA10=0;
double cEMA40=0, pEMA40=0;
double cSAR=0, pSAR=10;
double pip=Point();
double spread=pip*3;
int pTRANS; // how many periods since last MA cross
int above=0; // how long SAR has been up
int below=0; // how long SAR has been down
while(pos>=0)
{
pTRANS++;
cEMA10=iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE, pos);
pEMA10=iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE, pos+1);
cEMA40=iMA(Symbol(),0,40,0,MODE_EMA,PRICE_CLOSE, pos);
pEMA40=iMA(Symbol(),0,40,0,MODE_EMA,PRICE_CLOSE, pos+1);
cSAR=iSAR(Symbol(),0,0.02,0.2,pos);
pSAR=iSAR(Symbol(),0,0.02,0.2,pos+1);
if (pEMA10<cEMA40 && cEMA10>cEMA40)
{
Buffer1[pos]=cEMA10; // rising cross
pTRANS=0; // clear period counter
}
if (pEMA10>cEMA40 && cEMA10<cEMA40)
{
Buffer5[pos]=cEMA10; // falling cross
pTRANS=0; // clear period counter
}
if (pSAR<cSAR && cSAR>=High[pos])
{
Buffer2[pos]=cSAR; // rising SAR
if (below<=7 && pTRANS>=7) Buffer3[pos]=cSAR; // Box Indicator
above=0;
below=0;
}
if (pSAR>cSAR && cSAR<=Low[pos])
{
Buffer6[pos]=cSAR; // falling SAR
if (above<=7 && pTRANS>=7) Buffer7[pos]=cSAR; // Box Indicator
above=0;
below=0;
}
if (pSAR<cEMA40 && cSAR>cEMA40) Buffer4[pos]=cEMA40; //rising SAR/EMA40 cross
if (pSAR>cEMA40 && cSAR<cEMA40) Buffer8[pos]=cEMA40; //falling SAR/EMA40 cross
if (cSAR>High[pos]) above++; // count how long SAR has been up
if (cSAR<Low[pos]) below++; // count how long SAR has been down
pos--;
}
return(0);
}
//+------------------------------------------------------------------+
Comments