//+------------------------------------------------------------------+ //| 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); if (counted_bars > 0) counted_bars--; int limit=Bars - counted_bars; 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; } 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); } }