Time: 2013-08-12 | Download file:Cycle_KROUFR.mq4
//+------------------------------------------------------------------+ //| Cycle_KROUFR_version.mq4 | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008 | Grayman77, zIG, akadex" #property link "ForexResearch" #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 100 #property indicator_level1 20 #property indicator_level2 50 #property indicator_level3 80 #property indicator_buffers 1 #property indicator_color1 DarkOrchid //---- input parameters extern int FastMA=12; extern int SlowMA=24; extern int Crosses=50; extern bool Comments=true; //---- buffers double MA[]; double MCD[]; double MAfast[],MAslow[]; double Cross[]; double max_min[]; double PointDeviation[]; double PeriodTimeAVG[]; //---- var double smconst,ST,max,min; int ShiftFirstCross; // смещение первого пересечения c начала истории int ShiftCrossesCross; // смещение (Crosses+1)-го пересечения c начала истории (первое - пропускаем) int k; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { // string short_name; //---- indicator line IndicatorBuffers(8); SetIndexBuffer(0, MA); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2,DarkOrchid); SetIndexBuffer(1, MCD); SetIndexBuffer(2, MAfast); SetIndexBuffer(3, MAslow); SetIndexBuffer(4, Cross); SetIndexBuffer(5, max_min); SetIndexBuffer(6, PointDeviation); SetIndexBuffer(7, PeriodTimeAVG); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); SetIndexEmptyValue(3,0.0); SetIndexEmptyValue(4,0.0); SetIndexEmptyValue(5,0.0); SetIndexEmptyValue(6,0.0); SetIndexEmptyValue(7,0.0); ShiftFirstCross=0; ShiftCrossesCross=0; k=0; max=0.; min=1000000.; return(0); } int deinit() { Comment(""); return(0); } //+------------------------------------------------------------------+ //| Schaff Trend Cycle | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int i,j,limit,NumberCross,BarsCross; double prev,MinMACD,MaxMACD,delta,Sum_max_min; if(Bars<=SlowMA) return(-1); //---- последний посчитанный бар будет пересчитан if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; if(limit>Bars-SlowMA-1) limit=Bars-SlowMA-1; //+------------------------------------------------------------------+ //| Time AVG | //+------------------------------------------------------------------+ for(i=limit;i>0;i--) { Cross[i]=0.; // Вычислить значения средних и поместить в буферы MAfast[i]=iMA(NULL,Period(),FastMA,0,MODE_SMA,PRICE_CLOSE,i); MAslow[i]=iMA(NULL,Period(),SlowMA,0,MODE_SMA,PRICE_CLOSE,i); // Найти пересечения средних if(MAfast[i]>=MAslow[i] && MAfast[i+1]MAslow[i+1]) // быстрая пересекает медленную сверху вниз { // Если это первое найденное пересечение - запомнить его смещение if(ShiftFirstCross==0) ShiftFirstCross=i; // Если еще не найдено Crosses+1 пересечение if(ShiftCrossesCross==0) { k++; // если найдено - запомнить if(k==Crosses+1) ShiftCrossesCross=i; } // Запомнить факт пересечения в буфере Cross[i]=-1.; // Запомнить разность max-min в буфере max_min[i]=max-min; // Сбросить значения max и min max=0.; min=1000000.; } // Выбираем максимальную цену (из High) между пересечениями и минимальную из Low if(max Low[i]) min=Low[i]; } // Считаем статистику if(limit>ShiftCrossesCross) limit=ShiftCrossesCross; for(i=limit;i>0;i--) { // Найти первое пересечение (справа налево) j=i; while(Cross[j]==0.) j++; // Найти следующие Crosses пересечений NumberCross=0; BarsCross=0; Sum_max_min=0.; while(NumberCross =0;i--) { // Вычислить MACD MCD[i]=iMA(NULL,0,FastMA,0, MODE_EMA, PRICE_TYPICAL, i)- iMA(NULL,0,SlowMA,0, MODE_EMA, PRICE_TYPICAL, i); // Найти макс. и мин. значения MACD на периоде TimeAVG MinMACD=MCD[i]; MaxMACD=MCD[i]; for(j=i+1;jMaxMACD) MaxMACD=MCD[j]; } // Вычислить стохастик от MACD delta=MaxMACD-MinMACD; if(delta==0.) // проверка для исключения деления на 0 ST=50.; else // если не 0 - делим { ST=(MCD[i]-MinMACD)/delta*100; } // Заполнить буфер prev=MA[i+1]; MA[i]=(2./(1.+PeriodTimeAVG[i+1]/2.))*(ST-prev)+prev; //Вывести комментарии if (!IsTesting() && Comments) Comment(" Боковые отклонения: "+DoubleToStr(PointDeviation[1],0)+ " пунктов\n Среднее количество баров: "+DoubleToStr(PeriodTimeAVG[1],0)+ "\n Пересечений: "+Crosses); } return(0); } //+------------------------------------------------------------------+