//+------------------------------------------------------------------+ //| SpudsStochastic.mq5 | //| Copyright © 2012, Vladimir Hlystov | //| cmillion@narod.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2012, Vladimir Hlystov" #property link "cmillion@narod.ru" //---- описание индикатора #property description "Состав индикатора - 8 стохастических осцилляторов." #property description "Параметры «замедление» и «период %D» оставляем по умолчанию – 3." #property description "Параметр %K будет меняться от 6 до 24." #property description "В итоге - 8 стохастиков с параметрами (6, 3, 3), (7, 3, 3), (8, 3, 3) … (24, 3, 3)." #property description "У всех индикаторов используется только главная линия." //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- количество индикаторных буферов 10 #property indicator_buffers 10 //---- использовано всего 9 графических построений #property indicator_plots 9 //+----------------------------------------------+ //| объявление констант | //+----------------------------------------------+ #define RESET 0 // Константа для возврата терминалу команды на пересчёт индикатора //+----------------------------------------------+ //| Параметры граниченых значений индикатора | //+----------------------------------------------+ #property indicator_minimum 0 #property indicator_maximum 100 //+----------------------------------------------+ //| Параметры отрисовки уровней | //+----------------------------------------------+ //---- отрисовка уровней в виде линий #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_type3 DRAW_LINE #property indicator_type4 DRAW_LINE #property indicator_type5 DRAW_LINE #property indicator_type6 DRAW_LINE #property indicator_type7 DRAW_LINE #property indicator_type8 DRAW_LINE //---- выбор цветов уровней #property indicator_color1 Silver #property indicator_color2 Blue #property indicator_color3 Blue #property indicator_color4 Blue #property indicator_color5 Yellow #property indicator_color6 Red #property indicator_color7 Red #property indicator_color8 Red //---- уровни - штрихпунктирные кривые #property indicator_style1 STYLE_DASHDOTDOT #property indicator_style2 STYLE_DASHDOTDOT #property indicator_style3 STYLE_DASHDOTDOT #property indicator_style4 STYLE_DASHDOTDOT #property indicator_style5 STYLE_DASHDOTDOT #property indicator_style6 STYLE_DASHDOTDOT #property indicator_style7 STYLE_DASHDOTDOT #property indicator_style8 STYLE_DASHDOTDOT //---- толщина уровней Боллинджера равна 1 #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 1 #property indicator_width4 1 #property indicator_width5 1 #property indicator_width6 1 #property indicator_width7 1 #property indicator_width8 1 //---- отображение меток уровней Боллинджера #property indicator_label1 "Стохастик 1" #property indicator_label2 "Стохастик 2" #property indicator_label3 "Стохастик 3" #property indicator_label4 "Стохастик 4" #property indicator_label5 "Стохастик 5" #property indicator_label6 "Стохастик 6" #property indicator_label7 "Стохастик 7" #property indicator_label8 "Стохастик 8" //---- отрисовка индикатора в виде трёхцветной гистограммы #property indicator_type9 DRAW_COLOR_HISTOGRAM //---- в качестве цветов четырёхцветной гистограммы использованы #property indicator_color9 Gray,Magenta,Teal //---- линия индикатора - сплошная #property indicator_style9 STYLE_SOLID //---- толщина линии индикатора равна 5 #property indicator_width9 5 //---- отображение лэйбы индикатора #property indicator_label9 "Сигнал" //+-----------------------------------+ //| ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА | //+-----------------------------------+ input int LevelUp = 85; // уровень зоны перекупленности input int LevelDn = 15; // уровень зоны перепроданности input ENUM_MA_METHOD ma_method=MODE_SMA; // тип сглаживания input ENUM_STO_PRICE price_field=STO_LOWHIGH; // способ расчета стохастика //+-----------------------------------+ //---- объявление динамических массивов, которые будут в // дальнейшем использованы в качестве индикаторных буферов уровней Боллинджера double LineBuffer1[],LineBuffer2[],LineBuffer3[],LineBuffer4[]; double LineBuffer5[],LineBuffer6[],LineBuffer7[],LineBuffer8[]; //---- объявление динамических массивов, которые будут в // дальнейшем использованы в качестве индикаторных буферов double SignBuffer[],ColorSignBuffer[]; //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //---- Объявление целых переменных для хранения хендлов индикаторов int STO_Handle[8]; int Signal; //+------------------------------------------------------------------+ //| Regression indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- Инициализация переменных начала отсчёта данных min_rates_total=24+3+3+1; Signal=0; //---- Получение хендлов индикаторов STO_Handle[0]=iStochastic(NULL,0,6,3,3,ma_method,price_field); STO_Handle[1]=iStochastic(NULL,0,9,3,3,ma_method,price_field); STO_Handle[2]=iStochastic(NULL,0,12,3,3,ma_method,price_field); STO_Handle[3]=iStochastic(NULL,0,14,3,3,ma_method,price_field); STO_Handle[4]=iStochastic(NULL,0,16,3,3,ma_method,price_field); STO_Handle[5]=iStochastic(NULL,0,19,3,3,ma_method,price_field); STO_Handle[6]=iStochastic(NULL,0,21,3,3,ma_method,price_field); STO_Handle[7]=iStochastic(NULL,0,24,3,3,ma_method,price_field); if(STO_Handle[0]==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iStochastic"); if(STO_Handle[1]==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iStochastic"); if(STO_Handle[2]==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iStochastic"); if(STO_Handle[3]==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iStochastic"); if(STO_Handle[4]==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iStochastic"); if(STO_Handle[5]==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iStochastic"); if(STO_Handle[6]==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iStochastic"); if(STO_Handle[7]==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iStochastic"); //---- превращение динамических массивов в индикаторные буферы SetIndexBuffer(0,LineBuffer1,INDICATOR_DATA); SetIndexBuffer(1,LineBuffer2,INDICATOR_DATA); SetIndexBuffer(2,LineBuffer3,INDICATOR_DATA); SetIndexBuffer(3,LineBuffer4,INDICATOR_DATA); SetIndexBuffer(4,LineBuffer5,INDICATOR_DATA); SetIndexBuffer(5,LineBuffer6,INDICATOR_DATA); SetIndexBuffer(6,LineBuffer7,INDICATOR_DATA); SetIndexBuffer(7,LineBuffer8,INDICATOR_DATA); //---- установка позиции, с которой начинается отрисовка уровней PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total); PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total); PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total); PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total); PlotIndexSetInteger(5,PLOT_DRAW_BEGIN,min_rates_total); PlotIndexSetInteger(6,PLOT_DRAW_BEGIN,min_rates_total); PlotIndexSetInteger(7,PLOT_DRAW_BEGIN,min_rates_total); //---- запрет на отрисовку индикатором пустых значений PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(5,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(6,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(7,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(LineBuffer1,true); ArraySetAsSeries(LineBuffer2,true); ArraySetAsSeries(LineBuffer3,true); ArraySetAsSeries(LineBuffer4,true); ArraySetAsSeries(LineBuffer5,true); ArraySetAsSeries(LineBuffer6,true); ArraySetAsSeries(LineBuffer7,true); ArraySetAsSeries(LineBuffer8,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(8,SignBuffer,INDICATOR_DATA); //---- осуществление сдвига начала отсчёта отрисовки индикатора PlotIndexSetInteger(8,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(8,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(SignBuffer,true); //---- превращение динамического массива в цветовой, индексный буфер SetIndexBuffer(9,ColorSignBuffer,INDICATOR_COLOR_INDEX); //---- осуществление сдвига начала отсчёта отрисовки индикатора PlotIndexSetInteger(9,PLOT_DRAW_BEGIN,min_rates_total); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(ColorSignBuffer,true); //---- инициализации переменной для короткого имени индикатора string shortname; StringConcatenate(shortname,"Spuds Stochastic(",EnumToString(ma_method),", ",EnumToString(price_field),")"); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,0); //---- количество горизонтальных уровней индикатора 3 IndicatorSetInteger(INDICATOR_LEVELS,3); //---- значения горизонтальных уровней индикатора IndicatorSetDouble(INDICATOR_LEVELVALUE,0,LevelUp); IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50); IndicatorSetDouble(INDICATOR_LEVELVALUE,2,LevelDn); //---- в качестве цветов линий горизонтальных уровней использованы серый и розовый цвета IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,Magenta); IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,Gray); IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,Magenta); //---- в линии горизонтального уровня использован короткий штрих-пунктир IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_DASHDOTDOT); IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASHDOTDOT); IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DASHDOTDOT); //---- завершение инициализации } //+------------------------------------------------------------------+ //| Regression iteration function | //+------------------------------------------------------------------+ int OnCalculate( const int rates_total, // количество истории в барах на текущем тике const int prev_calculated,// количество истории в барах на предыдущем тике const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[] ) { //---- проверка количества баров на достаточность для расчёта if(BarsCalculated(STO_Handle[0])rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора { limit=rates_total-min_rates_total-1; // стартовый номер для расчёта всех баров } else limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров to_copy=limit+1; //---- копируем вновь появившиеся данные в массив if(CopyBuffer(STO_Handle[0],MAIN_LINE,0,to_copy,LineBuffer1)<=0) return(RESET); if(CopyBuffer(STO_Handle[1],MAIN_LINE,0,to_copy,LineBuffer2)<=0) return(RESET); if(CopyBuffer(STO_Handle[2],MAIN_LINE,0,to_copy,LineBuffer3)<=0) return(RESET); if(CopyBuffer(STO_Handle[3],MAIN_LINE,0,to_copy,LineBuffer4)<=0) return(RESET); if(CopyBuffer(STO_Handle[4],MAIN_LINE,0,to_copy,LineBuffer5)<=0) return(RESET); if(CopyBuffer(STO_Handle[5],MAIN_LINE,0,to_copy,LineBuffer6)<=0) return(RESET); if(CopyBuffer(STO_Handle[6],MAIN_LINE,0,to_copy,LineBuffer7)<=0) return(RESET); if(CopyBuffer(STO_Handle[7],MAIN_LINE,0,to_copy,LineBuffer8)<=0) return(RESET); //---- первый цикл расчёта индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { SignBuffer[bar]=EMPTY_VALUE; ColorSignBuffer[bar]=0; if((LineBuffer1[bar+1]>LevelUp && LineBuffer2[bar+1]>LevelUp && LineBuffer3[bar+1]>LevelUp && LineBuffer4[bar+1]>LevelUp && LineBuffer5[bar+1]>LevelUp && LineBuffer6[bar+1]>LevelUp && LineBuffer7[bar+1]>LevelUp && LineBuffer8[bar+1]>LevelUp) || (LineBuffer1[bar+1]LevelDn && LineBuffer2[bar]>LevelDn && LineBuffer3[bar]>LevelDn && LineBuffer4[bar]>LevelDn && LineBuffer5[bar]>LevelDn && LineBuffer6[bar]>LevelDn && LineBuffer7[bar]>LevelDn && LineBuffer8[bar]>LevelDn) && (LineBuffer1[bar+1]LevelUp || LineBuffer2[bar+1]>LevelUp || LineBuffer3[bar+1]>LevelUp || LineBuffer4[bar+1]>LevelUp || LineBuffer5[bar+1]>LevelUp || LineBuffer6[bar+1]>LevelUp || LineBuffer7[bar+1]>LevelUp || LineBuffer8[bar+1]>LevelUp)) { if(!Signal) { SignBuffer[bar]=100; ColorSignBuffer[bar]=1; Signal=-1; } } } //---- return(rates_total); } //+------------------------------------------------------------------+