ib-symbols 1.0 → 1.1
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/README.md +11 -4
- data/ib-symbols.gemspec +1 -1
- data/lib/ib/symbols/abstract.rb +91 -92
- data/lib/ib/symbols/futures.rb +12 -0
- data/lib/ib/symbols/version.rb +1 -1
- metadata +3 -28
- data/examples/contract_details +0 -71
- data/examples/contract_sample_details +0 -50
- data/examples/contract_samples.rb +0 -716
- data/examples/depth_of_market +0 -45
- data/examples/head_time_stamp +0 -35
- data/examples/historic_data +0 -102
- data/examples/market_data +0 -57
- data/examples/option_data +0 -63
- data/examples/real_time_data +0 -35
- data/examples/snapshot_market_data +0 -105
- data/examples/time_and_sales +0 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93d49cee4065b18e73400f1b50aa3e00916b6a45b7ab3f771527133c6f29f0cc
|
4
|
+
data.tar.gz: 6eba3b4925ccdf65ab725099038a84163375ead601854a7cb42281f68fa7d555
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72ea734bd5c525f6740b5062d300f584f7565c2ec817117a914fca465d0f4e094226d4da226016e8c2985918933e45f7218c650a02a3220246048bda8bc27aa7
|
7
|
+
data.tar.gz: 0e191f18cf53cd6cb88fc728dabf97c3d395218ffecea485d104940b03f4e055e9fe0c250f42344d096d5ca44b073ad4cdd52ee6213588efc5280db416a4b606
|
data/README.md
CHANGED
@@ -1,11 +1,18 @@
|
|
1
|
-
#
|
1
|
+
# IB-Symbols
|
2
2
|
|
3
|
-
|
3
|
+
---
|
4
|
+
__Documentation: [https://ib-ruby.github.io/ib-doc/](https://ib-ruby.github.io/ib-doc/)__
|
5
|
+
|
6
|
+
__Questions, Contributions, Remarks: [Discussions are opened in ib-api](https://github.com/ib-ruby/ib-api/discussions)__
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
__Predefined symbols and watchlists for contracts__
|
4
11
|
|
5
|
-
|
12
|
+
To activate use
|
6
13
|
|
7
14
|
```
|
8
|
-
gem 'ib-symbols'
|
15
|
+
gem 'ib-symbols'
|
9
16
|
```
|
10
17
|
in the Gemfile and
|
11
18
|
```
|
data/ib-symbols.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.require_paths = ["lib"]
|
28
28
|
|
29
29
|
spec.add_dependency "ib-api"
|
30
|
-
spec.add_dependency "ox"
|
30
|
+
# spec.add_dependency "ox"
|
31
31
|
spec.add_development_dependency "bundler", "~> 2.0"
|
32
32
|
spec.add_development_dependency "rspec", "~> 3.0"
|
33
33
|
spec.add_development_dependency 'rspec-collection_matchers'
|
data/lib/ib/symbols/abstract.rb
CHANGED
@@ -1,23 +1,22 @@
|
|
1
1
|
module IB
|
2
2
|
|
3
3
|
# reopen the contract-class and add yml_file
|
4
|
-
|
4
|
+
class Contract
|
5
5
|
|
6
6
|
# Reading Contract-Defaults
|
7
|
-
|
7
|
+
#
|
8
8
|
# by default, the yml-file in the base-directory (ib-ruby) is used.
|
9
9
|
# This method can be overloaded to include a file from a different location
|
10
|
-
|
10
|
+
#
|
11
11
|
# IB::Symbols::Stocks.wfc.yml_file
|
12
12
|
# => "/home/ubuntu/workspace/ib-ruby/contract_config.yml"
|
13
13
|
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
def yml_file
|
15
|
+
File.expand_path('../../../../contract_config.yml',__FILE__ )
|
16
|
+
end
|
17
|
+
end
|
19
18
|
|
20
|
-
|
19
|
+
module Symbols
|
21
20
|
|
22
21
|
=begin
|
23
22
|
Creates a Class and associates it with a filename
|
@@ -26,45 +25,45 @@ raises an IB::Error in case of a conflict with existing class-names
|
|
26
25
|
=end
|
27
26
|
|
28
27
|
# set the Pathname to "ib-api/symbols" by default
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
28
|
+
@@dir= Pathname.new File.expand_path("../../../../symbols/", __FILE__ )
|
29
|
+
def self.set_origin directory
|
30
|
+
p = Pathname.new directory
|
31
|
+
@@dir = p if p.directory?
|
32
|
+
rescue Errno::ENOENT
|
33
|
+
error "Setting up origin for symbol-files --> Directory (#{directory}) does not exist"
|
34
|
+
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.each &b
|
46
|
-
contracts.values.each &b
|
47
|
-
end
|
48
|
-
end # module new
|
49
|
-
name = name.to_s.camelize.to_sym
|
50
|
-
the_collection = if Symbols.send :const_defined?, name
|
51
|
-
Symbols.send :const_get, name
|
52
|
-
else
|
53
|
-
Symbols.const_set name, symbol_table
|
54
|
-
end
|
55
|
-
if the_collection.is_a? Symbols
|
56
|
-
the_collection.send :read_collection if the_collection.all.empty?
|
57
|
-
the_collection # return_value
|
58
|
-
else
|
59
|
-
error "#{the_collection} is already a Class"
|
60
|
-
nil
|
36
|
+
def self.allocate_collection name # name might be a string or a symbol
|
37
|
+
symbol_table = Module.new do
|
38
|
+
extend Symbols
|
39
|
+
extend Enumerable
|
40
|
+
def self.yml_file
|
41
|
+
@@dir + name.to_s.downcase.split("::").last.concat( ".yml" )
|
61
42
|
end
|
62
|
-
end
|
63
43
|
|
64
|
-
|
65
|
-
|
66
|
-
|
44
|
+
def self.each &b
|
45
|
+
contracts.values.each &b
|
46
|
+
end
|
47
|
+
end # module new
|
48
|
+
name = name.to_s.camelize.to_sym
|
49
|
+
the_collection = if Symbols.send :const_defined?, name
|
50
|
+
Symbols.send :const_get, name
|
51
|
+
else
|
52
|
+
Symbols.const_set name, symbol_table
|
53
|
+
end
|
54
|
+
if the_collection.is_a? Symbols
|
55
|
+
the_collection.send :read_collection if the_collection.all.empty?
|
56
|
+
the_collection # return_value
|
57
|
+
else
|
58
|
+
error "#{the_collection} is already a Class"
|
59
|
+
nil
|
67
60
|
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def purge_collection
|
64
|
+
yml_file.delete
|
65
|
+
@contracts = nil
|
66
|
+
end
|
68
67
|
|
69
68
|
=begin
|
70
69
|
cuts the Collection in `bunch_count` pieces. Each bunch is delivered to the block.
|
@@ -73,65 +72,65 @@ Sleeps for `sleeping time` between processing bunches
|
|
73
72
|
|
74
73
|
Returns count of created bunches
|
75
74
|
=end
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
75
|
+
def bunch( bunch_count = 50 , sleeping_time = 1)
|
76
|
+
en = self.each
|
77
|
+
the_size = en.size
|
78
|
+
i = 0
|
79
|
+
loop do
|
80
|
+
the_start = i * bunch_count
|
81
|
+
the_end = the_start + bunch_count
|
82
|
+
the_end = the_size -1 if the_end >= the_size
|
83
|
+
it = the_start .. the_end
|
84
|
+
yield it.map{|x| en.next rescue nil}.compact
|
85
|
+
break if the_end == the_size -1
|
86
|
+
i+=1
|
87
|
+
sleep sleeping_time
|
88
|
+
end
|
89
|
+
i -1 # return counts of bunches
|
90
|
+
end
|
92
91
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
92
|
+
def read_collection
|
93
|
+
if yml_file.exist?
|
94
|
+
contracts.merge! YAML.load_file yml_file rescue contracts
|
95
|
+
else
|
97
96
|
yml_file.open( "w"){}
|
98
|
-
end
|
99
97
|
end
|
98
|
+
end
|
100
99
|
|
101
|
-
|
102
|
-
|
103
|
-
|
100
|
+
def store_collection
|
101
|
+
yml_file.open( 'w' ){|f| f.write @contracts.to_yaml}
|
102
|
+
end
|
104
103
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
end
|
113
|
-
# ensure that evey Sybmol::xxx.yyy entry has a description
|
114
|
-
contract.description = contract.to_human[1..-2] if contract.description.nil?
|
115
|
-
# overwrite contract if existing
|
116
|
-
contracts[ symbol ] = contract.essential
|
117
|
-
store_collection
|
104
|
+
def add_contract symbol, contract
|
105
|
+
if symbol.is_a? String
|
106
|
+
symbol.to_sym
|
107
|
+
elsif symbol.is_a? Symbol
|
108
|
+
symbol
|
109
|
+
else
|
110
|
+
symbol.to_i
|
118
111
|
end
|
112
|
+
# ensure that evey Sybmol::xxx.yyy entry has a description
|
113
|
+
contract.description = contract.to_human[1..-2] if contract.description.nil?
|
114
|
+
# overwrite contract if existing
|
115
|
+
contracts[ symbol ] = contract.essential
|
116
|
+
store_collection
|
117
|
+
end
|
119
118
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
119
|
+
def remove_contract symbol
|
120
|
+
@contracts.delete symbol
|
121
|
+
store_collection
|
122
|
+
end
|
124
123
|
|
125
124
|
|
126
|
-
|
127
|
-
|
128
|
-
|
125
|
+
def to_human
|
126
|
+
self.to_s.split("::").last
|
127
|
+
end
|
129
128
|
|
130
129
|
|
131
130
|
|
132
|
-
|
133
|
-
|
134
|
-
|
131
|
+
module Unspecified
|
132
|
+
extend Symbols
|
133
|
+
end
|
135
134
|
|
136
|
-
|
135
|
+
end # module Symbols
|
137
136
|
end # module IB
|
data/lib/ib/symbols/futures.rb
CHANGED
@@ -73,6 +73,18 @@ module IB
|
|
73
73
|
:currency => "USD",
|
74
74
|
:multiplier => 50,
|
75
75
|
:description => "E-Mini S&P 500 future"),
|
76
|
+
:micro_es => IB::Future.new(:symbol => "MES",
|
77
|
+
:expiry => next_expiry,
|
78
|
+
:exchange => "GLOBEX",
|
79
|
+
:currency => "USD",
|
80
|
+
:multiplier => 5,
|
81
|
+
:description => "Micro E-Mini S&P 500 future"),
|
82
|
+
:micro_russell => IB::Future.new(:symbol => "M2K",
|
83
|
+
:expiry => next_expiry,
|
84
|
+
:exchange => "GLOBEX",
|
85
|
+
:currency => "USD",
|
86
|
+
:multiplier => 5,
|
87
|
+
:description => "Micro E-Mini Russell 2000 future"),
|
76
88
|
:zn => IB::Future.new( symbol: 'ZN',
|
77
89
|
expiry: next_expiry,
|
78
90
|
currency: 'USD',
|
data/lib/ib/symbols/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ib-symbols
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.1'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hartmut Bischoff
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ib-api
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: ox
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: bundler
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,17 +128,6 @@ files:
|
|
142
128
|
- bin/console.yml
|
143
129
|
- bin/setup
|
144
130
|
- build.md
|
145
|
-
- examples/contract_details
|
146
|
-
- examples/contract_sample_details
|
147
|
-
- examples/contract_samples.rb
|
148
|
-
- examples/depth_of_market
|
149
|
-
- examples/head_time_stamp
|
150
|
-
- examples/historic_data
|
151
|
-
- examples/market_data
|
152
|
-
- examples/option_data
|
153
|
-
- examples/real_time_data
|
154
|
-
- examples/snapshot_market_data
|
155
|
-
- examples/time_and_sales
|
156
131
|
- ib-symbols.gemspec
|
157
132
|
- lib/ib/symbols.rb
|
158
133
|
- lib/ib/symbols/abstract.rb
|
@@ -189,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
164
|
- !ruby/object:Gem::Version
|
190
165
|
version: '0'
|
191
166
|
requirements: []
|
192
|
-
rubygems_version: 3.
|
167
|
+
rubygems_version: 3.2.3
|
193
168
|
signing_key:
|
194
169
|
specification_version: 4
|
195
170
|
summary: Predefined symbols and watchlist, part of ib-ruby
|
data/examples/contract_details
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# This script gets details for specific contract from IB
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
# load predefined symbols
|
7
|
-
require 'ib/symbols'
|
8
|
-
|
9
|
-
include IB
|
10
|
-
# Definition of what we want market data for. We have to keep track of what ticker id
|
11
|
-
# corresponds to what symbol ourselves, because the ticks don't include any other
|
12
|
-
# identifying information. The choice of ticker ids is, as far as I can tell, arbitrary.
|
13
|
-
#
|
14
|
-
# I. Selected Contracts
|
15
|
-
contracts = [ IB::Symbols::Stocks.wfc,
|
16
|
-
IB::Symbols::Stocks.vxx,
|
17
|
-
IB::Symbols::Futures.vix,
|
18
|
-
IB::Symbols::Futures.ym,
|
19
|
-
IB::Symbols::Options.ge,
|
20
|
-
### OSI-Notation is broken
|
21
|
-
# IB::Symbols::Options[:vix20],
|
22
|
-
# IB::Symbols::Options[:spy270],
|
23
|
-
# IB::Symbols::Options[:vxx40],
|
24
|
-
IB::Symbols::Forex.eurusd,
|
25
|
-
### Bonds are not actually not supported
|
26
|
-
# 8 => IB::Symbols::Bonds[:wag],
|
27
|
-
IB::Symbols::Stocks.wrong ]
|
28
|
-
# or
|
29
|
-
# II. Use predefined Contracts
|
30
|
-
stock_contracts = Symbols::Stocks.all.map{|x| Symbols::Stocks.send x }
|
31
|
-
future_contracts = Symbols::Futures.all.map{|x| Symbols::Futures.send x }
|
32
|
-
option_contracts = Symbols::Options.all.map{|x| Symbols::Options.send x }
|
33
|
-
cfd_contracts = Symbols::CFD.all.map{|x| Symbols::CFD.send x }
|
34
|
-
index_contracts = Symbols::Index.all.map{|x| Symbols::Index.send x }
|
35
|
-
|
36
|
-
## comment if you want to display selected contracts ( I. )
|
37
|
-
contracts = stock_contracts + future_contracts + option_contracts + cfd_contracts + index_contracts
|
38
|
-
|
39
|
-
|
40
|
-
# Connect to IB TWS.
|
41
|
-
ib = Connection.new :client_id => 11912 do | gw| # , port: 7497 do | gw | # TWS
|
42
|
-
# Subscribe to TWS alerts/errors and contract data end marker
|
43
|
-
gw.subscribe(:Alert, :ContractDataEnd) { |msg| puts msg.to_human }
|
44
|
-
|
45
|
-
# Now, subscribe to ContractData incoming events. The code passed in the block
|
46
|
-
# will be executed when a message of that type is received, with the received
|
47
|
-
# message as its argument. In this case, we just print out the data.
|
48
|
-
gw.subscribe(:ContractData, :BondContractData) do |msg|
|
49
|
-
puts msg.contract.to_human + "\n"
|
50
|
-
puts "Attributes: "
|
51
|
-
puts "\t"+ msg.contract.attributes.map{ |k,v| "#{k} : #{v}" unless v.blank? || (v.is_a?(Numeric) && v.zero?) }.join("\n\t")
|
52
|
-
end
|
53
|
-
|
54
|
-
# Set log level
|
55
|
-
gw.logger.level = Logger::FATAL
|
56
|
-
end
|
57
|
-
|
58
|
-
ib.wait_for :NextValidOrderId
|
59
|
-
|
60
|
-
|
61
|
-
contracts.each do |contract|
|
62
|
-
puts "\nRequesting contract data for #{contract.description}"
|
63
|
-
|
64
|
-
# Request Contract details for the symbols we're interested in. TWS will
|
65
|
-
# respond with ContractData messages, which will be processed by the code above.
|
66
|
-
ib.send_message :RequestContractData, :contract => contract
|
67
|
-
|
68
|
-
# Wait for IB to respond to our request
|
69
|
-
ib.wait_for :ContractDataEnd, 5 #sec
|
70
|
-
ib.clear_received :ContractDataEnd
|
71
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# This script gets details for specific contract from IB
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
require 'ib/symbols'
|
7
|
-
require './contract_samples'
|
8
|
-
include IB
|
9
|
-
# Definition of what we want market data for. We have to keep track of what ticker id
|
10
|
-
# corresponds to what symbol ourselves, because the ticks don't include any other
|
11
|
-
# identifying information. The choice of ticker ids is, as far as I can tell, arbitrary.
|
12
|
-
contract_definitions = ContractSamples.public_instance_methods
|
13
|
-
|
14
|
-
# get contracts from contract_samples db
|
15
|
-
include ContractSamples
|
16
|
-
the_contracts = contract_definitions.map{ | method | self.send( method )}
|
17
|
-
|
18
|
-
|
19
|
-
# Connect to IB TWS.
|
20
|
-
ib = Connection.new( :client_id => 11912, :port => 4002 ) do | gw| # 7496 # TWS
|
21
|
-
# subscribe to TWS alerts/errors and contract data end marker
|
22
|
-
gw.subscribe(:Alert, :ContractDataEnd) { |msg| puts msg.to_human }
|
23
|
-
|
24
|
-
# subscribe to ContractData incoming events. The code passed in the block
|
25
|
-
# will be executed when a message of that type is received, with the received
|
26
|
-
# message as its argument. In this case, we just print out the data.
|
27
|
-
gw.subscribe(:ContractData, :BondContractData) do |msg|
|
28
|
-
puts "------------------> Recieved Contract Confirmation <----------------------------"
|
29
|
-
puts msg.contract.to_human + "\n"
|
30
|
-
puts "Attributes: "
|
31
|
-
puts "\t"+ msg.contract.attributes.map{ |k,v| "#{k} : #{v}" unless v.blank? }.join("\n\t")
|
32
|
-
end
|
33
|
-
# Set log level
|
34
|
-
gw.logger.level = Logger::DEBUG #FATAL
|
35
|
-
end
|
36
|
-
|
37
|
-
ib.wait_for :NextValidOrderId
|
38
|
-
|
39
|
-
|
40
|
-
the_contracts.each do | contract|
|
41
|
-
puts "\nRequesting contract data: #{contract_definitions}: #{contract.to_human}"
|
42
|
-
|
43
|
-
# Request Contract details for the symbols we're interested in. TWS will
|
44
|
-
# respond with ContractData messages, which will be processed by the code above.
|
45
|
-
ib.send_message :RequestContractData, contract: contract
|
46
|
-
|
47
|
-
# Wait for IB to respond to our request
|
48
|
-
ib.wait_for :ContractDataEnd, 1 #sec
|
49
|
-
ib.clear_received :ContractDataEnd
|
50
|
-
end
|