Class: Quant::Indicators::Indicator

Inherits:
Object
  • Object
show all
Includes:
Enumerable, Mixins::Filters, Mixins::FisherTransform, Mixins::Functions, Mixins::HilbertTransform, Mixins::MovingAverages, Mixins::Stochastic, Mixins::SuperSmoother
Defined in:
lib/quant/indicators/indicator.rb

Direct Known Subclasses

DominantCycles::DominantCycle, Ping

Constant Summary

Constants included from Mixins::UniversalFilters

Mixins::UniversalFilters::K

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Mixins::FisherTransform

#fisher_transform, #inverse_fisher_transform, #relative_fisher_transform

Methods included from Mixins::Stochastic

#stochastic

Methods included from Mixins::SuperSmoother

#three_pole_super_smooth, #two_pole_super_smooth

Methods included from Mixins::HilbertTransform

#hilbert_transform

Methods included from Mixins::ExponentialMovingAverage

#exponential_moving_average

Methods included from Mixins::SimpleMovingAverage

#simple_moving_average

Methods included from Mixins::WeightedMovingAverage

#extended_weighted_moving_average, #weighted_moving_average

Methods included from Mixins::UniversalFilters

#universal_band_pass, #universal_ema, #universal_filter, #universal_one_pole_high_pass, #universal_one_pole_low_pass, #universal_two_pole_high_pass, #universal_two_pole_low_pass

Methods included from Mixins::ButterworthFilters

#three_pole_butterworth, #two_pole_butterworth

Methods included from Mixins::HighPassFilters

#high_pass_filter, #hpf2, #two_pole_high_pass_filter

Methods included from Mixins::Functions

#angle, #bars_to_alpha, #deg2rad, #period_to_alpha, #rad2deg

Constructor Details

#initialize(series:, source:) ⇒ Indicator

Returns a new instance of Indicator.



18
19
20
21
22
23
24
# File 'lib/quant/indicators/indicator.rb', line 18

def initialize(series:, source:)
  @series = series
  @source = source
  @points = {}
  series.new_indicator(self)
  series.each { |tick| self << tick }
end

Instance Attribute Details

#p0Object (readonly)

Returns the value of attribute p0.



74
75
76
# File 'lib/quant/indicators/indicator.rb', line 74

def p0
  @p0
end

#p1Object (readonly)

Returns the value of attribute p1.



74
75
76
# File 'lib/quant/indicators/indicator.rb', line 74

def p1
  @p1
end

#p2Object (readonly)

Returns the value of attribute p2.



74
75
76
# File 'lib/quant/indicators/indicator.rb', line 74

def p2
  @p2
end

#p3Object (readonly)

Returns the value of attribute p3.



74
75
76
# File 'lib/quant/indicators/indicator.rb', line 74

def p3
  @p3
end

#seriesObject (readonly)

include Mixins::Direction



16
17
18
# File 'lib/quant/indicators/indicator.rb', line 16

def series
  @series
end

#sourceObject (readonly)

include Mixins::Direction



16
17
18
# File 'lib/quant/indicators/indicator.rb', line 16

def source
  @source
end

#t0Object (readonly)

Returns the value of attribute t0.



75
76
77
# File 'lib/quant/indicators/indicator.rb', line 75

def t0
  @t0
end

#t1Object (readonly)

Returns the value of attribute t1.



75
76
77
# File 'lib/quant/indicators/indicator.rb', line 75

def t1
  @t1
end

#t2Object (readonly)

Returns the value of attribute t2.



75
76
77
# File 'lib/quant/indicators/indicator.rb', line 75

def t2
  @t2
end

#t3Object (readonly)

Returns the value of attribute t3.



75
76
77
# File 'lib/quant/indicators/indicator.rb', line 75

def t3
  @t3
end

Instance Method Details

#<<(tick) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/quant/indicators/indicator.rb', line 77

def <<(tick)
  @t0 = tick
  @p0 = points_class.new(indicator: self, tick:, source:)
  @points[tick] = @p0

  @p1 = values[-2] || @p0
  @p2 = values[-3] || @p1
  @p3 = values[-4] || @p2

  @t1 = ticks[-2] || @t0
  @t2 = ticks[-3] || @t1
  @t3 = ticks[-4] || @t2

  compute
end

#[](index) ⇒ Object



62
63
64
# File 'lib/quant/indicators/indicator.rb', line 62

def [](index)
  values[index]
end

#computeObject

Raises:

  • (NotImplementedError)


101
102
103
# File 'lib/quant/indicators/indicator.rb', line 101

def compute
  raise NotImplementedError
end

#dc_periodObject



54
55
56
# File 'lib/quant/indicators/indicator.rb', line 54

def dc_period
  dominant_cycle.points[t0].period
end

#dominant_cycleObject



50
51
52
# File 'lib/quant/indicators/indicator.rb', line 50

def dominant_cycle
  series.indicators[source].dominant_cycle
end

#dominant_cycle_kindObject



42
43
44
# File 'lib/quant/indicators/indicator.rb', line 42

def dominant_cycle_kind
  Quant.config.indicators.dominant_cycle_kind
end

#each(&block) ⇒ Object



93
94
95
# File 'lib/quant/indicators/indicator.rb', line 93

def each(&block)
  @points.each_value(&block)
end

#half_periodObject



34
35
36
# File 'lib/quant/indicators/indicator.rb', line 34

def half_period
  Quant.config.indicators.half_period
end

#indicator_nameObject



105
106
107
# File 'lib/quant/indicators/indicator.rb', line 105

def indicator_name
  self.class.name.split("::").last
end

#inputNumeric

The input is the value derived from the source for the indicator for the current tick. For example, if the source is :oc2, then the input is the value of the current tick’s (open + close) / 2

Returns:

  • (Numeric)


140
141
142
# File 'lib/quant/indicators/indicator.rb', line 140

def input
  t0.send(source)
end

#inspectObject



97
98
99
# File 'lib/quant/indicators/indicator.rb', line 97

def inspect
  "#<#{self.class.name} symbol=#{series.symbol} source=#{source} ticks=#{ticks.size}>"
end

#max_periodObject



30
31
32
# File 'lib/quant/indicators/indicator.rb', line 30

def max_period
  Quant.config.indicators.max_period
end

#micro_periodObject



38
39
40
# File 'lib/quant/indicators/indicator.rb', line 38

def micro_period
  Quant.config.indicators.micro_period
end

#min_periodObject



26
27
28
# File 'lib/quant/indicators/indicator.rb', line 26

def min_period
  Quant.config.indicators.min_period
end

#p(offset) ⇒ Object

p(0) => values p(1) => values p(2) => values p(3) => values

Raises:

  • (ArgumentError)


117
118
119
120
121
122
# File 'lib/quant/indicators/indicator.rb', line 117

def p(offset)
  raise ArgumentError, "offset must be a positive value" if offset < 0

  index = offset + 1
  values[[-index, -size].max]
end

#pivot_kindObject



46
47
48
# File 'lib/quant/indicators/indicator.rb', line 46

def pivot_kind
  Quant.config.indicators.pivot_kind
end

#points_classObject



109
110
111
# File 'lib/quant/indicators/indicator.rb', line 109

def points_class
  Object.const_get "Quant::Indicators::#{indicator_name}Point"
end

#sizeObject



70
71
72
# File 'lib/quant/indicators/indicator.rb', line 70

def size
  @points.size
end

#t(offset) ⇒ Object

t(0) => ticks t(1) => ticks t(2) => ticks t(3) => ticks

Raises:

  • (ArgumentError)


128
129
130
131
132
133
# File 'lib/quant/indicators/indicator.rb', line 128

def t(offset)
  raise ArgumentError, "offset must be a positive value" if offset < 0

  index = offset + 1
  ticks[[-index, -size].max]
end

#ticksObject



58
59
60
# File 'lib/quant/indicators/indicator.rb', line 58

def ticks
  @points.keys
end

#valuesObject



66
67
68
# File 'lib/quant/indicators/indicator.rb', line 66

def values
  @points.values
end