Method: TechnicalAnalysis::Vpt.calculate

Defined in:
lib/technical_analysis/indicators/vpt.rb

.calculate(data) ⇒ Array<VptValue>

Calculates the volume-price trend (VPT) for the data en.wikipedia.org/wiki/Volume%E2%80%93price_trend

Parameters:

  • data (Array)

    Array of hashes with keys (:date_time, :close, :volume)

Returns:

  • (Array<VptValue>)

    An array of VptValue instances



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/technical_analysis/indicators/vpt.rb', line 52

def self.calculate(data)
  Validation.validate_numeric_data(data, :close, :volume)
  Validation.validate_length(data, min_data_size({}))
  Validation.validate_date_time_key(data)

  data = data.sort_by { |row| row[:date_time] }

  output = []
  prev_price = data.shift
  prev_pvt = 0

  data.each do |v|
    pvt = prev_pvt + (((v[:close] - prev_price[:close]) / prev_price[:close]) * v[:volume])
    output << VptValue.new(date_time: v[:date_time], vpt: pvt)
    prev_price = v
    prev_pvt = pvt
  end

  output.sort_by(&:date_time).reverse
end