#property copyright "http://dmffx.com" #property link "http://dmffx.com" #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 Gray #property indicator_color2 Gray //---- input parameters extern int FFTPower=8; // Ðàçìåð àíàëèçèðóåìîãî îêíà ñòåïåíü äâîéêè. Ïðè çíà÷åíèè 8 àíàëèçèðóåòñÿ 256 áàðîâ. extern int ShowBars=500; // Êîëè÷åñòâî áàðîâ äëÿ êîòîðûõ âûïîëíÿåòñÿ àíàëèç. extern int Shift=1; // Ñäâèã áàðîâ äëÿ êîòîðûõ âûïîëíÿåòñÿ àíàëèç extern int From_T=4; // Ìèíèìàëüíûé îòîáðàæàåìûé ïåðèîä (çíà÷åíèå ïåðèîäà íà íèæíåé ãðàíèöå äèàãðàììû) extern int To_T=50; // Ìàêñèìàëüíûé îòîáðàæàåìûé ïåðèîä (çíà÷åíèå ïåðèîäà íà âåðõíåé ãðàíèöå äèàãðàììû) extern color MaxColor=Yellow; // Öâåò ìàêñèìàëüíîé àìïëèòóäû extern color MinColor=Navy; // Öâåò ìèíèìàëüíîé àìïëèòóäû //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; double ExtMapBuffer4[]; double ExtMapBuffer5[]; double ExtMapBuffer6[]; double Counter[]; double Signal[]; #define Pi 3.14159265358979323846 #define TwoPi 6.28318530717958647692 int FFTPeriod; double FFTTmpOutput_1[]; double FFTSpectr[][3]; double FFTTmpOutput_2[]; double FFTPprocessedData[]; double FFTDC,FFTStartVShift; double FFTFilterK[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init(){ fFFTInit(FFTPower,FFTPeriod,FFTTmpOutput_1,FFTSpectr,FFTTmpOutput_2,FFTPprocessedData); //---- indicators IndicatorBuffers(8); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,ExtMapBuffer2); SetIndexBuffer(2,Counter); SetIndexBuffer(3,Signal); SetIndexEmptyValue(2,0); IndicatorDigits(0); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- fObjDeleteByPrefix(WindowExpertName()); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start(){ int limit=Bars-IndicatorCounted()-1; for(int i=limit;i>=0;i--){ Signal[i]=Close[i]; Counter[i]=Counter[i+1]+1; ExtMapBuffer1[i]=From_T-2; ExtMapBuffer2[i]=MathMin(FFTPeriod/2-1,To_T)+2; } limit=MathMin(limit,ShowBars-1); limit+=Shift; for(i=limit;i>=Shift;i--){ fFFTDirectMain(Signal,i,FFTPeriod,FFTTmpOutput_1); fFFTDirectConvertToSpectr(FFTTmpOutput_1,FFTPeriod,FFTSpectr,FFTDC,FFTStartVShift); double Max=0; for(int j=From_T;j<=MathMin(FFTPeriod/2-1,To_T);j++){ Max=MathMax(Max,FFTSpectr[j][0]); } for(j=From_T;j<=MathMin(FFTPeriod/2-1,To_T);j++){ string ObjName=WindowExpertName()+"_"+fInt(Counter[i])+"_"+j; fObjTrendLine(ObjName,Time[i],j,Time[i+1],j,false,GetColor(FFTSpectr[j][0]/Max,MinColor,MaxColor),2,WindowFind(WindowExpertName()),0,false); ObjectSetText(ObjName,""+DoubleToStr(1.0*FFTPeriod/j,1)); } } return(0); } //+------------------------------------------------------------------+ void fObjTrendLine( string aObjectName, // 1 èìÿ datetime aTime_1, // 2 âðåìÿ 1 double aPrice_1, // 3 öåíà 1 datetime aTime_2, // 4 âðåìÿ 2 double aPrice_2, // 5 öåíà 2 bool aRay=false, // 6 ëó÷ color aColor=Red, // 7 öâåò int aWidth=1, // 8 òîëùèíà int aWindowNumber=0, // 9 îêíî int aStyle=0, // 10 0-STYLE_SOLID, 1-STYLE_DASH, 2-STYLE_DOT, 3-STYLE_DASHDOT, 4-STYLE_DASHDOTDOT bool aBack=false // 11 ôîí ){ if(ObjectFind(aObjectName)!=aWindowNumber){ ObjectCreate(aObjectName,OBJ_TREND,aWindowNumber,aTime_1,aPrice_1,aTime_2,aPrice_2); } ObjectSet(aObjectName,OBJPROP_TIME1,aTime_1); ObjectSet(aObjectName,OBJPROP_PRICE1,aPrice_1); ObjectSet(aObjectName,OBJPROP_TIME2,aTime_2); ObjectSet(aObjectName,OBJPROP_PRICE2,aPrice_2); ObjectSet(aObjectName,OBJPROP_RAY,aRay); ObjectSet(aObjectName,OBJPROP_COLOR,aColor); ObjectSet(aObjectName,OBJPROP_WIDTH,aWidth); ObjectSet(aObjectName,OBJPROP_BACK,aBack); ObjectSet(aObjectName,OBJPROP_STYLE,aStyle); } int fInt(double aArg){ return(aArg); } void fObjDeleteByPrefix(string aPrefix){ //fObjDeleteByPrefix(""); for(int i=ObjectsTotal()-1;i>=0;i--){ if(StringFind(ObjectName(i),aPrefix,0)==0){ ObjectDelete(ObjectName(i)); } } } color GetColor(double aK,int Col1,double Col2){ int R1,G1,B1,R2,G2,B2; fGetRGB(R1,G1,B1,Col1); fGetRGB(R2,G2,B2,Col2); return(fRGB(R1+aK*(R2-R1),G1+aK*(G2-G1),B1+aK*(B2-B1))); } void fGetRGB(int & aR,int & aG,int & aB,int aCol){ aB=aCol/65536; aCol-=aB*65536; aG=aCol/256; aCol-=aG*256; aR=aCol; } color fRGB(int aR,int aG, int aB){ return(aR+256*aG+65536*aB); } void fFFTInit(int aFFTPower,int & aPeriod,double & aTmpOutput_1[],double & aSpectr[][2],double & aTmpOutput_2[],double & aFFTPprocessedData[]){ aPeriod=MathPow(2,FFTPower); ArrayResize(aTmpOutput_1,aPeriod); ArrayResize(aSpectr,aPeriod/2); ArrayResize(aTmpOutput_2,aPeriod); ArrayResize(FFTPprocessedData,aPeriod); } void fFFTDirectMain(double aInput[],int aInputStart,int aPeriod,double & aTmpOutput[]){ double twr; double twi; double twpr; double twpi; double twtemp; double ttheta; int i; int i1; int i2; int i3; int i4; double c1; double c2; double h1r; double h1i; double h2r; double h2i; double wrs; double wis; int HalfPeriod; int ii; int jj; int n; int mmax; int m; int j; int istep; int isign; double wtemp; double wr; double wpr; double wpi; double wi; double theta; double tempr; double tempi; ttheta=2.0*Pi/aPeriod; c1=0.5; c2=-0.5; isign=1; n=aPeriod; HalfPeriod=aPeriod/2; j=1; ArrayCopy(aTmpOutput,aInput,0,aInputStart,aPeriod); for(ii=1;ii<=HalfPeriod;ii++){ i=2*ii-1; if(j>i){ tempr=aTmpOutput[j-1]; tempi=aTmpOutput[j]; aTmpOutput[j-1]=aTmpOutput[i-1]; aTmpOutput[j]=aTmpOutput[i]; aTmpOutput[i-1]=tempr; aTmpOutput[i]=tempi; } m=n/2; while(m>=2 && j>m){ j=j-m; m=m/2; } j=j+m; } mmax = 2; while(n>mmax){ istep=2*mmax; theta=2.0*Pi/(isign*mmax); wpr=-2.0*MathPow(MathSin(0.5*theta),2); wpi=MathSin(theta); wr=1.0; wi=0.0; for(ii=1;ii<=mmax/2;ii++){ m=2*ii-1; for(jj=0;jj<=(n-m)/istep;jj++){ i=m+jj*istep; j=i+mmax; tempr=wr*aTmpOutput[j-1]-wi*aTmpOutput[j]; tempi=wr*aTmpOutput[j]+wi*aTmpOutput[j-1]; aTmpOutput[j-1]=aTmpOutput[i-1]-tempr; aTmpOutput[j]=aTmpOutput[i]-tempi; aTmpOutput[i-1]=aTmpOutput[i-1]+tempr; aTmpOutput[i]=aTmpOutput[i]+tempi; } wtemp=wr; wr=wr*wpr-wi*wpi+wr; wi=wi*wpr+wtemp*wpi+wi; } mmax = istep; } twpr=-2.0*MathPow(MathSin(0.5*ttheta),2); twpi=MathSin(ttheta); twr=1.0+twpr; twi=twpi; for(i=2;i<=aPeriod/4+1;i++){ i1=i+i-2; i2=i1+1; i3=aPeriod+1-i2; i4=i3+1; wrs=twr; wis=twi; h1r=c1*(aTmpOutput[i1]+aTmpOutput[i3]); h1i=c1*(aTmpOutput[i2]-aTmpOutput[i4]); h2r=-c2*(aTmpOutput[i2]+aTmpOutput[i4]); h2i=c2*(aTmpOutput[i1]-aTmpOutput[i3]); aTmpOutput[i1]=h1r+wrs*h2r-wis*h2i; aTmpOutput[i2]=h1i+wrs*h2i+wis*h2r; aTmpOutput[i3]=h1r-wrs*h2r+wis*h2i; aTmpOutput[i4]=-h1i+wrs*h2i+wis*h2r; twtemp=twr; twr=twr*twpr-twi*twpi+twr; twi=twi*twpr+twtemp*twpi+twi; } h1r=aTmpOutput[0]; aTmpOutput[0]=h1r+aTmpOutput[1]; aTmpOutput[1]=h1r-aTmpOutput[1]; return; } void fFFTDirectConvertToSpectr(double aInput[],int aPeriod,double & aOutput[][2],double & aDCValue,double & aStartVShift){ int i,j,HalfPeriod; HalfPeriod=aPeriod/2; for(i=2,j=1;i<aPeriod;i+=2,j++){ aOutput[j][0]=MathSqrt(aInput[i]*aInput[i]+aInput[i+1]*aInput[i+1])/HalfPeriod; aOutput[j][1]=fMyArcTan2(aInput[i+1],aInput[i]); } aDCValue=aInput[0]/aPeriod; aStartVShift=aInput[1]; } double fMyArcTan2(double aY,double aX){ // â îáå ñòîðîíû if(aY==0){ if(aX==0){ return(0); } if(aX>0){ return(0); } if(aX<0){ return(MathArctan(1)*4); } } if(aX==0){ if(aY>0){ return(MathArctan(1)*2); } else{ if(aY<0){ return(-MathArctan(1)*2); } } } else{ if(aY>0){ if(aX>0){ return(MathArctan(aY/aX)); } else{ return(MathArctan(aY/aX)+MathArctan(1)*4); } } else{ if(aX>0){ return(MathArctan(aY/aX)); } else{ return(MathArctan(aY/aX)-MathArctan(1)*4); } } } }
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open time of each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: