cotcube-bardata 0.1.15.6 → 0.1.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/bin/eod.rb +8 -0
- data/lib/cotcube-bardata/daily.rb +88 -84
- data/lib/cotcube-bardata/eods.rb +1 -1
- data/lib/cotcube-bardata.rb +2 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa52a5fd519f8351f712e30495d4dda59bb37a4d4b588c84904d1971d7ad734c
|
4
|
+
data.tar.gz: b1eaacc5e75d13d84edf8c095cdaebc7ec588fe0e61ef6dc764d2a5633fedece
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1798e058b377f50f2efe78f8f6b0936763ce29686a639f10e893914202ca27f4469665d9520d7adcda4df5f4346e5f9f87e8ce229c389ac78dde666335f1efd3
|
7
|
+
data.tar.gz: 8e245ebcea3acdde99f7c5673f97024432648938e530fd9ae11dae4b7f67091a5128536fa70c0e4ba0cb372d85f7c713460249da574278501e60f4bf66ebf1ac
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## 0.1.16 (November 23, 2021)
|
2
|
+
- bin/eod.rb: little helper to display eod data in bash resp. in xinetdhttpservice
|
3
|
+
- eods.rb: minor change to adapt move of symbols to Helpers
|
4
|
+
- daily.rb: in continuous, changed default indicators to %i[ tr atr5 dist ]
|
5
|
+
|
1
6
|
## 0.1.15.6 (November 19, 2021)
|
2
7
|
- daily: added filter_series
|
3
8
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.16
|
data/bin/eod.rb
ADDED
@@ -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
|
@@ -207,44 +203,46 @@ module Cotcube
|
|
207
203
|
indicators = {
|
208
204
|
ema_high_n => Cotcube::Indicators.ema(key: :high, length: ema_length, smoothing: 2),
|
209
205
|
ema_low_n => Cotcube::Indicators.ema(key: :low, length: ema_length, smoothing: 2),
|
206
|
+
# NOTE: TR / ATR5 are in default set of continuous
|
210
207
|
:tr => Cotcube::Indicators.true_range,
|
211
208
|
:atr5 => Cotcube::Indicators.ema(key: :tr, length: 5, smoothing: 2),
|
212
209
|
ema_filter => Cotcube::Indicators.calc(a: :high, b: :low, c: :close,
|
213
210
|
d: ema_high_n, e: ema_low_n, f: :atr5,
|
214
211
|
finalize: :to_i) do |high, low, close, ema_high, ema_low, atr5|
|
215
212
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
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
|
236
233
|
}
|
237
234
|
filter = Cotcube::Bardata.continuous(symbol: symbol, indicators: indicators).
|
238
235
|
map{ |z| z[:datetime] = DateTime.parse(z[:date]); z[:datetime] += z[:datetime].wday == 5 ? 3 : 1; z.slice(:datetime, ema_filter) }.
|
239
236
|
group_by{ |z| z[:datetime] }.
|
240
237
|
map{ |k,v| [ k, v[0][ema_filter] ] }.
|
241
238
|
to_h.
|
242
|
-
tap{ |z|
|
243
|
-
|
244
|
-
}
|
245
|
-
|
246
|
-
|
247
|
-
|
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
|
+
}
|
248
246
|
end
|
249
247
|
|
250
248
|
def continuous_ml(symbol: nil, id: nil, base: nil)
|
@@ -370,12 +368,14 @@ module Cotcube
|
|
370
368
|
.reject { |k, _| k[-2..].to_i >= date.year % 2000 }
|
371
369
|
.group_by { |k, _| k[2] }
|
372
370
|
measuring.call("Retrieved continous_overview")
|
373
|
-
output_sent = []
|
374
|
-
early_year=nil
|
375
371
|
long_output = []
|
372
|
+
|
373
|
+
toydate = -> (z,y=2021) { str = "#{z>365 ? y+1 : y} #{z>365 ? z-365 : z}"; DateTime.strptime(str, '%Y %j').strftime('%Y-%m-%d') }
|
374
|
+
|
376
375
|
data.keys.sort.each do |month|
|
377
376
|
puts "Processing #{sym[:symbol]}#{month}" if debuglevel > 1
|
378
377
|
v0 = data[month]
|
378
|
+
|
379
379
|
# ldays is the list of 'last days'
|
380
380
|
ldays = v0.map { |_, v1| Date.parse(v1.last[:date]).yday }
|
381
381
|
# fdays is the list of 'first days'
|
@@ -384,6 +384,23 @@ module Cotcube
|
|
384
384
|
ldays.map! { |x| x > 350 ? x - 366 : x } if ldays.min < 50
|
385
385
|
fday = fdays[fdays.size / 2]
|
386
386
|
lavg = ldays.reduce(:+) / ldays.size
|
387
|
+
|
388
|
+
# rubocop:disable Layout/ClosingParenthesisIndentation
|
389
|
+
current = {
|
390
|
+
month: month,
|
391
|
+
contract: "#{sym[:symbol]}#{month}",
|
392
|
+
first_ml: fday,
|
393
|
+
last_min: ldays.min,
|
394
|
+
last_avg: lavg,
|
395
|
+
last_max: ldays.max,
|
396
|
+
until_start: fday - ytoday,
|
397
|
+
until_end: ldays.min - ytoday
|
398
|
+
}
|
399
|
+
current[:until_end] += 365 if current[:until_end] - current[:until_start] < 0
|
400
|
+
current[:until_end] -= 365 if current[:until_end] > 365
|
401
|
+
|
402
|
+
long_output << current
|
403
|
+
|
387
404
|
# a contract is proposed to use after fday - 1, but before ldays.min (green)
|
388
405
|
# it is warned to user after fday - 1 but before lavg - 1 (red)
|
389
406
|
# it is warned red >= lavg - 1 and <= lavg + 1
|
@@ -396,55 +413,42 @@ module Cotcube
|
|
396
413
|
else
|
397
414
|
:white
|
398
415
|
end
|
399
|
-
|
400
|
-
long_output << {
|
401
|
-
month: month,
|
402
|
-
first_ml: fday,
|
403
|
-
last_min: ldays.min,
|
404
|
-
last_avg: lavg,
|
405
|
-
last_max: ldays.max }
|
416
|
+
|
406
417
|
output = "#{sym[:symbol]
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
418
|
+
}#{month
|
419
|
+
}\t#{format '%12s', sym[:type]
|
420
|
+
}\ttoday is #{ytoday
|
421
|
+
} -- median of first is #{fday
|
422
|
+
}\tlast ranges from #{format '%5d', ldays.min
|
423
|
+
}: #{dfm.call(ldays.min)
|
424
|
+
}\t#{format '%5d', lavg
|
425
|
+
}: #{dfm.call(lavg)
|
426
|
+
}\tto #{format '%5d', ldays.max
|
427
|
+
}: #{dfm.call(ldays.max)}".colorize(color)
|
428
|
+
|
429
|
+
if debug || (color != :white)
|
430
|
+
puts output unless silent
|
431
|
+
end
|
432
|
+
next if silent or not (debug and debuglevel >= 2)
|
433
|
+
|
434
|
+
v0.each do |contract, v1|
|
435
|
+
puts "\t#{contract
|
436
|
+
}\t#{v1.first[:date]
|
437
|
+
} (#{format '%3d', Date.parse(v1.first[:date]).yday
|
438
|
+
})\t#{Date.parse(v1.last[:date]).strftime('%a, %Y-%m-%d')
|
439
|
+
} (#{Date.parse(v1.last[:date]).yday})" unless silent
|
440
|
+
# rubocop:enable Layout/ClosingParenthesisIndentation
|
441
|
+
end
|
442
|
+
|
432
443
|
end
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
puts " Assuming late-year-processing.".light_yellow
|
438
|
-
puts early_year.light_green
|
439
|
-
end
|
440
|
-
when 1
|
441
|
-
# all ok
|
442
|
-
true
|
443
|
-
else
|
444
|
-
puts "Continuous table show #{output_sent.size} active contracts ( #{output_sent} ) for #{sym[:symbol]} ---------------" unless silent
|
444
|
+
long_output.sort_by!{|z| z[:until_end] + (z[:until_end].negative? ? 365 : 0)}
|
445
|
+
|
446
|
+
if short
|
447
|
+
return ([long_output.first] + long_output.select{|z| z[:until_start].positive? and z[:until_start] < 10 }).map{|z| z[:contract] }.uniq
|
445
448
|
end
|
449
|
+
|
446
450
|
measuring.call("Finished processing")
|
447
|
-
|
451
|
+
return long_output
|
448
452
|
end
|
449
453
|
end
|
450
454
|
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}" }
|
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.16
|
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-
|
11
|
+
date: 2021-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -164,6 +164,7 @@ files:
|
|
164
164
|
- README.md
|
165
165
|
- Rakefile
|
166
166
|
- VERSION
|
167
|
+
- bin/eod.rb
|
167
168
|
- cotcube-bardata.gemspec
|
168
169
|
- lib/cotcube-bardata.rb
|
169
170
|
- lib/cotcube-bardata/cached.rb
|