stockcruncher 1.3.1 → 1.4.2

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: 6c5f9d2cc2dba8ad0fbd9882cebcda893500e0f029610107004481b0b236d6b9
4
- data.tar.gz: 65815caea89d856ef4e4c76365df166bdb971302a95f6665d657c0ba6420e671
3
+ metadata.gz: 03dfe0d9f40c0b298cbe4c7d5f3d37683765ccb737b3a4d82ec75f6e04f46e06
4
+ data.tar.gz: e0da9a269671deb3400042cf87a7bfb39bf7b0842af91483d979d3c672c6c7a6
5
5
  SHA512:
6
- metadata.gz: 19b7f5eafd15cbcc5713a6729e17c3a2ae5dd4c471f0d77c7becb4ba10be08c6c492f4469b7ab4a93858215a406d95fced52cde98cffd0644c081ce331b43e9a
7
- data.tar.gz: c73d7c0caa396f0cf1b06f88f74e2e1cdbd0c7b7fa1739e4b72df4e5852b16e847a46d09071699db51bc6ed07a85e51766c8259221214d62e845ed15331bc980
6
+ metadata.gz: d858ff01048b66b048ec634519b9e19123e2b74204dc71826118e9c41fec707612e0424260b628fdc3a2e228366c1c1d7b2312bf8191beef0683f88ede20481d
7
+ data.tar.gz: 70fb3692a8d45ce7c292b89b551a0d78b11076b93a53caeefae4fc642d1f8ae2d50ebd09b43d6ec7cd59edf1117214aa7723a04bd96b958d866015f0479cd35d
data/README.md CHANGED
@@ -5,12 +5,14 @@
5
5
  [![Gem Version][gem-img]][gem]
6
6
 
7
7
  1. [Overview](#overview)
8
- 2. [Description](#role-description)
9
- 3. [Setup](#setup)
10
- 4. [Usage](#usage)
11
- 5. [Limitations](#limitations)
12
- 6. [Development](#development)
13
- 7. [Miscellaneous](#miscellaneous)
8
+ 1. [Description](#description)
9
+ 1. [Setup](#setup)
10
+ 1. [Usage](#usage)
11
+ 1. [Environment variables](#environment-variables)
12
+ 1. [Examples](#examples)
13
+ 1. [Limitations](#limitations)
14
+ 1. [Development](#development)
15
+ 1. [Miscellaneous](#miscellaneous)
14
16
 
15
17
  ## Overview
16
18
 
@@ -41,6 +43,17 @@ An interactive help is available with:
41
43
 
42
44
  $ stockcruncher help [subcommand]
43
45
 
46
+ ## Environment variables
47
+
48
+ Parameters in /etc/stockcruncher/stockcrunucher.yml can be overloaded with
49
+ environment variables.
50
+ Environment variables should match SCR_<COMPONENTID>_<ITEM>.
51
+ Component ID are as follow.
52
+ - AlphaVantage: AV
53
+ - InfluxDB: IDB
54
+ Items are upcase keys. See template /etc/stockcruncher/stockcrunucher.yml for
55
+ reference.
56
+
44
57
  ## Examples
45
58
 
46
59
  To get daily time serie data of a symbol:
@@ -51,6 +64,10 @@ To get last day endpoint data of a symbol:
51
64
 
52
65
  $ stockcruncher quote AAPL
53
66
 
67
+ To override a parameter with environment variable:
68
+
69
+ $ SCR_IDB_HOST=192.168.0.80; stockcruncher quote AAPL
70
+
54
71
  ## Limitations
55
72
 
56
73
  Data are currently scraped from AlphaVantage API.
@@ -45,12 +45,20 @@ module StockCruncher
45
45
  default: false,
46
46
  desc: 'Full data size.'
47
47
  )
48
+ option(
49
+ :catchup,
50
+ aliases: ['-u'],
51
+ type: :boolean,
52
+ default: false,
53
+ desc: 'Catch up the missing data only.'
54
+ )
48
55
  def daily(symbol)
49
56
  opts = options.dup
50
57
  config = YAML.load_file(opts['config'])
51
58
  cruncher = StockCruncher::AlphaVantage.new(config, opts['insecure'])
52
59
  data = cruncher.crunch_daily(symbol, opts['full'])
53
- StockCruncher::InfluxDB.new(config).export_history(symbol, data)
60
+ influx = StockCruncher::InfluxDB.new(config)
61
+ influx.export_history(symbol, data, opts['catchup'])
54
62
  puts JSON.pretty_generate(data) unless opts['quiet']
55
63
  end
56
64
 
@@ -63,10 +71,18 @@ module StockCruncher
63
71
  default: false,
64
72
  desc: 'Recalculate all MA historical values.'
65
73
  )
74
+ option(
75
+ :catchup,
76
+ aliases: ['-u'],
77
+ type: :boolean,
78
+ default: false,
79
+ desc: 'Catch up the missing data only.'
80
+ )
66
81
  def movingaverages(symbol)
67
82
  opts = options.dup
68
83
  config = YAML.load_file(opts['config'])
69
- StockCruncher::InfluxDB.new(config).moving_averages(symbol, opts['all'])
84
+ influx = StockCruncher::InfluxDB.new(config)
85
+ influx.moving_averages(symbol, opts['all'], opts['catchup'])
70
86
  end
71
87
 
72
88
  desc('quote SYMBOL [options]',
@@ -76,7 +92,8 @@ module StockCruncher
76
92
  config = StockCruncher::Config.load(opts['config'])
77
93
  cruncher = StockCruncher::AlphaVantage.new(config, opts['insecure'])
78
94
  data = cruncher.crunch_quote(symbol)
79
- StockCruncher::InfluxDB.new(config).export_last_day(data)
95
+ influx = StockCruncher::InfluxDB.new(config)
96
+ influx.export_last_day(data)
80
97
  puts JSON.pretty_generate(data) unless opts['quiet']
81
98
  end
82
99
  end
@@ -20,15 +20,22 @@ module StockCruncher
20
20
  data['columns'].zip(data['values'].transpose).to_h
21
21
  end
22
22
 
23
+ def get_ma_values(symbol, fullsize)
24
+ values = %w[ema200]
25
+ data = query('ema', symbol, values, fullsize)
26
+ data['columns'].zip(data['values'].transpose).to_h
27
+ end
28
+
23
29
  # Method to calculate moving averages based on last day values
24
- def moving_averages(symbol, fullsize)
25
- series = get_daily_values(symbol, fullsize)
30
+ def moving_averages(symbol, fullsize, catchup)
31
+ data = get_daily_values(symbol, fullsize)
32
+ mas = catchup ? get_ma_values(symbol, fullsize) : { 'time' => [] }
26
33
  tags = create_tags(symbol)
27
- series['close'].each_index do |i|
28
- date = series['time'][i]
29
- serie = series['close'][i, 201]
30
- weights = series['volume'][i, 201]
31
- write_moving_averages(tags, serie, weights, date)
34
+ dates, series, weights = data.values_at 'time', 'close', 'volume'
35
+ series.each_index do |i|
36
+ next if mas['time'].include? dates[i]
37
+
38
+ write_moving_averages(tags, series[i, 201], weights[i, 201], dates[i])
32
39
  break unless fullsize
33
40
  end
34
41
  end
@@ -39,8 +46,12 @@ module StockCruncher
39
46
  end
40
47
 
41
48
  # Method to export historical data to database
42
- def export_history(symbol, timeseries)
49
+ def export_history(symbol, timeseries, catchup)
43
50
  tags = create_tags(symbol)
51
+ if catchup
52
+ series = get_daily_values(symbol, true)
53
+ series['time'].each { |date| timeseries.delete(date) }
54
+ end
44
55
  timeseries.each_pair do |date, values|
45
56
  write('daily', tags, values, date)
46
57
  end
@@ -48,7 +48,7 @@ module StockCruncher
48
48
  RANGES.each do |n|
49
49
  next if values.size < n
50
50
 
51
- h["lwma#{n}"] = sma(values[0, n], volumes[0, n])
51
+ h["vwma#{n}"] = sma(values[0, n], volumes[0, n])
52
52
  end
53
53
  h
54
54
  end
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module StockCruncher
5
- VERSION = '1.3.1'
5
+ VERSION = '1.4.2'
6
6
  end
@@ -26,12 +26,24 @@ describe StockCruncher::CLI do # rubocop:disable Metrics/BlockLength
26
26
  end
27
27
  end
28
28
 
29
+ context 'daily SYM -u -c spec/files/stockcruncher.yml' do
30
+ it 'Get the daily time serie for SYM.' do
31
+ expect { start(self) }.to output(daily).to_stdout
32
+ end
33
+ end
34
+
29
35
  context 'movingaverages SYM -c spec/files/stockcruncher.yml' do
30
36
  it 'Get the daily time serie for SYM.' do
31
37
  expect { start(self) }.to output('').to_stdout
32
38
  end
33
39
  end
34
40
 
41
+ context 'movingaverages SYM -u -c spec/files/stockcruncher.yml' do
42
+ it 'Get the daily time serie for SYM.' do
43
+ expect { start(self) }.to output('').to_stdout
44
+ end
45
+ end
46
+
35
47
  context 'quote NODATA -c spec/files/stockcruncher.yml' do
36
48
  it 'Should not get any data and should fail.' do
37
49
  expect { start(self) }.to raise_error(SystemExit)
@@ -12,6 +12,10 @@ daily = "timestamp,open,high,low,close,volume\r\n2020-08-03,23.8500,24.6500," \
12
12
  "\n2020-07-29,24.7500,25.0300,24.0400,24.5600,4605804\r\n2020-07-28," \
13
13
  "25.9900,26.0700,24.5100,24.7500,6904261\r\n"
14
14
  d_err = "{\n \"Error Message\": \"Invalid API call.\"\n}"
15
+ i_ema = "q=SELECT ema200 FROM ema WHERE symbol = 'SYM' ORDER BY time DESC"
16
+ maval = '{"results":[{"statement_id":0,"series":[{"name":"ema","columns":[' \
17
+ '"time","ema200"],"values":[["2017-' \
18
+ '03-01T18:00:00Z",1]]}]}]}'
15
19
  mvavg = '{"results":[{"statement_id":0,"series":[{"name":"daily","columns":[' \
16
20
  '"time","close","change","changePercent","volume"],"values":[["2017-' \
17
21
  '03-01T18:00:00Z",1,0,0,1],["2017-03-02T18:00:00Z",1,0,0,1],["2017-0' \
@@ -35,6 +39,9 @@ RSpec.configure do |config|
35
39
  'function=TIME_SERIES_DAILY&symbol=SYM&apikey=demo' \
36
40
  '&datatype=csv&outputsize=compact')
37
41
  .to_return('status' => 200, 'body' => daily, 'headers' => {})
42
+ stub_request(:post, 'http://localhost:8086/query?db=test')
43
+ .with(body: i_ema)
44
+ .to_return('status' => 204, 'body' => maval, 'headers' => {})
38
45
  stub_request(:post, 'http://localhost:8086/query?db=test')
39
46
  .to_return('status' => 204, 'body' => mvavg, 'headers' => {})
40
47
  stub_request(:post, 'http://localhost:8086/write?db=test')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stockcruncher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Delaplace
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-19 00:00:00.000000000 Z
11
+ date: 2021-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler