//+------------------------------------------------------------------+ //| PastRegressionDeviated.mq5 | //| Copyright © 2006, tageiger, aka fxid10t@yahoo.com | //| fxid10t@yahoo.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, tageiger, aka fxid10t@yahoo.com" #property link "fxid10t@yahoo.com" #property description "past regression deviated" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- количество индикаторных буферов #property indicator_buffers 7 //---- использовано 7 графических построений #property indicator_plots 7 //+--------------------------------------------+ //| Параметры отрисовки индикатора | //+--------------------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type4 DRAW_LINE //---- в качестве цвета линии индикатора использован цвет MediumVioletRed #property indicator_color4 MediumVioletRed //---- линия индикатора - штрихпунктирная кривая #property indicator_style4 STYLE_DASHDOTDOT //---- толщина линии индикатора равна 1 #property indicator_width4 1 //---- отображение метки индикатора #property indicator_label4 "past regression deviated" //+--------------------------------------------+ //| Параметры отрисовки индикатора уровней | //+--------------------------------------------+ //---- отрисовка уровней в виде линий #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_type3 DRAW_LINE #property indicator_type5 DRAW_LINE #property indicator_type6 DRAW_LINE #property indicator_type7 DRAW_LINE //---- ввыбор цветов уровней #property indicator_color1 DarkViolet #property indicator_color2 Orange #property indicator_color3 Teal #property indicator_color5 Teal #property indicator_color6 Orange #property indicator_color7 DarkViolet //---- уровни - штрихпунктирные кривые #property indicator_style1 STYLE_DASHDOTDOT #property indicator_style2 STYLE_DASHDOTDOT #property indicator_style3 STYLE_DASHDOTDOT #property indicator_style5 STYLE_DASHDOTDOT #property indicator_style6 STYLE_DASHDOTDOT #property indicator_style7 STYLE_DASHDOTDOT //---- толщина уровней равна 1 #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 1 #property indicator_width5 1 #property indicator_width6 1 #property indicator_width7 1 //---- отображение меток уровней #property indicator_label1 "3st Std up" #property indicator_label2 "2st Std up" #property indicator_label3 "1st Std up" #property indicator_label5 "1st Std down" #property indicator_label6 "2st Std down" #property indicator_label7 "3st Std down" //+--------------------------------------------+ //| Перечисление для толщины уровня | //+--------------------------------------------+ enum ENUM_WIDTH // Тип константы { w_1 = 1, // 1 w_2, // 2 w_3, // 3 w_4, // 4 w_5 // 5 }; //+--------------------------------------------+ //| Входные параметры индикатора | //+--------------------------------------------+ //---- input parameters int period=0; input int Length=55; // Количество баров для регрессии input double StdChannel1=1; // 1st channel input double StdChannel2=2; // 2nd channel input double StdChannel3=3; // 3rd channel input int Shift=0; // Сдвиг индикатора по горизонтали в барах input color Line_color=Red; // Цвет трендовой линии input ENUM_LINE_STYLE Line_style=STYLE_SOLID; // Стиль трендовой линии input ENUM_WIDTH Line_width=w_3; // Толщина трендовой линии //+--------------------------------------------+ //---- объявление динамического массива, который в дальнейшем //---- будет использован в качестве индикаторного буфера double MeanBuffer[]; //---- объявление динамических массивов, которые в дальнейшем //---- будут использованы в качестве индикаторных буферов уровней double ExtLineBuffer1[],ExtLineBuffer2[],ExtLineBuffer3[]; double ExtLineBuffer4[],ExtLineBuffer5[],ExtLineBuffer6[]; //---- объявление целочисленных переменных начала отсчета данных int min_rates_total; //+------------------------------------------------------------------+ //| Создание трендовой линии | //+------------------------------------------------------------------+ void CreateTline(long chart_id, // идентификатор графика string name, // имя объекта int nwin, // индекс окна datetime time1, // время 1 ценового уровня double price1, // 1 ценовой уровень datetime time2, // время 2 ценового уровня double price2, // 2 ценовой уровень color Color, // цвет линии int style, // стиль линии int width, // толщина линии string text) // текст { //---- ObjectCreate(chart_id,name,OBJ_TREND,nwin,time1,price1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_BACK,true); // ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true); // ObjectSetInteger(chart_id,name,OBJPROP_RAY,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); //---- } //+------------------------------------------------------------------+ //| Переустановка трендовой линии | //+------------------------------------------------------------------+ void SetTline(long chart_id, // идентификатор графика string name, // имя объекта int nwin, // индекс окна datetime time1, // время 1 ценового уровня double price1, // 1 ценовой уровень datetime time2, // время 2 ценового уровня double price2, // 2 ценовой уровень color Color, // цвет линии int style, // стиль линии int width, // толщина линии string text) // текст { //---- if(ObjectFind(chart_id,name)==-1) { CreateTline(chart_id,name,nwin,time1,price1,time2,price2,Color,style,width,text); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectMove(chart_id,name,1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- инициализация переменных начала отсчета данных min_rates_total=Length+1; //---- превращение динамического массива MeanBuffer[] в индикаторный буфер SetIndexBuffer(3,MeanBuffer,INDICATOR_DATA); //---- осуществление сдвига индикатора 1 по горизонтали PlotIndexSetInteger(3,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- индексация элементов в буфере, как в таймсерии ArraySetAsSeries(MeanBuffer,true); //---- превращение динамических массивов в индикаторные буферы SetIndexBuffer(0,ExtLineBuffer1,INDICATOR_DATA); SetIndexBuffer(1,ExtLineBuffer2,INDICATOR_DATA); SetIndexBuffer(2,ExtLineBuffer3,INDICATOR_DATA); SetIndexBuffer(4,ExtLineBuffer4,INDICATOR_DATA); SetIndexBuffer(5,ExtLineBuffer5,INDICATOR_DATA); SetIndexBuffer(6,ExtLineBuffer6,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(4,PLOT_DRAW_BEGIN,min_rates_total); PlotIndexSetInteger(5,PLOT_DRAW_BEGIN,min_rates_total); PlotIndexSetInteger(6,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(4,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(5,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(6,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- индексация элементов в буферах, как в таймсериях ArraySetAsSeries(ExtLineBuffer1,true); ArraySetAsSeries(ExtLineBuffer2,true); ArraySetAsSeries(ExtLineBuffer3,true); ArraySetAsSeries(ExtLineBuffer4,true); ArraySetAsSeries(ExtLineBuffer5,true); ArraySetAsSeries(ExtLineBuffer6,true); //---- инициализации переменной для короткого имени индикатора string shortname; StringConcatenate(shortname,"Past regression deviated(", Length,", ",StdChannel1,", ",StdChannel2,", ",StdChannel3,", ",Shift,")"); //---- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //---- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //---- завершение инициализации } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---- удаляем уровень, если это необходимо ObjectDelete(0,string(period)+"m "+string(Length)+" TL"); //---- } //+------------------------------------------------------------------+ //| Custom 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(rates_totalrates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора limit=rates_total-min_rates_total-1; // стартовый номер для расчета всех баров else limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров //---- индексация элементов в массивах, как в таймсериях ArraySetAsSeries(close,true); ArraySetAsSeries(time,true); //---- основной цикл расчета индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { StartBar=bar+Length; EndBar=bar; n=StartBar-EndBar+1; value=close[EndBar]; sumy=value; sumx=0.0; sumxy=0.0; sumx2=0.0; for(int ii=1; ii