cotcube-bardata 0.1.15.2 → 0.1.15.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 46f85dd103fd911ba475b347f14002f1402eda630b79ded6a161969a1df487db
4
- data.tar.gz: 72f66b63600041d28131df575036d0295f8ab206e132fcd69c2ea84109194505
3
+ metadata.gz: 48c3d1d43865ad1b7bba959025aa38ecf0ea574a8a946740f8226aa06741e600
4
+ data.tar.gz: 4da3026ca588bd848648242c8f21d482e86bb8be72f4a6f0e45b543fca461e05
5
5
  SHA512:
6
- metadata.gz: 29271f6f4b5dba379bb19e81846d52f1d2995bd010f35b7e80bad3256ae415c841eeead6a84034ce72d29cd6b3746d4d62fb182347abca1fa6d78fd0c3bfb6a7
7
- data.tar.gz: 5cb42e0fbd5ae2124edb7ede368047e72c8fe68b99ed928727d8e47859a5c94470bab989a032f0689e63058dd01b190936d02f22d8be7fca3cd61f3240a40a1c
6
+ metadata.gz: 1235c3ba86c1aa51cd0925912e8f60b07c898498070d86f00d45747aa3041b69039974f04524c4fec187f924bff495596ac0ec32d812d444f8cb5d2b8d223afe
7
+ data.tar.gz: a9c4753b1cb05598d18c9d0f62d4ecb652b4430ec84ee8ad9900d2cdf0d9bc5330e5b5a8b8b0fa6ff2dda82a72b1087b5f8c28d257b9ce3c6763dd22080c1681
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.1.15.4 (October 26, 2021)
2
+ - daily: including the sourcing factor (:bcf) into provide_daily and continuous
3
+
4
+ ## 0.1.15.3 (August 04, 2021)
5
+ - daily.rb: Hotfixing
6
+
1
7
  ## 0.1.15.2 (August 04, 2021)
2
8
  - fixed leftover debug setting
3
9
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.15.2
1
+ 0.1.15.4
@@ -10,8 +10,10 @@ module Cotcube
10
10
  timezone: Time.find_zone('America/Chicago'),
11
11
  keep_last: false,
12
12
  add_eods: true,
13
+ indicators: {},
13
14
  config: init)
14
15
  contract = contract.to_s.upcase
16
+ rounding = 8
15
17
  unless contract.is_a?(String) && [3, 5].include?(contract.size)
16
18
  raise ArgumentError, "Contract '#{contract}' is bogus, should be like 'M21' or 'ESM21'"
17
19
  end
@@ -43,7 +45,10 @@ module Cotcube
43
45
  data = CSV.read(data_file, headers: %i[contract date open high low close volume oi]).map do |row|
44
46
  row = row.to_h
45
47
  row.each do |k, _|
46
- row[k] = row[k].to_f if %i[open high low close].include? k
48
+ if %i[open high low close].include? k
49
+ row[k] = row[k].to_f
50
+ row[k] = (row[k] * sym[:bcf]).round(8) unless sym[:bcf] == 1.0
51
+ end
47
52
  row[k] = row[k].to_i if %i[volume oi].include? k
48
53
  end
49
54
  row[:datetime] = timezone.parse(row[:date])
@@ -57,19 +62,28 @@ module Cotcube
57
62
  today = Date.today
58
63
  eods = [ ]
59
64
  while today.strftime('%Y-%m-%d') > data.last[:date]
60
- eods << provide_eods(symbol: sym[:symbol], dates: today, contracts_only: false)
65
+ eods << provide_eods(symbol: sym[:symbol], dates: today, contracts_only: false, quiet: true)
61
66
  today -= 1
62
67
  end
63
68
  eods.flatten!.map!{|x| x.tap {|y| %i[ volume_part oi_part ].map{|z| y.delete(z)} } }
64
- eods.select{|x| x[:contract] == contract }
69
+ eods.select!{|x| x[:contract] == "#{sym[:symbol]}#{contract}" }
65
70
  eods.map!{|x| x.tap{|y|
71
+ if sym[:bcf] != 1.0
72
+ %i[open high low close].map{|k|
73
+ y[k] = (y[k] * sym[:bcf]).round(8)
74
+ }
75
+ end
66
76
  y[:datetime] = timezone.parse(y[:date])
67
77
  y[:dist] = ((y[:high] - y[:low]) / sym[:ticksize] ).to_i
68
78
  y[:type] = :eod
69
79
  } }
70
80
  data += eods.reverse
71
-
72
81
  end
82
+ data.map do |bar|
83
+ indicators.each do |k,v|
84
+ bar[k] = v.call(bar).round(rounding)
85
+ end
86
+ end unless indicators.empty?
73
87
  if range.nil?
74
88
  data
75
89
  else
@@ -82,7 +96,7 @@ module Cotcube
82
96
 
83
97
  # reads all files in bardata/daily/<id> and aggregates by date
84
98
  # (what is a pre-stage of a continuous based on daily bars)
85
- def continuous(symbol: nil, id: nil, config: init, date: nil, measure: nil, force_rewrite: false, selector: nil, debug: false, add_eods: true)
99
+ def continuous(symbol: nil, id: nil, config: init, date: nil, measure: nil, force_rewrite: false, selector: nil, debug: false, add_eods: true, indicators: nil)
86
100
  raise ArgumentError, ':measure, if given, must be a Time object (e.g. Time.now)' unless [NilClass, Time].include? measure.class
87
101
  measuring = lambda {|c| puts "[continuous] Time measured until '#{c}': #{(Time.now.to_f - measure.to_f).round(2)}sec" unless measure.nil? }
88
102
 
@@ -99,7 +113,7 @@ module Cotcube
99
113
 
100
114
  # instead of using the provide_daily methods above, for this bulk operation a 'continuous.csv' is created
101
115
  # this boosts from 4.5sec to 0.3sec
102
- rewriting = force_rewrite or not(File.exist?(c_file)) or (Time.now - File.mtime(c_file) > 8.days)
116
+ rewriting = (force_rewrite or not(File.exist?(c_file)) or (Time.now - File.mtime(c_file) > 8.days))
103
117
  if rewriting
104
118
  puts "In daily+continuous: Rewriting #{c_file} #{force_rewrite ? "forcibly" : "due to fileage"}.".light_yellow
105
119
  `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}`
@@ -113,20 +127,20 @@ module Cotcube
113
127
  low: row[4],
114
128
  close: row[5],
115
129
  volume: row[6].to_i,
116
- oi: row[7].to_i
130
+ oi: row[7].to_i,
131
+ type: :cont
117
132
  }
118
133
  end
119
134
  if add_eods
120
135
  today = Date.today
121
136
  eods = [ ]
122
137
  while today.strftime('%Y-%m-%d') > data.last[:date]
123
- eods << provide_eods(symbol: symbol, dates: today, contracts_only: false)
138
+ eods << provide_eods(symbol: symbol, dates: today, contracts_only: false, quiet: true)
124
139
  today -= 1
125
140
  end
126
141
  eods.flatten!.map!{|x| x.tap {|y| %i[ volume_part oi_part ].map{|z| y.delete(z)} } }
127
142
  eods.delete_if { |elem| elem.flatten.empty? }
128
143
  data += eods.reverse
129
-
130
144
  end
131
145
 
132
146
  measuring.call("Finished retrieving dailies.")
@@ -137,34 +151,7 @@ module Cotcube
137
151
  sma250_high: Cotcube::Indicators.sma(key: :high, length: 250),
138
152
  sma250_low: Cotcube::Indicators.sma(key: :low, length: 250),
139
153
  sma250_typ: Cotcube::Indicators.sma(key: :typical, length: 250),
140
- # sma60_typ: Cotcube::Indicators.sma(key: :typical, length: short),
141
- # tr: Cotcube::Indicators.true_range,
142
- # atr5: Cotcube::Indicators.sma(key: :tr, length: 5),
143
- # dist_abs: Cotcube::Indicators.calc(a: :sma250_high, b: :sma250_low, c: :high, d: :low) do |sma_high, sma_low, high, low|
144
- # if high > sma_high
145
- # high - sma_high
146
- # elsif sma_low > low
147
- # low - sma_low
148
- # else
149
- # 0
150
- # end
151
- #end,
152
- #dist_sma: Cotcube::Indicators.calc(a: :sma250_typ, b: :sma60_typ) do |sma250, sma60|
153
- # sma60 - sma250
154
- #end,
155
- #dist_index: Cotcube::Indicators.index(key: :dist_abs, length: 60, abs: true),
156
- #dev250_squared: Cotcube::Indicators.calc(a: :sma250_typ, b: :typical) {|sma, x| (sma - x) ** 2 },
157
- #var250: Cotcube::Indicators.sma(key: :dev250_squared, length: long),
158
- #sig250: Cotcube::Indicators.calc(a: :var250) {|var| Math.sqrt(var)},
159
- #boll250_high: Cotcube::Indicators.calc(a: :sig250, b: :sma250_typ) {|sig, typ| (typ + sig * bollinger_factor) rescue nil},
160
- #boll250_low: Cotcube::Indicators.calc(a: :sig250, b: :sma250_typ) {|sig, typ| (typ - sig * bollinger_factor) rescue nil},
161
- #dev60_squared: Cotcube::Indicators.calc(a: :sma60_typ, b: :typical) {|sma, x| (sma - x) ** 2 },
162
- #var60: Cotcube::Indicators.sma(key: :dev60_squared, length: short),
163
- #sig60: Cotcube::Indicators.calc(a: :var60) {|var| Math.sqrt(var)},
164
- #boll60_high: Cotcube::Indicators.calc(a: :sig60, b: :sma60_typ) {|sig, typ| (typ + sig * bollinger_factor) rescue nil},
165
- #boll60_low: Cotcube::Indicators.calc(a: :sig60, b: :sma60_typ) {|sig, typ| (typ - sig * bollinger_factor) rescue nil}
166
- dist: Cotcube::Indicators.calc(a: :high, b: :low, finalize: :to_i) {|high, low| ((high-low) / ticksize) }
167
-
154
+ dist: Cotcube::Indicators.calc(a: :high, b: :low, finalize: :to_i) {|high, low| ((high-low) / ticksize) },
168
155
  }
169
156
 
170
157
 
@@ -177,10 +164,13 @@ module Cotcube
177
164
  open: nil, high: nil, low: nil, close: nil,
178
165
  volume: v.map { |x| x[:volume] }.reduce(:+),
179
166
  oi: v.map { |x| x[:oi] }.reduce(:+),
167
+ type: :cont_eod
180
168
  }
181
169
 
182
170
  %i[ open high low close ].each do |ohlc|
183
171
  avg_bar[ohlc] = (v.map{|x| x[ohlc].to_f * x[effective_selector] }.reduce(:+) / avg_bar[effective_selector]).round(rounding)
172
+ avg_bar[ohlc] = (avg_bar[ohlc] * sym[:bcf]).round(8) unless sym[:bcf] == 1.0
173
+
184
174
  end
185
175
  p avg_bar if debug
186
176
  indicators.each do |k,v|
@@ -326,17 +316,18 @@ module Cotcube
326
316
 
327
317
  ytoday = date.yday
328
318
  data = continuous_overview(id: id, selector: selector, filter: filter, human: false, config: init, measure: measure)
329
- .reject { |k, _| k[-2..].to_i == date.year % 2000 }
319
+ .reject { |k, _| k[-2..].to_i >= date.year % 2000 }
330
320
  .group_by { |k, _| k[2] }
331
321
  measuring.call("Retrieved continous_overview")
332
322
  output_sent = []
333
323
  early_year=nil
334
324
  long_output = []
335
325
  data.keys.sort.each do |month|
336
- current_long = { month: month }
337
326
  puts "Processing #{sym[:symbol]}#{month}" if debuglevel > 1
338
327
  v0 = data[month]
328
+ # ldays is the list of 'last days'
339
329
  ldays = v0.map { |_, v1| Date.parse(v1.last[:date]).yday }
330
+ # fdays is the list of 'first days'
340
331
  fdays = v0.map { |_, v1| Date.parse(v1.first[:date]).yday }.sort
341
332
  # if the last ml day nears the end of the year, we must fix
342
333
  ldays.map! { |x| x > 350 ? x - 366 : x } if ldays.min < 50
@@ -374,8 +365,8 @@ module Cotcube
374
365
  }: #{dfm.call(ldays.max)}".colorize(color)
375
366
  if debug || (color != :white)
376
367
  puts output unless silent
377
- output_sent << "#{sym[:symbol]}#{month}" unless color == :white
378
368
  end
369
+ output_sent << "#{sym[:symbol]}#{month}" unless color == :white
379
370
  early_year ||= output
380
371
  next if silent or not (debug and debuglevel >= 2)
381
372
 
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.15.2
4
+ version: 0.1.15.4
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-08-04 00:00:00.000000000 Z
11
+ date: 2021-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport