Author: Belomor
FN_Signal

This tool is designed as a visual market indicator for the MetaTrader platform. Its primary purpose is to help traders identify momentum shifts and potential trend reversals by analyzing price movements relative to historical volatility. Instead of just looking at the raw price, it processes the data through several layers of calculation to "smooth out" market noise and highlight significant signals.

How the Logic Works

The script follows a multi-step process to translate raw market data into the visual signals you see on your chart:

1. Normalization of Price Movement First, the script looks at the current price and compares it to a Simple Moving Average (SMA). It measures how far the price has strayed from that average in terms of standard deviation (a common measure of volatility). By dividing the distance by the volatility, it "normalizes" the data—essentially putting different types of market movements onto a consistent scale.

2. The Fisher Transformation The normalized data is then passed through a mathematical formula known as a Fisher Transformation. This is a key step because it helps compress extreme price outliers and expands smaller price movements. This makes it much easier for a trader to see where a move is becoming overextended or when momentum is beginning to decelerate.

3. Smoothing the Signal To prevent the indicator from jumping erratically with every small tick, the script applies two different "Exponential Moving Averages" (EMAs) to the transformed data:

  • The Fast EMA: Reacts quickly to recent changes in momentum.
  • The Slow EMA: Provides a broader view of the prevailing trend.

4. Visual Signal Generation The final output on your chart is determined by the interaction between these two averages:

  • Bullish Signal (Green): When the fast average crosses above the slow average, it suggests that upward momentum is accelerating.
  • Bearish Signal (Red): When the fast average crosses below the slow average, it suggests that downward momentum is gaining strength.

Summary for the User

Essentially, this script acts as a "momentum filter." It takes raw price action, strips away the "noise" of everyday market fluctuations, and highlights clear moments where the speed and direction of the price are shifting significantly enough to warrant trader attention.

Indicators Used
Moving average indicatorStandard Deviation indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
14 Views
0 Downloads
0 Favorites
FN_Signal
//+------------------------------------------------------------------+
//|                                                    FN Signal.mq4 |
//|                                                          Belomor |
//|                                                 belomor@inbox.ru |
//+------------------------------------------------------------------+
#property copyright "Belomor"
#property link      "belomor@inbox.ru"
//----
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Silver
//---- input parameters
extern int       FN=34;
extern double    Deviation=3.0;
extern int       FastEMA=5;
extern int       SlowEMA=13;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,3);
   SetIndexStyle(2,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
   if(FN<2)
      FN=2;
   if(Deviation<0)
      Deviation=1;
   if(FastEMA<1)
      FastEMA=1;
   if(SlowEMA<1)
      SlowEMA=1;
   IndicatorShortName("FNCD ("+FN+","+FastEMA+","+SlowEMA+")");
   SetIndexDrawBegin(0,FN+SlowEMA);
   SetIndexDrawBegin(1,FN+SlowEMA);
   SetIndexLabel(0,"FN Up");
   SetIndexLabel(1,"FN Down");
   SetIndexEmptyValue(0,0);
   SetIndexEmptyValue(1,0);
   IndicatorDigits(4);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double NormalizedX(int F_period, int i)
  {
   double result;
   double A;
   double S;
   double C;
   if(i<Bars-F_period)
     {
      C=Close[i];
      A=iMA(NULL,0,F_period,0,MODE_SMA,PRICE_CLOSE,i);
      S=iStdDev(NULL,0,F_period,MODE_SMA,0,PRICE_CLOSE,i);
      result=(C-A)/S;
     }
   else
      result=0;
   return(result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FisherNormalizedX(int F_period, double Dev, int i)
  {
   double result;
   double X;
   if(i<Bars-F_period && Dev>0)
     {
      X=NormalizedX(F_period,i)/Dev;
      if(X>0.99)
         X=0.99;
      if(X<-0.99)
         X=-0.99;
      result=0.5*MathLog((1+X)/(1-X));
     }
   else
      result=0;
   return(result);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   for(int i=0; i<limit; i++)
      ExtMapBuffer4[i]=FisherNormalizedX(FN,Deviation,i);
   for(i=0; i<limit; i++)
      ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer4,Bars,SlowEMA,0,MODE_EMA,i);
   for(i=0; i<limit; i++)
     {
      if(iMAOnArray(ExtMapBuffer4,Bars,FastEMA,0,MODE_EMA,i)>ExtMapBuffer3[i])
        {
         ExtMapBuffer1[i]=iMAOnArray(ExtMapBuffer4,Bars,FastEMA,0,MODE_EMA,i);
         ExtMapBuffer2[i]=0;
        }
      else
        {
         ExtMapBuffer1[i]=0;
         ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer4,Bars,FastEMA,0,MODE_EMA,i);
        }
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+

Comments