// --------------------------------------------------------------------------- // Рассчёт RSI по книге Ч.Лебо и Д.Лукаса, для усреднения используется EMA. // --------------------------------------------------------------------------- #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Green #property indicator_minimum 0 #property indicator_maximum 100 #property indicator_level1 30 #property indicator_level2 70 // Период индикатора. extern int PERIOD = 9; // Буферы индикатора. double buf_rsi[], buf_up[], buf_dn[]; // Коэффициенты расчёта средней. double k0, k1; // Рабочий период индикатора. int work_period; // Инициализация. int init() { IndicatorShortName(StringConcatenate( "AZZX - EMA RSI v1.0 (", PERIOD, ")")); IndicatorDigits(0); IndicatorBuffers(3); SetIndexBuffer(0, buf_rsi); SetIndexEmptyValue(0, -1); SetIndexLabel(0, "EMA RSI(" + PERIOD + ")"); SetIndexBuffer(1, buf_up); SetIndexBuffer(2, buf_dn); work_period = Bars - PERIOD - 1; k0 = 2.0 / (PERIOD + 1); k1 = 1.0 - k0; return(0); } // Главный цикл. int start() { int i; double v; for(i = Bars - IndicatorCounted() - 1; i >= 0; i--) { if(i < work_period) { v = Close[i] - Open[i]; if(v > 0) { buf_up[i] = v * k0 + buf_up[i + 1] * k1; buf_dn[i] = buf_dn[i + 1] * k1; } else { buf_up[i] = buf_up[i + 1] * k1; buf_dn[i] = v * k0 + buf_dn[i + 1] * k1; } buf_rsi[i] = buf_up[i] / (buf_up[i] - buf_dn[i]) * 100; } else if(i == work_period) { // Инициализация начальным значением буферов. int j; double u = 0, d = 0; for(j = i + PERIOD - 1; j >= i; j--) { u += buf_up[j]; d += buf_dn[j]; } buf_up[i] = u / PERIOD; buf_dn[i] = d / PERIOD; } else { // Начальных данных нет. buf_rsi[i] = -1; v = Close[i] - Open[i]; if(v > 0) { buf_up[i] = v; buf_dn[i] = 0; } else { buf_up[i] = 0; buf_dn[i] = -v; } } } return(0); }