This script is a technical analysis tool designed to provide visual trading signals on a chart by filtering price action through three specific mathematical lenses: Exponential Moving Averages (EMA), the Parabolic SAR, and Relative Price Positioning. Rather than overwhelming the user with raw data, the logic focuses on identifying "confluence"—moments where multiple trend indicators agree simultaneously.
Core Logic Overview
The tool operates by scanning historical price data to identify specific geometric relationships between different technical indicators. It uses three primary components to make its determinations:
- Moving Average Crosses (EMA 10 & 40): The script monitors the relationship between a fast-moving average (10 periods) and a slower-moving average (40 periods). When these lines cross, it signals a potential change in momentum.
- Parabolic SAR Positioning: This is used as a trend-following "stop" indicator. The script checks whether the SAR dots are currently appearing above or below the price candles to determine the prevailing trend direction.
- Momentum Flips: The logic specifically looks for sudden "flips" in the Parabolic SAR, identifying the exact moment the trend reverses from upward to downward (or vice-versa).
Signal Generation Logic
The script translates these calculations into eight distinct visual markers on the chart. These are categorized by color and shape to represent different levels of confirmation:
1. Trend Reversal Boxes (Red & White) These appear when a Moving Average cross occurs, but only if the Parabolic SAR confirms the direction.
- A White Box appears when the fast average crosses above the slow average while the SAR confirms an upward trend.
- A Red Box appears when the fast average crosses below the slow average while the SAR confirms a downward trend.
2. SAR Momentum Crosses (Dots) The script identifies specific instances where the Parabolic SAR line physically crosses the 40-period Moving Average.
- It marks a Red Dot when the SAR crosses from above to below the EMA, suggesting a move into a bearish state.
- It marks a White Dot when the SAR crosses from below to above the EMA, suggesting a move into a bullish state.
3. Immediate Trend Flips (Arrows) The script looks for rapid "flips" in the Parabolic SAR and applies a "cooldown" logic to them.
- An Up Arrow appears when the SAR flips upward, provided it has been in a downward state for no more than 6 periods.
- A Down Arrow appears when the SAR flips downward, provided it has been in an upward state for no more than 6 periods.
Summary of Behavior
In professional terms, this script acts as a trend-confirmation filter. It ignores minor price fluctuations and only plots a signal when a trend change is validated by both the moving average "crossover" and the Parabolic SAR's position relative to the price. By using multiple visual symbols (Boxes, Dots, and Arrows), it allows a trader to distinguish between a confirmed trend shift, a momentum crossover, and an immediate trend flip.
//+------------------------------------------------------------------+
//| 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 Red
#property indicator_color3 Red
#property indicator_color4 Red
#property indicator_color5 White
#property indicator_color6 White
#property indicator_color7 White
#property indicator_color8 White
//---- 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); //RED ARROW
SetIndexBuffer(0, Buffer1);
SetIndexArrow(0,234);
SetIndexStyle(1,DRAW_ARROW);
SetIndexBuffer(1, Buffer2);
SetIndexArrow(1,159);
SetIndexStyle(2,DRAW_ARROW); //RED OPEN BOX
SetIndexBuffer(2, Buffer3);
SetIndexArrow(2,120);
SetIndexStyle(3,DRAW_ARROW); //RED DOT
SetIndexBuffer(3, Buffer4);
SetIndexArrow(3,159);
SetIndexStyle(4,DRAW_ARROW); //WHITE ARROW
SetIndexBuffer(4, Buffer5);
SetIndexArrow(4,233);
SetIndexStyle(5,DRAW_ARROW);
SetIndexBuffer(5, Buffer6);
SetIndexArrow(5,159);
SetIndexStyle(6,DRAW_ARROW); //WHITE X BOX
SetIndexBuffer(6, Buffer7);
SetIndexArrow(6,120);
SetIndexStyle(7,DRAW_ARROW); //RED DOT
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 |
//+------------------------------------------------------------------+
int start()
{
int pos=350; // leave room for moving average periods
double cEMA10=0, pEMA10=0;
double cEMA40=0, pEMA40=0;
double cSAR=0, pSAR=10;
bool rising=false;
bool falling=false;
bool sarLO=false;
bool sarHI=false;
bool flipUP=false;
bool flipDN=false;
int dCROSS; // 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
double p=Point();
bool Over=false;
bool Under=false;
// 1 RED DOWN ARROW
// 2 RED
// 3 RED BIG OPEN BOX
// 4 RED BIG DOT
// 5 WHITE UP ARROW
// 6 WHITE
// 7 WHITE BIG X BOX
// 8 WHITE BIG DOT
while(pos>=0)
{
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);
//
// Set all the switches
//
// determine if rising or falling cross
rising=false;
if (pEMA10<=pEMA40 && cEMA10>=cEMA40){rising=true;}
falling=false;
if (pEMA10>=pEMA40 && cEMA10<=cEMA40){falling=true;}
// which side is SAR on
sarLO=false;
if (cSAR<Low[pos]) sarLO=true;
sarHI=false;
if (cSAR>High[pos]) sarHI=true;
// did PSAR just flip
flipUP=false;
if (pSAR<=Low[pos+1] && cSAR>=High[pos]){flipUP=true;}
flipDN=false;
if (pSAR>=High[pos+1] && cSAR<=Low[pos]){flipDN=true;}
//
// Show all the indicators based on switches
//
// rising crosses with LOW SAR ONLY
if (rising){Buffer7[pos]=cEMA10; above=0; below=0;} //WHITE BOX
// falling crosses with HIGH SAR ONLY
if (falling){Buffer3[pos]=cEMA10; above=0; below=0;} //RED BOX
//SAR crossed above EMA40
if (pSAR<pEMA40 && cSAR>=cEMA40 && !flipUP && !flipDN){Buffer8[pos]=cSAR;}
//SAR crossed below EMA40
if (pSAR>pEMA40 && cSAR<=cEMA40 && !flipUP && !flipDN){Buffer4[pos]=cSAR;}
if (sarHI) above++; // count how long SAR has been up
if (sarLO) below++; // count how long SAR has been down
if (flipUP && below<=6){Buffer1[pos]=cSAR;}
if (flipDN && above<=6){Buffer5[pos]=cSAR;}
pos--;
}
return(0);
}
//+------------------------------------------------------------------+
Comments