pricehistory
Version:
Series data with technical indicators.
56 lines (55 loc) • 2.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const simpul_1 = require("simpul");
function setCandleRSI(option, candle, series) {
var _a, _b;
if (option.rsi !== true && typeof option.rsi !== "number")
return;
const period = typeof option.rsi === "number" ? option.rsi : 14;
const prev = series[series.length - 2];
if (series.length === period + 1) {
let gain = 0;
let loss = 0;
for (let i = 1; i < series.length; i++) {
const currPrice = (_a = series[i]) === null || _a === void 0 ? void 0 : _a.priceClose;
const prevPrice = (_b = series[i - 1]) === null || _b === void 0 ? void 0 : _b.priceClose;
if (typeof currPrice === "number" && typeof prevPrice === "number") {
const change = currPrice - prevPrice;
if (change > 0)
gain += change;
if (change < 0)
loss += Math.abs(change);
}
}
const averageGain = gain / period;
const averageLoss = loss / period;
const rsi = averageLoss === 0 ? 100 : 100 - 100 / (1 + averageGain / averageLoss);
candle.averageGain = simpul_1.math.num(averageGain);
candle.averageLoss = simpul_1.math.num(averageLoss);
candle.rsi = simpul_1.math.num(rsi);
}
else if (typeof (prev === null || prev === void 0 ? void 0 : prev.rsi) === "number") {
if (typeof prev.averageGain !== "number")
return;
if (typeof prev.averageLoss !== "number")
return;
if (typeof prev.priceClose !== "number")
return;
if (typeof candle.priceClose !== "number")
return;
let gain = prev.averageGain * (period - 1);
let loss = prev.averageLoss * (period - 1);
const change = candle.priceClose - prev.priceClose;
if (change > 0)
gain += change;
if (change < 0)
loss += Math.abs(change);
const averageGain = gain / period;
const averageLoss = loss / period;
const rsi = averageLoss === 0 ? 100 : 100 - 100 / (1 + averageGain / averageLoss);
candle.averageGain = simpul_1.math.num(averageGain);
candle.averageLoss = simpul_1.math.num(averageLoss);
candle.rsi = simpul_1.math.num(rsi);
}
}
exports.default = setCandleRSI;