Sha256: 78eab2d49caf60e0d19463a1b7a6cacd794a21de5c4a699f0824e3f0d264e49e

Contents?: true

Size: 1.13 KB

Versions: 2

Compression:

Stored size: 1.13 KB

Contents

require "quant/version"

module Quant

  def self.sma(values, n)
    acc = 0
    values.inject_with_index([]) do |m, e, i|
      acc += e
      if i < (n - 1)
        m << not_a_number
      elsif i == (n - 1)
        m << acc / n
      else
        acc = acc - values[i - n]
        m << acc / n
      end
    end
  end

  def self.donchian_channel(ohlc, n)
    dc = []
    ohlc.each_with_index do |e, i|
      if i < (n - 1)
        dc << [not_a_number, not_a_number]
      else
        c = ohlc[(i - n + 1)..(i)].flatten
        dc << [c.max, c.min]
      end
    end
    dc
  end

  def self.tr(ohlc)
    tr = []
    ohlc.each_with_index do |e, i|
      tr << if i == 0
        not_a_number
      else
        high       = e[1]
        low        = e[2]
        last_close = ohlc[i - 1][3]
        [ high - low, (high - last_close).abs, (last_close - low).abs ].max
      end
    end
    tr
  end

  def self.atr(ohlc, n)
    tr = tr(ohlc)
    tr.delete_if{ |e| e.nan? }
    a = sma(tr, n)
    0.upto(ohlc.length - tr.length - 1) { a.unshift(not_a_number) } if ohlc.length > tr.length
    a
  end

  private

  def self.not_a_number
    0 / 0.0
  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
quant-0.0.5 lib/quant.rb
quant-0.0.4 lib/quant.rb