// ---------------------------------------------------------------------------
// Ðàññ÷¸ò 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);
}
Comments