расчет RSI

 

Для MQL4.  

Появилась идея сделать совтеника на RSI с динамически изменяемым периодом.  

вызвал индикатор

double x = iRSI (_Symbol,0,din_pereriod,PRICE_CLOSE,0);

При оптимизации получил сообщение. что не хватает памяти.

2015.03.26 06:32:25.393 Not enough memory for indicator Relative Strength Index (EURGBP,M1)
2015.03.26 06:32:25.393 Memory handler: cannot allocate 3641080 bytes of memory

Ну решил расчитать RSI прямо в советнике. А он  выдает результаты отличные от стандартного РСИ. Расчет брался для периода 14.

Помогите правильно расчиать РСИ !  

double RSI(int perRSI)
  {
   double u=0.0;
   double d=0.0;
   double c0,c1;
   for(int i=perRSI;i>=0;i--)
     {
      c1 = Close[i+1];
      c0 = Close [i];
      if(c0<c1) u+=(c1-c0);
      else d+=(c0-c1);
     }
    d/=perRSI;
    u/=perRSI;
    
        if (u==0)return (100.0);
        if (d==0) return (0.00);
   double rsi=100.0-(100.0/(1.0+d/u));
   return (rsi);
  }
 
Учитывайте, что IndicatorRelease() не работает в тестере.
 
joo:
Учитывайте, что IndicatorRelease() не работает в тестере.
При чем тут  IndicatorRelease() ? Вопрос в то, что надо написать, чтоб с приходом тика переменная rsi принимала значение индикатора. Но индикатор при этом не вызывался, а расчитывался. 
 

Чтобы правильно рассчитать рси с периодом 14 нужно баров 300.

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

 

Вообще РСИ считается вот так: 

Формула RSI следующая:RSI = 100 - [100/1 + RS],

где RS - среднее значение положительных изменений цены закрытия за определенное число дней, деленное на среднее значение отрицательных изменений цены закрытия за то же число дней.

Т.е. 300 баров обсчитывать не надо. Но такой расчет не совпадает со значением индикатора. 

 
dimeon:

Вообще РСИ считается вот так: 

Формула RSI следующая:RSI = 100 - [100/1 + RS],

где RS - среднее значение положительных изменений цены закрытия за определенное число дней, деленное на среднее значение отрицательных изменений цены закрытия за то же число дней.

Т.е. 300 баров обсчитывать не надо. Но такой расчет не совпадает со значением индикатора. 

Гы гы гы... расскажите лучше про формулу скользящей средней. 

Можете и не обсчитывать 300 баров, тогда не удивляйтесь, почему значение не совпадает.  

Самый простой вариант - взять исходник рси из примеров, ограничить количество обсчитываемых баров (еще сделать, чтобы всегда на все бары пересчет был) и сделать параметры из глобальной переменной.

 
dimeon:
В цикле лишнее значение. Надо либо "for(int i=perRSI-1;i>=0;i--)" либо "for(int i=0;i<perRSI;i++)". И проверьте, не перепутаны ли u и d.
 
Integer:

Гы гы гы... расскажите лучше про формулу скользящей средней. 

Можете и не обсчитывать 300 баров, тогда не удивляйтесь, почему значение не совпадает. 

Не, тут же обычное усреднение, история не нужна.
 
Обана и вот это да! Это когда и с чего вдруг RSI стал рассчитываться с использованием просто го сглаживания? Он всегда рассчитывался с  использованием экспоненциального сглаживания Уйлдера (период 14 соответствует периоду EMA 27). 
 
Integer:
Обана и вот это да! Это когда и с чего вдруг RSI стал рассчитываться с использованием просто го сглаживания? Он всегда рассчитывался с  использованием экспоненциального сглаживания Уйлдера (период 14 соответствует периоду EMA 27). 
Точно, не обратил внимания. Тогда история нужна.
 
komposter:
Точно, не обратил внимания. Тогда история нужна.
Не нужна. RSI из примеров с простым сглаживанием. Но что-то вообще... вроде помню, когда последний раз исходники смотрел, правда очень давно, было экспоненциальное сглаживание. Может с ADX перепутал.
Причина обращения: