Phoenix5_Ind_1_v2
Download scriptThis indicator is designed to identify specific high-probability trading opportunities by analyzing price action through four distinct technical lenses simultaneously. Rather than relying on a single rule, it requires a "confluence" of conditions—meaning all four systems must agree before a visual signal (an arrow) appears on your chart.
Core Logic & Methodology
The script evaluates the market using four primary layers of analysis:
1. Price Envelope Boundaries The system establishes an upper and lower "envelope" based on recent price movement. It looks for instances where the price pushes outside of these boundaries (overextended).
- If the price closes above the upper limit, it identifies a potential selling opportunity.
- If the price closes below the lower limit, it identifies a potential buying opportunity.
2. Simple Moving Average (SMA) Comparison The script compares two different moving averages to determine the current momentum of the trend. By measuring the distance and direction between these averages, it determines whether the current movement aligns with a bullish (upward) or bearish (downward) shift in the market's structural flow.
3. On Balance Volume Oscillator (OSMA) This layer acts as a momentum filter. It analyzes the relationship between fast and slow price movements relative to volume. The logic looks for a specific "turn" in the oscillator—detecting when momentum is shifting from one direction to another, helping to confirm that a price move has actual strength behind it.
4. Divergence Calculation This is a sophisticated layer that measures the difference between two different moving averages of varying lengths. It calculates how much these averages are "diverging" or spreading apart in real-time. The script looks for specific "sweet spots" where this divergence falls within a predefined range, suggesting a moment of balanced tension before a potential reversal or breakout.
Smart Adaptability
One of the key features of this logic is its ability to auto-calibrate. The script recognizes different currency pairs (such as USDJPY, EURJPY, GBPUSD, etc.) and automatically adjusts its internal sensitivity settings to match the specific volatility and behavior of those markets. It also adjusts its visual "offset" based on the timeframe you are viewing, ensuring that the signals are displayed clearly regardless of whether you are looking at a 1-minute or a daily chart.
Execution Summary
A signal is only triggered when all four of these conditions align:
- Buy Signal: Price is below the lower envelope + Moving Averages indicate upward momentum + OSMA shows bullish movement + Divergence meets the specific "Buy" threshold.
- Sell Signal: Price is above the upper envelope + Moving Averages indicate downward momentum + OSMA shows bearish movement + Divergence meets the specific "Sell" threshold.
By requiring this multi-layered confirmation, the logic aims to filter out market "noise" and highlight moments where price action, momentum, and volume are all moving in synchronization.
//+------------------------------------------------------------------------+
//| Phoenix_4_CONTEST_indicator.ex4 |
//| Copyright © 2006, fryk@tlen.pl |
//| This indicator is based on Phoenix_v4_2_CONTEST.mq4 EA © 2006 Hendrick |
//+------------------------------------------------------------------------+
#property copyright "Copyright © 2006, fryk@tlen.pl"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//----
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//----
extern int SMAPeriod =7;
extern int SMA2Bars =14;
extern double Percent =0.0032;
extern int EnvelopePeriod =2;
extern int OSMAFast =5;
extern int OSMASlow =30;
extern double OSMASignal =2;
//----
extern int Fast_Period =25;
extern int Fast_Price =PRICE_OPEN;
extern int Slow_Period =15;
extern int Slow_Price =PRICE_OPEN;
extern double DVBuySell =0.003;
extern double DVStayOut =0.024;
extern bool PrefSettings =true;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double divergence(int F_Period, int S_Period, int F_Price, int S_Price, int mypos)
{
int i;
//----
double maF1, maF2, maS1, maS2;
double dv1, dv2;
//----
maF1=iMA(Symbol(), 0, F_Period, 0, MODE_SMA, F_Price, mypos);
maS1=iMA(Symbol(), 0, S_Period, 0, MODE_SMA, S_Price, mypos);
dv1=(maF1 - maS1);
maF2=iMA(Symbol(), 0, F_Period, 0, MODE_SMA, F_Price, mypos + 1);
maS2=iMA(Symbol(), 0, S_Period, 0, MODE_SMA, S_Price, mypos + 1);
dv2=((maF1 - maS1) - (maF2 - maS2));
//----
return(dv1 - dv2);
}
int nShift=0;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
SetIndexStyle(0, DRAW_ARROW, 0, 1);
SetIndexArrow(0, 233);
SetIndexBuffer(0, ExtMapBuffer1);
SetIndexStyle(1, DRAW_ARROW, 0, 1);
SetIndexArrow(1, 234);
SetIndexBuffer(1, ExtMapBuffer2);
if(PrefSettings==true)
{
if((Symbol()=="USDJPY") || (Symbol()=="USDJPYm"))
{
Percent =0.0032;
EnvelopePeriod =2;
SMAPeriod =2;
SMA2Bars =18;
OSMAFast =5;
OSMASlow =22;
OSMASignal =2;
Fast_Period =25;
Slow_Period =15;
DVBuySell =0.0029;
DVStayOut =0.024;
}
if((Symbol()=="EURJPY") || (Symbol()=="EURJPYm"))
{
Percent =0.007;
EnvelopePeriod =2;
SMAPeriod =4;
SMA2Bars =16;
OSMAFast =11;
OSMASlow =20;
OSMASignal =14;
Fast_Period =20;
Slow_Period =10;
DVBuySell =0.0078;
DVStayOut =0.026;
}
if((Symbol()=="GBPJPY") || (Symbol()=="GBPJPYm"))
{
Percent =0.0072;
EnvelopePeriod =2;
SMAPeriod =8;
SMA2Bars =12;
OSMAFast =5;
OSMASlow =36;
OSMASignal =10;
Fast_Period =17;
Slow_Period =28;
DVBuySell =0.0034;
DVStayOut =0.063;
}
if((Symbol()=="USDCHF") || (Symbol()=="USDCHFm"))
{
Percent =0.0056;
EnvelopePeriod =10;
SMAPeriod =5;
SMA2Bars =9;
OSMAFast =5;
OSMASlow =12;
OSMASignal =11;
Fast_Period =5;
Slow_Period =20;
DVBuySell =0.00022;
DVStayOut =0.0015;
}
if((Symbol()=="GBPUSD") || (Symbol()=="GBPUSDm"))
{
Percent =0.0023;
EnvelopePeriod =6;
SMAPeriod =3;
SMA2Bars =14;
OSMAFast =23;
OSMASlow =17;
OSMASignal =15;
Fast_Period =25;
Slow_Period =37;
DVBuySell =0.00042;
DVStayOut =0.05;
}
}
switch(Period())
{
case 1: nShift=1; break;
case 5: nShift=3; break;
case 15: nShift=5; break;
case 30: nShift=10; break;
case 60: nShift=15; break;
case 240: nShift=20; break;
case 1440: nShift=80; break;
case 10080: nShift=100; break;
case 43200: nShift=200; break;
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars > 0) counted_bars--;
//----
limit=Bars - counted_bars;
//----
for(int i=0; i < limit; i++)
{
bool BuySignal1=false, SellSignal1=false;
double HighEnvelope1=iEnvelopes(NULL,0,EnvelopePeriod,MODE_SMA,0,PRICE_CLOSE,Percent,MODE_UPPER,i+1);
double LowEnvelope1 =iEnvelopes(NULL,0,EnvelopePeriod,MODE_SMA,0,PRICE_CLOSE,Percent,MODE_LOWER,i+1);
double CloseBar1 =Close[i+1];
//----
if(CloseBar1 > HighEnvelope1) {SellSignal1=true;}
if(CloseBar1 < LowEnvelope1) {BuySignal1 =true;}
bool BuySignal2=false, SellSignal2=false;
double SMA1=iMA(NULL,0,SMAPeriod,0,MODE_SMA,5,i+1);
double SMA2=iMA(NULL,0,SMAPeriod,0,MODE_SMA,5,i+SMA2Bars);
if(SMA2-SMA1>0) {BuySignal2 =true;}
if(SMA2-SMA1<0) {SellSignal2=true;}
bool BuySignal3=false, SellSignal3=false;
double OsMABar2=iOsMA(NULL,0,OSMASlow,OSMAFast,OSMASignal,PRICE_CLOSE,i+2);
double OsMABar1=iOsMA(NULL,0,OSMASlow,OSMAFast,OSMASignal,PRICE_CLOSE,i+1);
if(OsMABar2 > OsMABar1) {SellSignal3=true;}
if(OsMABar2 < OsMABar1) {BuySignal3 =true;}
double diverge;
bool BuySignal4=false,SellSignal4=false;
diverge=divergence(Fast_Period, Slow_Period, Fast_Price, Slow_Price,i);
if(diverge>=DVBuySell && diverge<=DVStayOut)
{BuySignal4=true;}
if(diverge<=(DVBuySell*(-1)) && diverge>=(DVStayOut*(-1)))
{SellSignal4=true;}
if((SellSignal1==true) && (SellSignal2==true) && (SellSignal3==true) && (SellSignal4==true))
{
ExtMapBuffer2[i]=High[i] + nShift*Point;
}
if((BuySignal1==true) && (BuySignal2==true) && (BuySignal3==true) && (BuySignal4==true))
{
ExtMapBuffer1[i]=Low[i] - nShift*Point;
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments