Василий Пупкин (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
RSI - моя имплементация упорно не совпадает с Квиковой
 
Пишу торговую систему и делаю для неё индикаторы, использую Квик как эталон. Застрял уже на втором. В общем, у меня упорно не совпадает RSI. Какой алгоритм используется в Квике? Подозреваю, что выбрана другая альфа.
Вроде реализации ведут себя схожим образом, но довольно сильно не совпадают по значениям.
Код
@Override
protected void compute() {

   if (this.history.size() == this.indicatorHistory.size()) {
      return; // we are in sync
   }

   if (this.isFirstRun()) {

      this.indicatorHistory.add(null);
      double gain = 0, loss = 0;

      for (int i = 1; i < this.history.size(); i++) { // skip i = 0 as we can't get delta

         double delta = this.getDelta(i);
         UpDown upDown =  new UpDown(Math.max(delta, 0), Math.max(-delta, 0));

         if (gain == 0) { // Seed our ema
            gain = upDown.getGain();
            loss = upDown.getLoss();
         } else {
            gain = this.alpha * upDown.getGain() + (1 - this.alpha) * gain;
            loss = this.alpha * upDown.getLoss() + (1 - this.alpha) * loss;
         }

         if (i < this.length) { // this data is too inaccurate
            this.indicatorHistory.add(null);
            continue;
         }

         double RS = (loss == 0) ? 0 : gain / loss;
         this.indicatorHistory.add(this.computeInternal(i, RS));
      }
   } else {

   }
}

protected double getDelta(int i) {
   assert i > 0;
   return this.history.get(i).getClose() - this.history.get(i - 1).getClose();
}

protected IndicatorValue<Double> computeInternal(int i, double RS) {
   return new IndicatorValue<>(this.history.get(i).getTimestamp(), 100 - 100 / (1 + RS));
}
Страницы: 1
Наверх