//+------------------------------------------------------------------+ //| VininI_Cyber | //| Copyright © 2009, Victor Nicolaev | //| e-mail: vinin@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, Victor Nicolaev" #property link "e-mail: vinin@mail.ru" #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Yellow #property indicator_color2 Green #property indicator_color3 Red #property indicator_level1 -0.5 #property indicator_level2 0 #property indicator_level3 0.5 #property indicator_minimum -1.05 #property indicator_maximum 1.05 //---- input parameters extern double alpha=0.01; extern double betta=1.0; extern int price_mode=4; //---- buffers double Cycle[]; double Smonth[]; double iCycle[]; double Buy[]; double Sell[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorBuffers(5); SetIndexBuffer(0,iCycle); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(1,Buy); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(2,Sell); SetIndexStyle(2,DRAW_LINE); SetIndexBuffer(3,Smonth); SetIndexBuffer(4,Cycle); return(0); } int deinit() { return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); int limit=Bars-counted_bars; if(counted_bars==0) { limit-=4; for(int k=Bars-1;k>=Bars-7;k--) { Smonth[k]=0; iCycle[k]=0; } for(int j=Bars-3;j>=Bars-7;j--) Cycle[j]=(Price(j)+2*Price(j+1)+Price(j+2))/4.0; } for(int i=limit; i>=0; i--) { Smonth[i]=(Price(i)+2.0*Price(i+1)+2.0*Price(i+2)+Price(i+3))/6.0; } if(counted_bars==0) limit-=3; for(i=limit; i>=0; i--) { Cycle[i]=betta*((1.0-0.5*alpha)*(1.0-0.5*alpha)*(Smonth[i]-2.0*Smonth[i+1]+Smonth[i+2])+2.0*(1.0-alpha)*Cycle[i+1]-(1.0-alpha)*(1.0-alpha)*Cycle[i+2]); iCycle[i]=(MathExp(2.0*Cycle[i])-1.0)/(MathExp(2.0*Cycle[i])+1.0); if(iCycle[i]>= 0.5) {Buy[i]=iCycle[i];Buy[i+1]=iCycle[i+1];} if(iCycle[i]<=-0.5) {Sell[i]=iCycle[i];Sell[i+1]=iCycle[i+1];} } return(0); } //+------------------------------------------------------------------+ double Price(int pos) { switch(price_mode) { case PRICE_CLOSE: return(Close[pos]); case PRICE_OPEN: return(Open[pos]); case PRICE_HIGH: return(High[pos]); case PRICE_LOW: return(Low[pos]); case PRICE_MEDIAN: return((High[pos]+Low[pos])/2.0); case PRICE_TYPICAL: return((High[pos]+Low[pos]+Close[pos])/3.0); case PRICE_WEIGHTED: return((High[pos]+Low[pos]+Close[pos]+Close[pos])/4.0); } } //+------------------------------------------------------------------+