Method: TechnicalAnalysis::Trix.calculate
- Defined in:
- lib/technical_analysis/indicators/trix.rb
.calculate(data, period: 15, price_key: :value) ⇒ Array<TrixValue>
Calculates the triple exponential average (Trix) for the data over the given period en.wikipedia.org/wiki/Trix_(technical_analysis)
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/technical_analysis/indicators/trix.rb', line 53 def self.calculate(data, period: 15, 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] } ema1 = [] ema2 = [] ema3 = [] output = [] period_values = [] data.each do |v| price = v[price_key] period_values << price if period_values.size == period ema1_value = StockCalculation.ema(price, period_values, period, ema1.last) ema1 << ema1_value if ema1.size == period ema2_value = StockCalculation.ema(ema1_value, ema1, period, ema2.last) ema2 << ema2_value if ema2.size == period ema3_value = StockCalculation.ema(ema2_value, ema2, period, ema3.last) ema3 << ema3_value if ema3.size == 2 prev_ema3, current_ema3 = ema3 trix = ((current_ema3 - prev_ema3) / prev_ema3) output << TrixValue.new(date_time: v[:date_time], trix: trix) ema3.shift end ema2.shift end ema1.shift end period_values.shift end end output.sort_by(&:date_time).reverse end |