ib-ruby 0.8.3 → 0.8.4
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.
- data/HISTORY +2 -2
- data/README.md +9 -1
- data/VERSION +1 -1
- data/lib/ib/symbols.rb +18 -0
- data/lib/ib/symbols/forex.rb +61 -58
- data/lib/ib/symbols/futures.rb +97 -99
- data/lib/ib/symbols/options.rb +30 -30
- data/lib/ib/symbols/stocks.rb +18 -17
- data/spec/README.md +15 -9
- data/spec/ib/symbols/symbols_spec.rb +49 -0
- data/spec/integration/contract_info_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +4 -2
data/HISTORY
CHANGED
data/README.md
CHANGED
@@ -145,7 +145,8 @@ if defined?(Bundler)
|
|
145
145
|
Now run:
|
146
146
|
|
147
147
|
$ bundle install
|
148
|
-
$ rake
|
148
|
+
$ rake ib:install:migrations
|
149
|
+
$ rake db:migrate
|
149
150
|
|
150
151
|
This will install ib-ruby gem and copy its migrations into your Rails apps migrations.
|
151
152
|
|
@@ -177,6 +178,13 @@ The gem comes with a spec suit that may be used to test ib-ruby compatibility wi
|
|
177
178
|
specific TWS/Gateway installation. Please read 'spec/Readme.md' for more details about
|
178
179
|
running specs.
|
179
180
|
|
181
|
+
## RUBY VERSION COMPATIBILITY:
|
182
|
+
|
183
|
+
The library is continuously tested with JRuby 1.6.7 (ruby-1.8.7-p357-compatible mode) and
|
184
|
+
JRuby head (ruby-1.9.3-p203-compatible mode). It is not JRuby-specific though, as it is currently used in a some MRI Ruby based projects. If there are any problems in any mode
|
185
|
+
for either JRuby or MRI, please report an [issue](https://github.com/ib-ruby/ib-ruby/issues/new)
|
186
|
+
and we will work on it.
|
187
|
+
|
180
188
|
## CONTRIBUTING:
|
181
189
|
|
182
190
|
1. Fork it
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.8.
|
1
|
+
0.8.4
|
data/lib/ib/symbols.rb
CHANGED
@@ -1,5 +1,23 @@
|
|
1
|
+
# These modules are used to facilitate referencing of most popular IB Contracts.
|
2
|
+
# For example, suppose you're explicitely creating such Contract in all your scripts:
|
3
|
+
# wfc = IB::Contract.new(:symbol => "WFC",
|
4
|
+
# :exchange => "NYSE",
|
5
|
+
# :currency => "USD",
|
6
|
+
# :sec_type => :stock,
|
7
|
+
# :description => "Wells Fargo Stock"),
|
8
|
+
#
|
9
|
+
# Instead, you can put this contract definition into 'ib/symbols/stocks' and just reference
|
10
|
+
# it as IB::Symbols::Stock[:wfc] anywhere you need it.
|
11
|
+
#
|
12
|
+
# Note that the :description field is local to ib-ruby, and is NOT part of the standard TWS API.
|
13
|
+
# It is never transmitted to IB. It's purely used clientside, and you can store any arbitrary
|
14
|
+
# string that you may find useful there.
|
15
|
+
|
1
16
|
module IB
|
2
17
|
module Symbols
|
18
|
+
def [] symbol
|
19
|
+
contracts[symbol]
|
20
|
+
end
|
3
21
|
end
|
4
22
|
end
|
5
23
|
|
data/lib/ib/symbols/forex.rb
CHANGED
@@ -1,71 +1,74 @@
|
|
1
|
-
# Note that the :description field is particular to ib, and is NOT part of the
|
2
|
-
# standard TWS API. It is never transmitted to IB. It's purely used clientside, and
|
3
|
-
# you can store any arbitrary string that you may find useful there.
|
4
1
|
module IB
|
5
2
|
module Symbols
|
6
|
-
|
7
|
-
|
8
|
-
# used for smaller currency conversions.
|
9
|
-
Forex = {
|
10
|
-
:audusd => IB::Contract.new(:symbol => "AUD",
|
11
|
-
:exchange => "IDEALPRO",
|
12
|
-
:currency => "USD",
|
13
|
-
:sec_type => :forex,
|
14
|
-
:description => "AUDUSD"),
|
3
|
+
module Forex
|
4
|
+
extend Symbols
|
15
5
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
6
|
+
# IDEALPRO is for orders over 25,000 and routes to the interbank quote stream.
|
7
|
+
# IDEAL is for smaller orders, and has wider spreads/slower execution... generally
|
8
|
+
# used for smaller currency conversions.
|
9
|
+
def self.contracts
|
10
|
+
@contracts ||= {
|
11
|
+
:audusd => IB::Contract.new(:symbol => "AUD",
|
12
|
+
:exchange => "IDEALPRO",
|
13
|
+
:currency => "USD",
|
14
|
+
:sec_type => :forex,
|
15
|
+
:description => "AUDUSD"),
|
21
16
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
17
|
+
:gbpusd => IB::Contract.new(:symbol => "GBP",
|
18
|
+
:exchange => "IDEALPRO",
|
19
|
+
:currency => "USD",
|
20
|
+
:sec_type => :forex,
|
21
|
+
:description => "GBPUSD"),
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
23
|
+
:euraud => IB::Contract.new(:symbol => "EUR",
|
24
|
+
:exchange => "IDEALPRO",
|
25
|
+
:currency => "AUD",
|
26
|
+
:sec_type => :forex,
|
27
|
+
:description => "EURAUD"),
|
33
28
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
29
|
+
:eurgbp => IB::Contract.new(:symbol => "EUR",
|
30
|
+
:exchange => "IDEALPRO",
|
31
|
+
:currency => "GBP",
|
32
|
+
:sec_type => :forex,
|
33
|
+
:description => "EURGBP"),
|
39
34
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
35
|
+
:eurjpy => IB::Contract.new(:symbol => "EUR",
|
36
|
+
:exchange => "IDEALPRO",
|
37
|
+
:currency => "JPY",
|
38
|
+
:sec_type => :forex,
|
39
|
+
:description => "EURJPY"),
|
45
40
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
41
|
+
:eurusd => IB::Contract.new(:symbol => "EUR",
|
42
|
+
:exchange => "IDEALPRO",
|
43
|
+
:currency => "USD",
|
44
|
+
:sec_type => :forex,
|
45
|
+
:description => "EURUSD"),
|
51
46
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
47
|
+
:eurcad => IB::Contract.new(:symbol => "EUR",
|
48
|
+
:exchange => "IDEALPRO",
|
49
|
+
:currency => "CAD",
|
50
|
+
:sec_type => :forex,
|
51
|
+
:description => "EURCAD"),
|
57
52
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
53
|
+
:usdchf => IB::Contract.new(:symbol => "USD",
|
54
|
+
:exchange => "IDEALPRO",
|
55
|
+
:currency => "CHF",
|
56
|
+
:sec_type => :forex,
|
57
|
+
:description => "USDCHF"),
|
63
58
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
59
|
+
:usdcad => IB::Contract.new(:symbol => "USD",
|
60
|
+
:exchange => "IDEALPRO",
|
61
|
+
:currency => "CAD",
|
62
|
+
:sec_type => :forex,
|
63
|
+
:description => "USDCAD"),
|
64
|
+
|
65
|
+
:usdjpy => IB::Contract.new(:symbol => "USD",
|
66
|
+
:exchange => "IDEALPRO",
|
67
|
+
:currency => "JPY",
|
68
|
+
:sec_type => :forex,
|
69
|
+
:description => "USDJPY")
|
70
|
+
}
|
71
|
+
end
|
72
|
+
end
|
70
73
|
end
|
71
74
|
end
|
data/lib/ib/symbols/futures.rb
CHANGED
@@ -1,113 +1,111 @@
|
|
1
|
-
# The Futures
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# takes over as the volume leader.
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# Note that the :description field is particular to ib, and is NOT part of the standard TWS API.
|
8
|
-
# It is never transmitted to IB. It's purely used clientside, and you can store any arbitrary string that
|
9
|
-
# you may find useful there.
|
10
|
-
#
|
1
|
+
# The Futures module tries to guess the front month currency future using a crude algorithm
|
2
|
+
# that does not take into account expiry/rollover day. This will be valid most of the time,
|
3
|
+
# but near/after expiry day the next quarter's contract takes over as the volume leader.
|
11
4
|
|
12
5
|
module IB
|
13
6
|
module Symbols
|
7
|
+
module Futures
|
8
|
+
extend Symbols
|
9
|
+
|
10
|
+
# Find the next front month of quarterly futures.
|
11
|
+
#
|
12
|
+
# N.B. This will not work as expected during the front month before expiration, as
|
13
|
+
# it will point to the next quarter even though the current month is still valid!
|
14
|
+
def self.next_quarter_month time=Time.now
|
15
|
+
[3, 6, 9, 12].find { |month| month > time.month } || 3 # for December, next March
|
16
|
+
end
|
14
17
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# it will point to the next quarter even though the current month is still valid!
|
19
|
-
def self.next_quarter_month time=Time.now
|
20
|
-
[3, 6, 9, 12].find { |month| month > time.month } || 3 # for December, next March
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.next_quarter_year time=Time.now
|
24
|
-
next_quarter_month(time) < time.month ? time.year + 1 : time.year
|
25
|
-
end
|
18
|
+
def self.next_quarter_year time=Time.now
|
19
|
+
next_quarter_month(time) < time.month ? time.year + 1 : time.year
|
20
|
+
end
|
26
21
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
22
|
+
# WARNING: This is currently broken. It returns the next
|
23
|
+
# quarterly expiration month after the current month. Many futures
|
24
|
+
# instruments have monthly contracts for the near months. This
|
25
|
+
# method will not work for such contracts; it will return the next
|
26
|
+
# quarter after the current month, even though the present month
|
27
|
+
# has the majority of the trading volume.
|
28
|
+
#
|
29
|
+
# For example, in early November of 2011, many contracts have the
|
30
|
+
# vast majority of their volume in the Nov 2011 contract, but this
|
31
|
+
# method will return the Dec 2011 contract instead.
|
32
|
+
#
|
33
|
+
def self.next_expiry time=Time.now
|
34
|
+
"#{ next_quarter_year(time) }#{ sprintf("%02d", next_quarter_month(time)) }"
|
35
|
+
end
|
41
36
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
37
|
+
# Convenience method; generates an IB::Contract instance for a futures
|
38
|
+
# contract with the given parameters.
|
39
|
+
#
|
40
|
+
# If expiry is nil, it will use the end month of the current
|
41
|
+
# quarter. This will be wrong for most contracts most of the time,
|
42
|
+
# since most contracts have the majority of their volume in a
|
43
|
+
# nearby intraquarter month.
|
44
|
+
#
|
45
|
+
# It is recommended that you specify an expiration date manually
|
46
|
+
# until next_expiry is fixed. Expiry should be a string in the
|
47
|
+
# format "YYYYMM", where YYYY is the 4 digit year and MM is the 2
|
48
|
+
# digit month. For example, November 2011 is "201111".
|
49
|
+
#
|
50
|
+
def self.future(base_symbol, exchange, currency, description="", expiry=nil)
|
51
|
+
IB::Contract.new :symbol => base_symbol,
|
52
|
+
:expiry => expiry || next_expiry,
|
53
|
+
:exchange => exchange,
|
54
|
+
:currency => currency,
|
55
|
+
:sec_type => SECURITY_TYPES[:future],
|
56
|
+
:description => description
|
57
|
+
end
|
63
58
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
59
|
+
def self.contracts
|
60
|
+
@contracts ||= {
|
61
|
+
:ym => IB::Contract.new(:symbol => "YM",
|
62
|
+
:expiry => next_expiry,
|
63
|
+
:exchange => "ECBOT",
|
64
|
+
:currency => "USD",
|
65
|
+
:sec_type => :future,
|
66
|
+
:description => "Mini Dow Jones Industrial"),
|
71
67
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
68
|
+
:es => IB::Contract.new(:symbol => "ES",
|
69
|
+
:expiry => next_expiry,
|
70
|
+
:exchange => "GLOBEX",
|
71
|
+
:currency => "USD",
|
72
|
+
:sec_type => :future,
|
73
|
+
:multiplier => 50,
|
74
|
+
:description => "E-Mini S&P 500"),
|
79
75
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
76
|
+
:gbp => IB::Contract.new(:symbol => "GBP",
|
77
|
+
:expiry => next_expiry,
|
78
|
+
:exchange => "GLOBEX",
|
79
|
+
:currency => "USD",
|
80
|
+
:sec_type => :future,
|
81
|
+
:multiplier => 62500,
|
82
|
+
:description => "British Pounds"),
|
87
83
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
84
|
+
:eur => IB::Contract.new(:symbol => "EUR",
|
85
|
+
:expiry => next_expiry,
|
86
|
+
:exchange => "GLOBEX",
|
87
|
+
:currency => "USD",
|
88
|
+
:sec_type => :future,
|
89
|
+
:multiplier => 12500,
|
90
|
+
:description => "Euro FX"),
|
95
91
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
92
|
+
:jpy => IB::Contract.new(:symbol => "JPY",
|
93
|
+
:expiry => next_expiry,
|
94
|
+
:exchange => "GLOBEX",
|
95
|
+
:currency => "USD",
|
96
|
+
:sec_type => :future,
|
97
|
+
:multiplier => 12500000,
|
98
|
+
:description => "Japanese Yen"),
|
103
99
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
100
|
+
:hsi => IB::Contract.new(:symbol => "HSI",
|
101
|
+
:expiry => next_expiry,
|
102
|
+
:exchange => "HKFE",
|
103
|
+
:currency => "HKD",
|
104
|
+
:sec_type => :future,
|
105
|
+
:multiplier => 50,
|
106
|
+
:description => "Hang Seng Index")
|
107
|
+
}
|
108
|
+
end
|
109
|
+
end
|
112
110
|
end
|
113
111
|
end
|
data/lib/ib/symbols/options.rb
CHANGED
@@ -1,36 +1,36 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Note that the :description field is particular to ib, and is NOT part of the
|
4
|
-
# standard TWS API. It is never transmitted to IB. It's purely used clientside, and
|
5
|
-
# you can store any arbitrary string that you may find useful there.
|
6
|
-
|
1
|
+
# Option contracts definitions
|
7
2
|
module IB
|
8
3
|
module Symbols
|
4
|
+
module Options
|
5
|
+
extend Symbols
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
7
|
+
def self.contracts
|
8
|
+
@contracts ||= {
|
9
|
+
:wfc20 => IB::Option.new(:symbol => "WFC",
|
10
|
+
:expiry => "201301",
|
11
|
+
:right => "CALL",
|
12
|
+
:strike => 20.0,
|
13
|
+
:description => "Wells Fargo 20 Call 2013-01"),
|
14
|
+
:aapl500 => IB::Option.new(:symbol => "AAPL",
|
15
|
+
:expiry => "201301",
|
16
|
+
:right => "CALL",
|
17
|
+
:strike => 500,
|
18
|
+
:description => "Apple 500 Call 2013-01"),
|
19
|
+
:z50 => IB::Option.new(:symbol => "Z",
|
20
|
+
:exchange => "LIFFE",
|
21
|
+
:expiry => "201206",
|
22
|
+
:right => "CALL",
|
23
|
+
:strike => 50.0,
|
24
|
+
:description => " FTSE-100 index 50 Call 2012-06"),
|
25
|
+
:spy75 => IB::Option.new(:symbol => 'SPY',
|
26
|
+
:expiry => "20120615",
|
27
|
+
:right => "P",
|
28
|
+
:currency => "USD",
|
29
|
+
:strike => 75.0,
|
30
|
+
:description => "SPY 75.0 Put 2012-06-16"),
|
31
|
+
:spy100 => IB::Option.new(:osi => 'SPY 121222P00100000'),
|
34
32
|
}
|
33
|
+
end
|
34
|
+
end
|
35
35
|
end
|
36
36
|
end
|
data/lib/ib/symbols/stocks.rb
CHANGED
@@ -1,29 +1,30 @@
|
|
1
1
|
# Stock contracts definitions
|
2
|
-
#
|
3
|
-
# Note that the :description field is particular to ib, and is NOT part of the
|
4
|
-
# standard TWS API. It is never transmitted to IB. It's purely used clientside, and
|
5
|
-
# you can store any arbitrary string that you may find useful there.
|
6
|
-
|
7
2
|
module IB
|
8
3
|
module Symbols
|
4
|
+
module Stocks
|
5
|
+
extend Symbols
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
:sec_type => :stock,
|
15
|
-
:description => "Wells Fargo"),
|
16
|
-
|
17
|
-
:aapl => IB::Contract.new(:symbol => "AAPL",
|
7
|
+
def self.contracts
|
8
|
+
@contracts ||= {
|
9
|
+
:wfc => IB::Contract.new(:symbol => "WFC",
|
10
|
+
:exchange => "NYSE",
|
18
11
|
:currency => "USD",
|
19
12
|
:sec_type => :stock,
|
20
|
-
:description => "
|
13
|
+
:description => "Wells Fargo"),
|
21
14
|
|
22
|
-
|
23
|
-
:exchange => "NYSE",
|
15
|
+
:aapl => IB::Contract.new(:symbol => "AAPL",
|
24
16
|
:currency => "USD",
|
25
17
|
:sec_type => :stock,
|
26
|
-
:description => "
|
18
|
+
:description => "Apple Inc."),
|
19
|
+
|
20
|
+
:wrong => IB::Contract.new(:symbol => "QEEUUE",
|
21
|
+
:exchange => "NYSE",
|
22
|
+
:currency => "USD",
|
23
|
+
:sec_type => :stock,
|
24
|
+
:description => "Non-existent stock"),
|
27
25
|
}
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
28
29
|
end
|
29
30
|
end
|
data/spec/README.md
CHANGED
@@ -33,15 +33,6 @@ switches (by default, TWS port is used):
|
|
33
33
|
$ rspec -rgw [spec/specific_spec.rb]
|
34
34
|
$ rspec -rtws [spec/specific_spec.rb]
|
35
35
|
|
36
|
-
Some of the specs may randomly fail from time to time when you are running the spec suit
|
37
|
-
against your IB paper account. This happens because these specs depend on live connection
|
38
|
-
to IB, which is inherently non-deterministic. Anything happening along the way - network
|
39
|
-
delay, problems with IB data farms, even high CPU load on your machine - may delay the
|
40
|
-
expected responce, so that the spec times out or does not find expected data. It is
|
41
|
-
suggested that you run the failing specs several times, and start debugging them only
|
42
|
-
if they are failing regularly. Otherwise, you may just waste time chasing an artifact of
|
43
|
-
unreliable IB connection, rather than some real problem with the specs.
|
44
|
-
|
45
36
|
## RUNNING RAILS-SPECIFIC SPECS:
|
46
37
|
|
47
38
|
This gem has two operating modes: standalone and Rails-engine. If you require it in a
|
@@ -64,6 +55,21 @@ To run specs with Dummy Rails application, use:
|
|
64
55
|
|
65
56
|
Other suit switches described in previous section should work with Rails as well.
|
66
57
|
|
58
|
+
## PROBLEMS WHILE RUNNING THE SPECS:
|
59
|
+
|
60
|
+
Some of the specs may randomly fail from time to time when you are running the spec suit
|
61
|
+
against your IB paper account. This happens because these specs depend on live connection
|
62
|
+
to IB, which is inherently non-deterministic. Anything happening along the way - network
|
63
|
+
delay, problems with IB data farms, even high CPU load on your machine - may delay the
|
64
|
+
expected responce, so that the spec times out or does not find expected data. For example,
|
65
|
+
IB historical data farm is known to disappear from time to time, so any specs related to
|
66
|
+
historical data will fail while this outage lasts.
|
67
|
+
|
68
|
+
If you experience such intermittent spec failures, it is recommended that you run the
|
69
|
+
failing specs several times, possibly with a delay of 10-20 minutes. Start debugging
|
70
|
+
the specs only if they are failing regularly. Otherwise, you may just waste time chasing
|
71
|
+
an artifact of unreliable IB connection, rather than some real problem with the specs.
|
72
|
+
|
67
73
|
# WRITING YOUR OWN INTEGRATION SPECS
|
68
74
|
|
69
75
|
You can easily create your own integration specs. Pattern for writing specs is like this:
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe IB::Symbols do
|
4
|
+
|
5
|
+
it 'references pre-defined IB stock Contracts' do
|
6
|
+
wfc = IB::Symbols::Stocks[:wfc]
|
7
|
+
wfc.should be_an IB::Contract
|
8
|
+
wfc.sec_type.should == :stock
|
9
|
+
wfc.symbol.should == "WFC"
|
10
|
+
wfc.exchange.should == "NYSE"
|
11
|
+
wfc.currency.should == "USD"
|
12
|
+
wfc.description.should == "Wells Fargo"
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'references pre-defined IB option Contracts' do
|
16
|
+
wfc = IB::Symbols::Options[:wfc20]
|
17
|
+
wfc.should be_an IB::Contract
|
18
|
+
wfc.sec_type.should == :option
|
19
|
+
wfc.symbol.should == "WFC"
|
20
|
+
wfc.expiry.should == "201301"
|
21
|
+
wfc.right.should == :call
|
22
|
+
wfc.strike.should == 20
|
23
|
+
wfc.description.should == "Wells Fargo 20 Call 2013-01"
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'references pre-defined IB forex Contracts' do
|
27
|
+
fx = IB::Symbols::Forex[:gbpusd]
|
28
|
+
fx.should be_an IB::Contract
|
29
|
+
fx.sec_type.should == :forex
|
30
|
+
fx.symbol.should == "GBP"
|
31
|
+
fx.currency.should == "USD"
|
32
|
+
fx.exchange.should == "IDEALPRO"
|
33
|
+
fx.description.should == "GBPUSD"
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'references pre-defined IB futures Contracts' do
|
37
|
+
fx = IB::Symbols::Futures[:gbp]
|
38
|
+
fx.should be_an IB::Contract
|
39
|
+
fx.expiry.should == IB::Symbols::Futures.next_expiry
|
40
|
+
fx.sec_type.should == :future
|
41
|
+
fx.symbol.should == "GBP"
|
42
|
+
fx.currency.should == "USD"
|
43
|
+
fx.multiplier.should == 62500
|
44
|
+
fx.exchange.should == "GLOBEX"
|
45
|
+
fx.description.should == "British Pounds"
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
end # describe IB::Symbols
|
@@ -184,7 +184,7 @@ describe "Request Contract Info", :connected => true, :integration => true do
|
|
184
184
|
|
185
185
|
contract.symbol.should == 'YM'
|
186
186
|
contract.local_symbol.should =~ /YM/
|
187
|
-
contract.expiry.should =~ Regexp.new(IB::Symbols.next_expiry)
|
187
|
+
contract.expiry.should =~ Regexp.new(IB::Symbols::Futures.next_expiry)
|
188
188
|
contract.exchange.should == 'ECBOT'
|
189
189
|
contract.con_id.should be_an Integer
|
190
190
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: ib-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.8.
|
5
|
+
version: 0.8.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Paul Legato
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2012-07-
|
14
|
+
date: 2012-07-18 00:00:00 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -322,6 +322,7 @@ files:
|
|
322
322
|
- spec/ib/messages/incoming/order_status_spec.rb
|
323
323
|
- spec/ib/messages/outgoing/account_data_spec.rb
|
324
324
|
- spec/ib/messages/outgoing/market_data_type_spec.rb
|
325
|
+
- spec/ib/symbols/symbols_spec.rb
|
325
326
|
- spec/integration/account_info_spec.rb
|
326
327
|
- spec/integration/contract_info_spec.rb
|
327
328
|
- spec/integration/depth_data_spec.rb
|
@@ -407,6 +408,7 @@ test_files:
|
|
407
408
|
- spec/ib/messages/incoming/order_status_spec.rb
|
408
409
|
- spec/ib/messages/outgoing/account_data_spec.rb
|
409
410
|
- spec/ib/messages/outgoing/market_data_type_spec.rb
|
411
|
+
- spec/ib/symbols/symbols_spec.rb
|
410
412
|
- spec/integration/account_info_spec.rb
|
411
413
|
- spec/integration/contract_info_spec.rb
|
412
414
|
- spec/integration/depth_data_spec.rb
|