quantitative 0.3.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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