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