Class: TechnicalAnalysis::Sma

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

Overview

Simple Moving Average

Class Method Summary collapse

Methods inherited from Indicator

find, roster

Class Method Details

.calculate(data, period: 30, price_key: :value, date_time_key: :date_time) ⇒ Array<SmaValue>

Calculates the simple moving average (SMA) for the data over the given period en.wikipedia.org/wiki/Moving_average#Simple_moving_average

Parameters:

  • data (Array)

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

  • period (Integer) (defaults to: 30)

    The given period to calculate the SMA

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

    The hash key for the price data. Default :value

  • date_time_key (Symbol) (defaults to: :date_time)

    The hash key for the date time data. Default :date_time

Returns:

  • (Array<SmaValue>)

    An array of SmaValue instances



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/technical_analysis/indicators/sma.rb', line 54

def self.calculate(data, period: 30, price_key: :value, date_time_key: :date_time)
  period = period.to_i
  price_key = price_key.to_sym
  date_time_key = date_time_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, date_time_key)

  data = data.sort_by { |row| row[date_time_key] }

  output = []
  period_values = []

  data.each do |v|
    period_values << v[price_key]
    if period_values.size == period
      output << SmaValue.new(date_time: v[date_time_key], sma: ArrayHelper.average(period_values))
      period_values.shift
    end
  end

  output.sort_by(&:date_time).reverse
end

.indicator_nameString

Returns the name of the technical indicator

Returns:

  • (String)

    A string of the name of the technical indicator



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

def self.indicator_name
  "Simple Moving Average"
end

.indicator_symbolString

Returns the symbol of the technical indicator

Returns:

  • (String)

    A string of the symbol of the technical indicator



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

def self.indicator_symbol
  "sma"
end

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

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

Parameters:

  • options (Hash)

    The options for the technical indicator

Returns:

  • (Integer)

    Returns the minimum number of observations needed to calculate the technical indicator based on the options provided



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

def self.min_data_size(period: 30, **params)
  period.to_i
end

.valid_optionsArray

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

Returns:

  • (Array)

    An array of keys as symbols for valid options for this technical indicator



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

def self.valid_options
  %i(period price_key date_time_key)
end

.validate_options(options) ⇒ Boolean

Validates the provided options for this technical indicator

Parameters:

  • options (Hash)

    The options for the technical indicator to be validated

Returns:

  • (Boolean)

    Returns true if options are valid or raises a ValidationError if they’re not



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

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