cotcube-bardata 0.1.15.5 → 0.1.18
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/CHANGELOG.md +18 -0
- data/VERSION +1 -1
- data/bin/daily.rb +73 -0
- data/bin/eod.rb +18 -0
- data/bin/intra.rb +75 -0
- data/bin/sym.rb +16 -0
- data/bin/symbols.rb +11 -0
- data/cotcube-bardata.gemspec +1 -1
- data/lib/cotcube-bardata/daily.rb +115 -61
- data/lib/cotcube-bardata/eods.rb +5 -3
- data/lib/cotcube-bardata.rb +2 -0
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 748713da1657b8a6793d565bb512e4b75e5e42eac3f8358f0539fdc68bf01b15
|
4
|
+
data.tar.gz: b5f2357bec4f8a2bef007deaae1bfa03ebf55f8cfdeee4ed7a3ad54070d1b0a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14390b66e537a384dd769d228e6f48ecf27fffb0cfcfdaf3f459cd01ad3db911ab886f450fdc4ba097aa79a27c0ee31ea820553d084d967a597dd71a1f508ea4
|
7
|
+
data.tar.gz: c92e81d2d6488ed4b7fcffc8b000fcde62ec94ebe5e6e0ff461b40febb4ac19cadb6126b8a3c7241ec0e647cde9c43126176ae573a18769e42287eb206c02c2b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
## 0.1.18 (December 23, 2021)
|
2
|
+
- gemspec: raised activesupport to v7
|
3
|
+
- daily: added check for valid/allowed month pattern in continuous_overview
|
4
|
+
|
5
|
+
## 0.1.17 (December 06, 2021)
|
6
|
+
- changed parameter for building of continuous (in daily.rb)
|
7
|
+
- added bin/intra + symbols. improved bin/daily
|
8
|
+
- bin/*: created (sym, daily) and improved (eod) cmd wrappers
|
9
|
+
- daily.rb: improved silence in .continuous
|
10
|
+
|
11
|
+
## 0.1.16 (November 23, 2021)
|
12
|
+
- bin/eod.rb: little helper to display eod data in bash resp. in xinetdhttpservice
|
13
|
+
- eods.rb: minor change to adapt move of symbols to Helpers
|
14
|
+
- daily.rb: in continuous, changed default indicators to %i[ tr atr5 dist ]
|
15
|
+
|
16
|
+
## 0.1.15.6 (November 19, 2021)
|
17
|
+
- daily: added filter_series
|
18
|
+
|
1
19
|
## 0.1.15.5 (November 08, 2021)
|
2
20
|
- decommissioned .get_id_set in favor of Cotcube::Helpers.get_id_set
|
3
21
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.18
|
data/bin/daily.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/cotcube-bardata'
|
4
|
+
require 'cotcube-level'
|
5
|
+
require 'cotcube-indicators'
|
6
|
+
CcI = Cotcube::Indicators
|
7
|
+
|
8
|
+
def exit_with_error(err)
|
9
|
+
msg = { error: 1, message: "#{err}" }
|
10
|
+
p msg.to_json
|
11
|
+
exit 1
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
contract = ARGV[0].nil? ? nil : ARGV[0].upcase
|
16
|
+
if contract.nil?
|
17
|
+
exit_with_error('No contract given')
|
18
|
+
end
|
19
|
+
|
20
|
+
output = true
|
21
|
+
|
22
|
+
sym = Cotcube::Helpers.get_id_set(symbol: contract[..1])
|
23
|
+
# TODO: apply daylight time pimped diff to all relevant datetimes in series
|
24
|
+
timediff = if %w[ NYBOT NYMEX ].include? sym[:exchange]
|
25
|
+
5.hours
|
26
|
+
elsif %w[ DTB ].include? sym[:exchane]
|
27
|
+
1.hour
|
28
|
+
else
|
29
|
+
6.hours
|
30
|
+
end
|
31
|
+
|
32
|
+
continuous = %w[currencies interest indices].include? sym[:type]
|
33
|
+
intraday = false
|
34
|
+
interval = intraday ? 30.minutes : 1.day
|
35
|
+
ema_period = 50
|
36
|
+
|
37
|
+
indicators = {
|
38
|
+
ema_high: CcI.ema(key: :high, length: ema_period, smoothing: 2),
|
39
|
+
ema_low: CcI.ema(key: :low, length: ema_period, smoothing: 2)
|
40
|
+
}
|
41
|
+
|
42
|
+
dailybase = []
|
43
|
+
stencil = nil
|
44
|
+
stencil = Cotcube::Level::EOD_Stencil.new( interval: :daily, swap_type: :full)
|
45
|
+
dailybase = if continuous
|
46
|
+
Cotcube::Bardata.continuous(symbol: contract[..1], indicators: indicators)[-300..].
|
47
|
+
map{ |z|
|
48
|
+
z[:datetime] = DateTime.parse(z[:date])
|
49
|
+
z.delete(:contracts)
|
50
|
+
z
|
51
|
+
}
|
52
|
+
else
|
53
|
+
Cotcube::Bardata.provide_daily(contract: contract, indicators: indicators)[-300..]
|
54
|
+
end
|
55
|
+
|
56
|
+
base = dailybase
|
57
|
+
base.select!{|z| z[:high]}
|
58
|
+
|
59
|
+
scaleBreaks = []
|
60
|
+
brb = stencil.base
|
61
|
+
brb.each_with_index.map{|z,i|
|
62
|
+
next if i.zero?
|
63
|
+
if brb[i][:datetime] - brb[i-1][:datetime] > (intraday ? 1 : 1.day) and brb[i][:datetime] > base.first[:datetime] and brb[i-1][:datetime] < base.last[:datetime]
|
64
|
+
scaleBreaks << { startValue: brb[i-1][:datetime] + 0.5 * interval, endValue: brb[i][:datetime] - 0.5 * interval }
|
65
|
+
end
|
66
|
+
} unless base.empty?
|
67
|
+
|
68
|
+
pkg = {
|
69
|
+
base: base,
|
70
|
+
breaks: scaleBreaks
|
71
|
+
}
|
72
|
+
|
73
|
+
puts pkg.to_json if output
|
data/bin/eod.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/cotcube-bardata.rb'
|
4
|
+
|
5
|
+
symbol = ARGV[0].nil? ? nil : ARGV[0].upcase
|
6
|
+
json = ARGV.include? 'json'
|
7
|
+
|
8
|
+
begin
|
9
|
+
s = Cotcube::Bardata.provide_eods(threshold: 0.10, contracts_only: false, symbol: symbol, filter: :oi_part)
|
10
|
+
if json
|
11
|
+
p s.to_json
|
12
|
+
else
|
13
|
+
s.each {|x| puts x.values.to_csv}
|
14
|
+
end
|
15
|
+
rescue
|
16
|
+
msg = { error: 503, message: "Could not processes symbol '#{symbol}'." }
|
17
|
+
p msg.to_json
|
18
|
+
end
|
data/bin/intra.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'cotcube-bardata'
|
4
|
+
require 'cotcube-level'
|
5
|
+
require 'cotcube-indicators'
|
6
|
+
|
7
|
+
def exit_with_error(err)
|
8
|
+
msg = { error: 1, message: "#{err}" }
|
9
|
+
p msg.to_json
|
10
|
+
exit 1
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
contract = ARGV[0].nil? ? nil : ARGV[0].upcase
|
15
|
+
|
16
|
+
debug = ARGV.include? 'debug'
|
17
|
+
if contract.nil?
|
18
|
+
exit_with_error('No contract given')
|
19
|
+
end
|
20
|
+
|
21
|
+
sym = Cotcube::Helpers.get_id_set(symbol: contract[..1])
|
22
|
+
# TODO: apply daylight time pimped diff to all relevant datetimes in series
|
23
|
+
timediff = if %w[ NYBOT NYMEX ].include? sym[:exchange]
|
24
|
+
5.hours
|
25
|
+
elsif %w[ DTB ].include? sym[:exchane]
|
26
|
+
1.hour
|
27
|
+
else
|
28
|
+
6.hours
|
29
|
+
end
|
30
|
+
|
31
|
+
continuous = %w[currencies interest indices].include? sym[:type]
|
32
|
+
interval = 30.minutes
|
33
|
+
|
34
|
+
intrabase = []
|
35
|
+
istencil = []
|
36
|
+
collector_threads = []
|
37
|
+
|
38
|
+
collector_threads << Thread.new do
|
39
|
+
istencil = Cotcube::Level::Intraday_Stencil.new( interval: 30.minutes, swap_type: :full, asset: :full, weeks: 8)
|
40
|
+
end
|
41
|
+
|
42
|
+
collector_threads << Thread.new do
|
43
|
+
begin
|
44
|
+
intrabase = JSON.parse(Cotcube::Helpers::DataClient.new.get_historical(contract: contract, interval: :min30, duration: '3_W' ), symbolize_names: true)[:base].
|
45
|
+
map{ |z|
|
46
|
+
z[:datetime] = DateTime.parse(z[:time])
|
47
|
+
%i[time created_at wap trades].each{|k| z.delete(k)}
|
48
|
+
z
|
49
|
+
}
|
50
|
+
rescue
|
51
|
+
intrabase = []
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
collector_threads.each(&:join)
|
56
|
+
|
57
|
+
base = intrabase
|
58
|
+
base.select!{|z| z[:high]}
|
59
|
+
|
60
|
+
scaleBreaks = []
|
61
|
+
brb = istencil.base
|
62
|
+
brb.each_with_index.map{|z,i|
|
63
|
+
next if i.zero?
|
64
|
+
if brb[i][:datetime] - brb[i-1][:datetime] > (1) and brb[i][:datetime] > base.first[:datetime] and brb[i-1][:datetime] < base.last[:datetime]
|
65
|
+
scaleBreaks << { startValue: brb[i-1][:datetime] + 0.5 * interval, endValue: brb[i][:datetime] - 0.5 * interval }
|
66
|
+
end
|
67
|
+
} unless base.empty?
|
68
|
+
|
69
|
+
pkg = {
|
70
|
+
sym: sym,
|
71
|
+
base: base,
|
72
|
+
breaks: scaleBreaks
|
73
|
+
}
|
74
|
+
|
75
|
+
puts pkg.to_json
|
data/bin/sym.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'cotcube-level'
|
4
|
+
require 'cotcube-helpers'
|
5
|
+
include Cotcube::Helpers
|
6
|
+
require_relative '../lib/cotcube-bardata.rb'
|
7
|
+
|
8
|
+
contract = ARGV[0].nil? ? nil : ARGV[0].upcase
|
9
|
+
|
10
|
+
begin
|
11
|
+
s = Cotcube::Helpers.get_id_set(symbol: contract[..1])
|
12
|
+
p s.to_json
|
13
|
+
rescue
|
14
|
+
msg = { error: 503, message: "Could not process contract '#{contract}'." }
|
15
|
+
p msg.to_json
|
16
|
+
end
|
data/bin/symbols.rb
ADDED
data/cotcube-bardata.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
27
|
spec.require_paths = ['lib']
|
28
28
|
|
29
|
-
spec.add_dependency 'activesupport', '~>
|
29
|
+
spec.add_dependency 'activesupport', '~> 7'
|
30
30
|
spec.add_dependency 'colorize', '~> 0.8'
|
31
31
|
spec.add_dependency 'cotcube-helpers', '~> 0.2'
|
32
32
|
spec.add_dependency 'cotcube-indicators', '~> 0.1'
|
@@ -7,7 +7,7 @@ module Cotcube
|
|
7
7
|
def provide_daily(contract:, # rubocop:disable Metrics/ParameterLists
|
8
8
|
symbol: nil, id: nil,
|
9
9
|
range: nil,
|
10
|
-
timezone:
|
10
|
+
timezone: Cotcube::Helpers::CHICAGO,
|
11
11
|
keep_last: false,
|
12
12
|
add_eods: true,
|
13
13
|
indicators: {},
|
@@ -29,7 +29,7 @@ module Cotcube
|
|
29
29
|
|
30
30
|
unless range.nil?
|
31
31
|
range_begin = range.begin.nil? ? nil : timezone.parse(range.begin.to_s)
|
32
|
-
range_end = range.end.nil?
|
32
|
+
range_end = range.end.nil? ? nil : timezone.parse(range. end.to_s)
|
33
33
|
range = (range_begin..range_end)
|
34
34
|
end
|
35
35
|
|
@@ -116,7 +116,7 @@ module Cotcube
|
|
116
116
|
# this boosts from 4.5sec to 0.3sec
|
117
117
|
rewriting = (force_rewrite or not(File.exist?(c_file)) or (Time.now - File.mtime(c_file) > 8.days))
|
118
118
|
if rewriting
|
119
|
-
puts "In daily+continuous: Rewriting #{c_file} #{force_rewrite ? "forcibly" : "due to fileage"}.".light_yellow
|
119
|
+
puts "In daily+continuous: Rewriting #{c_file} #{force_rewrite ? "forcibly" : "due to fileage"}.".light_yellow if debug
|
120
120
|
`rm #{c_file}; find #{id_path} | xargs cat 2>/dev/null | grep -v ',0,' | grep -v ',0$'| sort -t, -k2 | cut -d, -f1-8 | grep ',.*,' | uniq > #{c_file}`
|
121
121
|
end
|
122
122
|
loading = lambda do
|
@@ -146,17 +146,13 @@ module Cotcube
|
|
146
146
|
|
147
147
|
measuring.call("Finished retrieving dailies.")
|
148
148
|
result = []
|
149
|
-
rounding = 8
|
149
|
+
rounding = 8
|
150
150
|
indicators ||= {
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
sma250_typ: Cotcube::Indicators.sma(key: :typical, length: 250),
|
155
|
-
dist: Cotcube::Indicators.calc(a: :high, b: :low, finalize: :to_i) {|high, low| ((high-low) / ticksize) },
|
151
|
+
tr: Cotcube::Indicators.true_range,
|
152
|
+
atr5: Cotcube::Indicators.ema(key: :tr, length: 5),
|
153
|
+
dist: Cotcube::Indicators.calc(a: :high, b: :low, finalize: :to_i) {|high, low| ((high-low) / ticksize) }
|
156
154
|
}
|
157
155
|
|
158
|
-
|
159
|
-
|
160
156
|
data.group_by { |x| x[:date] }.map do |k, v|
|
161
157
|
v.map { |x| x.delete(:date) }
|
162
158
|
avg_bar = {
|
@@ -180,9 +176,9 @@ module Cotcube
|
|
180
176
|
avg_bar[k] = tmp.respond_to?(:round) ? tmp.round(rounding) : tmp
|
181
177
|
puts avg_bar[k] if debug
|
182
178
|
end
|
183
|
-
|
184
|
-
|
185
|
-
}
|
179
|
+
#%i[tr atr5].each { |ind|
|
180
|
+
# avg_bar[ind] = (avg_bar[ind] / sym[:ticksize]).round.to_i unless avg_bar[ind].nil?
|
181
|
+
#}
|
186
182
|
result << avg_bar
|
187
183
|
result.last[:contracts] = v
|
188
184
|
end
|
@@ -198,6 +194,57 @@ module Cotcube
|
|
198
194
|
date.nil? ? Cotcube::Bardata.const_get(constname).map{|z| z.dup } : Cotcube::Bardata.const_get(constname).find { |x| x[:date] == date }
|
199
195
|
end
|
200
196
|
|
197
|
+
# the filter series is an indicator based on the Cotcube::Bardata.continuous of the asset price.
|
198
|
+
# current default filter is the ema50
|
199
|
+
def filter_series(ema_length: 50, symbol: , print_range: nil)
|
200
|
+
ema_high_n = "ema#{ema_length}_high".to_sym
|
201
|
+
ema_low_n = "ema#{ema_length}_low".to_sym
|
202
|
+
ema_filter = "ema#{ema_length}_filter".to_sym
|
203
|
+
indicators = {
|
204
|
+
ema_high_n => Cotcube::Indicators.ema(key: :high, length: ema_length, smoothing: 2),
|
205
|
+
ema_low_n => Cotcube::Indicators.ema(key: :low, length: ema_length, smoothing: 2),
|
206
|
+
# NOTE: TR / ATR5 are in default set of continuous
|
207
|
+
:tr => Cotcube::Indicators.true_range,
|
208
|
+
:atr5 => Cotcube::Indicators.ema(key: :tr, length: 5, smoothing: 2),
|
209
|
+
ema_filter => Cotcube::Indicators.calc(a: :high, b: :low, c: :close,
|
210
|
+
d: ema_high_n, e: ema_low_n, f: :atr5,
|
211
|
+
finalize: :to_i) do |high, low, close, ema_high, ema_low, atr5|
|
212
|
+
|
213
|
+
if close > ema_high and (low - ema_high).abs <= atr5 / 5.0; 3 # :bullish_tipped
|
214
|
+
elsif low > ema_high and (low - ema_high).abs >= atr5 * 3.0; 5 # :bullish_away
|
215
|
+
elsif low > ema_high and (low - ema_high).abs <= atr5 / 1.5; 2 # :bullish_nearby
|
216
|
+
elsif low > ema_high; 4 # :bullish
|
217
|
+
|
218
|
+
elsif close < ema_low and (high - ema_low).abs <= atr5 / 5.0; -3 # :bearish_tipped
|
219
|
+
elsif high < ema_low and (high - ema_low).abs >= atr5 * 3.0; -5 # :bearish_away
|
220
|
+
elsif high < ema_low and (high - ema_low).abs <= atr5 / 1.5; -2 # :bearish_nearby
|
221
|
+
elsif high < ema_low; -4 # :bearish
|
222
|
+
|
223
|
+
elsif close >= ema_high and (close - ema_high).abs > atr5 ; 2 # :bullish_closed
|
224
|
+
elsif close <= ema_low and (close - ema_low ).abs > atr5 ; -2 # :bearish_closed
|
225
|
+
elsif close >= ema_high; 1 # :bullish_weak
|
226
|
+
elsif close <= ema_low; -1 # :bearish_weak
|
227
|
+
elsif close > ema_low and close < ema_high; 0 # :ambigue
|
228
|
+
else
|
229
|
+
raise RuntimeError, "Unconsidered Indicator value with #{high}, #{low}, #{close}, #{ema_high}, #{ema_low}, #{atr5}"
|
230
|
+
|
231
|
+
end
|
232
|
+
end
|
233
|
+
}
|
234
|
+
filter = Cotcube::Bardata.continuous(symbol: symbol, indicators: indicators).
|
235
|
+
map{ |z| z[:datetime] = DateTime.parse(z[:date]); z[:datetime] += z[:datetime].wday == 5 ? 3 : 1; z.slice(:datetime, ema_filter) }.
|
236
|
+
group_by{ |z| z[:datetime] }.
|
237
|
+
map{ |k,v| [ k, v[0][ema_filter] ] }.
|
238
|
+
to_h.
|
239
|
+
tap{ |z|
|
240
|
+
z.to_a[print_range].each { |v|
|
241
|
+
puts "#{symbol} #{v[0].strftime('%Y-%m-%d')
|
242
|
+
} #{format '%2d', v[1]
|
243
|
+
}".colorize(v[1] > 3 ? :light_green : v[1] > 1 ? :green : v[1] < -3 ? :light_red : v[1] < -1 ? :red : :white )
|
244
|
+
} if print_range.is_a? Range
|
245
|
+
}
|
246
|
+
end
|
247
|
+
|
201
248
|
def continuous_ml(symbol: nil, id: nil, base: nil)
|
202
249
|
(base.nil? ? Cotcube::Bardata.continuous(symbol: symbol, id: id) : base).map do |x|
|
203
250
|
x[:ml] = x[:contracts].max_by { |z| z[:volume] }[:contract]
|
@@ -319,14 +366,17 @@ module Cotcube
|
|
319
366
|
ytoday = date.yday
|
320
367
|
data = continuous_overview(id: id, selector: selector, filter: filter, human: false, config: init, measure: measure)
|
321
368
|
.reject { |k, _| k[-2..].to_i >= date.year % 2000 }
|
369
|
+
.select { |k, _| sym[:months].chars.include? k[2] }
|
322
370
|
.group_by { |k, _| k[2] }
|
323
371
|
measuring.call("Retrieved continous_overview")
|
324
|
-
output_sent = []
|
325
|
-
early_year=nil
|
326
372
|
long_output = []
|
373
|
+
|
374
|
+
toydate = -> (z,y=2021) { str = "#{z>365 ? y+1 : y} #{z>365 ? z-365 : z}"; DateTime.strptime(str, '%Y %j').strftime('%Y-%m-%d') }
|
375
|
+
|
327
376
|
data.keys.sort.each do |month|
|
328
377
|
puts "Processing #{sym[:symbol]}#{month}" if debuglevel > 1
|
329
378
|
v0 = data[month]
|
379
|
+
|
330
380
|
# ldays is the list of 'last days'
|
331
381
|
ldays = v0.map { |_, v1| Date.parse(v1.last[:date]).yday }
|
332
382
|
# fdays is the list of 'first days'
|
@@ -335,6 +385,23 @@ module Cotcube
|
|
335
385
|
ldays.map! { |x| x > 350 ? x - 366 : x } if ldays.min < 50
|
336
386
|
fday = fdays[fdays.size / 2]
|
337
387
|
lavg = ldays.reduce(:+) / ldays.size
|
388
|
+
|
389
|
+
# rubocop:disable Layout/ClosingParenthesisIndentation
|
390
|
+
current = {
|
391
|
+
month: month,
|
392
|
+
contract: "#{sym[:symbol]}#{month}",
|
393
|
+
first_ml: fday,
|
394
|
+
last_min: ldays.min,
|
395
|
+
last_avg: lavg,
|
396
|
+
last_max: ldays.max,
|
397
|
+
until_start: fday - ytoday,
|
398
|
+
until_end: lavg - ytoday
|
399
|
+
}
|
400
|
+
current[:until_end] += 365 if current[:until_end] - current[:until_start] < 0
|
401
|
+
current[:until_end] -= 365 if current[:until_end] > 365
|
402
|
+
|
403
|
+
long_output << current
|
404
|
+
|
338
405
|
# a contract is proposed to use after fday - 1, but before ldays.min (green)
|
339
406
|
# it is warned to user after fday - 1 but before lavg - 1 (red)
|
340
407
|
# it is warned red >= lavg - 1 and <= lavg + 1
|
@@ -347,55 +414,42 @@ module Cotcube
|
|
347
414
|
else
|
348
415
|
:white
|
349
416
|
end
|
350
|
-
|
351
|
-
long_output << {
|
352
|
-
month: month,
|
353
|
-
first_ml: fday,
|
354
|
-
last_min: ldays.min,
|
355
|
-
last_avg: lavg,
|
356
|
-
last_max: ldays.max }
|
417
|
+
|
357
418
|
output = "#{sym[:symbol]
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
419
|
+
}#{month
|
420
|
+
}\t#{format '%12s', sym[:type]
|
421
|
+
}\ttoday is #{ytoday
|
422
|
+
} -- median of first is #{fday
|
423
|
+
}\tlast ranges from #{format '%5d', ldays.min
|
424
|
+
}: #{dfm.call(ldays.min)
|
425
|
+
}\t#{format '%5d', lavg
|
426
|
+
}: #{dfm.call(lavg)
|
427
|
+
}\tto #{format '%5d', ldays.max
|
428
|
+
}: #{dfm.call(ldays.max)}".colorize(color)
|
429
|
+
|
430
|
+
if debug || (color != :white)
|
431
|
+
puts output unless silent
|
432
|
+
end
|
433
|
+
next if silent or not (debug and debuglevel >= 2)
|
434
|
+
|
435
|
+
v0.each do |contract, v1|
|
436
|
+
puts "\t#{contract
|
437
|
+
}\t#{v1.first[:date]
|
438
|
+
} (#{format '%3d', Date.parse(v1.first[:date]).yday
|
439
|
+
})\t#{Date.parse(v1.last[:date]).strftime('%a, %Y-%m-%d')
|
440
|
+
} (#{Date.parse(v1.last[:date]).yday})" unless silent
|
441
|
+
# rubocop:enable Layout/ClosingParenthesisIndentation
|
442
|
+
end
|
443
|
+
|
383
444
|
end
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
puts " Assuming late-year-processing.".light_yellow
|
389
|
-
puts early_year.light_green
|
390
|
-
end
|
391
|
-
when 1
|
392
|
-
# all ok
|
393
|
-
true
|
394
|
-
else
|
395
|
-
puts "Continuous table show #{output_sent.size} active contracts ( #{output_sent} ) for #{sym[:symbol]} ---------------" unless silent
|
445
|
+
long_output.sort_by!{|z| z[:until_end] + (z[:until_end].negative? ? 365 : 0)}
|
446
|
+
|
447
|
+
if short
|
448
|
+
return ([long_output.first] + long_output.select{|z| z[:until_start].positive? and z[:until_start] < 10 }).map{|z| z[:contract] }.uniq
|
396
449
|
end
|
450
|
+
|
397
451
|
measuring.call("Finished processing")
|
398
|
-
|
452
|
+
return long_output
|
399
453
|
end
|
400
454
|
end
|
401
455
|
end
|
data/lib/cotcube-bardata/eods.rb
CHANGED
@@ -68,7 +68,7 @@ module Cotcube
|
|
68
68
|
raise ArgumentError, ':filter must be in [:volume_part, :oi_part]' unless %i[volume_part oi_part].include? filter
|
69
69
|
|
70
70
|
# noinspection RubyScope
|
71
|
-
ids = sym.nil? ? symbols.map { |x| x[:id] } : [sym[:id]]
|
71
|
+
ids = sym.nil? ? Cotcube::Helpers.symbols.map { |x| x[:id] } : [sym[:id]]
|
72
72
|
dates = [dates] unless dates.is_a?(Array) || dates.nil?
|
73
73
|
|
74
74
|
id_path_get = ->(local_id) { "#{config[:data_path]}/eods/#{local_id}" }
|
@@ -78,12 +78,14 @@ module Cotcube
|
|
78
78
|
# l_symbol = l_sym[:symbol]
|
79
79
|
id_path = id_path_get.call(i)
|
80
80
|
data_file = "#{id_path}/#{d}.csv"
|
81
|
+
current_sym = Cotcube::Helpers.get_id_set(id: i, config: config)
|
81
82
|
raise "No data found for requested :id (#{id_path} does not exist)" unless Dir.exist?(id_path)
|
82
83
|
|
83
84
|
unless File.exist?(data_file)
|
84
85
|
unless quiet
|
85
|
-
puts 'WARNING: No data found for requested
|
86
|
-
|
86
|
+
puts 'WARNING: No data found for requested symbol'\
|
87
|
+
" #{current_sym[:symbol]} in #{id_path} for #{d}.".colorize(:light_yellow)
|
88
|
+
|
87
89
|
end
|
88
90
|
return []
|
89
91
|
end
|
data/lib/cotcube-bardata.rb
CHANGED
@@ -56,6 +56,8 @@ module Cotcube
|
|
56
56
|
:continuous_overview,
|
57
57
|
# provider estimation of current ML usability
|
58
58
|
:continuous_table,
|
59
|
+
# provide a simple filter series
|
60
|
+
:filter_series,
|
59
61
|
# provide the list of quarters, possibly as hours or days.
|
60
62
|
:provide_quarters,
|
61
63
|
# some statistics to estimate daily volatility of specific contract
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cotcube-bardata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benjamin L. Tischendorf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '7'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '7'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: colorize
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,6 +164,11 @@ files:
|
|
164
164
|
- README.md
|
165
165
|
- Rakefile
|
166
166
|
- VERSION
|
167
|
+
- bin/daily.rb
|
168
|
+
- bin/eod.rb
|
169
|
+
- bin/intra.rb
|
170
|
+
- bin/sym.rb
|
171
|
+
- bin/symbols.rb
|
167
172
|
- cotcube-bardata.gemspec
|
168
173
|
- lib/cotcube-bardata.rb
|
169
174
|
- lib/cotcube-bardata/cached.rb
|