ib-api 972.2 → 972.3
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/VERSION +1 -1
- data/lib/ib/connection.rb +13 -2
- data/lib/ib/messages/incoming/account_value.rb +5 -1
- data/lib/ib/messages/incoming/historical_data.rb +25 -5
- data/lib/ib/messages/outgoing/bar_requests.rb +4 -5
- data/lib/ib/support.rb +30 -15
- data/lib/models/ib/bag.rb +6 -0
- data/lib/models/ib/bar.rb +1 -1
- data/lib/models/ib/combo_leg.rb +22 -0
- data/lib/models/ib/contract.rb +31 -39
- data/lib/models/ib/spread.rb +22 -17
- metadata +3 -16
- data/example/README.md +0 -76
- data/example/account_info +0 -54
- data/example/account_positions +0 -30
- data/example/account_summary +0 -88
- data/example/cancel_orders +0 -74
- data/example/fa_accounts +0 -25
- data/example/fundamental_data +0 -40
- data/example/historic_data_cli +0 -186
- data/example/list_orders +0 -45
- data/example/portfolio_csv +0 -81
- data/example/scanner_data +0 -62
- data/example/template +0 -19
- data/example/tick_data +0 -28
data/example/list_orders
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# This script retrieves list of all Orders from TWS
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
require 'ib-api'
|
7
|
-
|
8
|
-
# Connect to IB as 0 (TWS) to retrieve all Orders, including TWS-generated ones
|
9
|
-
ib = IB::Connection.new :client_id => 0 do |gw| # , :port => 7497 # TWS
|
10
|
-
|
11
|
-
# Subscribe to TWS alerts/errors and order-related messages
|
12
|
-
counter = 0
|
13
|
-
|
14
|
-
gw.subscribe(:Alert, :ManagedAccounts, :OrderStatus, :OpenOrderEnd) { |msg| puts msg.to_human }
|
15
|
-
|
16
|
-
gw.subscribe(:OpenOrder) do |msg|
|
17
|
-
counter += 1
|
18
|
-
puts "#{counter}: #{msg.to_human}"
|
19
|
-
|
20
|
-
# Get rid of logging verbosity
|
21
|
-
gw.logger.level = Logger::FATAL
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
## fire request
|
26
|
-
ib.send_message :RequestAllOpenOrders
|
27
|
-
|
28
|
-
# Wait for IB to respond to our request
|
29
|
-
ib.wait_for :OpenOrderEnd
|
30
|
-
sleep 1 # Let printer do the job
|
31
|
-
|
32
|
-
=begin
|
33
|
-
---> expected output
|
34
|
-
1: <OpenOrder: <Bag: GOOG SMART USD legs: 269330045|1,269562569|1,301964119|-2 > <Order: LMT GTC buy 10.0 0.06 PreSubmitted #9/561364885 from 1112/DU167349 fee 0.0>>
|
35
|
-
<OrderStatus: <OrderState: PreSubmitted #9/561364885 from 1112 filled 0.0/10.0 at 0.0/0.0 why_held locate>>
|
36
|
-
2:<OpenOrder: <Stock: WFC USD> <Order: LMT DAY sell 100.0 34.05 PreSubmitted #19/561364895 from 1112/DU167349 fee 0.0>>
|
37
|
-
<OrderStatus: <OrderState: PreSubmitted #19/561364895 from 1112 filled 0.0/100.0 at 0.0/0.0 why_held child,locate>>
|
38
|
-
3: <OpenOrder: <Stock: WFC USD> <Order: STP DAY sell 100.0 0.0 PreSubmitted /33.55#18/561364894 from 1112/DU167349 fee 0.0>>
|
39
|
-
<OrderStatus: <OrderState: PreSubmitted #18/561364894 from 1112 filled 0.0/100.0 at 0.0/0.0 why_held child,locate,trigger>>
|
40
|
-
4: <OpenOrder: <Bag: GOOG SMART USD legs: 269330045|1,269562569|1,301964119|-2 > <Order: LMT GTC buy 10.0 0.06 PreSubmitted #8/1562725198 from 1112/DU167349 fee 0.0>>
|
41
|
-
<OrderStatus: <OrderState: PreSubmitted #8/1562725198 from 1112 filled 0.0/10.0 at 0.0/0.0 why_held locate>>
|
42
|
-
5: <OpenOrder: <Stock: WFC USD> <Order: LMT GTC buy 100.0 1.72 Submitted #3/1562725193 from 1112/DU167349 fee 0.0>>
|
43
|
-
<OrderStatus: <OrderState: Submitted #3/1562725193 from 1112 filled 0.0/100.0 at 0.0/0.0 why_held >>
|
44
|
-
<OpenOrderEnd: >
|
45
|
-
=end
|
data/example/portfolio_csv
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# This script exports your IB portfolio in a CSV format. Usage:
|
4
|
-
# $ example/portfolio_csv [account] > portfolio.csv
|
5
|
-
|
6
|
-
require 'bundler/setup'
|
7
|
-
require 'ib-ruby'
|
8
|
-
|
9
|
-
# Only for Advisors: you need to provide account id such as U666777
|
10
|
-
account = ARGV[0] || ''
|
11
|
-
accounts = []
|
12
|
-
|
13
|
-
# Connect to IB TWS and subscribe to events
|
14
|
-
ib = IB::Connection.new( :client_id => 1112 , port: 4002 ) do |gw| # , :port => 7496 # TWS
|
15
|
-
|
16
|
-
# Redirect TWS alerts/errors to STDERR to keep output file clean
|
17
|
-
#gw.subscribe(:Alert) { |msg| STDERR.puts msg.to_human }
|
18
|
-
|
19
|
-
# Subscribe to TWS alerts/errors and account-related messages
|
20
|
-
# that TWS sends in response to account data request
|
21
|
-
gw.subscribe(:Alert) do |msg|
|
22
|
-
## if an account is not given. but required, (Error 321 indicates this)
|
23
|
-
## fetch data from the last account detected. (The first is most probably the Advisor-Account)
|
24
|
-
if msg.code == 321
|
25
|
-
account = accounts.last
|
26
|
-
gw.send_message :RequestAccountData, :subscribe => true, :account_code => account
|
27
|
-
else
|
28
|
-
puts msg.to_human
|
29
|
-
end
|
30
|
-
end
|
31
|
-
# Silently ignore account-related messages other than :PortfolioValue
|
32
|
-
gw.subscribe(:AccountUpdateTime, :AccountValue, :ManagedAccounts, :AccountDownloadEnd) {}
|
33
|
-
# Get rid of logging verbosity
|
34
|
-
gw.logger.level = Logger::FATAL
|
35
|
-
|
36
|
-
## Just in case: put account-names into accounts-array
|
37
|
-
gw.subscribe(:ManagedAccounts){ |msg| accounts = msg.accounts_list.split ',' }
|
38
|
-
end
|
39
|
-
|
40
|
-
# Output CSV headers
|
41
|
-
puts %w[Symbol
|
42
|
-
SecType
|
43
|
-
Expiry
|
44
|
-
Strike
|
45
|
-
Right
|
46
|
-
Currency
|
47
|
-
LocalSymbol
|
48
|
-
Position
|
49
|
-
MarketPrice
|
50
|
-
MarketValue
|
51
|
-
AvgCost
|
52
|
-
UnrealizedPNL
|
53
|
-
RealizedPNL
|
54
|
-
Account].map {|val| "\"#{val}\""}.join(",")
|
55
|
-
|
56
|
-
# Output each portfolio position as a single line in CSV format
|
57
|
-
ib.subscribe(:PortfolioValue) do |msg|
|
58
|
-
contract = msg.contract
|
59
|
-
csv = [ contract.symbol,
|
60
|
-
IB::CODES[:sec_type][contract.sec_type],
|
61
|
-
contract.expiry,
|
62
|
-
contract.strike == 0 ? "" : contract.strike,
|
63
|
-
contract.right == :none ? "" : contract.right,
|
64
|
-
contract.currency,
|
65
|
-
contract.local_symbol,
|
66
|
-
msg.position,
|
67
|
-
msg.market_price,
|
68
|
-
msg.market_value,
|
69
|
-
msg.average_cost,
|
70
|
-
msg.unrealized_pnl,
|
71
|
-
msg.realized_pnl,
|
72
|
-
msg.account_name
|
73
|
-
].map {|val| "\"#{val}\""}.join(",")
|
74
|
-
puts csv
|
75
|
-
end
|
76
|
-
|
77
|
-
# Request account data, wait for its end, unsubscribe
|
78
|
-
ib.send_message :RequestAccountData, :subscribe => true, :account_code => account
|
79
|
-
ib.wait_for :AccountDownloadEnd, 30
|
80
|
-
ib.send_message :RequestAccountData, :subscribe => false, :account_code => account
|
81
|
-
sleep 0.5
|
data/example/scanner_data
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# This Script needs testing. remove this line after sucessfully using the scanner facility
|
3
|
-
#
|
4
|
-
# This script setups a scan request and retreives the results.
|
5
|
-
|
6
|
-
require 'rubygems'
|
7
|
-
require 'bundler/setup'
|
8
|
-
require 'ib-api'
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# Connect to IB TWS.
|
13
|
-
ib = IB::Connection.new :client_id => 1112 , port: 7496 do | gw | #, :port => 7497 # TWS
|
14
|
-
|
15
|
-
|
16
|
-
# Subscribe to TWS alerts/errors
|
17
|
-
gw.subscribe(:Alert) { |msg| puts msg.to_human }
|
18
|
-
|
19
|
-
|
20
|
-
# Subscribe to ScannerData incoming events. The code passed in the block
|
21
|
-
# will be executed when a message of that type is received, with the received
|
22
|
-
# message as its argument. In this case, we just print out the data.
|
23
|
-
#
|
24
|
-
gw.subscribe(IB::Messages::Incoming::ScannerData) do |msg|
|
25
|
-
puts "ID: #{msg.request_id} : #{msg.count} items:"
|
26
|
-
msg.results.each { |entry| puts " #{entry}" }
|
27
|
-
end
|
28
|
-
end
|
29
|
-
id = 42
|
30
|
-
# Now we actually request scanner data for the type of scan we are interested.
|
31
|
-
# Some scan types can be found here: http://www.interactivebrokers.com/php/apiUsersGuide/apiguide/tables/available_market_scanners.htm
|
32
|
-
mess = IB::Messages::Outgoing::RequestScannerSubscription.new(
|
33
|
-
:request_id => id,
|
34
|
-
:number_of_rows => 20,
|
35
|
-
:instrument => "STK",
|
36
|
-
:location_code => 'STK.US.MAJOR',
|
37
|
-
:scan_code => 'TOP_PERC_GAIN',
|
38
|
-
:above_price => 4.0,
|
39
|
-
:below_price => Float::MAX,
|
40
|
-
:above_volume => 5000,
|
41
|
-
:market_cap_above => 100000000,
|
42
|
-
:market_cap_below => Float::MAX,
|
43
|
-
:moody_rating_above => "",
|
44
|
-
:moody_rating_below => "",
|
45
|
-
:sp_rating_above => "",
|
46
|
-
:sp_rating_below => "",
|
47
|
-
:maturity_date_above => "",
|
48
|
-
:maturity_date_below => "",
|
49
|
-
:coupon_rate_above => Float::MAX,
|
50
|
-
:coupon_rate_below => Float::MAX,
|
51
|
-
:exclude_convertible => "",
|
52
|
-
:average_option_volume_above => "", # ?
|
53
|
-
:scanner_setting_pairs => "Annual,true",
|
54
|
-
:stock_type_filter => "Stock"
|
55
|
-
)
|
56
|
-
|
57
|
-
ib.send_message( mess )
|
58
|
-
|
59
|
-
# IB does not send any indication when all data is done being delivered.
|
60
|
-
# So we need to interrupt manually when our request is answered.
|
61
|
-
puts "\n******** Press <Enter> to exit... *********\n\n"
|
62
|
-
STDIN.gets
|
data/example/template
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# Your script description here...
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
require 'ib-api'
|
7
|
-
|
8
|
-
# First, connect to IB TWS and subscribe for events.
|
9
|
-
ib = IB::Connection.new :client_id => 1112 do | gw | #, :port => 7497 # TWS
|
10
|
-
|
11
|
-
# Subscribe to TWS alerts/errors
|
12
|
-
gw.subscribe(:Alert, :ManagedAccounts) { |msg| puts msg.to_human }
|
13
|
-
# Set log level
|
14
|
-
gw.logger.level = Logger::FATAL # DEBUG -- INFO -- WARN -- ERROR -- FATAL
|
15
|
-
|
16
|
-
end
|
17
|
-
# Put your code here
|
18
|
-
# ...
|
19
|
-
|
data/example/tick_data
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
# This script reproduces https://github.com/ib-ruby/ib-ruby/issues/12
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
require 'ib-api'
|
7
|
-
|
8
|
-
contract = IB::Stock.new :symbol=> 'AAPL'
|
9
|
-
|
10
|
-
# First, connect to IB Gateway.
|
11
|
-
ib = IB::Connection.new :client_id => 1112 # id to identify your script
|
12
|
-
# :port => 7497 # TWS connection (instead of default Gateway)
|
13
|
-
# :received => false # Do not keep all received messages in memory
|
14
|
-
|
15
|
-
ib.subscribe(:Alert) { |msg| puts msg.to_human }
|
16
|
-
ib.subscribe(:MarketDataType) { |msg| puts msg.to_human }
|
17
|
-
ib.subscribe(:TickGeneric, :TickString, :TickPrice, :TickSize) { |msg| puts msg.inspect }
|
18
|
-
ib.send_message :RequestMarketDataType, :market_data_type => :delayed
|
19
|
-
ib.send_message :RequestMarketData, id: 123, contract: contract
|
20
|
-
|
21
|
-
puts "\nSubscribed to market data"
|
22
|
-
puts "\n******** Press <Enter> to cancel... *********\n\n"
|
23
|
-
gets
|
24
|
-
puts "Cancelling market data subscription.."
|
25
|
-
|
26
|
-
ib.send_message :CancelMarketData, id: 123
|
27
|
-
sleep 1
|
28
|
-
puts "Done."
|