//+------------------------------------------------------------------+ //| LK_FDI_v2.mq4 | //| Copyright © 2009, Leif Karlsson. | //| Leffemannen1973@telia.com | //+------------------------------------------------------------------+ //| Please feel free to copy, modify and / or redistribute this | //| software / source code in any way you see fit. | //+------------------------------------------------------------------+ //+ ********************* Shameless Ad. **************************** + //+ * I do custom programing jobs in C, Java, X86 Assembler & MQL4 * + //+ ***** Pleace do not hesitate to get in contact if you nead ***** + //+ ***** something special: EA, indicator or somthing else. ******* + //+ ****************** Leffemannen1973@telia.com ******************* + //+ **************************************************************** + //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Leif Kalrsson" #property link "mailto://Leffemannen1973@telia.com" //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Blue #property indicator_color2 Yellow #property indicator_color3 Green #property indicator_width1 1 //+------------------------------------------------------------------+ extern int WindowSize = 60; extern int SmoothPeriod = 5; extern bool LinearWeighted = true; extern string AppliedPriceText1 = "Close: 0, Open: 1, High: 2, Low: 3"; extern string AppliedPriceText2 = "Median: 4, Typical: 5, Weighted: 6"; extern int AppliedPrice = 0; extern int PriceShift = 0; extern bool dFDI = true; extern double RandomLevel = 1.5; extern int MaxBars = 4000; //+------------------------------------------------------------------+ double RangeBuffer[]; double TrendBuffer[]; double dFDIBuffer[]; double Price[]; double dPrice[]; double Alpha = 0.0; //+------------------------------------------------------------------+ int init() { IndicatorDigits(Digits+1); IndicatorBuffers(5); SetIndexStyle(0, DRAW_LINE); SetIndexStyle(1, DRAW_LINE); SetIndexStyle(2, DRAW_LINE); SetIndexBuffer(0, RangeBuffer); SetIndexBuffer(1, TrendBuffer); SetIndexBuffer(2, dFDIBuffer); SetIndexBuffer(3, Price); SetIndexBuffer(4, dPrice); SetLevelValue(0, RandomLevel); IndicatorShortName("LK_FDI_V2, WindowSize: " + WindowSize + ", SmoothPeriod: " + SmoothPeriod + " "); Alpha = 2.0/(SmoothPeriod + 1.0); return(0); } //+------------------------------------------------------------------+ double FDI(double Data[], int p, bool w, int Shift) { double Df = 0.0; double Temp = 0.0; double Range = 0.0; int i = 0; Range = Data[ArrayMaximum(Data, p, Shift)] - Data[ArrayMinimum(Data, p, Shift)]; i = p-2; while(i >= 0) { if(Range == 0.0) Temp = 1.0; else Temp = (Data[i+Shift] - Data[i+1+Shift])/Range; if(w) Df = Df + (p-1-i)*MathSqrt(Temp*Temp + 1.0/(p*p)); else Df = Df + MathSqrt(Temp*Temp + 1.0/(p*p)); i--; } if(w) Df = Df/(p/2.0); Df = 1.0 + MathLog(2.0*Df)/MathLog(2.0*p); return(Df); } //+------------------------------------------------------------------+ int start() { int j = 0; int i = IndicatorCounted(); if(i < 0) return(-1); i = Bars - i; if(i > MaxBars) { i = MaxBars; ArrayInitialize(TrendBuffer, 1.5); ArrayInitialize(RangeBuffer, 1.5); ArrayInitialize(dFDIBuffer, 1.7); i--; j = i + WindowSize; } else j = i; while(j >= 0) { Price[j] = iMA(NULL, 0, 1, 0, 0, AppliedPrice, j+PriceShift); dPrice[j] = Price[j] - iMA(NULL, 0, 1, 0, 0, AppliedPrice, j+PriceShift+1); j--; } while(i >= 0) { double Df = FDI(Price, WindowSize, LinearWeighted, i); if(RangeBuffer[i+1] == EMPTY_VALUE) Df = (1.0-Alpha)*TrendBuffer[i+1] + Alpha*Df; else Df = (1.0-Alpha)*RangeBuffer[i+1] + Alpha*Df; if(dFDI) dFDIBuffer[i] = (1.0-Alpha)*dFDIBuffer[i+1] + Alpha*FDI(dPrice, WindowSize, LinearWeighted, i); else dFDIBuffer[i] = EMPTY_VALUE; if(Df > RandomLevel) { RangeBuffer[i] = Df; TrendBuffer[i] = EMPTY_VALUE; if(RangeBuffer[i+1] == EMPTY_VALUE) RangeBuffer[i+1] = TrendBuffer[i+1]; } else { TrendBuffer[i] = Df; RangeBuffer[i] = EMPTY_VALUE; if(TrendBuffer[i+1] == EMPTY_VALUE) TrendBuffer[i+1] = RangeBuffer[i+1]; } i--; } return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Other Features: