Class: TechnicalAnalysis::Trix

Inherits:
Indicator show all
Defined in:
lib/technical_analysis/indicators/trix.rb

Overview

Triple Exponential Average

Class Method Summary collapse

Methods inherited from Indicator

find, roster

Class Method Details

.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

.indicator_nameString

Returns the name of the technical indicator



15
16
17
# File 'lib/technical_analysis/indicators/trix.rb', line 15

def self.indicator_name
  "Triple Exponential Average"
end

.indicator_symbolString

Returns the symbol of the technical indicator



8
9
10
# File 'lib/technical_analysis/indicators/trix.rb', line 8

def self.indicator_symbol
  "trix"
end

.min_data_size(period: 15, **params) ⇒ Integer

Calculates the minimum number of observations needed to calculate the technical indicator



41
42
43
# File 'lib/technical_analysis/indicators/trix.rb', line 41

def self.min_data_size(period: 15, **params)
  (period.to_i * 3) - 1
end

.valid_optionsArray

Returns an array of valid keys for options for this technical indicator



22
23
24
# File 'lib/technical_analysis/indicators/trix.rb', line 22

def self.valid_options
  i(period price_key)
end

.validate_options(options) ⇒ Boolean

Validates the provided options for this technical indicator



31
32
33
# File 'lib/technical_analysis/indicators/trix.rb', line 31

def self.validate_options(options)
  Validation.validate_options(options, valid_options)
end