Расчет RSI

 
Почему не сходится с ручным расчетом?
Хочу для начала разобраться с индикатором 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;
???
 

Пользовательский индикатор 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

 
grotesque писал(а) >>
Извиняюсь что нагрубил, давайте тогда попытаемся разобраться:
- где сказано что в RSI используется сглаженная средняя, а не просто средняя?
- что происходит при использовании в выражении неинициализированной переменной (PosBuffer[i+1] в первом проходе), какое значение она имеет в этот момент и почему Alert ее выводит не как нуль? Вообще корректно ли это? (
- почему RSI равно нулю если за период отрицательное изменение цены равно 0?

Вот мой вариант индикатора RSI, написанный на скорую руку, но получился куда более логичнее и понятнее:

Очень, очень интересно ... Можно продолжить ?
 

По этой теме, по моему, все копья уже давно поломаты и топоры попрятаны: 'Один эксперт у одного брокера на разных терминалах и счетах, результат разный.'

 
VBAG >>:

По этой теме, по моему, все копья уже давно поломаты и топоры попрятаны: 'Один эксперт у одного брокера на разных терминалах и счетах, результат разный.'

просто ищу самые чувствительные индикаторы ...