Phoenix5_Ind_1_v2

Download script
Author: Copyright � 2006, fryk@tlen.pl
Phoenix5_Ind_1_v2

This 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.

Indicators Used
Moving average indicatorEnvelopes indicatorMoving Average of Oscillator
Miscellaneous
Implements a curve of type %1
19 Views
0 Downloads
0 Favorites
Phoenix5_Ind_1_v2
//+------------------------------------------------------------------------+
//|                                        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