// --------------------------------------------------------------------------- // Инидикатор динамической средней. // // Буферы индикатора: // 0 - Повышение величины вверх (раскраска). // 1 - Понижение величины вниз (раскраска). // 2 - Значение величины (расчётное). // --------------------------------------------------------------------------- #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Red #property indicator_color2 Blue #property indicator_width1 2 #property indicator_width2 2 // Периоды средних. extern int PERIOD_FROM = 5; extern int PERIOD_TO = 15; // Буферы индикатора. double buf_up[], buf_dn[], buf_av[]; // Число обсчитываемых средних. int sma_count; // Инициализация. int init() { if(PERIOD_FROM > PERIOD_TO) { int t = PERIOD_FROM; PERIOD_FROM = PERIOD_TO; PERIOD_TO = t; } IndicatorShortName(StringConcatenate( "AZZX - D-AVR v1.0 (", PERIOD_FROM, ", ", PERIOD_TO, ")")); IndicatorBuffers(3); SetIndexBuffer(0, buf_up); SetIndexBuffer(1, buf_dn); SetIndexBuffer(2, buf_av); SetIndexLabel(0, "UP-MOTION"); SetIndexLabel(1, "DOWN-MOTION"); SetIndexEmptyValue(0, -1); SetIndexEmptyValue(1, -1); sma_count = PERIOD_TO - PERIOD_FROM + 1; return(0); } // Главный цикл. int start() { int i, j; for(i = Bars - IndicatorCounted() - 1; i >= 0; i--) { // Вычисление величины. buf_av[i] = 0; for(j = PERIOD_FROM; j <= PERIOD_TO; j++) { buf_av[i] += iMA(NULL, 0, j, 0, MODE_SMA, PRICE_CLOSE, i); } buf_av[i] /= sma_count; // Раскраска. if(i < Bars - 1) { if(buf_av[i] >= buf_av[i + 1]) { buf_up[i] = buf_av[i]; buf_dn[i] = -1; if(buf_up[i + 1] < 0) buf_up[i + 1] = buf_av[i + 1]; } else { buf_up[i] = -1; buf_dn[i] = buf_av[i]; if(buf_dn[i + 1] < 0) buf_dn[i + 1] = buf_av[i + 1]; } } else { buf_up[i] = -1; buf_dn[i] = -1; } } return(0); }