mick-whats/xza-node

View on GitHub
lib/calc.js

Summary

Maintainability
A
0 mins
Test Coverage
// Generated by CoffeeScript 2.3.1
const Big = require('big.js')
const _ = require('lodash-core')

const calc = {
  sum: function (arr) {
    var initialValue, reducer, res
    initialValue = Big(0)
    reducer = function (result, current, i, arr) {
      return result.plus(current)
    }
    res = arr.reduce(reducer, initialValue)
    return parseFloat(res)
  },
  sumBy: function (arr, key) {
    var newArr
    newArr = _.map(arr, key)
    return calc.sum(newArr)
  },
  mean: function (arr) {
    var res, sum
    sum = calc.sum(arr)
    res = Big(sum).div(arr.length)
    return parseFloat(res)
  },
  meanBy: function (arr, key) {
    var newArr
    newArr = _.map(arr, key)
    return calc.mean(newArr)
  },
  changeIn: function (base, target) {
    var res
    res = Big(target)
      .minus(base)
      .div(base)
      .times(100)
      .round(2)
    return parseFloat(res)
  },
  addSma: function (range, items, roundNumber) {
    var d_key, key
    roundNumber = roundNumber || 0
    key = `sma${range}`
    d_key = `smad${range}`
    items.forEach(function (item, i, arr) {
      var refItems, sma
      if (i < range - 1) {
        item[key] = null
        return (item[d_key] = null)
      } else {
        refItems = arr.slice(i - (range - 1), +i + 1 || 9e9)
        sma = calc.meanBy(refItems, 'Close')
        item[key] = parseFloat(Big(sma).round(roundNumber))
        return (item[d_key] = calc.changeIn(sma, item.Close))
      }
    })
    return items
  },
  addVwma: function (range, items, roundNumber) {
    var d_key, key
    roundNumber = roundNumber || 0
    key = `vwma${range}`
    d_key = `vwmad${range}`
    items.forEach(function (item, i, arr) {
      var refItems, sumPrice, sumVolume, vwma
      if (i < range - 1) {
        item[key] = null
        return (item[d_key] = null)
      } else {
        refItems = arr.slice(i - (range - 1), +i + 1 || 9e9)
        sumPrice = calc.sumBy(refItems, function (o) {
          return o.Close * o.Volume
        })
        sumVolume = calc.sumBy(refItems, 'Volume')
        vwma = Big(sumPrice).div(sumVolume)
        item[key] = parseFloat(vwma.round(roundNumber))
        return (item[d_key] = calc.changeIn(parseFloat(vwma), item.Close))
      }
    })
    return items
  }
}

module.exports = calc