Fisher Transform for CCO, COGO or RVI_001
Download scriptThis technical tool is designed to provide traders with a specialized visual oscillator that combines multiple layers of data analysis. Instead of relying on a single price movement, the script synthesizes information from external oscillators to identify trends and potential momentum shifts.
Core Logic Overview
The functionality operates through a four-step process:
1. Data Sourcing The script allows you to choose between several different underlying market indicators (such as Cyber Cycle, CG Oscillator, Relative Vigor Index, or RSI). By selecting one of these as your "Base Oscillator," the tool determines which primary data stream it will analyze to generate its final output.
2. Peak and Valley Normalization Once the base data is selected, the script looks at a specific window of recent price history (defined by the user's chosen length). It identifies the highest and lowest values within that timeframe. It then calculates the relative position of the current value between those extremes. This process effectively "normalizes" the data, making it easier to see where the price sits on a scale from 0 to 1, regardless of the actual price digits.
3. Weighted Smoothing To filter out erratic market "noise" and focus on the meaningful trend, the script applies a weighted moving average to the normalized data. It assigns higher importance to the most recent figures while gradually reducing the weight of older figures. This creates a smoother line that reflects the true momentum of the market rather than instantaneous price spikes.
4. Logarithmic Transformation The final stage involves a mathematical transformation (Logarithmic) applied to the smoothed results. This is used to compress or expand the visual representation of the data, highlighting significant moves while keeping the overall movement manageable within the display window.
Visual Output
The result is presented as two distinct lines in a separate window below your main chart:
- The Primary Line: Represents the current processed momentum.
- The Offset Line: A secondary line that mimics the primary line but is shifted by one period, allowing you to visually track changes in direction and acceleration more clearly.
//+------------------------------------------------------------------+
//| |
//| Copyright © 2006, Luis Guilherme Damiani |
//| http://www.damianifx.com.br |
//|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Luis Guilherme Damiani"
#property link "http://www.damianifx.com.br"
#property indicator_buffers 2
#property indicator_separate_window
//#property indicator_chart_window
#property indicator_color1 Yellow
#property indicator_color2 Blue
#property indicator_maximum 0.8
//#property indicator_color3 Purple
//---- input parameters
extern int length=8;
extern int maxbars=1000;
extern bool mean_signal=false;
extern string Base_Oscillator_Choice="0= Cyber Cycle, 1= CG, 2= RVI, other= RSI(12) ----------------";
extern int Osc_Choice=0;
//---- buffers
double ind1[];
double ind2[];
//double ind3[];
//double AuxBuffer[]; //Smooth
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ind1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ind2);
// SetIndexStyle(2,DRAW_LINE);
// SetIndexBuffer(2,ind3);
SetLevelValue(0,0.0);
// SetLevelValue(1,-0.8);
ArrayInitialize(ind1,0.0);
ArrayInitialize(ind2,0.0);
// ArrayInitialize(ind3,0.0);
/// ArrayResize(AuxBuffer,maxbars+3);
// ArrayInitialize(AuxBuffer,0.0);
switch(Osc_Choice)
{
case 0: IndicatorShortName("StochFisher of Cyber Cycle ");break;
case 1: IndicatorShortName("StochFisher of CG Oscillator ");break;
case 2: IndicatorShortName("StochFisher of Relative Vigor Index ");break;
default: IndicatorShortName("StochFisher of RSI(12) ");break;
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{//1
int counted_bars=IndicatorCounted();
double num=0,denom=0;
double indw[];
double stoch[];
double mstoch;
ArrayResize(indw,length);
ArrayInitialize(indw,0);
ArrayResize(stoch,Bars);
ArrayInitialize(stoch,0);
//---- check for possible errors
if(counted_bars<0) return(-1);
int limit=Bars-2*length-counted_bars;
if(limit>maxbars)limit=maxbars;
//if (limit>Bars-1)limit=Bars-1;
//----
for (int i = limit; i>=0;i--)
{//2
for(int j=0;j<length;j++)
{
switch(Osc_Choice)
{
case 0: indw[j]=iCustom(NULL,0,"CyAn_4_Cyber Cycle",0,i+j);break;
case 1: indw[j]=iCustom(NULL,0,"CyAn_5_CG Oscillator",0,i+j);break;
case 2: indw[j]=iCustom(NULL,0,"CyAn_6_RVI",0,i+j);break;
default:indw[j]=iRSI(NULL,0,12,PRICE_MEDIAN,i+j);break;
}
}
double max=indw[ArrayMaximum(indw)];
double min=indw[ArrayMinimum(indw)];
stoch[i]=(indw[0]-min)/(max-min);
mstoch=(4*stoch[i]+3*stoch[i+1]+2*stoch[i+2]+stoch[i+3])/10;
ind1[i]=0.5*(MathLog((1+0.98*(mstoch-0.5))/(1-0.98*(mstoch-0.5))));
ind2[i]=ind1[i+1];
// ind3[i]=(4*ind1[i]+3*ind1[i+1]+2*ind1[i+2]+ind1[i+3])/10;
}//2
//----
return(0);
}
//+------------------------------------------------------------------+
Comments