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