indicators
by frogggeee McFrogggeee
JavaScript
let indicators = {}
let data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
for (let i = 0; i < data.length; i++) {
// rsi
updateGainsLosses(i) // always leave in if calculating rsi
// ema and macd
ema(i, 4)
ema(i, 7)
macd(i, 4, 7, 10)
}
function macd(index, shortPeriod, longPeriod, signalPeriod) {
if (!indicators["macdLine"]) {
indicators["macdLine"] = []
}
if (!indicators["signalLine"]) {
indicators["signalLine"] = []
}
if (!indicators["macdHistogram"]) {
indicators["macdHistogram"] = []
}
if (!indicators["ema" + shortPeriod]) {
ema(index, shortPeriod)
}
if (!indicators["ema" + longPeriod]) {
ema(index, longPeriod)
}
if (index >= longPeriod - 1) {
const shortEma = indicators["ema" + shortPeriod][index]
const longEma = indicators["ema" + longPeriod][index]
const macdValue = shortEma - longEma
indicators["macdLine"].push(macdValue)
if (indicators["signalLine"].length == 0) {
// calculate sma of macd values for first point
const initialMacdValues = indicators["macdLine"].slice(0, signalPeriod)
if (initialMacdValues.length === signalPeriod) {
const smaSignal = calculateSma(initialMacdValues)
indicators["signalLine"].push(smaSignal)
} else {
indicators["signalLine"].push(-1)
}
} else {
const previousSignal = indicators["signalLine"][indicators["signalLine"].length - 1]
const smoother = 2 / (signalPeriod + 1)
const newSignal = (macdValue - previousSignal) * smoother + previousSignal
indicators["signalLine"].push(newSignal)
}
// histogram, the macd line - signal line(ema of macd line)
const currentSignal = indicators["signalLine"][indicators["signalLine"].length - 1]
const histogramValue = macdValue - currentSignal
indicators["macdHistogram"].push(histogramValue)
} else {
indicators["macdLine"].push(-1)
indicators["signalLine"].push(-1)
...