pricehistory
Version:
Series data with technical indicators.
58 lines (57 loc) • 2.24 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.setCandleEMA = setCandleEMA;
exports.calcEMA = calcEMA;
const simpul_1 = require("simpul");
const option_propsPrice_1 = __importDefault(require("./option.propsPrice"));
function setCandleEMA(option, candle, series) {
if (option.ema === true || option.macd === true) {
calcEMA(9, series, candle);
calcEMA(12, series, candle);
calcEMA(26, series, candle);
}
}
function calcEMA(period, series, candle, numKey = "priceClose") {
if (typeof period !== "number" || series.length <= period)
return;
const prev = series[series.length - 2];
let emaKey = `ema${period}`;
if (numKey !== "priceClose")
emaKey += numKey;
let prevEMA = prev[emaKey];
if (typeof prevEMA !== "number") {
const numbers = [];
const recent = series.slice(series.length - period - 1, series.length - 1);
for (const i of recent) {
const number = i[numKey];
if (typeof number === "number")
numbers.push(number);
}
if (numbers.length === period) {
const mean = simpul_1.math.mean(numbers);
if (typeof mean === "number")
prevEMA = mean;
}
}
if (typeof prevEMA === "number") {
const number = candle[numKey];
if (typeof number === "number") {
const k = 2 / (period + 1);
const currEMA = simpul_1.math.num(number * k + prevEMA * (1 - k));
candle[emaKey] = currEMA;
if (numKey === "priceClose" && typeof currEMA === "number") {
for (const priceProp of option_propsPrice_1.default) {
if (priceProp === emaKey)
continue;
if (typeof candle[priceProp] === "number") {
candle[`${emaKey}Signal${(0, simpul_1.capitalize)(priceProp)}`] =
simpul_1.math.change.percent(currEMA, candle[priceProp]);
}
}
}
}
}
}