Скачать MetaTrader 5

Принцип рассчета RSI в MT4

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен программист? Cервис Фриланс найдет его!
андрей
15
андрей 2012.01.26 04:59 

Из документации MT4 взял принцип рассчета RSI:

RSI = 100 - (100 / (1 + U / D))

где:
U — среднее значение положительных ценовых изменений;
D — среднее значение отрицательных ценовых изменений.

Но график отличается от исходного



(первый - MT4, второй - мой)

Закралось подозрение, что используется не просто отношение U/D, а как сказано в википедии (https://ru.wikipedia.org/wiki/RSI) -

Тоесть усредненное экспоненциальной средней значение U и D за период N

Какая именно форма рассчета используется для RSI в MT4?

Спасибо.

Yury Reshetov
13462
Yury Reshetov 2012.01.26 11:39  
an1313:

Какая именно форма рассчета используется для RSI в MT4?

Загрузите МТ4, запустите, в окне "Навигатор", "Пользовательские индикаторы", RSI. Выделяете индикатор, кликаете Enter, открывается MetaEditor с кодом расчета индикатора. В коде ответ на Ваш вопрос.
Sceptic Philozoff
Модератор
17844
Sceptic Philozoff 2012.01.26 13:07  
Судя по комменту внутри кода, это smoothed moving average, т.е. SMMA.
Vladislav Andruschenko
92075
Vladislav Andruschenko 2012.01.26 13:32  

а второй мой, а мой это рисунок о руки?

#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
//---- input parameters
extern int RSIPeriod=14;
//---- buffers
double RSIBuffer[];
double PosBuffer[];
double NegBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(3);
   SetIndexBuffer(1,PosBuffer);
   SetIndexBuffer(2,NegBuffer);
//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,RSIBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="RSI("+RSIPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
//----
   SetIndexDrawBegin(0,RSIPeriod);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i,counted_bars=IndicatorCounted();
   double rel,negative,positive;
//----
   if(Bars<=RSIPeriod) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=RSIPeriod;i++) RSIBuffer[Bars-i]=0.0;
//----
   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumn=0.0,sump=0.0;
      if(i==Bars-RSIPeriod-1)
        {
         int k=Bars-2;
         //---- initial accumulation
         while(k>=i)
           {
            rel=Close[k]-Close[k+1];
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
      else
        {
         //---- smoothed moving average
         rel=Close[i]-Close[i+1];
         if(rel>0) sump=rel;
         else      sumn=-rel;
         positive=(PosBuffer[i+1]*(RSIPeriod-1)+sump)/RSIPeriod;
         negative=(NegBuffer[i+1]*(RSIPeriod-1)+sumn)/RSIPeriod;
        }
      PosBuffer[i]=positive;
      NegBuffer[i]=negative;
      if(negative==0.0) RSIBuffer[i]=0.0;
      else RSIBuffer[i]=100.0-100.0/(1+positive/negative);
      i--;
     }
//----
   return(0);
  }
//+----------
ask
518
ask 2012.01.27 00:26  

Vladon:


а второй мой, а мой это рисунок о руки?


Разница, как мне кажется, очевидна:

Экспоненциальное скользящее среднее (Exponential Moving Average, EMA)

Экспоненциально сглаженное скользящее среднее определяется путем добавления к предыдущему значению скользящего среднего определенной доли текущей цены закрытия. При использовании экспоненциальных скользящих средних больший вес имеют последние цены закрытия. Р-процентное экспоненциальное скользящее среднее будет иметь вид:

EMA = (CLOSE (i) * P) + (EMA (i - 1) * (100 - P))

где:
CLOSE (i) — цена закрытия текущего периода;
EMA (i - 1) — значение скользящего среднего предыдущего периода;
P — доля использования значения цен.


Сглаженное скользящее среднее (Smoothed Moving Average, SMMA)

Первое значение сглаженного скользящего среднего рассчитывается, как простое скользящее среднее (SMA):

SUM1 = SUM (CLOSE (i), N)
SMMA1 = SUM1 / N

Второе значение рассчитывается по следующей формуле:

SMMA (i) = (SUM1 - SMMA (i - 1) + CLOSE (i)) / N

Последующие скользящие средние рассчитываются по следующей формуле:

PREVSUM = SMMA (i-1) * N
SMMA (i) = (PREVSUM - SMMA (i - 1) + CLOSE (i)) / N

где:
SUM — сумма;
SUM1 — сумма цен закрытия N периодов, отсчитываемая от предыдущего бара;
PREVSUM — сглаженная сумма предыдущего бара;
SMMA (i - 1) — сглаженное скользящее среднее предыдущего бара;
SMMA (i) — сглаженное скользящее среднее текущего бара (кроме первого);
CLOSE (i) — текущая цена закрытия;
N — период сглаживания.


В результате арифметических преобразований формула может быть упрощена:

SMMA (i) = (SMMA (i - 1) * (N - 1) + CLOSE (i)) / N

Получается, что

SMMA (i) = (SMMA (i - 1) * (N - 1) + CLOSE (i)) / N

аналогично

positive=(PosBuffer[i+1]*(RSIPeriod-1)+sump)/RSIPeriod;
negative=(NegBuffer[i+1]*(RSIPeriod-1)+sumn)/RSIPeriod;

где sum(n или p)=Close[i]-Close[i+1]

Я не настаиваю, что я прав, вполне возможно, что запутался, но кто просил разработчиков что-то сглаживать? Получаем запаздывание же...

Обьясните-я правда не понимаю....

Роман
7939
Роман 2012.01.27 00:39  
ask:


Разница, как мне кажется, очевидна:

Получается, что

SMMA (i) = (SMMA (i - 1) * (N - 1) + CLOSE (i)) / N

аналогично

positive=(PosBuffer[i+1]*(RSIPeriod-1)+sump)/RSIPeriod;
negative=(NegBuffer[i+1]*(RSIPeriod-1)+sumn)/RSIPeriod;

где sum(n или p)=Close[i]-Close[i+1]

Я не настаиваю, что я прав, вполне возможно, что запутался, но кто просил разработчиков что-то сглаживать? Получаем запаздывание же...

Обьясните-я правда не понимаю....

Вы не парьтесь попусту. Если не устраивает, что есть - правьте под свои нужды, выкладывайте с описанием, в кодебазу - мош кому и еще пригодится! :-)

Код же открыт.

Sceptic Philozoff
Модератор
17844
Sceptic Philozoff 2012.01.27 00:51  
ask: Разница, как мне кажется, очевидна:

Нет, не очевидна. Ее почти нет.
ask
518
ask 2012.01.27 03:27  
Mathemat:
Нет, не очевидна. Ее почти нет.


Спасибо за ссылку, ознакомился-интересно. Но на данный момент меня волнует немного другое (посидел, почитал про РСИ). Возможно, я чего-то не допонял из описания РСИ, но:

RSI ввел Уэллс Уайлдер в статье, опубликованной в журнале Commodities (ныне Futures) в июне 1978 года. Подробные инструкции по расчету и интерпретации индикатора RSI можно найти также в книге У.Уайлдера «Новые концепции технических торговых систем». Название «индекс относительной силы» не вполне удачно, поскольку индикатор RSI показывает не относительную силу двух сравниваемых ценных бумаг, а внутреннюю силу одной бумаги. Пожалуй, точнее было бы название «индекс внутренней силы».

Вводя индикатор RSI, У. Уайлдер рекомендовал использовать 14дневный период расчета RSI. В дальнейшем распространение получили также 9 и 25дневные периоды индикатора RSI. Число единичных периодов при расчете RSI можно варьировать, поэтому рекомендуем поэкспериментировать с ними, чтобы выбрать наиболее подходящий вариант. (Чем короче период расчета RSI, тем чувствительнее индикатор.)

Индикатор RSI - это следующий за ценами осциллятор, который колеблется в диапазоне от 0 до 100. Один из распространенных методов анализа индикатора RSI состоит в поиске расхождений, при которых цена образует новый максимум, а RSI не удается преодолеть уровень своего предыдущего максимума. Подобное расхождение свидетельствует о вероятности разворота цен. Если затем индикатор RSI поворачивает вниз и опускается ниже своей последней впадины, то RSI завершает так называемый «неудавшийся размах» (failure swing). Этот неудавшийся размах считается подтверждением скорого разворота цен.

В своей книге У.Уайлдер описывает пять способов применения индикатора RSI для анализа графиков товарных рынков. Все эти методы применимы и к другим типам ценных бумаг.
Вершины и основания. Вершины индикатора RSI обычно формируются выше 70, а основания — ниже 30, причем они обычно опережают образование вершин и оснований на ценовом графике.
Графические модели. Индикатор RSI часто образует графические модели — такие как «голова и плечи» или треугольники — которые на ценовом графике могут и не обозначиться.
Неудавшийся размах (прорыв уровня поддержки или сопротивления). Имеет место, когда индикатор RSI поднимается выше предыдущего максимума (пика) или опускается ниже предыдущего минимума (впадины).
Уровни поддержки и сопротивления. На графике индикатора RSI уровни поддержки и сопротивления иногда проступают даже отчетливее, чем на ценовом графике.
Расхождения. Как уже сказано выше, расхождения образуются, когда цена достигает нового максимума (минимума), но он не подтверждается новым максимумом (минимумом) на графике RSI. При этом обычно происходит коррекция цен в направлении движения индикатора RSI.
Расчет индикатора RSI

U - среднее значение положительных ценовых изменений;
D - среднее значение отрицательных ценовых изменений.

Получается берется не ЕМА, не SMMA, а обычное SMA (поправьте если я ошибаюсь) и это не утверждение, скорее вопрос?

Sceptic Philozoff
Модератор
17844
Sceptic Philozoff 2012.01.27 03:32  

Средним по традиции называется любое из упомянутых Вами сглаживаний (слово "average" есть во всех трех видах; есть еще LWMA, AMA (AMKA), FRAMA, JMA).

Лучше всего смотреть в код. Я не анализировал его, а просто посмотрел на комментарий внутри кода.

Попробуйте изменить период по формуле EMA_Period = 2 * SMMA_Period - 1, т.е. сделайте период RSI в MT4 равным 7 или 8. Может, разница почти исчезнет?

ask
518
ask 2012.01.27 03:53  
Mathemat:

Средним по традиции называется любое из упомянутых Вами сглаживаний (слово "average" есть во всех трех видах; есть еще LWMA, AMA (AMKA), FRAMA, JMA).

Лучше всего смотреть в код. Я не анализировал его, а просто посмотрел на комментарий внутри кода.

Попробуйте изменить период по формуле EMA_Period = 2 * SMMA_Period - 1, т.е. сделайте период RSI в MT4 равным 7 или 8. Может, разница почти исчезнет?


Я ознакомился с вашей статьей и понимаю-она исчезнет. Благодарю за дельный совет (действительно проще), но в том случае, если нам нужно РСИ по ЕМА, но мне то нужен был РСИ по SMA. Хотя, наверно, это настолько мелочи, что из-за них не стОит замарачиваться. Принципиально, получается, ничего не меняется, значит не заслуживает пристального внимания. Спасибо за формулу перевода, теперь буду знать. Если ЕМА и SMMA, взаимообратны, то и для SMA есть такое же решение. Получается, впринципе-нужно просто перебрать периоды в исходной РСИ.

Sceptic Philozoff
Модератор
17844
Sceptic Philozoff 2012.01.27 03:57  
ask: Если ЕМА и SMMA, взаимообратны, то и для SMA есть такое же решение. Получается, впринципе-нужно просто перебрать периоды в исходной РСИ.

Ну они не совсем взаимно обратны. Все же кодирование на основе EMA универсальнее: если рассматривать как исходный код на основе SMMA, то эквивалентный период ЕМА, равный 14, не получится.

Для SMA такого же решения нет, увы. Надо переписывать код.

Но отличия RSI будут вряд ли значительными.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий