dtn 0.0.0 → 0.1.0
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/.circleci/config.yml +21 -5
- data/.env.example +5 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +7 -0
- data/CHANGELOG.md +5 -1
- data/Gemfile +3 -1
- data/README.md +288 -9
- data/Rakefile +2 -0
- data/docker-compose.yml +34 -0
- data/dtn.gemspec +1 -1
- data/lib/dtn.rb +18 -1
- data/lib/dtn/concerns/id.rb +36 -0
- data/lib/dtn/concerns/validation.rb +71 -0
- data/lib/dtn/helpers/catalog.rb +32 -0
- data/lib/dtn/lookups/catalog/listed_markets.rb +12 -0
- data/lib/dtn/lookups/catalog/naic_codes.rb +12 -0
- data/lib/dtn/lookups/catalog/security_types.rb +12 -0
- data/lib/dtn/lookups/catalog/sic_codes.rb +12 -0
- data/lib/dtn/lookups/catalog/trade_conditions.rb +12 -0
- data/lib/dtn/lookups/historical/base.rb +43 -0
- data/lib/dtn/lookups/historical/daily_datapoint.rb +13 -0
- data/lib/dtn/lookups/historical/daily_timeframe.rb +34 -0
- data/lib/dtn/lookups/historical/datapoint.rb +27 -0
- data/lib/dtn/lookups/historical/interval.rb +14 -0
- data/lib/dtn/lookups/historical/interval_datapoint.rb +31 -0
- data/lib/dtn/lookups/historical/interval_day.rb +32 -0
- data/lib/dtn/lookups/historical/interval_timeframe.rb +37 -0
- data/lib/dtn/lookups/historical/monthly_datapoint.rb +13 -0
- data/lib/dtn/lookups/historical/tick.rb +14 -0
- data/lib/dtn/lookups/historical/tick_datapoint.rb +24 -0
- data/lib/dtn/lookups/historical/tick_day.rb +34 -0
- data/lib/dtn/lookups/historical/tick_timeframe.rb +31 -0
- data/lib/dtn/lookups/historical/weekly_datapoint.rb +13 -0
- data/lib/dtn/lookups/news/base.rb +85 -0
- data/lib/dtn/lookups/news/config.rb +25 -0
- data/lib/dtn/lookups/news/headline.rb +40 -0
- data/lib/dtn/lookups/news/story.rb +40 -0
- data/lib/dtn/lookups/news/story_count.rb +36 -0
- data/lib/dtn/lookups/request.rb +92 -0
- data/lib/dtn/lookups/symbol/base.rb +11 -0
- data/lib/dtn/lookups/symbol/by_filter.rb +58 -0
- data/lib/dtn/lookups/symbol/by_naic.rb +26 -0
- data/lib/dtn/lookups/symbol/by_sic.rb +26 -0
- data/lib/dtn/message.rb +29 -0
- data/lib/dtn/messages/bar/base.rb +30 -0
- data/lib/dtn/messages/bar/current_bar.rb +11 -0
- data/lib/dtn/messages/bar/historical_bar.rb +11 -0
- data/lib/dtn/messages/bar/update_bar.rb +11 -0
- data/lib/dtn/messages/catalog/code.rb +22 -0
- data/lib/dtn/messages/catalog/listed_markets.rb +20 -0
- data/lib/dtn/messages/catalog/naic_codes.rb +10 -0
- data/lib/dtn/messages/catalog/security_types.rb +20 -0
- data/lib/dtn/messages/catalog/sic_codes.rb +10 -0
- data/lib/dtn/messages/catalog/trade_conditions.rb +20 -0
- data/lib/dtn/messages/historical/daily_weekly_monthly.rb +25 -0
- data/lib/dtn/messages/historical/interval.rb +28 -0
- data/lib/dtn/messages/historical/tick.rb +31 -0
- data/lib/dtn/messages/level2/level2_update.rb +38 -0
- data/lib/dtn/messages/level2/market_maker_name.rb +20 -0
- data/lib/dtn/messages/message_with_simple_parser.rb +38 -0
- data/lib/dtn/messages/news/base.rb +34 -0
- data/lib/dtn/messages/news/config.rb +24 -0
- data/lib/dtn/messages/news/headline.rb +25 -0
- data/lib/dtn/messages/news/story.rb +20 -0
- data/lib/dtn/messages/news/story_count.rb +21 -0
- data/lib/dtn/messages/quote/level1.rb +150 -0
- data/lib/dtn/messages/quote/level1_fundamental.rb +17 -0
- data/lib/dtn/messages/quote/level1_news.rb +27 -0
- data/lib/dtn/messages/quote/level1_regional.rb +31 -0
- data/lib/dtn/messages/quote/level1_summary.rb +19 -0
- data/lib/dtn/messages/quote/level1_update.rb +21 -0
- data/lib/dtn/messages/symbol/base.rb +35 -0
- data/lib/dtn/messages/symbol/by_filter.rb +11 -0
- data/lib/dtn/messages/symbol/by_naic.rb +22 -0
- data/lib/dtn/messages/symbol/by_sic.rb +22 -0
- data/lib/dtn/messages/system/client_stats.rb +46 -0
- data/lib/dtn/messages/system/customer_info.rb +30 -0
- data/lib/dtn/messages/system/end_of_message_characters.rb +22 -0
- data/lib/dtn/messages/system/error.rb +20 -0
- data/lib/dtn/messages/system/generic.rb +98 -0
- data/lib/dtn/messages/system/no_data_characters.rb +22 -0
- data/lib/dtn/messages/system/stats.rb +38 -0
- data/lib/dtn/messages/system/symbol_not_found.rb +19 -0
- data/lib/dtn/messages/system/timestamp.rb +16 -0
- data/lib/dtn/messages/unknown.rb +15 -0
- data/lib/dtn/registry.rb +57 -0
- data/lib/dtn/streaming/client.rb +105 -0
- data/lib/dtn/streaming/clients/admin.rb +20 -0
- data/lib/dtn/streaming/clients/bar.rb +49 -0
- data/lib/dtn/streaming/clients/level2.rb +25 -0
- data/lib/dtn/streaming/clients/quote.rb +57 -0
- data/lib/dtn/streaming/messages_recorder_observer.rb +26 -0
- data/lib/dtn/streaming/request.rb +27 -0
- data/lib/dtn/streaming/request_builder.rb +57 -0
- data/lib/dtn/streaming/requests/admin/register_client_app.rb +24 -0
- data/lib/dtn/streaming/requests/admin/remove_client_app.rb +22 -0
- data/lib/dtn/streaming/requests/admin/save_login_info.rb +18 -0
- data/lib/dtn/streaming/requests/admin/set_autoconnect.rb +18 -0
- data/lib/dtn/streaming/requests/admin/set_client_stats.rb +20 -0
- data/lib/dtn/streaming/requests/admin/set_loginid.rb +21 -0
- data/lib/dtn/streaming/requests/admin/set_password.rb +21 -0
- data/lib/dtn/streaming/requests/bar/unwatch.rb +18 -0
- data/lib/dtn/streaming/requests/bar/unwatch_all.rb +16 -0
- data/lib/dtn/streaming/requests/bar/watch.rb +81 -0
- data/lib/dtn/streaming/requests/bar/watches.rb +21 -0
- data/lib/dtn/streaming/requests/level2/connect.rb +16 -0
- data/lib/dtn/streaming/requests/level2/disconnect.rb +16 -0
- data/lib/dtn/streaming/requests/level2/market_maker_by_id.rb +18 -0
- data/lib/dtn/streaming/requests/level2/unwatch.rb +18 -0
- data/lib/dtn/streaming/requests/level2/watch.rb +18 -0
- data/lib/dtn/streaming/requests/quote/all_update_fieldnames.rb +16 -0
- data/lib/dtn/streaming/requests/quote/connect.rb +16 -0
- data/lib/dtn/streaming/requests/quote/current_update_fieldnames.rb +16 -0
- data/lib/dtn/streaming/requests/quote/fundamental_fieldnames.rb +16 -0
- data/lib/dtn/streaming/requests/quote/news_switch.rb +18 -0
- data/lib/dtn/streaming/requests/quote/refresh.rb +29 -0
- data/lib/dtn/streaming/requests/quote/regional_switch.rb +26 -0
- data/lib/dtn/streaming/requests/quote/set_client_name.rb +16 -0
- data/lib/dtn/streaming/requests/quote/set_protocol.rb +16 -0
- data/lib/dtn/streaming/requests/quote/timestamp.rb +21 -0
- data/lib/dtn/streaming/requests/quote/timestamp_switch.rb +18 -0
- data/lib/dtn/streaming/requests/quote/trades.rb +21 -0
- data/lib/dtn/streaming/requests/quote/unwatch.rb +22 -0
- data/lib/dtn/streaming/requests/quote/unwatch_all.rb +16 -0
- data/lib/dtn/streaming/requests/quote/update_fields.rb +40 -0
- data/lib/dtn/streaming/requests/quote/watch.rb +22 -0
- data/lib/dtn/streaming/requests/quote/watches.rb +21 -0
- data/lib/dtn/version.rb +1 -1
- data/lib/ext/business_day.rb +15 -0
- data/lib/tasks/spec_date.rake +13 -0
- metadata +126 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 01144ea75d9a670db11ab1836fff8bc3e650bad5f964aef65511b2ee1669268d
|
|
4
|
+
data.tar.gz: dc9116938d33b14f375c25c5df374be43d4797d5efe0a12a40adbeb2363a67b3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ac0e99c1951a85709ba61e3632c1d7c8924fb631e42e450548e83fbf3e4347dd50d2c0eeb83ba1d2a0d30943bfd693adec6c06e96a76d10b6e38e09126e50b05
|
|
7
|
+
data.tar.gz: daa3d7752b364c772c6f6094745a92f2b30f080a7ccc9954aa06fd23b1d2ecb28057792172b32cc02abb843ecb81f1fcde453a8f3d3c157c4a5a755b7e97ae3c
|
data/.circleci/config.yml
CHANGED
|
@@ -2,10 +2,10 @@ version: 2.1
|
|
|
2
2
|
defaults: &defaults
|
|
3
3
|
working_directory: ~/repo
|
|
4
4
|
docker:
|
|
5
|
-
- image: circleci/ruby:2.6
|
|
5
|
+
- image: circleci/ruby:2.6
|
|
6
6
|
environment:
|
|
7
7
|
BUNDLE_PATH: vendor/bundle
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
commands:
|
|
10
10
|
prepare:
|
|
11
11
|
description: "Common preparation steps"
|
|
@@ -46,7 +46,14 @@ jobs:
|
|
|
46
46
|
paths:
|
|
47
47
|
- cc-test-reporter
|
|
48
48
|
rspec:
|
|
49
|
-
|
|
49
|
+
working_directory: ~/repo
|
|
50
|
+
docker:
|
|
51
|
+
- image: << parameters.image >>
|
|
52
|
+
environment:
|
|
53
|
+
BUNDLE_PATH: vendor/bundle
|
|
54
|
+
parameters:
|
|
55
|
+
image:
|
|
56
|
+
type: string
|
|
50
57
|
environment:
|
|
51
58
|
COVERAGE: "1"
|
|
52
59
|
CI: "1"
|
|
@@ -59,11 +66,11 @@ jobs:
|
|
|
59
66
|
command: |
|
|
60
67
|
bundle exec rspec
|
|
61
68
|
|
|
62
|
-
./tmp/cc-test-reporter format-coverage -t simplecov -o tmp/codeclimate.json coverage/coverage.json
|
|
69
|
+
./tmp/cc-test-reporter format-coverage -t simplecov -o tmp/codeclimate.$CIRCLE_BUILD_NUM.json coverage/coverage.json
|
|
63
70
|
- persist_to_workspace:
|
|
64
71
|
root: tmp
|
|
65
72
|
paths:
|
|
66
|
-
- codeclimate
|
|
73
|
+
- codeclimate.*.json
|
|
67
74
|
rubocop:
|
|
68
75
|
<<: *defaults
|
|
69
76
|
steps:
|
|
@@ -80,7 +87,10 @@ jobs:
|
|
|
80
87
|
at: ~/repo/tmp
|
|
81
88
|
- run:
|
|
82
89
|
name: Upload coverage results to Code Climate
|
|
90
|
+
# --parts flag must match the build matrix size
|
|
83
91
|
command: |
|
|
92
|
+
./tmp/cc-test-reporter sum-coverage -o tmp/codeclimate.json --parts 3 tmp/codeclimate.*.json
|
|
93
|
+
|
|
84
94
|
./tmp/cc-test-reporter upload-coverage -i tmp/codeclimate.json
|
|
85
95
|
|
|
86
96
|
workflows:
|
|
@@ -91,6 +101,12 @@ workflows:
|
|
|
91
101
|
- rspec:
|
|
92
102
|
requires:
|
|
93
103
|
- download_test_reporter
|
|
104
|
+
matrix:
|
|
105
|
+
parameters:
|
|
106
|
+
image:
|
|
107
|
+
- "circleci/ruby:2.6"
|
|
108
|
+
- "circleci/ruby:2.7"
|
|
109
|
+
- "circleci/ruby:3.0"
|
|
94
110
|
- rubocop
|
|
95
111
|
- upload-coverage:
|
|
96
112
|
requires:
|
data/.env.example
ADDED
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
|
@@ -8,11 +8,13 @@ gemspec
|
|
|
8
8
|
gem "rake", "~> 13.0"
|
|
9
9
|
|
|
10
10
|
gem "pry", "~> 0.14.0"
|
|
11
|
-
gem "rubocop", "~> 1.
|
|
11
|
+
gem "rubocop", "~> 1.18.0", require: false
|
|
12
12
|
gem "rubocop-rake", "~> 0.5.0", require: false
|
|
13
13
|
gem "rubocop-rspec", "~> 2.3.0", require: false
|
|
14
14
|
|
|
15
15
|
group :test do
|
|
16
|
+
gem "business_time", "~> 0.10.0"
|
|
17
|
+
gem "holidays", "~> 8.4.0"
|
|
16
18
|
gem "rspec", ">= 3.10.0", "< 4.0"
|
|
17
19
|
gem "rspec_junit_formatter"
|
|
18
20
|
gem "simplecov", "~> 0.21.0", require: false
|
data/README.md
CHANGED
|
@@ -4,14 +4,30 @@
|
|
|
4
4
|
[](https://codeclimate.com/github/kvokka/dtn/maintainability)
|
|
5
5
|
[](https://codeclimate.com/github/kvokka/dtn/test_coverage)
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
# Dtn
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
Unofficial DTN (IQFeed) client.
|
|
10
|
+
|
|
11
|
+
# Dependencies
|
|
12
|
+
|
|
13
|
+
* IQFeed client ~> 6.1
|
|
14
|
+
|
|
15
|
+
# IQFeed API support status
|
|
11
16
|
|
|
12
|
-
|
|
17
|
+
## Streaming clients
|
|
13
18
|
|
|
14
|
-
|
|
19
|
+
- [x] Quote (Level 1) client
|
|
20
|
+
- [x] Level 2 client
|
|
21
|
+
- [x] Bar (Derivative) client
|
|
22
|
+
- [x] Admin client
|
|
23
|
+
|
|
24
|
+
## Lookup client
|
|
25
|
+
|
|
26
|
+
- [x] Historical data
|
|
27
|
+
- [x] News data
|
|
28
|
+
- [x] Symbol Lookup data
|
|
29
|
+
- [ ] Chains Lookup data
|
|
30
|
+
- [ ] Market Summary Data (new in protocol 6.1)
|
|
15
31
|
|
|
16
32
|
## Installation
|
|
17
33
|
|
|
@@ -31,17 +47,275 @@ Or install it yourself as:
|
|
|
31
47
|
|
|
32
48
|
## Usage
|
|
33
49
|
|
|
34
|
-
|
|
50
|
+
### Quick start
|
|
51
|
+
|
|
52
|
+
```ruby
|
|
53
|
+
Dtn::Lookups::Historical::DailyTimeframe.call(
|
|
54
|
+
symbol: :aapl,
|
|
55
|
+
begin_date: Date.new(2021, 5, 1),
|
|
56
|
+
end_date: Date.new(2021, 6, 1)
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
=>
|
|
60
|
+
#<Dtn::Messages::Historical::DailyWeeklyMonthly request_id=1, timestamp=Mon, 03 May 2021 18:06:37 +0000, high=134.07, low=131.83, open=132.04, close=132.54, period_volume=75135100, open_interest=0>
|
|
61
|
+
#<Dtn::Messages::Historical::DailyWeeklyMonthly request_id=1, timestamp=Tue, 04 May 2021 18:06:37 +0000, high=131.4899, low=126.7, open=131.19, close=127.85, period_volume=137564718, open_interest=0>
|
|
62
|
+
#<Dtn::Messages::Historical::DailyWeeklyMonthly request_id=1, timestamp=Wed, 05 May 2021 18:06:37 +0000, high=130.45, low=127.97, open=129.2, close=128.1, period_volume=84000900, open_interest=0>
|
|
63
|
+
#<Dtn::Messages::Historical::DailyWeeklyMonthly request_id=1, timestamp=Thu, 06 May 2021 18:06:37 +0000, high=129.75, low=127.13, open=127.89, close=129.74, period_volume=78128334, open_interest=0>
|
|
64
|
+
...
|
|
65
|
+
|
|
66
|
+
# if block provided, then each message will be yielded as it is processed
|
|
67
|
+
|
|
68
|
+
Dtn::Lookups::News::Headline.call(limit: 10) do |message|
|
|
69
|
+
# ...
|
|
70
|
+
end
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Supported requests
|
|
74
|
+
|
|
75
|
+
Keep in mind, that at the time of writing DTN, API has limit of 50
|
|
76
|
+
historical requests per minute.
|
|
77
|
+
|
|
78
|
+
TODO: Attach [limiter](https://github.com/Shopify/limiter) gem after merge
|
|
79
|
+
https://github.com/Shopify/limiter/pull/17 https://github.com/Shopify/limiter/pull/19
|
|
80
|
+
or use own branch of this gem.
|
|
81
|
+
|
|
82
|
+
#### News
|
|
83
|
+
|
|
84
|
+
* [config](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/news/config.rb)
|
|
85
|
+
```ruby
|
|
86
|
+
Dtn::Lookups::News::Config.call
|
|
87
|
+
```
|
|
88
|
+
* [headline](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/news/headline.rb)
|
|
89
|
+
```ruby
|
|
90
|
+
Dtn::Lookups::News::Headline.call limit: 10, symbols: 'aapl;fb'
|
|
91
|
+
```
|
|
92
|
+
* [story_count](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/news/story_count.rb)
|
|
93
|
+
```ruby
|
|
94
|
+
Dtn::Lookups::News::StoryCount.call symbols: :aapl, date_range: Date.new(2020,1,1)..Date.new(2020,2,1)
|
|
95
|
+
```
|
|
96
|
+
* [story](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/news/story.rb)
|
|
97
|
+
```ruby
|
|
98
|
+
Dtn::Lookups::News::Story.call story_id: '22424363689'
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
NOTES:
|
|
103
|
+
|
|
104
|
+
* if XML output option selected, the response will return **unparsed** XML
|
|
105
|
+
|
|
106
|
+
#### Historical
|
|
107
|
+
|
|
108
|
+
* [interval_day](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/interval_day.rb)
|
|
109
|
+
```ruby
|
|
110
|
+
Dtn::Lookups::Historical::IntervalDay.call(symbol: :aapl, interval: 3600, max_datapoints: 50, days: 2)
|
|
111
|
+
```
|
|
112
|
+
* [tick_timeframe](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/tick_timeframe.rb)
|
|
113
|
+
```ruby
|
|
114
|
+
Dtn::Lookups::Historical::TickTimeframe.call(
|
|
115
|
+
symbol: :aapl,
|
|
116
|
+
begin_datetime: begin_datetime,
|
|
117
|
+
end_datetime: end_datetime,
|
|
118
|
+
max_datapoints: 50
|
|
119
|
+
)
|
|
120
|
+
```
|
|
121
|
+
* [daily_datapoint](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/daily_datapoint.rb)
|
|
122
|
+
```ruby
|
|
123
|
+
Dtn::Lookups::Historical::DailyDatapoint.call(symbol: :aapl, max_datapoints: 50)
|
|
124
|
+
```
|
|
125
|
+
* [interval_timeframe](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/interval_timeframe.rb)
|
|
126
|
+
```ruby
|
|
127
|
+
Dtn::Lookups::Historical::IntervalTimeframe.call(
|
|
128
|
+
symbol: :aapl,
|
|
129
|
+
interval: 15,
|
|
130
|
+
max_datapoints: 50,
|
|
131
|
+
begin_datetime: DateTime.new(2020, 5, 1),
|
|
132
|
+
end_datetime: DateTime.new(2020, 6, 1)
|
|
133
|
+
)
|
|
134
|
+
```
|
|
135
|
+
* [tick_datapoint](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/tick_datapoint.rb)
|
|
136
|
+
```ruby
|
|
137
|
+
Dtn::Lookups::Historical::TickDatapoint.call(symbol: :aapl, max_datapoints: 100)
|
|
138
|
+
```
|
|
139
|
+
* [weekly_datapoint](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/weekly_datapoint.rb)
|
|
140
|
+
```ruby
|
|
141
|
+
Dtn::Lookups::Historical::WeeklyDatapoint.call(symbol: :aapl, max_datapoints: 10)
|
|
142
|
+
```
|
|
143
|
+
* [daily_timeframe](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/daily_timeframe.rb)
|
|
144
|
+
```ruby
|
|
145
|
+
Dtn::Lookups::Historical::DailyTimeframe.call(
|
|
146
|
+
symbol: :aapl,
|
|
147
|
+
begin_date: Date.new(2020, 5, 1),
|
|
148
|
+
end_date: Date.new(2020, 6, 1)
|
|
149
|
+
)
|
|
150
|
+
```
|
|
151
|
+
* [interval_datapoint](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/interval_datapoint.rb)
|
|
152
|
+
```ruby
|
|
153
|
+
Dtn::Lookups::Historical::IntervalDatapoint.call(symbol: :aapl, interval: 3600, max_datapoints: 100)
|
|
154
|
+
```
|
|
155
|
+
* [monthly_datapoint](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/monthly_datapoint.rb)
|
|
156
|
+
```ruby
|
|
157
|
+
Dtn::Lookups::Historical::MonthlyDatapoint.call(symbol: :aapl, max_datapoints: 10)
|
|
158
|
+
```
|
|
159
|
+
* [tick_day](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/historical/tick_day.rb)
|
|
160
|
+
```ruby
|
|
161
|
+
Dtn::Lookups::Historical::TickDay.call(symbol: :aapl, days: 2, max_datapoints: 50)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
NOTES:
|
|
165
|
+
|
|
166
|
+
* Lookups have extra options from their parents classes. They have appropriate
|
|
167
|
+
defaults and are easy to customize.
|
|
168
|
+
|
|
169
|
+
#### Catalogs
|
|
170
|
+
|
|
171
|
+
For symbol lookup and description API use a few catalogs, which describe each row.
|
|
172
|
+
They very rarely change and we can treat them as constants. To reduce requests to
|
|
173
|
+
API they are requested only once. For easy access to them you can use:
|
|
174
|
+
|
|
175
|
+
* `Dtn.listed_markets_catalog`
|
|
176
|
+
* `Dtn.naic_codes_catalog`
|
|
177
|
+
* `Dtn.security_types_catalog`
|
|
178
|
+
* `Dtn.sic_codes_catalog`
|
|
179
|
+
* `Dtn.trade_conditions_catalog`
|
|
180
|
+
|
|
181
|
+
#### Symbol lookup
|
|
182
|
+
|
|
183
|
+
* [by_sic](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/symbol/by_sic.rb)
|
|
184
|
+
```ruby
|
|
185
|
+
Dtn::Lookups::Symbol::BySic.call(search_line: '42')
|
|
186
|
+
```
|
|
187
|
+
* [by_naic](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/symbol/by_naic.rb)
|
|
188
|
+
```ruby
|
|
189
|
+
Dtn::Lookups::Symbol::ByNaic.call(search_line: '42')
|
|
190
|
+
```
|
|
191
|
+
* [by_filter](https://github.com/kvokka/dtn/blob/master/lib/dtn/requests/symbol/by_filter.rb)
|
|
192
|
+
```ruby
|
|
193
|
+
Dtn::Lookups::Symbol::ByFilter.call(field_to_search: "s", search_line: "aap", filter_type: "t", filter_value: "1")
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
#### Streaming data
|
|
197
|
+
|
|
198
|
+
All streaming data is using Observer pattern, so you can connect a few listeners
|
|
199
|
+
to any client with minimal cost. Below, you will get the examples with simple
|
|
200
|
+
observers, but there is an [Observer](https://github.com/kvokka/dtn/blob/master/lib/dtn/streaming/messages_recorder_observer.rb) for easier development & testing.
|
|
201
|
+
|
|
202
|
+
##### Quotes (Level1)
|
|
203
|
+
|
|
204
|
+
Streaming data is using Observers to deliver the results.
|
|
205
|
+
Keep in mind, that observers will receive data until you unsubscribe from it
|
|
206
|
+
or stop the client.
|
|
207
|
+
|
|
208
|
+
Summary message always come with all the possible fields, while for Update message
|
|
209
|
+
it is possible to add a filter with `client.request.quote.update_fields list: %w[Bid Ask]`
|
|
210
|
+
|
|
211
|
+
These methods do not allow any historical data access, only real time.
|
|
212
|
+
|
|
213
|
+
```ruby
|
|
214
|
+
class Observer
|
|
215
|
+
# data callbacks are optional and match message class
|
|
216
|
+
def level1_summary(message:)
|
|
217
|
+
puts message
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def level1_update(message:)
|
|
221
|
+
puts message
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# one of system methods callback
|
|
225
|
+
def disconnected(message:)
|
|
226
|
+
puts message
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
client = Dtn::Streaming::Clients::Quote.new
|
|
231
|
+
client.observers << Observer.new
|
|
232
|
+
client.request.quote.watch symbol: :aapl
|
|
233
|
+
sleep 10
|
|
234
|
+
client.stop
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
[Here](https://github.com/kvokka/dtn/tree/master/lib/dtn/streaming/requests) you
|
|
238
|
+
will find all level1 streaming requests with appropriate documentation.
|
|
239
|
+
|
|
240
|
+
#### Bars data
|
|
241
|
+
|
|
242
|
+
Get live data as interval bar data. It allows to look back and fetch historical
|
|
243
|
+
data and get current (live) data as well,
|
|
244
|
+
[details](https://github.com/kvokka/dtn/tree/master/lib/dtn/streaming/requests/bar)
|
|
245
|
+
|
|
246
|
+
```ruby
|
|
247
|
+
class Observer
|
|
248
|
+
# this callback will return all historical bars for the symbol
|
|
249
|
+
def historical_bar(message:)
|
|
250
|
+
puts message
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# Here you get live updates until the current bar is formed
|
|
254
|
+
def update_bar(message:)
|
|
255
|
+
puts message
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# when the current bar was formed, it will be processed by this callback
|
|
259
|
+
def current_bar(message:)
|
|
260
|
+
puts message
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
client = Dtn::Streaming::Clients::Bar.new
|
|
265
|
+
client.observers << Observer.new
|
|
266
|
+
client.request.bar.watch symbol: :aapl
|
|
267
|
+
sleep 10
|
|
268
|
+
client.stop
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
#### Admin
|
|
272
|
+
|
|
273
|
+
Admin data management. See other commands in [here](https://github.com/kvokka/dtn/tree/master/lib/dtn/streaming/requests/admin)
|
|
274
|
+
|
|
275
|
+
```ruby
|
|
276
|
+
client.observers << Observer.new
|
|
277
|
+
client.request.admin.set_client_stats turned_on: false
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
#### Level2
|
|
281
|
+
|
|
282
|
+
Connection to level2 data. See other commands in [here](https://github.com/kvokka/dtn/tree/master/lib/dtn/streaming/requests/level2)
|
|
283
|
+
|
|
284
|
+
```ruby
|
|
285
|
+
client.observers << Observer.new
|
|
286
|
+
client.request.level2.watch symbol: :aapl
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Config
|
|
290
|
+
|
|
291
|
+
In case you are using DTN client running remotely (no questions asked how you
|
|
292
|
+
can do it), you can specify the host with `Dtn.host = 'my_host'` setting
|
|
35
293
|
|
|
36
294
|
## Development
|
|
37
295
|
|
|
38
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
296
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
297
|
+
`bundle exec rake` to run the tests. You can also run `bin/console` for an
|
|
298
|
+
interactive prompt that will allow you to experiment.
|
|
299
|
+
|
|
300
|
+
Test specs are using recorded output from DTN client. The recorded file is set
|
|
301
|
+
by the RSpec option `socket_recorder`, so you can share 1 recording with a few
|
|
302
|
+
specs. If the file is missing, then specs will do real request to the api.
|
|
303
|
+
`socket_recorder` will use the pre-defined Date for the specs from the file
|
|
304
|
+
[current_day](https://github.com/kvokka/dtn/blob/master/spec/current_day) to
|
|
305
|
+
minimise recordings rewrites. To bump the date to the yesterday business day
|
|
306
|
+
you can use
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
$ bundle exec rake spec:set_spec_date
|
|
310
|
+
```
|
|
39
311
|
|
|
40
|
-
To
|
|
312
|
+
To run windows DTN client you can use the `docker-compose up` (before execution
|
|
313
|
+
pls fill in `.env` file with your credentials following the pattern from
|
|
314
|
+
[.env.example](https://github.com/kvokka/dtn/blob/master/.env.example))
|
|
41
315
|
|
|
42
316
|
## Contributing
|
|
43
317
|
|
|
44
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
|
318
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/kvokka/dtn. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/kvokka/dtn/blob/master/CODE_OF_CONDUCT.md).
|
|
45
319
|
|
|
46
320
|
## License
|
|
47
321
|
|
|
@@ -49,4 +323,9 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
|
49
323
|
|
|
50
324
|
## Code of Conduct
|
|
51
325
|
|
|
52
|
-
Everyone interacting in the Dtn project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
|
326
|
+
Everyone interacting in the Dtn project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/kvokka/dtn/blob/master/CODE_OF_CONDUCT.md).
|
|
327
|
+
|
|
328
|
+
## References
|
|
329
|
+
|
|
330
|
+
* https://github.com/mathpaquette/IQFeed.CSharpApiClient
|
|
331
|
+
* https://github.com/akapur/pyiqfeed
|