Пользовательский индикатор RSI полностью соответствует встроенному.
Прежде, чем называть что-либо бредом, попытайтесь сначала разобраться.
Например, Вы в курсе, что элементы индикаторных массивов нумеруются
в обратном порядке (точно так же, как и массивы таймсерий).
А в курсе ли Вы, что для того, чтобы посчитать последние 7 значений
индикатора, необходимо рассмотреть как минимум 15 цен? Из-за
того, что в расчёте используется скользящая средняя.
Кстати, то, что выглядит для Вас бредом, на самом деле является
формулой сглаженной скользящей средней.
- где сказано что в RSI используется сглаженная средняя, а не просто средняя?
- что происходит при использовании в выражении неинициализированной переменной (PosBuffer[i+1] в первом проходе), какое значение она имеет в этот момент и почему Alert ее выводит не как нуль? Вообще корректно ли это? (
- почему RSI равно нулю если за период отрицательное изменение цены равно 0?
Вот мой вариант индикатора RSI, написанный на скорую руку, но получился куда более логичнее и понятнее:
#property copyright "my"
#property link "not"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
extern int RSIPeriod=22;
double RSIBuffer[];
int init()
{
string short_name;
IndicatorBuffers(1);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,RSIBuffer);
short_name="RSIMy("+RSIPeriod+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
SetIndexDrawBegin(0,0);
return(0);
}
int start()
{
int i=Bars-RSIPeriod-1;
while(i>=0)
{
double p=0.0,n=0.0,rel;
for(int k=i;k<i+RSIPeriod;k++)
{
rel=Open[k]-Open[k+1];
if(rel>0)
{
p+=rel;
}else
{
n+=-rel;
}
}
if(n==0.0) n=0.0001;
RSIBuffer[i]=100-100/(1+p/n);
i--;
}
return(0);
}
#property copyright "my" #property link "not" #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 100 #property indicator_buffers 1 #property indicator_color1 DodgerBlue extern int RSIPeriod=22; double RSIBuffer[]; int init() { string short_name; IndicatorBuffers(1); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,RSIBuffer); short_name="RSIMy("+RSIPeriod+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); SetIndexDrawBegin(0,0); return(0); } int start() { int i=Bars-RSIPeriod-1; while(i>=0) { double p=0.0,n=0.0,rel; for(int k=i;k<i+RSIPeriod;k++) { rel=Open[k]-Open[k+1]; if(rel>0) { p+=rel; }else { n+=-rel; } } if(n==0.0) n=0.0001; RSIBuffer[i]=100-100/(1+p/n); i--; } return(0); }
ДАнный код не соответсвует встроенному индикатору RSI в MT
Вот картинка стандартного и пользовательского с периодом 2, цены Open
Стандартный и пользовательский RSI период 2, Open
Извиняюсь что нагрубил, давайте тогда попытаемся разобраться:
- где сказано что в RSI используется сглаженная средняя, а не просто средняя?
- что происходит при использовании в выражении неинициализированной переменной (PosBuffer[i+1] в первом проходе), какое значение она имеет в этот момент и почему Alert ее выводит не как нуль? Вообще корректно ли это? (
- почему RSI равно нулю если за период отрицательное изменение цены равно 0?
Вот мой вариант индикатора RSI, написанный на скорую руку, но получился куда более логичнее и понятнее:
По этой теме, по моему, все копья уже давно поломаты и топоры попрятаны: 'Один эксперт у одного брокера на разных терминалах и счетах, результат разный.'
По этой теме, по моему, все копья уже давно поломаты и топоры попрятаны: 'Один эксперт у одного брокера на разных терминалах и счетах, результат разный.'
просто ищу самые чувствительные индикаторы ...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Хочу для начала разобраться с индикатором RSI, а точнее реализовать на нем советника.
решил считать индекс относительной силы как описывает Элдер в своей книге:
1. Получите цены закрытия за 7 дней.
2. Выделите все дни, в которые цена закрытия оказалась выше, чем накануне, сложите цены закрытия в эти дни и разделите на 7, чтобы найти среднюю цену закрытия ВВЕРХ.
3. Выделите все дни, в которые цена закрытия оказалась ниже, чем накануне, сложите цены закрытия в эти дни и разделите на 7, чтобы найти среднюю цену закрытия ВНИЗ.
4. Разделите среднюю цену закрытия ВВЕРХ на среднюю цену ВНИЗ, чтобы найти относительную силу (RS). Подставьте результат в приведенную выше формулу, чтобы получить RSI - индекс относительной силы.
Таблица из книги, цены закрытия:
77,34
78,02
77,71
78,45
79,15
79,91
79,63
79,99
79,96
79,94
79,96
79,76
80,09
79,72
80,10
Считая по формуле: RSI = 100 - 100/(1+RS), получаем следующий результат (для последних 8 цен закрытия):
71,54071555
57,22782985
56,99872538
57,11497834
42,89725476
42,9156312
42,9087269
42,91995067
Далее ее реализация в советники имеет следующий вид:
RSPeriod = 7
for(int i=0; i<RSPeriod; i++)
{
if(Open[i]>Open[i+1])
{
sump+=Open[i];
}
else sumn+=Open[i];
}
positive=sump/RSPeriod;
negative=sumn/RSPeriod;
RSI=100-100/(1+(positive/negative));
***
Пытаюсь разобраться в пользовательском индикаторе RSI и прихожу к выводу что формула его вычисления сколько (или абсолютно) иная... Может кто-нибудь объяснить почему?
Например, зачем это: Close[k]-Close[k+1] ?
А это вообще выглядит каким-то бредом: positive=(PosBuffer[i+1]*(RSIPeriod-1)+sump)/RSIPeriod;
negative=(NegBuffer[i+1]*(RSIPeriod-1)+sumn)/RSIPeriod;
???