/* */ #property copyright "Клименко Сергей" #property version "2.00" #property strict #property indicator_chart_window #property indicator_buffers 6 #property indicator_label1 "go_avg_low" #property indicator_label2 "go_avg_high" #property indicator_label3 "go_max75_low" #property indicator_label4 "go_max75_high" #property indicator_label5 "go_max95_low" #property indicator_label6 "go_max95_high" input int Depth = 50, //глубина истории в днях Size = 15; //размер гистограммы input double Border95 = 95, //верхняя 95% граница Border75 = 75; //верхняя 75% граница bool redraw_histogram; double go_avg_low[], // средний ход go_avg_high[], go_max75_low[], // 75% go_max75_high[], go_max95_low[], // максимальный ход go_max95_high[], day_go_array[], // массив дневных ходов глубиной Depth day_go_histo[], // гистограмма дневных ходов глубиной Size step, startup, avg, max95, max75, disp, today_go, int_sum, current_bar_go, x; int k, i, top95, top75, scale, today_bar_count; MqlDateTime time_full; MqlRates current_tf_array[]; datetime last_midnight; void day_go_update(); void OnInit() { //фиксируем масштаб в зависимости от количества знаков в цене после десятичной точки if(Digits == 5) scale = 10000; if(Digits == 2) scale = 10; if(Digits == 3) scale = 10; if ( Symbol() == "USDJPY" || Symbol() == "EURJPY" || Symbol() == "XAGUSD") scale = 100; SetIndexStyle( 0, DRAW_LINE, STYLE_DOT, 1, clrDimGray); SetIndexBuffer( 0, go_avg_low); //SetIndexShift( 0, 0); SetIndexStyle( 1, DRAW_LINE, STYLE_DOT, 1, clrDimGray); SetIndexBuffer( 1, go_avg_high); //SetIndexShift( 1, 0); SetIndexStyle( 2, DRAW_LINE, STYLE_SOLID, 1, clrMaroon); SetIndexBuffer( 2, go_max75_low); //SetIndexShift( 2, 0); SetIndexStyle( 3, DRAW_LINE, STYLE_SOLID, 1, clrMaroon); SetIndexBuffer( 3, go_max75_high); //SetIndexShift( 3, 0); SetIndexStyle( 4, DRAW_LINE, STYLE_SOLID, 1, clrRed); SetIndexBuffer( 4, go_max95_low); //SetIndexShift( 4, 0); SetIndexStyle( 5, DRAW_LINE, STYLE_SOLID, 1, clrRed); SetIndexBuffer( 5, go_max95_high); //SetIndexShift( 5, 0); ArrayResize(day_go_array, Depth); ArrayResize(day_go_histo, Size); redraw_histogram = true; // надо перерисовать гистограмму далее на новом тике один раз при инициализации } int OnCalculate (const int rates_total, // размер входных таймсерий const int prev_calculated, // обработано баров на предыдущем вызове const datetime &time[], // Time const double &open[], // Open const double &high[], // High const double &low[], // Low const double &close[], // Close const long &tick_volume[], // Tick Volume const long &volume[], // Real Volume const int &spread[]) // Spread { //=============================================================================================== if (redraw_histogram) //рисуем гистограмму однажды при инициалиации { //берем только закрытые дневные свечи for (i=0; i=0; k--) { day_go_histo[k] = 0; for (i=0; i day_go_array[i])) day_go_histo[k]++; int_sum = 0; for (i=Size-1; i>=k; i--) int_sum += day_go_histo[i]; if ((int_sum/Depth > Border75/100) && top75==15) top75 = k; if ( int_sum/Depth > Border95/100) { top95 = k; // фиксируем границу доверительного интервала; break; // прекращаем строить гистограмму } } max75 = startup + (Size - top75) * step; max95 = startup + (Size - top95) * step; avg = 0; for (i=0; i", Border95/100, "; top75 = ", top75, "; top95 = ", top95, "; startup = ", MathRound(startup*scale), "; step = ", MathRound(step*scale), "; histo[5]= ", day_go_histo[10], "; int_sum = ", int_sum );*/ redraw_histogram = false; day_go_update(); } //============================================================================================== if((iHigh(NULL, 1440, 0) - iLow(NULL, 1440, 0)) != today_go) // если размах бара текущего дня увеличился на новом тике { day_go_update(); today_go = (iHigh(NULL, 1440, 0) - iLow(NULL, 1440, 0)); } //=======================================NEW.BAR============================================== if(rates_total != prev_calculated) day_go_update(); //============================================================================================ return(rates_total); }//end.OnCalculate //============================================================================================ void day_go_update() { // строим диапазон текущего дневного хода x = (iHigh(NULL, 1440, 0) + iLow(NULL, 1440, 0))/2; go_avg_low[0] = x - avg/2; go_avg_high[0] = x + avg/2; go_max75_low[0] = x - max75/2; go_max75_high[0] = x + max75/2; go_max95_low[0] = x - max95/2; go_max95_high[0] = x + max95/2; TimeCurrent(time_full); time_full.hour = 0; time_full.min = 0; time_full.sec = 0; last_midnight = StructToTime(time_full); today_bar_count = CopyRates(NULL, Period(), last_midnight, TimeCurrent(), current_tf_array); for(i=1; i<=PERIOD_D1/Period()*4; i++) { go_avg_low[i] = EMPTY_VALUE; go_avg_high[i] = EMPTY_VALUE; go_max75_low[i] = EMPTY_VALUE; go_max75_high[i] = EMPTY_VALUE; go_max95_low[i] = EMPTY_VALUE; go_max95_high[i] = EMPTY_VALUE; } for(i=1; i