Method: TechnicalAnalysis::Dc.calculate
- Defined in:
- lib/technical_analysis/indicators/dc.rb
.calculate(data, period: 20, price_key: :value) ⇒ Array<DcValue>
Calculates the donchian channel (DC) for the data over the given period en.wikipedia.org/wiki/Donchian_channel
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/dc.rb', line 53 def self.calculate(data, period: 20, price_key: :value) period = period.to_i price_key = price_key.to_sym Validation.validate_numeric_data(data, price_key) Validation.validate_length(data, min_data_size(period: period)) Validation.validate_date_time_key(data) data = data.sort_by { |row| row[:date_time] } output = [] period_values = [] data.each do |v| period_values << v[price_key] if period_values.size == period output << DcValue.new( date_time: v[:date_time], upper_bound: period_values.max, lower_bound: period_values.min ) period_values.shift end end output.sort_by(&:date_time).reverse end |