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