//+------------------------------------------------------------------+ //| ColorSchaffMomentumTrendCycle.mq5 | //| Copyright © 2011, EarnForex.com | //| http://www.earnforex.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, EarnForex.com" #property link "http://www.earnforex.com" #property description "Schaff Trend Cycle - Cyclical Stoch over Stoch over Momentum MACD." #property description "The code adapted Nikolay Kositsin." //---- номер версии индикатора #property version "2.10" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- количество индикаторных буферов 2 #property indicator_buffers 2 //---- использовано всего одно графическое построение #property indicator_plots 1 //+-----------------------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------------------+ //---- отрисовка индикатора в виде цветной гистограммы #property indicator_type1 DRAW_COLOR_HISTOGRAM //---- в качестве цветов гистограммы использованы #property indicator_color1 clrDeepPink,clrMediumOrchid,clrGold,clrPeru,clrMediumBlue,clrDodgerBlue,clrGreen,clrLime //---- линия индикатора - сплошная #property indicator_style1 STYLE_SOLID //---- толщина линии индикатора равна 2 #property indicator_width1 2 //---- отображение метки индикатора #property indicator_label1 "Schaff Momentum Trend Cycle" //+-----------------------------------------------+ //| Параметры отображения горизонтальных уровней | //+-----------------------------------------------+ //---- фиксирование верхней и нижней границ окна индикатора #property indicator_minimum -110 #property indicator_maximum +110 //+-----------------------------------------------+ //| Объявление констант | //+-----------------------------------------------+ #define RESET 0 // константа для возврата терминалу команды на пересчет индикатора //+-----------------------------------------------+ //| Входные параметры индикатора | //+-----------------------------------------------+ input uint Fast_Momentum = 23; // Период быстрого Momentum input uint Slow_Momentum = 50; // Период медленного Momentum input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // Ценовая константа input uint Cycle=10; // Период стохастического осциллятора input int HighLevel=+60; input int MiddleLevel=0; input int LowLevel=-60; //+-----------------------------------------------+ //---- объявление динамических массивов, которые будут в //---- дальнейшем использованы в качестве индикаторных буферов double STC_Buffer[]; double ColorSTC_Buffer[]; //---- int Count[]; bool st1_pass,st2_pass; double MACD[],ST[],Factor; //---- объявление целочисленных переменных начала отсчета данных int min_rates_total,min_rates_1,min_rates_2; //---- объявление целочисленных переменных для хендлов индикаторов int Ind1_Handle,Ind2_Handle; //+------------------------------------------------------------------+ //| Пересчет позиции самого нового элемента в массиве | //+------------------------------------------------------------------+ void Recount_ArrayZeroPos(int &CoArr[],// возврат по ссылке номера текущего значения ценового ряда int Rates_total, int Bar) { //---- if(!Bar) return; //---- int numb; static int count=1; count--; //---- if(count<0) count=int(Cycle)-1; //---- for(int iii=0; iiiint(Cycle)-1) numb-=int(Cycle); CoArr[iii]=numb; } //---- } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- инициализация переменных начала отсчета данных min_rates_1=int(Fast_Momentum); min_rates_2=int(Slow_Momentum); min_rates_total=MathMax(min_rates_1,min_rates_2)+int(Cycle)+1; //--- получение хендла индикатора MA 1 Ind1_Handle=iMomentum(Symbol(),PERIOD_CURRENT,Fast_Momentum,AppliedPrice); if(Ind1_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора Momentum 1"); return(INIT_FAILED); } //--- получение хендла индикатора MA 2 Ind2_Handle=iMomentum(Symbol(),PERIOD_CURRENT,Slow_Momentum,AppliedPrice); if(Ind2_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора Momentum 2"); return(INIT_FAILED); } //---- распределение памяти под массивы переменных if(ArrayResize(ST,Cycle)rates_total || prev_calculated<=0) // проверка на первый старт расчета индикатора { limit=rates_total-2; // стартовый номер для расчета всех баров STC_Buffer[limit+1]=0; } else limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров to_copy=limit+1; //---- копируем вновь появившиеся данные в массивы if(CopyBuffer(Ind1_Handle,0,0,to_copy,fastMomentum)<=0) return(RESET); if(CopyBuffer(Ind2_Handle,0,0,to_copy,slowMomentum)<=0) return(RESET); //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(fastMomentum,true); ArraySetAsSeries(slowMomentum,true); //---- основной цикл расчета индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { Bar0=Count[0]; Bar1=Count[1]; //---- MACD[Bar0]=fastMomentum[bar]-slowMomentum[bar]; //---- LLV=MACD[ArrayMinimum(MACD)]; HHV=MACD[ArrayMaximum(MACD)]; //---- расчет первого стохастика if(HHV-LLV!=0) ST[Bar0]=((MACD[Bar0]-LLV)/(HHV-LLV))*100; else ST[Bar0]=ST[Bar1]; //---- if(st1_pass) ST[Bar0]=Factor *(ST[Bar0]-ST[Bar1])+ST[Bar1]; st1_pass=true; //---- LLV=ST[ArrayMinimum(ST)]; HHV=ST[ArrayMaximum(ST)]; //---- расчет второго стохастика if(HHV-LLV!=0) STC_Buffer[bar]=((ST[Bar0]-LLV)/(HHV-LLV))*200-100; else STC_Buffer[bar]=STC_Buffer[bar+1]; //---- сглаживание второго стохастика if(st2_pass) STC_Buffer[bar]=Factor *(STC_Buffer[bar]-STC_Buffer[bar+1])+STC_Buffer[bar+1]; st2_pass=true; //---- пересчет позиции элементов в кольцевых буферах на смене бара Recount_ArrayZeroPos(Count,rates_total,bar); } //---- if(prev_calculated>rates_total || prev_calculated<=0) limit=rates_total-min_rates_total; //---- основной цикл раскраски индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { double Sts=STC_Buffer[bar]; double dSts=Sts-STC_Buffer[bar+1]; int clr=4; //---- if(Sts>0) { if(Sts>HighLevel) { if(dSts>=0) clr=7; else clr=6; } else { if(dSts>=0) clr=5; else clr=4; } } //---- if(Sts<0) { if(Sts