series-processing
Version:
Time-series processing for forex, market analysis, including MA, EMA,...
42 lines (35 loc) • 1.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.EMA = undefined;
var _SMA = require('./SMA');
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
/**
* Exponential Moving Average
* @see https://en.wikipedia.org/wiki/Exponential_smoothing
*
* <output series> = ema(<input series>, length)
*/
var EMA = exports.EMA = function EMA(outputKey, inputKey, length) {
return function (lastPoint, dataStream) {
if (typeof lastPoint === 'undefined' || typeof lastPoint[inputKey] === 'undefined') {
return null;
}
var previousPoint = dataStream.getPrevious();
var previousEma = null;
if (previousPoint && previousPoint[outputKey]) {
previousEma = previousPoint[outputKey];
} else {
// Use SMA when the first previous EMA value is not available
var sma = (0, _SMA.SMA)('test', 'close', length)(lastPoint, dataStream);
if (sma && sma['test']) {
previousEma = sma['test'];
}
}
if (!previousEma) return null;
var K = 2 / (1 + length);
var ema = (lastPoint[inputKey] - previousEma) * K + previousEma;
return _defineProperty({}, outputKey, ema);
};
};