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

Parameters:

  • data (Array)

    Array of hashes with keys (:date_time, :value)

  • period (Integer) (defaults to: 20)

    The given period to calculate the DC

  • price_key (Symbol) (defaults to: :value)

    The hash key for the price data. Default :value

Returns:

  • (Array<DcValue>)

    An array of DcValue instances



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