@4ex/indicators
Version:
Technical indicators for ohlc charts written in TypeScript
104 lines (103 loc) • 3.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.KST = void 0;
const fp_1 = require("lodash/fp");
const technicalindicators_1 = require("technicalindicators");
const types_1 = require("../types");
const defaultInput = {
signalPeriod: 9,
rocLength1: 10,
rocLength2: 15,
rocLength3: 20,
rocLength4: 30,
smaLength1: 10,
smaLength2: 10,
smaLength3: 10,
smaLength4: 15,
};
/**
* The Know Sure Thing (KST) is a momentum oscillator developed
* by Martin Pring to make rate-of-change readings easier for
* traders to interpret. In a 1992 Stocks and Commodities article,
* Pring referred to the indicator as "Summed Rate of Change (KST)",
* but the KST term stuck with technical analysts. The indicator is
* relatively common among technical analysts preferring momentum
* oscillators to make decisions
*/
class KST {
/**
*
* @param {OHLC[]} series candle series
* @param {number} signalPeriod signal line period
* @param {number} rocLength1
* @param {number} rocLength2
* @param {number} rocLength3
* @param {number} rocLength4
* @param {number} smaLength1
* @param {number} smaLength2
* @param {number} smaLength3
* @param {number} smaLength4
*/
constructor(series, signalPeriod = defaultInput.signalPeriod, rocLength1 = defaultInput.rocLength1, rocLength2 = defaultInput.rocLength2, rocLength3 = defaultInput.rocLength3, rocLength4 = defaultInput.rocLength4, smaLength1 = defaultInput.smaLength1, smaLength2 = defaultInput.smaLength2, smaLength3 = defaultInput.smaLength3, smaLength4 = defaultInput.smaLength4) {
// super();
const values = fp_1.map(types_1.OHLCEnum.CLOSE)(series);
this.indicator = new technicalindicators_1.KST({
values,
ROCPer1: rocLength1,
ROCPer2: rocLength2,
ROCPer3: rocLength3,
ROCPer4: rocLength4,
SMAROCPer1: smaLength1,
SMAROCPer2: smaLength2,
SMAROCPer3: smaLength3,
SMAROCPer4: smaLength4,
signalPeriod,
});
}
/**
* Retrieve KST values for instance
* @return {KnowSureThingOutput[]} values for instance data
*/
getResults() {
return this.indicator.getResult();
}
/**
* Calculate KST to next tick
* @param {OHLC} candle new candle to add to series
* @return {KnowSureThingOutput | undefined} next KST value or undefined if
* period is greater than actual series length
*/
next(candle) {
return this.indicator.nextValue(candle[types_1.OHLCEnum.CLOSE]);
}
/**
* Create instance from data
* @param {KnowSureThingInput} input input data
* @return {KST} KST instance
*/
static generator({ series, signalPeriod, rocLength1, rocLength2, rocLength3, rocLength4, smaLength1, smaLength2, smaLength3, smaLength4, }) {
return new KST(series, signalPeriod, rocLength1, rocLength2, rocLength3, rocLength4, smaLength1, smaLength2, smaLength3, smaLength4);
}
/**
* Get KST values from input
* @param {KnowSureThingInput} input input data
* @return {KnowSureThingOutput[]} KST values
*/
static calculate(input) {
const { series, signalPeriod, rocLength1, rocLength2, rocLength3, rocLength4, smaLength1, smaLength2, smaLength3, smaLength4, } = Object.assign(Object.assign({}, defaultInput), input);
const values = fp_1.map(types_1.OHLCEnum.CLOSE)(series);
return technicalindicators_1.KST.calculate({
values,
ROCPer1: rocLength1,
ROCPer2: rocLength2,
ROCPer3: rocLength3,
ROCPer4: rocLength4,
SMAROCPer1: smaLength1,
SMAROCPer2: smaLength2,
SMAROCPer3: smaLength3,
SMAROCPer4: smaLength4,
signalPeriod,
});
}
}
exports.KST = KST;