quantitative 0.3.1 → 0.3.3
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/quant/dominant_cycles_source.rb +1 -32
- data/lib/quant/indicators/adx.rb +2 -5
- data/lib/quant/indicators/atr.rb +2 -0
- data/lib/quant/indicators/cci.rb +2 -0
- data/lib/quant/indicators/decycler.rb +2 -0
- data/lib/quant/indicators/dominant_cycles/acr.rb +2 -0
- data/lib/quant/indicators/dominant_cycles/band_pass.rb +2 -0
- data/lib/quant/indicators/dominant_cycles/differential.rb +2 -0
- data/lib/quant/indicators/dominant_cycles/half_period.rb +2 -0
- data/lib/quant/indicators/dominant_cycles/homodyne.rb +2 -0
- data/lib/quant/indicators/dominant_cycles/phase_accumulator.rb +2 -0
- data/lib/quant/indicators/ema.rb +67 -0
- data/lib/quant/indicators/frama.rb +1 -0
- data/lib/quant/indicators/indicator.rb +17 -57
- data/lib/quant/indicators/indicator_point.rb +11 -0
- data/lib/quant/indicators/mama.rb +2 -0
- data/lib/quant/indicators/mesa.rb +3 -4
- data/lib/quant/indicators/ping.rb +2 -0
- data/lib/quant/indicators/pivots/atr.rb +11 -16
- data/lib/quant/indicators/pivots/bollinger.rb +10 -25
- data/lib/quant/indicators/pivots/camarilla.rb +30 -31
- data/lib/quant/indicators/pivots/classic.rb +3 -1
- data/lib/quant/indicators/pivots/demark.rb +5 -3
- data/lib/quant/indicators/pivots/donchian.rb +20 -23
- data/lib/quant/indicators/pivots/fibbonacci.rb +12 -9
- data/lib/quant/indicators/pivots/guppy.rb +3 -1
- data/lib/quant/indicators/pivots/keltner.rb +11 -19
- data/lib/quant/indicators/pivots/murrey.rb +8 -13
- data/lib/quant/indicators/pivots/pivot.rb +109 -0
- data/lib/quant/indicators/pivots/traditional.rb +2 -0
- data/lib/quant/indicators/pivots/woodie.rb +2 -0
- data/lib/quant/indicators/rocket_rsi.rb +57 -0
- data/lib/quant/indicators/roofing.rb +59 -0
- data/lib/quant/indicators/rsi.rb +67 -0
- data/lib/quant/indicators/snr.rb +64 -0
- data/lib/quant/indicators_registry.rb +63 -0
- data/lib/quant/indicators_source.rb +14 -9
- data/lib/quant/pivots_source.rb +1 -13
- data/lib/quant/version.rb +1 -1
- data/lib/quantitative.rb +10 -3
- metadata +9 -3
- data/lib/quant/indicators/pivot.rb +0 -107
@@ -16,13 +16,18 @@ module Quant
|
|
16
16
|
# By design, the {Quant::Indicators::Indicator} class holds the {Quant::Ticks::Tick} instance
|
17
17
|
# alongside the indicator's computed values for that tick.
|
18
18
|
class IndicatorsSource
|
19
|
+
include IndicatorsRegistry
|
20
|
+
|
19
21
|
attr_reader :series, :source, :dominant_cycles, :pivots
|
20
22
|
|
21
23
|
def initialize(series:, source:)
|
22
24
|
@series = series
|
23
25
|
@source = source
|
26
|
+
|
24
27
|
@indicators = {}
|
25
28
|
@ordered_indicators = []
|
29
|
+
define_indicator_accessors(indicator_source: self)
|
30
|
+
|
26
31
|
@dominant_cycles = DominantCyclesSource.new(indicator_source: self)
|
27
32
|
@pivots = PivotsSource.new(indicator_source: self)
|
28
33
|
end
|
@@ -35,20 +40,19 @@ module Quant
|
|
35
40
|
@ordered_indicators.each { |indicator| indicator << tick }
|
36
41
|
end
|
37
42
|
|
38
|
-
def adx; indicator(Indicators::Adx) end
|
39
|
-
def atr; indicator(Indicators::Atr) end
|
40
|
-
def cci; indicator(Indicators::Cci) end
|
41
|
-
def decycler; indicator(Indicators::Decycler) end
|
42
|
-
def frama; indicator(Indicators::Frama) end
|
43
|
-
def mama; indicator(Indicators::Mama) end
|
44
|
-
def mesa; indicator(Indicators::Mesa) end
|
45
|
-
def ping; indicator(Indicators::Ping) end
|
46
|
-
|
47
43
|
# Attaches a given Indicator class and defines the method for
|
48
44
|
# accessing it using the given name. Indicators take care of
|
49
45
|
# computing their values when first attached to a populated
|
50
46
|
# series.
|
51
47
|
#
|
48
|
+
# NOTE: You can also use the `register` method on the indicator class to
|
49
|
+
# accomplish the same thing. `attach` lets you inject a custom indicator
|
50
|
+
# at run-time when you have an instance of {Quant::IndicatorsSource} while
|
51
|
+
# the `register` method is used to define the indicator at load-time.
|
52
|
+
#
|
53
|
+
# NOTE Calling `attach` also registers the indicator with the framework, so
|
54
|
+
# you only have to `attach` once.
|
55
|
+
#
|
52
56
|
# The indicators shipped with the library are all wired into the framework, thus
|
53
57
|
# this method should be used for custom indicators not shipped with the library.
|
54
58
|
#
|
@@ -57,6 +61,7 @@ module Quant
|
|
57
61
|
# @example
|
58
62
|
# series.indicators.oc2.attach(name: :foo, indicator_class: Indicators::Foo)
|
59
63
|
def attach(name:, indicator_class:)
|
64
|
+
self.class.register(name:, indicator_class:)
|
60
65
|
define_singleton_method(name) { indicator(indicator_class) }
|
61
66
|
end
|
62
67
|
|
data/lib/quant/pivots_source.rb
CHANGED
@@ -4,21 +4,9 @@ module Quant
|
|
4
4
|
class PivotsSource
|
5
5
|
def initialize(indicator_source:)
|
6
6
|
@indicator_source = indicator_source
|
7
|
+
indicator_source.define_indicator_accessors(indicator_source: self)
|
7
8
|
end
|
8
9
|
|
9
|
-
def atr; indicator(Indicators::Pivots::Atr) end
|
10
|
-
def bollinger; indicator(Indicators::Pivots::Bollinger) end
|
11
|
-
def camarilla; indicator(Indicators::Pivots::Camarilla) end
|
12
|
-
def classic; indicator(Indicators::Pivots::Classic) end
|
13
|
-
def demark; indicator(Indicators::Pivots::Demark) end
|
14
|
-
def donchian; indicator(Indicators::Pivots::Donchian) end
|
15
|
-
def fibbonacci; indicator(Indicators::Pivots::Fibbonacci) end
|
16
|
-
def guppy; indicator(Indicators::Pivots::Guppy) end
|
17
|
-
def keltner; indicator(Indicators::Pivots::Keltner) end
|
18
|
-
def murrey; indicator(Indicators::Pivots::Murrey) end
|
19
|
-
def traditional; indicator(Indicators::Pivots::Traditional) end
|
20
|
-
def woodie; indicator(Indicators::Pivots::Woodie) end
|
21
|
-
|
22
10
|
private
|
23
11
|
|
24
12
|
def indicator(indicator_class)
|
data/lib/quant/version.rb
CHANGED
data/lib/quantitative.rb
CHANGED
@@ -18,6 +18,7 @@ module Quant
|
|
18
18
|
include Config
|
19
19
|
include Experimental
|
20
20
|
end
|
21
|
+
Quantitative = Quant
|
21
22
|
|
22
23
|
# Configure Zeitwerk to autoload the Quant module.
|
23
24
|
loader = Zeitwerk::Loader.for_gem
|
@@ -29,6 +30,12 @@ loader.inflector.inflect "version" => "VERSION"
|
|
29
30
|
loader.setup
|
30
31
|
|
31
32
|
# Refinements aren't autoloaded by Zeitwerk, so we need to require them manually.
|
32
|
-
%w(refinements).each do |sub_folder|
|
33
|
-
|
34
|
-
end
|
33
|
+
# %w(refinements).each do |sub_folder|
|
34
|
+
# Dir.glob(File.join(quant_folder, sub_folder, "**/*.rb")).each { |fn| require fn }
|
35
|
+
# end
|
36
|
+
|
37
|
+
refinements_folder = File.join(quant_folder, "refinements")
|
38
|
+
indicators_folder = File.join(quant_folder, "indicators")
|
39
|
+
|
40
|
+
loader.eager_load_dir(refinements_folder)
|
41
|
+
loader.eager_load_dir(indicators_folder)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quantitative
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Lang
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|
@@ -77,13 +77,13 @@ files:
|
|
77
77
|
- lib/quant/indicators/dominant_cycles/half_period.rb
|
78
78
|
- lib/quant/indicators/dominant_cycles/homodyne.rb
|
79
79
|
- lib/quant/indicators/dominant_cycles/phase_accumulator.rb
|
80
|
+
- lib/quant/indicators/ema.rb
|
80
81
|
- lib/quant/indicators/frama.rb
|
81
82
|
- lib/quant/indicators/indicator.rb
|
82
83
|
- lib/quant/indicators/indicator_point.rb
|
83
84
|
- lib/quant/indicators/mama.rb
|
84
85
|
- lib/quant/indicators/mesa.rb
|
85
86
|
- lib/quant/indicators/ping.rb
|
86
|
-
- lib/quant/indicators/pivot.rb
|
87
87
|
- lib/quant/indicators/pivots/atr.rb
|
88
88
|
- lib/quant/indicators/pivots/bollinger.rb
|
89
89
|
- lib/quant/indicators/pivots/camarilla.rb
|
@@ -94,8 +94,14 @@ files:
|
|
94
94
|
- lib/quant/indicators/pivots/guppy.rb
|
95
95
|
- lib/quant/indicators/pivots/keltner.rb
|
96
96
|
- lib/quant/indicators/pivots/murrey.rb
|
97
|
+
- lib/quant/indicators/pivots/pivot.rb
|
97
98
|
- lib/quant/indicators/pivots/traditional.rb
|
98
99
|
- lib/quant/indicators/pivots/woodie.rb
|
100
|
+
- lib/quant/indicators/rocket_rsi.rb
|
101
|
+
- lib/quant/indicators/roofing.rb
|
102
|
+
- lib/quant/indicators/rsi.rb
|
103
|
+
- lib/quant/indicators/snr.rb
|
104
|
+
- lib/quant/indicators_registry.rb
|
99
105
|
- lib/quant/indicators_source.rb
|
100
106
|
- lib/quant/indicators_sources.rb
|
101
107
|
- lib/quant/interval.rb
|
@@ -1,107 +0,0 @@
|
|
1
|
-
module Quant
|
2
|
-
module Indicators
|
3
|
-
class PivotPoint < IndicatorPoint
|
4
|
-
attribute :high_price
|
5
|
-
attribute :avg_high, default: :high_price
|
6
|
-
attribute :highest, default: :input
|
7
|
-
|
8
|
-
attribute :low_price
|
9
|
-
attribute :avg_low, default: :low_price
|
10
|
-
attribute :lowest, default: :input
|
11
|
-
|
12
|
-
attribute :range, default: 0.0
|
13
|
-
attribute :avg_range, default: 0.0
|
14
|
-
attribute :std_dev, default: 0.0
|
15
|
-
|
16
|
-
def bands
|
17
|
-
@bands ||= { 0 => input }
|
18
|
-
end
|
19
|
-
|
20
|
-
def [](band)
|
21
|
-
bands[band]
|
22
|
-
end
|
23
|
-
|
24
|
-
def []=(band, value)
|
25
|
-
bands[band] = value
|
26
|
-
end
|
27
|
-
|
28
|
-
def key?(band)
|
29
|
-
bands.key?(band)
|
30
|
-
end
|
31
|
-
|
32
|
-
def midpoint
|
33
|
-
bands[0]
|
34
|
-
end
|
35
|
-
alias :h0 :midpoint
|
36
|
-
alias :l0 :midpoint
|
37
|
-
|
38
|
-
def midpoint=(value)
|
39
|
-
bands[0] = value
|
40
|
-
end
|
41
|
-
alias :h0= :midpoint=
|
42
|
-
alias :l0= :midpoint=
|
43
|
-
|
44
|
-
(1..8).each do |band|
|
45
|
-
define_method("h#{band}") { bands[band] }
|
46
|
-
define_method("h#{band}=") { |value| bands[band] = value }
|
47
|
-
|
48
|
-
define_method("l#{band}") { bands[-band] }
|
49
|
-
define_method("l#{band}=") { |value| bands[-band] = value }
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
class Pivot < Indicator
|
54
|
-
def points_class
|
55
|
-
Quant::Indicators::PivotPoint
|
56
|
-
end
|
57
|
-
|
58
|
-
def band?(band)
|
59
|
-
p0.key?(band)
|
60
|
-
end
|
61
|
-
|
62
|
-
def period
|
63
|
-
dc_period
|
64
|
-
end
|
65
|
-
|
66
|
-
def averaging_period
|
67
|
-
min_period
|
68
|
-
end
|
69
|
-
|
70
|
-
def period_midpoints
|
71
|
-
period_points(period).map(&:midpoint)
|
72
|
-
end
|
73
|
-
|
74
|
-
def compute
|
75
|
-
compute_extents
|
76
|
-
compute_value
|
77
|
-
compute_midpoint
|
78
|
-
compute_bands
|
79
|
-
end
|
80
|
-
|
81
|
-
def compute_midpoint
|
82
|
-
p0.midpoint = p0.input
|
83
|
-
end
|
84
|
-
|
85
|
-
def compute_value
|
86
|
-
# No-op -- override in subclasses
|
87
|
-
end
|
88
|
-
|
89
|
-
def compute_bands
|
90
|
-
# No-op -- override in subclasses
|
91
|
-
end
|
92
|
-
|
93
|
-
def compute_extents
|
94
|
-
period_midpoints.tap do |midpoints|
|
95
|
-
p0.high_price = t0.high_price
|
96
|
-
p0.low_price = t0.low_price
|
97
|
-
p0.highest = midpoints.max
|
98
|
-
p0.lowest = midpoints.min
|
99
|
-
p0.range = p0.high_price - p0.low_price
|
100
|
-
p0.avg_low = super_smoother(:low_price, previous: :avg_low, period: averaging_period)
|
101
|
-
p0.avg_high = super_smoother(:high_price, previous: :avg_high, period: averaging_period)
|
102
|
-
p0.avg_range = super_smoother(:range, previous: :avg_range, period: averaging_period)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|