//+------------------------------------------------------------------+ //| geHMA_HP.mq4 | //| Copyright © 2007, ver 1.0 | //| Forte928 | //+------------------------------------------------------------------+ #property copyright "Forte928" #property link "" #define IndicatorName "geHMA_HP" #property indicator_chart_window //#property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Tomato #property indicator_color2 YellowGreen extern int Alpha =3; extern int Shift =0; extern int Counter =2000; //double FreqTOL =0.0001;//Tolerance of frequency calculation for Method 1 double FxView1[]; double FxView2[]; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~V~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Work Variables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int Ix; int Sx; double TimeBuf1[]; double TimeBuf2[]; double TimeBuf3[]; double TimeBuf4[]; double TimeBuf5[]; double TimeBuf6[]; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~V~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Initialization program Buffers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void InitBufferam(int iBufferSize) { ArrayResize(TimeBuf1,iBufferSize); ArrayResize(TimeBuf2,iBufferSize); ArrayResize(TimeBuf3,iBufferSize); ArrayResize(TimeBuf4,iBufferSize); ArrayResize(TimeBuf5,iBufferSize); ArrayResize(TimeBuf6,iBufferSize); return; } void EmptyBufferam() { ArrayInitialize(TimeBuf1,EMPTY_VALUE); ArrayInitialize(TimeBuf2,EMPTY_VALUE); ArrayInitialize(TimeBuf3,EMPTY_VALUE); ArrayInitialize(TimeBuf4,EMPTY_VALUE); ArrayInitialize(TimeBuf5,EMPTY_VALUE); ArrayInitialize(TimeBuf6,EMPTY_VALUE); // --> return; } void DoneBufferam() { ArrayResize(TimeBuf1,0); ArrayResize(TimeBuf2,0); ArrayResize(TimeBuf3,0); ArrayResize(TimeBuf4,0); ArrayResize(TimeBuf5,0); ArrayResize(TimeBuf6,0); return; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~V~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Program Constants ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int MaxPeriod=0; int CalcCount=0; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Custom indicator initialization function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int init() { //---- initialization program values -------------------------------- MaxPeriod=0;//MathMax(EMAPrd,WinSize); InitBufferam(MaxCounter(Counter,MaxPeriod)); CalcCount=InitCounter(Counter,MaxPeriod); //---- initialization indicators ------------------------------------- SetupChartLine(0,FxView1,0,2,"HMA_HP"+Alpha);// SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1); SetIndexBuffer(0,ValueBuf0); // IndicatorShortName(IndicatorName+"("+WinSize+"("+EMAPrd+"))"); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)); //---- return(0); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~V~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Custom indicator deinitialization function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int deinit() { //---- DoneBufferam(); //---- return(0); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~V~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Start defination ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int start() { if (!StartCounter(IndicatorName,Counter,CalcCount,MaxPeriod)) return(-1); //------------------------------------------------------------------------------------ EmptyBufferam(); //+-------------------------- Begin Cycle ---------------------------------------------------+\\ for (int Rx=0;Rx<Counter;Rx++) TimeBuf1[Rx]=Close[Rx+Shift]; HPFilter(TimeBuf1,TimeBuf2,MathFloor(Alpha/2),Counter); HPFilter(TimeBuf1,TimeBuf3,Alpha,Counter); for (Rx=Counter-1;Rx>=0;Rx--) TimeBuf2[Rx]=2.0*TimeBuf2[Rx]-TimeBuf3[Rx]; HPFilter(TimeBuf2,TimeBuf1,MathFloor(MathSqrt(Alpha)),Counter); ArrayCopy(FxView1,TimeBuf1,Shift,0,Counter); //---- return(0); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~ InitCounter ~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int InitCounter(int iPreCount,int iMaxPeriod) { // Rule 1 //if ((Result==0)||(Result>Bars)) Result=Bars; int Result=MaxCounter(iPreCount,iMaxPeriod); // Rule 2 if ((Result+iMaxPeriod)>Bars) Result=Bars-iMaxPeriod; // Rule 3 if (Result<iMaxPeriod) Result=0; else Result=Result+iMaxPeriod; return(Result); } //------------------------------------------ StartCounter -------------------------- bool StartCounter(string WindowName,int iPreCount,int& iCalcCount,int iMaxPeriod) { if ((iPreCount>iCalcCount)||(iPreCount==0)) iCalcCount=InitCounter(iPreCount,iMaxPeriod); if (iCalcCount==0) { Alert(WindowName+" "+Symbol()+"("+Period()+") - Limited Calculate Period"); return(false); } return(true); //int iBarCount=IndicatorCounted(); //if (iBarCount>0) return(true); //Print("StartCounter"); return(false); } //------------------------------------------ StartCounter -------------------------- int MaxCounter(int iPreCount,int iMaxPeriod) { int Result=iPreCount; // Rule 1 //if ((Result==0)||(Result>Bars)) Result=Bars; if (Result==0) Result=Bars-1; if (Result<iMaxPeriod) Result=iMaxPeriod; return(Result+iMaxPeriod); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~ Style active Line ~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void SetupChartLine(int Index,double& ViewAy[],int Style,int Width,string Label) { switch(Style) { case 0 : SetIndexStyle(Index,DRAW_LINE,STYLE_SOLID,Width);break; case 1 : SetIndexStyle(Index,DRAW_HISTOGRAM,STYLE_SOLID,Width);break; case 2 : SetIndexStyle(Index,DRAW_ARROW,STYLE_SOLID,Width);break; default : SetIndexStyle(Index,DRAW_LINE,STYLE_SOLID,Width);break; } if (Label!="") SetIndexLabel(Index,Label); SetIndexBuffer(Index,ViewAy); return(0); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~ HPFilter - Ôèëüòð Õîäðèêà-Ïðåñêîòòà ~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Hodrick-Prescott Filter-----------------------------------------------------------------+ void HPFilter(double& aySource[],double& ayResult[],int Lambda,int iCount) { double Ak[],Bk[],Ck[],H1,H2,H3,H4,H5,HH1,HH2,HH3,HH4,HH5,HB,HC,Z; ArrayResize(Ak,iCount); ArrayResize(Bk,iCount); ArrayResize(Ck,iCount); Ak[0]=1.0+Lambda; Bk[0]=-2.0*Lambda; Ck[0]=Lambda; for(int Hx=1;Hx<iCount-2;Hx++) { Ak[Hx]=6.0*Lambda+1.0; Bk[Hx]=-4.0*Lambda; Ck[Hx]=Lambda; } Ak[1]=5.0*Lambda+1; Ak[iCount-1]=1.0+Lambda; Ak[iCount-2]=5.0*Lambda+1.0; Bk[iCount-2]=-2.0*Lambda; Bk[iCount-1]=0.0; Ck[iCount-2]=0.0; Ck[iCount-1]=0.0; //Forward for(Hx=0;Hx<iCount;Hx++) { Z=Ak[Hx]-H4*H1-HH5*HH2; HB=Bk[Hx]; HH1=H1; H1=(HB-H4*H2)/Z; Bk[Hx]=H1; HC=Ck[Hx]; HH2=H2; H2=HC/Z; Ck[Hx]=H2; Ak[Hx]=(aySource[Hx]-HH3*HH5-H3*H4)/Z; HH3=H3; H3=Ak[Hx]; H4=HB-H5*HH1; HH5=H5; H5=HC; } //Backward H2=0; H1=Ak[iCount-1]; ayResult[iCount-1]=H1; for(Hx=iCount-2;Hx>=0;Hx--) { ayResult[Hx]=Ak[Hx]-Bk[Hx]*H1-Ck[Hx]*H2; H2=H1; H1=ayResult[Hx]; } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Implements a curve of type DRAW_HISTOGRAM
Implements a curve of type DRAW_ARROW
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen