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)
   ...