quantitative 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +3 -1
  3. data/lib/quant/asset.rb +0 -2
  4. data/lib/quant/dominant_cycles_source.rb +1 -32
  5. data/lib/quant/experimental.rb +3 -1
  6. data/lib/quant/indicators/adx.rb +3 -10
  7. data/lib/quant/indicators/atr.rb +3 -4
  8. data/lib/quant/indicators/cci.rb +3 -1
  9. data/lib/quant/indicators/decycler.rb +3 -1
  10. data/lib/quant/indicators/dominant_cycles/acr.rb +5 -6
  11. data/lib/quant/indicators/dominant_cycles/band_pass.rb +4 -4
  12. data/lib/quant/indicators/dominant_cycles/differential.rb +4 -2
  13. data/lib/quant/indicators/dominant_cycles/dominant_cycle.rb +2 -4
  14. data/lib/quant/indicators/dominant_cycles/half_period.rb +4 -4
  15. data/lib/quant/indicators/dominant_cycles/homodyne.rb +4 -5
  16. data/lib/quant/indicators/dominant_cycles/phase_accumulator.rb +4 -4
  17. data/lib/quant/indicators/ema.rb +67 -0
  18. data/lib/quant/indicators/frama.rb +2 -1
  19. data/lib/quant/indicators/indicator.rb +5 -1
  20. data/lib/quant/indicators/indicator_point.rb +1 -1
  21. data/lib/quant/indicators/mama.rb +3 -1
  22. data/lib/quant/indicators/mesa.rb +4 -5
  23. data/lib/quant/indicators/ping.rb +3 -1
  24. data/lib/quant/indicators/pivots/atr.rb +3 -2
  25. data/lib/quant/indicators/pivots/bollinger.rb +4 -2
  26. data/lib/quant/indicators/pivots/camarilla.rb +3 -5
  27. data/lib/quant/indicators/pivots/classic.rb +4 -2
  28. data/lib/quant/indicators/pivots/demark.rb +4 -2
  29. data/lib/quant/indicators/pivots/donchian.rb +3 -2
  30. data/lib/quant/indicators/pivots/fibbonacci.rb +4 -2
  31. data/lib/quant/indicators/pivots/guppy.rb +5 -3
  32. data/lib/quant/indicators/pivots/keltner.rb +3 -2
  33. data/lib/quant/indicators/pivots/murrey.rb +4 -3
  34. data/lib/quant/indicators/pivots/pivot.rb +109 -0
  35. data/lib/quant/indicators/pivots/traditional.rb +4 -2
  36. data/lib/quant/indicators/pivots/woodie.rb +5 -3
  37. data/lib/quant/indicators/rocket_rsi.rb +57 -0
  38. data/lib/quant/indicators/roofing.rb +59 -0
  39. data/lib/quant/indicators/rsi.rb +67 -0
  40. data/lib/quant/indicators/snr.rb +64 -0
  41. data/lib/quant/indicators.rb +6 -0
  42. data/lib/quant/indicators_registry.rb +63 -0
  43. data/lib/quant/indicators_source.rb +14 -10
  44. data/lib/quant/mixins/filters.rb +0 -3
  45. data/lib/quant/mixins/moving_averages.rb +0 -3
  46. data/lib/quant/pivots_source.rb +1 -13
  47. data/lib/quant/ticks/ohlc.rb +0 -2
  48. data/lib/quant/ticks/spot.rb +0 -2
  49. data/lib/quant/version.rb +1 -1
  50. data/lib/quantitative.rb +29 -6
  51. metadata +25 -5
  52. data/lib/quant/indicators/pivot.rb +0 -107
  53. data/quantitative.gemspec +0 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '06693d3511af25d58463fd872f004265889bb0c8d8344dd4fc8436bd4a66f63b'
4
- data.tar.gz: b1e7db72820532999567608e1d3b864a7e4b1029b363de4c05c1032b177abc5a
3
+ metadata.gz: 8908c3b863d42be9e0c27fcce1dc57a7b0f0b2f4699cb559140eca1caa717223
4
+ data.tar.gz: 2fda3094ef0da147ed1aef5c5aa6b3020f3de426e885562dab714ed00d3bac43
5
5
  SHA512:
6
- metadata.gz: 6dcc22eaa684535f9452287e1a486d2de3bc3d38b12be207130e62fb0264ea90087e20c9a9693952b8be3030738a3eebd8681813ccf2f0c2838aa9c33c9ad7b1
7
- data.tar.gz: 05d9470a2c3426c46b6e64113b728672d841640dea56887d1efc9fcd9c7839b561f09cb2da4d6453bd339222bd07f48885bbae443e55646b90b855cd6bec716f
6
+ metadata.gz: a35fa3205f447fa5b43a52c7725b3ee3fe3c576c5663e2a5cb29fb67325ca11ee4bea24e80bc93510f7d0c22c5bce706fb809a0e8b9a73bfe00a831f28e875ca
7
+ data.tar.gz: 1f31136c06beacee9276208a2e9a6bdaebd4c60930ece409b552581dea19b27e38231680ab7699e985cf1040b12d4ac0819510bc748c364051033b3bcd0e4017
data/Gemfile.lock CHANGED
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- quantitative (0.3.0)
4
+ quantitative (0.3.2)
5
5
  oj (~> 3.10)
6
+ zeitwerk (~> 2.6)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
@@ -126,6 +127,7 @@ GEM
126
127
  unicode-display_width (2.5.0)
127
128
  vernier (0.5.1)
128
129
  yard (0.9.34)
130
+ zeitwerk (2.6.15)
129
131
 
130
132
  PLATFORMS
131
133
  arm64-darwin-22
data/lib/quant/asset.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "asset_class"
4
-
5
3
  module Quant
6
4
  # A {Quant::Asset} is a representation of a financial instrument such as a stock, option, future, or currency.
7
5
  # It is used to represent the instrument that is being traded, analyzed, or managed.
@@ -17,40 +17,9 @@ module Quant
17
17
  class DominantCyclesSource
18
18
  def initialize(indicator_source:)
19
19
  @indicator_source = indicator_source
20
+ indicator_source.define_indicator_accessors(indicator_source: self)
20
21
  end
21
22
 
22
- # Auto-Correlation Reversals is a method of computing the dominant cycle
23
- # by correlating the data stream with itself delayed by a lag.
24
- def acr; indicator(Indicators::DominantCycles::Acr) end
25
-
26
- # The band-pass dominant cycle passes signals within a certain frequency
27
- # range, and attenuates signals outside that range.
28
- # The trend component of the signal is removed, leaving only the cyclical
29
- # component. Then we count number of iterations between zero crossings
30
- # and this is the `period` of the dominant cycle.
31
- def band_pass; indicator(Indicators::DominantCycles::BandPass) end
32
-
33
- # The Dual Differentiator algorithm computes the phase angle from the
34
- # analytic signal as the arctangent of the ratio of the imaginary
35
- # component to the real component. Further, the angular frequency
36
- # is defined as the rate change of phase. We can use these facts to
37
- # derive the cycle period.
38
- def differential; indicator(Indicators::DominantCycles::Differential) end
39
-
40
- # Static, arbitrarily set period.
41
- def half_period; indicator(Indicators::DominantCycles::HalfPeriod) end
42
-
43
- # Homodyne means the signal is multiplied by itself. More precisely,
44
- # we want to multiply the signal of the current bar with the complex
45
- # value of the signal one bar ago
46
- def homodyne; indicator(Indicators::DominantCycles::Homodyne) end
47
-
48
- # The phase accumulation method of computing the dominant cycle measures
49
- # the phase at each sample by taking the arctangent of the ratio of the
50
- # quadrature component to the in-phase component. The phase is then
51
- # accumulated and the period is derived from the phase.
52
- def phase_accumulator; indicator(Indicators::DominantCycles::PhaseAccumulator) end
53
-
54
23
  private
55
24
 
56
25
  def indicator(indicator_class)
@@ -14,7 +14,9 @@ module Quant
14
14
  end
15
15
  end
16
16
 
17
- def self.experimental(message)
17
+ module_function
18
+
19
+ def experimental(message)
18
20
  return if Experimental.rspec_defined?
19
21
  return if Experimental.tracker[caller.first]
20
22
 
@@ -1,11 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "indicator_point"
4
- require_relative "indicator"
5
- require_relative "atr"
6
-
7
3
  module Quant
8
- class Indicators
4
+ module Indicators
9
5
  class AdxPoint < IndicatorPoint
10
6
  attribute :dmu, default: 0.0
11
7
  attribute :dmd, default: 0.0
@@ -25,12 +21,9 @@ module Quant
25
21
  end
26
22
 
27
23
  class Adx < Indicator
24
+ register name: :adx
28
25
  depends_on Indicators::Atr
29
26
 
30
- def alpha
31
- bars_to_alpha(dc_period)
32
- end
33
-
34
27
  def scale
35
28
  1.0
36
29
  end
@@ -75,7 +68,7 @@ module Quant
75
68
  p0.di_ema = three_pole_super_smooth(:di, period:, previous: :di_ema).clamp(-10.0, 10.0)
76
69
 
77
70
  p0.value = p0.di_ema
78
- p0.inst_stoch = stochastic :di, period: dc_period
71
+ p0.inst_stoch = stochastic(:di, period:)
79
72
  p0.stoch = three_pole_super_smooth :inst_stoch, period:, previous: :stoch
80
73
  end
81
74
  end
@@ -1,10 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "indicator_point"
4
- require_relative "indicator"
5
-
6
3
  module Quant
7
- class Indicators
4
+ module Indicators
8
5
  class AtrPoint < IndicatorPoint
9
6
  attribute :tr, default: 0.0
10
7
  attribute :period, default: :min_period
@@ -28,6 +25,8 @@ module Quant
28
25
  end
29
26
 
30
27
  class Atr < Indicator
28
+ register name: :atr
29
+
31
30
  attr_reader :points
32
31
 
33
32
  def period
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
4
+ module Indicators
5
5
  class CciPoint < IndicatorPoint
6
6
  attribute :hp, default: 0.0
7
7
  attribute :real, default: 0.0
@@ -18,6 +18,8 @@ module Quant
18
18
  #
19
19
  # SOURCE: https://www.mesasoftware.com/papers/CORRELATION%20AS%20A%20CYCLE%20INDICATOR.pdf
20
20
  class Cci < Indicator
21
+ register name: :cci
22
+
21
23
  def max_period
22
24
  [min_period, dc_period].max
23
25
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
4
+ module Indicators
5
5
  # The decycler oscillator can be useful for determining the transition be- tween uptrends and downtrends by the crossing of the zero
6
6
  # line. Alternatively, the changes of slope of the decycler oscillator are easier to identify than the changes in slope of the
7
7
  # original decycler. Optimum cutoff periods can easily be found by experimentation.
@@ -24,6 +24,8 @@ module Quant
24
24
  end
25
25
 
26
26
  class Decycler < Indicator
27
+ register name: :decycler
28
+
27
29
  def max_period
28
30
  dc_period
29
31
  end
@@ -1,12 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../indicator_point"
4
- require_relative "dominant_cycle"
5
-
6
3
  module Quant
7
- class Indicators
8
- class DominantCycles
9
- class AcrPoint < DominantCyclePoint
4
+ module Indicators
5
+ module DominantCycles
6
+ class AcrPoint < Quant::Indicators::IndicatorPoint
10
7
  attribute :hp, default: 0.0
11
8
  attribute :filter, default: 0.0
12
9
  attribute :interim_period, default: 0.0
@@ -31,6 +28,8 @@ module Quant
31
28
  # The cyclic information is extracted using a discrete Fourier transform
32
29
  # (DFT) of the autocorrelation results.
33
30
  class Acr < DominantCycle
31
+ register name: :acr
32
+
34
33
  BANDWIDTH_DEGREES = 370
35
34
  BANDWIDTH_RADIANS = BANDWIDTH_DEGREES * Math::PI / 180.0
36
35
 
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "dominant_cycle"
4
-
5
3
  module Quant
6
- class Indicators
7
- class DominantCycles
4
+ module Indicators
5
+ module DominantCycles
8
6
  class BandPassPoint < Quant::Indicators::IndicatorPoint
9
7
  attribute :hp, default: 0.0
10
8
  attribute :bp, default: 0.0
@@ -22,6 +20,8 @@ module Quant
22
20
  # component. Then we count number of iterations between zero crossings
23
21
  # and this is the `period` of the dominant cycle.
24
22
  class BandPass < DominantCycle
23
+ register name: :band_pass
24
+
25
25
  def bandwidth
26
26
  0.75
27
27
  end
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
5
- class DominantCycles
4
+ module Indicators
5
+ module DominantCycles
6
6
  # The Dual Differentiator algorithm computes the phase angle from the
7
7
  # analytic signal as the arctangent of the ratio of the imaginary
8
8
  # component to the real component. Further, the angular frequency
9
9
  # is defined as the rate change of phase. We can use these facts to
10
10
  # derive the cycle period.
11
11
  class Differential < DominantCycle
12
+ register name: :differential
13
+
12
14
  def compute_period
13
15
  p0.ddd = (p0.q2 * (p0.i2 - p1.i2)) - (p0.i2 * (p0.q2 - p1.q2))
14
16
  p0.inst_period = p0.ddd > 0.01 ? 6.2832 * (p0.i2**2 + p0.q2**2) / p0.ddd : 0.0
@@ -1,9 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../indicator"
4
-
5
3
  module Quant
6
- class Indicators
4
+ module Indicators
7
5
  # Dominant Cycles measure the primary cycle within a given range. By default, the library
8
6
  # is wired to look for cycles between 10 and 48 bars. These values can be adjusted by setting
9
7
  # the `min_period` and `max_period` configuration values in {Quant::Config}.
@@ -18,7 +16,7 @@ module Quant
18
16
  # The purpose of these indicators is to compute the dominant cycle and underpin the various
19
17
  # indicators that would otherwise be setting an arbitrary lookback period. This makes the
20
18
  # indicators adaptive and auto-tuning to the market dynamics. Or so the theory goes!
21
- class DominantCycles
19
+ module DominantCycles
22
20
  class DominantCyclePoint < Quant::Indicators::IndicatorPoint
23
21
  attribute :smooth, default: 0.0
24
22
  attribute :detrend, default: 0.0
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "dominant_cycle"
4
-
5
3
  module Quant
6
- class Indicators
7
- class DominantCycles
4
+ module Indicators
5
+ module DominantCycles
8
6
  # This dominant cycle indicator is based on the half period
9
7
  # that is the midpoint of the `min_period` and `max_period`
10
8
  # configured in the `Quant.config.indicators` object.
@@ -14,6 +12,8 @@ module Quant
14
12
  end
15
13
 
16
14
  class HalfPeriod < DominantCycle
15
+ register name: :half_period
16
+
17
17
  def compute
18
18
  # No-Op
19
19
  end
@@ -1,15 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../indicator_point"
4
- require_relative "dominant_cycle"
5
-
6
3
  module Quant
7
- class Indicators
8
- class DominantCycles
4
+ module Indicators
5
+ module DominantCycles
9
6
  # Homodyne means the signal is multiplied by itself. More precisely,
10
7
  # we want to multiply the signal of the current bar with the complex
11
8
  # value of the signal one bar ago
12
9
  class Homodyne < DominantCycle
10
+ register name: :homodyne
11
+
13
12
  def compute_period
14
13
  p0.re = (p0.i2 * p1.i2) + (p0.q2 * p1.q2)
15
14
  p0.im = (p0.i2 * p1.q2) - (p0.q2 * p1.i2)
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "dominant_cycle"
4
-
5
3
  module Quant
6
- class Indicators
7
- class DominantCycles
4
+ module Indicators
5
+ module DominantCycles
8
6
  # The phase accumulation method of computing the dominant cycle is perhaps
9
7
  # the easiest to comprehend. In this technique, we measure the phase
10
8
  # at each sample by taking the arctangent of the ratio of the quadrature
@@ -26,6 +24,8 @@ module Quant
26
24
  # Therefore, shorter cycle periods necessarily have a higher output
27
25
  # signal-to-noise ratio.
28
26
  class PhaseAccumulator < DominantCycle
27
+ register name: :phase_accumulator
28
+
29
29
  def compute_period
30
30
  p0.i1 = 0.15 * p0.i1 + 0.85 * p1.i1
31
31
  p0.q1 = 0.15 * p0.q1 + 0.85 * p1.q1
@@ -0,0 +1,67 @@
1
+ module Quant
2
+ module Indicators
3
+ class EmaPoint < IndicatorPoint
4
+ attribute :ss_dc_period, default: :input
5
+ attribute :ss_half_dc_period, default: :input
6
+ attribute :ss_micro_period, default: :input
7
+ attribute :ss_min_period, default: :input
8
+ attribute :ss_half_period, default: :input
9
+ attribute :ss_max_period, default: :input
10
+
11
+ attribute :ema_dc_period, default: :input
12
+ attribute :ema_half_dc_period, default: :input
13
+ attribute :ema_micro_period, default: :input
14
+ attribute :ema_min_period, default: :input
15
+ attribute :ema_half_period, default: :input
16
+ attribute :ema_max_period, default: :input
17
+
18
+ attribute :osc_dc_period, default: 0.0
19
+ attribute :osc_half_dc_period, default: 0.0
20
+ attribute :osc_micro_period, default: 0.0
21
+ attribute :osc_min_period, default: 0.0
22
+ attribute :osc_half_period, default: 0.0
23
+ attribute :osc_max_period, default: 0.0
24
+ end
25
+
26
+ class Ema < Indicator
27
+ register name: :ema
28
+
29
+ def half_dc_period
30
+ dc_period / 2
31
+ end
32
+
33
+ def compute_super_smoothers
34
+ p0.ss_dc_period = super_smoother :input, previous: :ss_dc_period, period: dc_period
35
+ p0.ss_half_dc_period = super_smoother :input, previous: :ss_half_dc_period, period: half_dc_period
36
+ p0.ss_micro_period = super_smoother :input, previous: :ss_micro_period, period: micro_period
37
+ p0.ss_min_period = super_smoother :input, previous: :ss_min_period, period: min_period
38
+ p0.ss_half_period = super_smoother :input, previous: :ss_half_period, period: half_period
39
+ p0.ss_max_period = super_smoother :input, previous: :ss_max_period, period: max_period
40
+ end
41
+
42
+ def compute_emas
43
+ p0.ema_dc_period = ema :input, previous: :ema_dc_period, period: dc_period
44
+ p0.ema_half_dc_period = ema :input, previous: :ema_half_dc_period, period: half_dc_period
45
+ p0.ema_micro_period = ema :input, previous: :ema_micro_period, period: micro_period
46
+ p0.ema_min_period = ema :input, previous: :ema_min_period, period: min_period
47
+ p0.ema_half_period = ema :input, previous: :ema_half_period, period: half_period
48
+ p0.ema_max_period = ema :input, previous: :ema_max_period, period: max_period
49
+ end
50
+
51
+ def compute_oscillators
52
+ p0.osc_dc_period = p0.ss_dc_period - p0.ema_dc_period
53
+ p0.osc_half_dc_period = p0.ss_half_dc_period - p0.ema_half_dc_period
54
+ p0.osc_micro_period = p0.ss_micro_period - p0.ema_micro_period
55
+ p0.osc_min_period = p0.ss_min_period - p0.ema_min_period
56
+ p0.osc_half_period = p0.ss_half_period - p0.ema_half_period
57
+ p0.osc_max_period = p0.ss_max_period - p0.ema_max_period
58
+ end
59
+
60
+ def compute
61
+ compute_super_smoothers
62
+ compute_emas
63
+ compute_oscillators
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
4
+ module Indicators
5
5
  class FramaPoint < IndicatorPoint
6
6
  attribute :frama, default: :input
7
7
  attribute :dimension, default: 0.0
@@ -15,6 +15,7 @@ module Quant
15
15
  #
16
16
  # SOURCE: http://www.mesasoftware.com/papers/FRAMA.pdf
17
17
  class Frama < Indicator
18
+ register name: :frama
18
19
  using Quant
19
20
 
20
21
  # The max_period is divided into two smaller, equal periods, so must be even
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
4
+ module Indicators
5
5
  # The {Quant::Indicators::Indicator} class is the abstract ancestor for all Indicators.
6
6
  #
7
7
  class Indicator
@@ -15,6 +15,10 @@ module Quant
15
15
  include Mixins::FisherTransform
16
16
  # include Mixins::Direction
17
17
 
18
+ def self.register(name:)
19
+ Quant::IndicatorsSource.register(name:, indicator_class: self)
20
+ end
21
+
18
22
  # Provides a registry of dependent indicators for each indicator class.
19
23
  # NOTE: Internal use only.
20
24
  def self.dependent_indicator_classes
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
4
+ module Indicators
5
5
  class IndicatorPoint
6
6
  include Quant::Attributes
7
7
  extend Forwardable
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
4
+ module Indicators
5
5
  class MamaPoint < IndicatorPoint
6
6
  attribute :smooth, default: 0.0
7
7
  attribute :detrend, default: 0.0
@@ -46,6 +46,8 @@ module Quant
46
46
  # dominant cycle indicator other than the homodyne for the rest
47
47
  # of your indicators.
48
48
  class Mama < Indicator
49
+ register name: :mama
50
+
49
51
  # constrain between 6 and 50 bars
50
52
  def constrain_period_bars
51
53
  p0.period = p0.period.clamp(min_period, max_period)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
4
+ module Indicators
5
5
  # The MESA inidicator
6
6
  class MesaPoint < IndicatorPoint
7
7
  attribute :mama, default: :input
@@ -33,12 +33,11 @@ module Quant
33
33
  # indicators for the dominant cycle, then this version is useful
34
34
  # as it avoids extra computational steps.
35
35
  class Mesa < Indicator
36
- def period
37
- dc_period
38
- end
36
+ register name: :mesa
37
+ depends_on DominantCycles::Homodyne
39
38
 
40
39
  def fast_limit
41
- @fast_limit ||= bars_to_alpha(min_period / 2)
40
+ @fast_limit ||= bars_to_alpha(micro_period)
42
41
  end
43
42
 
44
43
  def slow_limit
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
4
+ module Indicators
5
5
  # A simple point used primarily to test the indicator system in unit tests.
6
6
  # It has a simple computation that just sets the pong value to the input value
7
7
  # and increments the compute_count by 1 each time compute is called.
@@ -13,6 +13,8 @@ module Quant
13
13
 
14
14
  # A simple idicator used primarily to test the indicator system
15
15
  class Ping < Indicator
16
+ register name: :ping
17
+
16
18
  def compute
17
19
  p0.pong = input
18
20
  p0.compute_count += 1
@@ -1,7 +1,8 @@
1
1
  module Quant
2
- class Indicators
3
- class Pivots
2
+ module Indicators
3
+ module Pivots
4
4
  class Atr < Pivot
5
+ register name: :atr
5
6
  depends_on Indicators::Atr
6
7
 
7
8
  def atr_point
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
5
- class Pivots
4
+ module Indicators
5
+ module Pivots
6
6
  class Bollinger < Pivot
7
+ register name: :bollinger
8
+
7
9
  using Quant
8
10
 
9
11
  def compute_midpoint
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
5
- class Pivots
4
+ module Indicators
5
+ module Pivots
6
6
  # Camarilla pivot point calculations are rather straightforward. We need to
7
7
  # input the previous day’s open, high, low and close. The formulas for each
8
8
  # resistance and support level are:
@@ -27,9 +27,7 @@ module Quant
27
27
  # S5 = S4 – 1.168 * (S3 – S4)
28
28
  # S6 = Close – (R6 – Close)
29
29
  class Camarilla < Pivot
30
- def multiplier
31
- 1.1
32
- end
30
+ register name: :camarilla
33
31
 
34
32
  def compute_midpoint
35
33
  p0.midpoint = t0.close_price
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
5
- class Pivots
4
+ module Indicators
5
+ module Pivots
6
6
  class Classic < Pivot
7
+ register name: :classic
8
+
7
9
  def compute_midpoint
8
10
  p0.midpoint = super_smoother :input, previous: :midpoint, period: averaging_period
9
11
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
5
- class Pivots
4
+ module Indicators
5
+ module Pivots
6
6
  # The value of X in the formula below depends on where the Close of the market is.
7
7
  # If Close = Open then X = (H + L + (C * 2))
8
8
 
@@ -14,6 +14,8 @@ module Quant
14
14
  # PP = X / 4 (this is not an official DeMark number but merely a reference point based on the calculation of X)
15
15
  # S1 = X / 2 - H
16
16
  class Demark < Pivot
17
+ register name: :demark
18
+
17
19
  def averaging_period
18
20
  min_period / 2
19
21
  end
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quant
4
- class Indicators
5
- class Pivots
4
+ module Indicators
5
+ module Pivots
6
6
  class Donchian < Pivot
7
+ register name: :donchian
7
8
  using Quant
8
9
 
9
10
  def st_period; min_period end
@@ -1,7 +1,9 @@
1
1
  module Quant
2
- class Indicators
3
- class Pivots
2
+ module Indicators
3
+ module Pivots
4
4
  class Fibbonacci < Pivot
5
+ register name: :fibbonacci
6
+
5
7
  def averaging_period
6
8
  half_period
7
9
  end
@@ -1,7 +1,9 @@
1
1
  module Quant
2
- class Indicators
3
- class Pivots
2
+ module Indicators
3
+ module Pivots
4
4
  class Guppy < Pivot
5
+ register name: :guppy
6
+
5
7
  def guppy_ema(period, band)
6
8
  return p0.input unless p1[band]
7
9
 
@@ -15,7 +17,7 @@ module Quant
15
17
 
16
18
  # The short-term MAs are typically set at 3, 5, 8, 10, 12, and 15 periods. The
17
19
  # longer-term MAs are typically set at 30, 35, 40, 45, 50, and 60.
18
- def compute
20
+ def compute_bands
19
21
  p0[1] = guppy_ema(5, 1)
20
22
  p0[2] = guppy_ema(8, 2)
21
23
  p0[3] = guppy_ema(10, 3)
@@ -1,7 +1,8 @@
1
1
  module Quant
2
- class Indicators
3
- class Pivots
2
+ module Indicators
3
+ module Pivots
4
4
  class Keltner < Pivot
5
+ register name: :keltner
5
6
  depends_on Indicators::Atr
6
7
 
7
8
  def atr_point