sqa 0.0.7 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,63 @@
1
+ # lib/sqa/indicator/predict_next_values.rb
2
+
3
+ module SQA
4
+ end
5
+
6
+ class SQA::Indicator; class << self
7
+
8
+ def predict_next_values(array, predictions)
9
+ result = []
10
+
11
+ array.each_cons(2) do |a, b|
12
+ # TODO: take 3 at a time. compare 3rd
13
+ # prediction. Generate an average delta
14
+ # between predicted and actual. Return
15
+ # the prediction as a range???
16
+ result << b + (b - a)
17
+ end
18
+
19
+ if predictions > 0
20
+ (1..predictions).each do |_|
21
+ last_two_values = result.last(2)
22
+ delta = last_two_values.last - last_two_values.first
23
+ next_value = last_two_values.last + delta
24
+ result << next_value
25
+ end
26
+ end
27
+
28
+ result.last(predictions)
29
+ end
30
+ alias_method :pnv, :predict_next_values
31
+
32
+
33
+ # Returns a forecast for future values based on the near past
34
+ #
35
+ # When I wrote this I was thinking of hurricane forecasting and how
36
+ # the cone of probability gets larger the further into the future
37
+ # the forecast goes. This does not produce that kind of probability
38
+ # cone; but, that was hwat I was thinking about
39
+ #
40
+ # array is an Array - for example historical price data
41
+ # predictions is an Integer for how many predictions into the future
42
+ #
43
+ def pnv2(array, predictions)
44
+ result = []
45
+ last_inx = array.size - 1 # indexes are zero based
46
+
47
+ predictions.times do |x|
48
+ x += 1 # forecasting 1 day into the future needs 2 days of near past data
49
+
50
+ # window is the near past values
51
+ window = array[last_inx-x..]
52
+
53
+ high = window.max
54
+ low = window.min
55
+ midpoint = (high + low) / 2.0
56
+
57
+ result << [high, midpoint, low]
58
+ end
59
+
60
+ result
61
+ end
62
+
63
+ end; end
data/lib/sqa/strategy.rb CHANGED
@@ -54,4 +54,12 @@ class SQA::Strategy
54
54
  end
55
55
  end
56
56
 
57
+ require_relative 'strategy/common'
58
+ require_relative 'strategy/consensus'
59
+ require_relative 'strategy/ema'
60
+ require_relative 'strategy/mp'
61
+ require_relative 'strategy/mr'
62
+ require_relative 'strategy/random'
63
+ require_relative 'strategy/rsi'
64
+ require_relative 'strategy/sma'
57
65
 
data/lib/sqa/version.rb CHANGED
@@ -1,7 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'sem_version'
4
+ require 'sem_version/core_ext'
5
+
3
6
  module SQA
4
- module Version
5
- VERSION = "0.0.7"
7
+ VERSION = "0.0.9"
8
+
9
+ class << self
10
+ def version
11
+ @@version ||= VERSION.to_version
12
+ end
6
13
  end
7
14
  end
data/lib/sqa/web.rb ADDED
@@ -0,0 +1,159 @@
1
+ # lib/sqa/command/web.rb
2
+
3
+ require 'tty-option'
4
+
5
+
6
+ module SQA
7
+ class Web < CLI
8
+ include TTY::Option
9
+
10
+ command "web"
11
+
12
+ desc "Run a web server"
13
+
14
+ example "Set working directory (-w)",
15
+ " sqa web --port 4567 --data-dir /path/to/dir/ ubuntu pwd"
16
+
17
+ example <<~EOS
18
+ Do Something
19
+ sqa web
20
+ EOS
21
+
22
+ argument :image do
23
+ required
24
+ desc "The name of the image to use"
25
+ end
26
+
27
+ keyword :restart do
28
+ default "no"
29
+ permit %w[no on-failure always unless-stopped]
30
+ desc "Restart policy to apply when a container exits"
31
+ end
32
+
33
+ flag :detach do
34
+ long "--detach"
35
+ desc "Run container in background and print container ID"
36
+ end
37
+
38
+ option :name do
39
+ required
40
+ long "--name string"
41
+ desc "Assign a name to the container"
42
+ end
43
+
44
+ option :port do
45
+ arity one_or_more
46
+ long "--port integer"
47
+ default 4567
48
+ desc "The port where the web app will run"
49
+ end
50
+
51
+
52
+ def initialize
53
+ # TODO: make it happen
54
+ end
55
+ end
56
+ end
57
+
58
+ __END__
59
+
60
+
61
+ #!/usr/bin/env ruby
62
+ # experiments/sinatra_examples/svg_viewer.rb
63
+ # builds on md_viewer.rb
64
+
65
+ require 'sinatra'
66
+ require 'kramdown'
67
+ require 'nenv'
68
+
69
+ # class MdViewer < Sinatra::Application
70
+
71
+ # Set the directory location
72
+ set :markdown_directory, Nenv.home + '/Downloads'
73
+
74
+ # Sinatra route to show a markdown file as html
75
+ get '/md/:filename' do
76
+ # Get the file name from the URL parameter
77
+ filename = params[:filename]
78
+
79
+ # Check if the file exists in the specified directory
80
+ if File.file?(File.join(settings.markdown_directory, filename))
81
+ # Read the markdown file
82
+ markdown_content = File.read(File.join(settings.markdown_directory, filename))
83
+
84
+ # Convert the markdown to HTML using kramdown
85
+ converted_html = Kramdown::Document.new(markdown_content).to_html
86
+
87
+ # Display the generated HTML
88
+ content_type :html
89
+ converted_html
90
+ else
91
+ # File not found error
92
+ status 404
93
+ "File not found: #{filename} in #{markdown_directory}"
94
+ end
95
+ end
96
+
97
+
98
+ # Sinatra route to show a markdown file as html
99
+ get '/svg/:filename' do
100
+ # Get the file name from the URL parameter
101
+ filename = params[:filename]
102
+
103
+ # Check if the file exists in the specified directory
104
+ if File.file?(File.join(settings.markdown_directory, filename))
105
+ # Read the svg file
106
+ svg_content = File.read(File.join(settings.markdown_directory, filename))
107
+
108
+ # Convert the svg to HTML
109
+ converted_html = <<~HTML
110
+ <!DOCTYPE html>
111
+ <html>
112
+ <head>
113
+ <meta charset="utf-8">
114
+ <meta name="viewport" content="width=device-width, initial-scale=1">
115
+ <title>#{filename}</title>
116
+ </head>
117
+ <body>
118
+ #{svg_content}
119
+ </body>
120
+ </html>
121
+ HTML
122
+
123
+ # Display the generated HTML
124
+ content_type :html
125
+ converted_html
126
+ else
127
+ # File not found error
128
+ status 404
129
+ "File not found: #{filename} in #{markdown_directory}"
130
+ end
131
+ end
132
+
133
+
134
+
135
+
136
+ # end
137
+
138
+ # Start the Sinatra app
139
+ # run MdViewer
140
+
141
+
142
+ __END__
143
+
144
+ ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
145
+
146
+ Options are:
147
+
148
+ -h # help
149
+ -p # set the port (default is 4567)
150
+ -o # set the host (default is 0.0.0.0)
151
+ -e # set the environment (default is development)
152
+ -s # specify rack server/handler (default is puma)
153
+ -q # turn on quiet mode for server (default is off)
154
+ -x # turn on the mutex lock (default is off)
155
+
156
+
157
+
158
+
159
+
data/lib/sqa.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # lib/sqa.rb
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'active_support'
@@ -5,11 +6,11 @@ require 'active_support/core_ext/string'
5
6
  require 'daru'
6
7
  require 'date'
7
8
  require 'descriptive_statistics'
8
- require 'mixlib/cli'
9
- require 'mixlib/config'
10
9
  require 'nenv'
11
10
  require 'pathname'
12
- require "version_gem"
11
+
12
+ require_relative "sqa/version"
13
+
13
14
 
14
15
  unless defined?(HOME)
15
16
  HOME = Pathname.new(Nenv.home)
@@ -17,59 +18,64 @@ end
17
18
 
18
19
 
19
20
  module SQA
20
- Signal = {
21
- hold: 0,
22
- buy: 1,
23
- sell: 2
24
- }.freeze
25
-
26
- Trend = {
27
- up: 0,
28
- down: 1
29
- }.freeze
30
-
31
- Swing = {
32
- valley: 0,
33
- peak: 1,
34
- }.freeze
35
-
36
- module Config
37
- extend Mixlib::Config
38
- config_strict_mode true
39
-
40
- default :data_dir, HOME + "sqa_data"
41
- default :plotting_library, :gruff # TODO: use svg-graph
42
- default :lazy_update, false
43
- default :portfolio_filename, "portfolio.csv"
44
- default :trades_filename, "trades.csv"
45
-
46
- default :log_level, :info
47
- default :config_file, "~/.sqa.rb"
21
+ class << self
22
+ @@config = nil
48
23
 
49
- end
24
+ def init(argv=ARGV)
25
+ if argv.is_a? String
26
+ argv = argv.split()
27
+ end
50
28
 
51
- def self.init
52
- SQA::CLI.new.run if defined? SQA::CLI
53
29
 
54
- Config.config_file = Pathname.new homify(Config.config_file)
30
+ # Ran at SQA::Config elaboration time
31
+ # @@config = Config.new
55
32
 
56
- Config.from_file(Config.config_file)
33
+ if defined? CLI
34
+ CLI.run(argv)
35
+ else
36
+ # There are no real command line parameters
37
+ # because the sqa gem is be required within
38
+ # the context of a larger program.
39
+ end
57
40
 
58
- Config.data_dir = Pathname.new homify(Config.data_dir)
41
+ Daru.lazy_update = config.lazy_update
42
+ Daru.plotting_library = config.plotting_library
59
43
 
60
- Daru.lazy_update = Config.lazy_update
61
- Daru.plotting_library = Config.plotting_library
44
+ if config.debug? || config.verbose?
45
+ debug_me{[
46
+ :config
47
+ ]}
48
+ end
62
49
 
63
- nil
64
- end
50
+ nil
51
+ end
52
+
53
+ def homify(filepath)
54
+ filepath.gsub(/^~/, Nenv.home)
55
+ end
56
+
57
+ def config
58
+ @@config
59
+ end
65
60
 
66
- def self.homify(filepath)
67
- filepath.gsub(/^~/, Nenv.home)
61
+ def config=(an_object)
62
+ @@config = an_object
63
+ end
64
+
65
+ def debug?
66
+ @@config.debug?
67
+ end
68
+
69
+ def verbose?
70
+ @@config.verbose?
71
+ end
68
72
  end
69
73
  end
70
74
 
71
75
  # require_relative "patches/daru" # TODO: extract Daru::DataFrame in new gem sqa-data_frame
72
76
 
77
+ require_relative "sqa/config"
78
+ require_relative "sqa/constants"
73
79
  require_relative "sqa/data_frame"
74
80
  require_relative "sqa/errors"
75
81
  require_relative "sqa/indicator"
@@ -77,9 +83,3 @@ require_relative "sqa/portfolio"
77
83
  require_relative "sqa/strategy"
78
84
  require_relative "sqa/stock"
79
85
  require_relative "sqa/trade"
80
- require_relative "sqa/version"
81
-
82
-
83
- SQA::Version.class_eval do
84
- extend VersionGem::Basic
85
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dewayne VanHoozer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-19 00:00:00.000000000 Z
11
+ date: 2023-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: mixlib-cli
56
+ name: hashie
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: mixlib-config
70
+ name: nenv
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,91 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: nenv
84
+ name: tty-logger
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: tty-markdown
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: tty-option
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: tty-progressbar
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: tty-prompt
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: tty-reader
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: tty-spinner
85
169
  requirement: !ruby/object:Gem::Requirement
86
170
  requirements:
87
171
  - - ">="
@@ -95,7 +179,7 @@ dependencies:
95
179
  - !ruby/object:Gem::Version
96
180
  version: '0'
97
181
  - !ruby/object:Gem::Dependency
98
- name: version_gem
182
+ name: tty-table
99
183
  requirement: !ruby/object:Gem::Requirement
100
184
  requirements:
101
185
  - - ">="
@@ -199,6 +283,10 @@ files:
199
283
  - checksums/sqa-0.0.4.gem.sha512
200
284
  - checksums/sqa-0.0.5.gem.sha512
201
285
  - checksums/sqa-0.0.6.gem.sha512
286
+ - checksums/sqa-0.0.7.gem.sha512
287
+ - checksums/sqa-0.0.8.gem.sha512
288
+ - checksums/sqa-0.0.9.gem.sha512
289
+ - docs/.gitignore
202
290
  - docs/README.md
203
291
  - docs/average_true_range.md
204
292
  - docs/bollinger_bands.md
@@ -216,15 +304,27 @@ files:
216
304
  - docs/momentum.md
217
305
  - docs/moving_average_convergence_divergence.md
218
306
  - docs/peaks_and_valleys.md
307
+ - docs/predict_next_value.md
219
308
  - docs/relative_strength_index.md
220
309
  - docs/requirements.md
221
310
  - docs/simple_moving_average.md
222
311
  - docs/stochastic_oscillator.md
223
312
  - docs/strategy.md
224
313
  - docs/true_range.md
314
+ - lib/patches/daru.rb
315
+ - lib/patches/daru/category.rb
316
+ - lib/patches/daru/data_frame.rb
317
+ - lib/patches/daru/plotting/svg-graph.rb
318
+ - lib/patches/daru/plotting/svg-graph/category.rb
319
+ - lib/patches/daru/plotting/svg-graph/dataframe.rb
320
+ - lib/patches/daru/plotting/svg-graph/vector.rb
321
+ - lib/patches/daru/vector.rb
225
322
  - lib/sqa.rb
226
323
  - lib/sqa/activity.rb
324
+ - lib/sqa/analysis.rb
227
325
  - lib/sqa/cli.rb
326
+ - lib/sqa/config.rb
327
+ - lib/sqa/constants.rb
228
328
  - lib/sqa/data_frame.rb
229
329
  - lib/sqa/data_frame/yahoo_finance.rb
230
330
  - lib/sqa/errors.rb
@@ -244,6 +344,7 @@ files:
244
344
  - lib/sqa/indicator/momentum.rb
245
345
  - lib/sqa/indicator/moving_average_convergence_divergence.rb
246
346
  - lib/sqa/indicator/peaks_and_valleys.rb
347
+ - lib/sqa/indicator/predict_next_value.rb
247
348
  - lib/sqa/indicator/relative_strength_index.rb
248
349
  - lib/sqa/indicator/simple_moving_average.rb
249
350
  - lib/sqa/indicator/simple_moving_average_trend.rb
@@ -264,6 +365,7 @@ files:
264
365
  - lib/sqa/strategy/sma.rb
265
366
  - lib/sqa/trade.rb
266
367
  - lib/sqa/version.rb
368
+ - lib/sqa/web.rb
267
369
  homepage: https://github.com/MadBomber/sqa
268
370
  licenses:
269
371
  - MIT