Method: TechnicalAnalysis::Obv.calculate
- Defined in:
- lib/technical_analysis/indicators/obv.rb
.calculate(data) ⇒ Array<ObvValue>
Calculates the on-balance volume (OBV) for the data over the given period en.wikipedia.org/wiki/On-balance_volume
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/technical_analysis/indicators/obv.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] } current_obv = 0 output = [] prior_close = nil prior_volume = nil data.each do |v| volume = v[:volume] close = v[:close] unless prior_close.nil? current_obv += volume if close > prior_close current_obv -= volume if close < prior_close end output << ObvValue.new(date_time: v[:date_time], obv: current_obv) prior_volume = volume prior_close = close end output.sort_by(&:date_time).reverse end |