Ошибка в реализации индикатора OBV в MT5?

 

Здесь описана формула расчета индикатора OBV.

Если текущая цена закрытия выше предыдущей, то:

OBV (i) = OBV (i - 1) + VOLUME (i).

Если текущая цена закрытия ниже предыдущей, то:

OBV (i) = OBV (i - 1) - VOLUME (i)

Если текущая цена закрытия равна предыдущей, то:

OBV (i) = OBV (i - 1)

Где:

OBV (i) — значение индикатора On Balance Volume в текущем периоде;

OBV (i - 1) — значение индикатора On Balance Volume в предыдущем периоде;

VOLUME (i) — объем текущего бара.


Но похоже, что индикатор в MT5 реализован с ошибкой.

Сейчас опубликую несколько примеров.


UPD: индикатор сравнивает цены закрытия, а я сравниваю open и close. Вопрос снимается.

On Balance Volume - Индикаторы объемов - MetaTrader 5
On Balance Volume - Индикаторы объемов - MetaTrader 5
  • www.metatrader5.com
Технический индикатор Балансового Объема (On Balance Volume, OBV) связывает объем и изменение цены, сопровождавшее данный объем. Смысл этого индикатора, придуманного Джозефом Гранвиллем, прост. Если цена закрытия текущего бара выше закрытия предыдущего, значение объема текущего бара прибавляется к предыдущему значению OBV, если закрытие...
 

close < open, но объем не учтен.

Файлы:
scr1.jpg  354 kb
 
open == close, но объем учтен
Файлы:
scr2.jpg  351 kb
 

Со временем эта погрешность накапливается и даёт неверную картину.

На скринах сверху стандартный индикатор OBV, снизу моя реализация:


int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    for(int i =  prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++) {
      OBVBuffer[i] = i > 0 ? OBVBuffer[i - 1] : 0;
      const long ivol = AppliedVolume == VOLUME_REAL ? volume[i] : tick_volume[i];
      if(open[i] < close[i]) {
        OBVBuffer[i] = OBVBuffer[i] + ivol;
      } else if(open[i] > close[i]) {
        OBVBuffer[i] = OBVBuffer[i] - ivol;
      }
    }
//--- return value of prev_calculated for next call
    return(rates_total);
  }
Файлы:
scr3.jpg  361 kb
 

Вопрос: это действительно ошибка в реализации стандартного индикатора или я что-то не понимаю?


+ индикатор не работает на таймфрейме выше M30 (превращается в сплошную линию).

Файлы:
scr4.jpg  340 kb
 
Индикатор сравнивает цены закрытия - я не прав. Вопрос снимается.
Причина обращения: