Пишу торговую систему и делаю для неё индикаторы, использую Квик как эталон. Застрял уже на втором. В общем, у меня упорно не совпадает 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)); } |