Method: TechnicalAnalysis::Wr.calculate
- Defined in:
- lib/technical_analysis/indicators/wr.rb
.calculate(data, period: 14) ⇒ Array<WrValue>
Calculates the Williams %R (WR) for the data over the given period en.wikipedia.org/wiki/Williams_%25R
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 |
# File 'lib/technical_analysis/indicators/wr.rb', line 52 def self.calculate(data, period: 14) period = period.to_i Validation.validate_numeric_data(data, :high, :low, :close) 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 << { high: v[:high], low: v[:low] } if period_values.size == period lowest_low = period_values.map { |pv| pv[:low] }.min highest_high = period_values.map { |pv| pv[:high] }.max wr = (highest_high - v[:close]) / (highest_high - lowest_low) * -100 output << WrValue.new(date_time: v[:date_time], wr: wr) period_values.shift end end output.sort_by(&:date_time).reverse end |