ib-api 972.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +50 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +16 -0
  7. data/Gemfile.lock +105 -0
  8. data/Guardfile +24 -0
  9. data/LICENSE +674 -0
  10. data/README.md +65 -0
  11. data/Rakefile +11 -0
  12. data/VERSION +1 -0
  13. data/api.gemspec +43 -0
  14. data/bin/console +95 -0
  15. data/bin/console.yml +3 -0
  16. data/bin/setup +8 -0
  17. data/changelog.md +7 -0
  18. data/example/README.md +76 -0
  19. data/example/account_info +54 -0
  20. data/example/account_positions +30 -0
  21. data/example/account_summary +88 -0
  22. data/example/cancel_orders +74 -0
  23. data/example/fa_accounts +25 -0
  24. data/example/fundamental_data +40 -0
  25. data/example/historic_data_cli +186 -0
  26. data/example/list_orders +45 -0
  27. data/example/portfolio_csv +81 -0
  28. data/example/scanner_data +62 -0
  29. data/example/template +19 -0
  30. data/example/tick_data +28 -0
  31. data/lib/extensions/class-extensions.rb +87 -0
  32. data/lib/ib-api.rb +7 -0
  33. data/lib/ib/base.rb +103 -0
  34. data/lib/ib/base_properties.rb +160 -0
  35. data/lib/ib/connection.rb +450 -0
  36. data/lib/ib/constants.rb +393 -0
  37. data/lib/ib/errors.rb +44 -0
  38. data/lib/ib/logger.rb +26 -0
  39. data/lib/ib/messages.rb +99 -0
  40. data/lib/ib/messages/abstract_message.rb +101 -0
  41. data/lib/ib/messages/incoming.rb +251 -0
  42. data/lib/ib/messages/incoming/abstract_message.rb +116 -0
  43. data/lib/ib/messages/incoming/account_value.rb +78 -0
  44. data/lib/ib/messages/incoming/alert.rb +34 -0
  45. data/lib/ib/messages/incoming/contract_data.rb +102 -0
  46. data/lib/ib/messages/incoming/delta_neutral_validation.rb +23 -0
  47. data/lib/ib/messages/incoming/execution_data.rb +50 -0
  48. data/lib/ib/messages/incoming/historical_data.rb +84 -0
  49. data/lib/ib/messages/incoming/market_depths.rb +44 -0
  50. data/lib/ib/messages/incoming/next_valid_id.rb +18 -0
  51. data/lib/ib/messages/incoming/open_order.rb +277 -0
  52. data/lib/ib/messages/incoming/order_status.rb +85 -0
  53. data/lib/ib/messages/incoming/portfolio_value.rb +78 -0
  54. data/lib/ib/messages/incoming/real_time_bar.rb +32 -0
  55. data/lib/ib/messages/incoming/scanner_data.rb +54 -0
  56. data/lib/ib/messages/incoming/ticks.rb +268 -0
  57. data/lib/ib/messages/outgoing.rb +437 -0
  58. data/lib/ib/messages/outgoing/abstract_message.rb +88 -0
  59. data/lib/ib/messages/outgoing/account_requests.rb +112 -0
  60. data/lib/ib/messages/outgoing/bar_requests.rb +250 -0
  61. data/lib/ib/messages/outgoing/place_order.rb +209 -0
  62. data/lib/ib/messages/outgoing/request_marketdata.rb +99 -0
  63. data/lib/ib/messages/outgoing/request_tick_data.rb +21 -0
  64. data/lib/ib/model.rb +4 -0
  65. data/lib/ib/models.rb +14 -0
  66. data/lib/ib/server_versions.rb +114 -0
  67. data/lib/ib/socket.rb +185 -0
  68. data/lib/ib/support.rb +160 -0
  69. data/lib/ib/version.rb +6 -0
  70. data/lib/models/ib/account.rb +85 -0
  71. data/lib/models/ib/account_value.rb +33 -0
  72. data/lib/models/ib/bag.rb +55 -0
  73. data/lib/models/ib/bar.rb +31 -0
  74. data/lib/models/ib/combo_leg.rb +105 -0
  75. data/lib/models/ib/condition.rb +245 -0
  76. data/lib/models/ib/contract.rb +415 -0
  77. data/lib/models/ib/contract_detail.rb +108 -0
  78. data/lib/models/ib/execution.rb +67 -0
  79. data/lib/models/ib/forex.rb +13 -0
  80. data/lib/models/ib/future.rb +15 -0
  81. data/lib/models/ib/index.rb +15 -0
  82. data/lib/models/ib/option.rb +78 -0
  83. data/lib/models/ib/option_detail.rb +55 -0
  84. data/lib/models/ib/order.rb +519 -0
  85. data/lib/models/ib/order_state.rb +152 -0
  86. data/lib/models/ib/portfolio_value.rb +64 -0
  87. data/lib/models/ib/stock.rb +16 -0
  88. data/lib/models/ib/underlying.rb +34 -0
  89. data/lib/models/ib/vertical.rb +96 -0
  90. data/lib/requires.rb +12 -0
  91. metadata +203 -0
@@ -0,0 +1,65 @@
1
+ # ib-api
2
+ Ruby interface to Interactive Brokers' TWS API
3
+
4
+ Reimplementation of the basic functions of ib-ruby
5
+
6
+
7
+ ----
8
+ `ib-ruby` offers a modular access to the TWS-API-Interface of Interactive Brokers.
9
+
10
+ `ib-api` provides a simple interface to low-level TWS API-calls.
11
+
12
+ ----
13
+
14
+ In its plain vanilla usage, it just exchanges messages with the TWS. The user is responsible for any further data processing.
15
+
16
+
17
+ Even then, it needs just a few lines of code to place an order
18
+
19
+ ```ruby
20
+ # connect with default parameters
21
+ ib = IB::Connection.new
22
+
23
+ # define a contract to deal with
24
+ the_stock = IB::Stock.new symbol: 'TAP'
25
+
26
+ # order 100 shares for 35 $
27
+ limit_order = IB::Order.new limit_price: 35, order_type: 'LMT', total_quantity: 100, action: :buy
28
+ ib.send_message :PlaceOrder,
29
+ :order => limit_order,
30
+ :contract => the_stock,
31
+ :local_id => ib.next_local_id
32
+
33
+ # wait until the orderstate message returned
34
+ ib.wait_for :OrderStatus
35
+
36
+ # print the Orderstatus
37
+ puts ib.recieved[:OrderStatus].to_human
38
+
39
+ # => ["<OrderState: Submitted #17/1528367295 from 2000 filled 0.0/100.0 at 0.0/0.0 why_held >"]
40
+
41
+ ```
42
+ ## Minimal TWS-Version
43
+
44
+ `ib-api` is tested via the _stable ib-Gateway_ (Version 9.72)
45
+
46
+ ## Tests
47
+
48
+ are invoked by
49
+
50
+ ```
51
+ bundle exec guard
52
+ # or
53
+ bundle exec rake spec
54
+ ```
55
+ Integration tests on order-placements are not included. To run the test suite its thus safe to use a _real Account_.
56
+ You have to edit `spec/spec.yml` and replace the `:account`-Setting with your own `AccountID`, even if you connect to a single account.
57
+
58
+
59
+ ## Contributing
60
+
61
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/ib-api. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
62
+
63
+ ## Code of Conduct
64
+
65
+ Everyone interacting in the Core project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/ib-api/blob/master/CODE_OF_CONDUCT.md).
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require "rake"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec) do |t|
7
+ t.pattern = Dir.glob("spec/**/*_spec.rb")
8
+ t.rspec_opts = "--format documentation"
9
+ end
10
+
11
+ task default: :spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 972.0
@@ -0,0 +1,43 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "ib/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ib-api"
8
+ spec.version = IB::VERSION
9
+ spec.authors = ["Hartmut Bischoff"]
10
+ spec.email = ["topofocus@gmail.com"]
11
+
12
+ spec.summary = %q{Ruby Implementation of the Interactive Brokers TWS API}
13
+ spec.description = %q{Ruby Implementation of the Interactive Brokers TWS API}
14
+ spec.homepage = "https://github.com/ib-ruby"
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ if spec.respond_to?(:metadata)
19
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
20
+
21
+ spec.metadata["homepage_uri"] = spec.homepage
22
+ spec.metadata["source_code_uri"] = "https://github.com/ib-ruby/ib-api"
23
+ # spec.metadata["changelog_uri"] = "https://github.com/ib-ruby/ib-api/CHANGELOG.md"
24
+ else
25
+ raise "RubyGems 2.0 or newer is required to protect against " \
26
+ "public gem pushes."
27
+ end
28
+
29
+ # Specify which files should be added to the gem when it is released.
30
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
31
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
32
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
33
+ end
34
+ spec.bindir = "exe"
35
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
36
+ spec.require_paths = ["lib"]
37
+
38
+ spec.add_development_dependency "bundler", "~> 1.17"
39
+ spec.add_development_dependency "rake", "~> 13.0"
40
+ spec.add_development_dependency "rspec", "~> 3.0"
41
+ spec.add_dependency 'activesupport', '>= 6.0'
42
+ spec.add_dependency 'activemodel'
43
+ end
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env ruby
2
+ ### loads the active-orient environment
3
+ ### and starts an interactive shell
4
+ ###
5
+ ### Parameter: t)ws | g)ateway (or number of port ) Default: Gateway ,
6
+ ### client_id , Default 2000
7
+ ###
8
+ ### Define Parameter in file console.yml
9
+ ###
10
+ require 'bundler/setup'
11
+ require 'yaml'
12
+
13
+ require 'logger'
14
+
15
+ require 'ib-api'
16
+
17
+ class Array
18
+ # enables calling members of an array. which are hashes by it name
19
+ # i.e
20
+ #
21
+ # 2.5.0 :006 > C.received[:OpenOrder].local_id
22
+ # => [16, 17, 21, 20, 19, 8, 7]
23
+ # 2.5.0 :007 > C.received[:OpenOrder].contract.to_human
24
+ # => ["<Bag: IECombo SMART USD legs: >", "<Stock: GE USD>", "<Stock: GE USD>", "<Stock: GE USD>", "<Stock: GE USD>", "<Stock: WFC USD>", "<Stock: WFC USD>"]
25
+ #
26
+ # its included only in the console, for inspection purposes
27
+
28
+ def method_missing(method, *key)
29
+ unless method == :to_hash || method == :to_str #|| method == :to_int
30
+ return self.map{|x| x.public_send(method, *key)}
31
+ end
32
+
33
+ end
34
+ end # Array
35
+
36
+
37
+ # read items from console.yml
38
+ read_yml = -> (key) do
39
+ YAML::load_file( File.expand_path('../console.yml',__FILE__))[key]
40
+ end
41
+
42
+
43
+ puts
44
+ puts ">> IB-Core Interactive Console <<"
45
+ puts '-'* 45
46
+ puts
47
+ puts "Namespace is IB ! "
48
+ puts
49
+ puts '-'* 45
50
+ include LogDev
51
+ include IB
52
+ require 'irb'
53
+ client_id = ARGV[1] || read_yml[:client_id]
54
+ specified_port = ARGV[0] || 'Gateway'
55
+ port = case specified_port
56
+ when Integer
57
+ specified_port # just use the number
58
+ when /^[gG]/
59
+ read_yml[:gateway]
60
+ when /^[Tt]/
61
+ read_yml[:tws]
62
+ end
63
+
64
+ ARGV.clear
65
+ logger = default_logger # Logger.new STDOUT
66
+
67
+ ## The Block takes instructions which are executed after initializing all instance-variables
68
+ ## and prior to the connection-process
69
+ ## Here we just subscribe to some events
70
+ C = Connection.new client_id: client_id, port: port do |c| # future use__ , optional_capacities: "+PACEAPI" do |c|
71
+
72
+ c.subscribe( :ContractData, :BondContractData) { |msg| logger.info { msg.contract.to_human } }
73
+ c.subscribe( :Alert, :ContractDataEnd, :ManagedAccounts, :OrderStatus ) {| m| logger.info { m.to_human } }
74
+ c.subscribe( :PortfolioValue, :AccountValue, :OrderStatus, :OpenOrderEnd, :ExecutionData ) {| m| logger.info { m.to_human }}
75
+ # c.subscribe :ManagedAccounts do |msg|
76
+ # puts "------------------------------- Managed Accounts ----------------------------------"
77
+ # puts "Detected Accounts: #{msg.accounts.account.join(' -- ')} "
78
+ # puts
79
+ # end
80
+
81
+ c.subscribe( :OpenOrder){ |msg| "Open Order detected and stored: C.received[:OpenOrders] " }
82
+ c.logger.level = Logger::INFO
83
+ end
84
+ unless C.received[:OpenOrder].blank?
85
+ puts "------------------------------- OpenOrders ----------------------------------"
86
+ puts C.received[:OpenOrder].to_human.join "\n"
87
+ end
88
+ puts "Connection established on Port #{port}, client_id #{client_id} used"
89
+ puts
90
+ puts "----> C points to the connection-instance"
91
+ puts
92
+ puts "some basic Messages are subscribed and accordingly displayed"
93
+ puts '-'* 45
94
+
95
+ IRB.start(__FILE__)
@@ -0,0 +1,3 @@
1
+ :gateway: 4002
2
+ :tws: 7496
3
+ :client_id: 2000
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,7 @@
1
+ Changelog
2
+ =============
3
+
4
+ | Date | Description |
5
+ |=++++ |=++++++++++++ |
6
+ | 30.8.2020 | migrating lib-files from ib-ruby-project |
7
+
@@ -0,0 +1,76 @@
1
+ ## IB-RUBY EXAMPLES:
2
+
3
+ This folder contains sample scripts that demonstrate common ib-ruby use cases.
4
+ The scripts show you how to access account info, print real time quotes, retrieve
5
+ historic or fundamental data, request options calculations, place, list, and cancel orders.
6
+ You may also want to look into `spec/integration` directory for more scenarios,
7
+ use cases and examples of handling IB messages.
8
+
9
+ Normally you run these examples like this:
10
+
11
+ $ ruby example/list_orders
12
+
13
+ The examples are executable.
14
+ If you're on Unix-like platform, they can be called directly ( » ./{script} «)
15
+
16
+ The Examples assume a running Gateway-Application on Localhost. Please use a Demo-Account or run
17
+ the API in »read-only-mode«
18
+
19
+ ## EXAMPLE DESCRIPTION:
20
+
21
+ *account_info* - Request your account info, current positions, portfolio values and so on
22
+
23
+ $ ruby example/account_info # or cd example; ./account_info
24
+
25
+ For Financial Advisors, you need to add the managed account you want info for:
26
+
27
+ $ ruby example/account_info U123456
28
+
29
+ *cancel_orders* - Cancel either all open orders, or specific order(s), by their (local) ids. Examples:
30
+
31
+ $ ruby example/cancel_orders
32
+ $ ruby example/cancel_orders 492 495
33
+
34
+ *contract_details* - Obtain detailed descriptions for specific Stock, Option, Forex, Futures and Bond contracts.
35
+
36
+ *contract_sample details* - Define Contract samples provided by java and python API-implementations
37
+
38
+ *depth_of_market* - Receive a stream of MarketDepth change events for Stock, Forex and Future symbols.
39
+
40
+ *fa_accounts* - Get info about accounts under management (for Financial Advisors).
41
+
42
+ *flex_query* - Run a pre-defined Flex query, receive and print Flex report. Example:
43
+
44
+ $ ruby example/flex_query 12345 # Flex query id pre-defined in Account Management
45
+
46
+ *fundamental_data* - Request and print fundamental data report for a specific stock.
47
+
48
+ *historic_data* - Receive 5 days of 1-hour trade data for Stock, Forex and Future symbols.
49
+
50
+ *historic_data_cli* - CLI script for historic data downloading. It has many options, for detailed help run:
51
+
52
+ $ ruby example/historic_data_cli
53
+
54
+ *list_orders* - List all open API orders.
55
+
56
+ *market_data* - Receive a stream of trade events for multiple Forex symbols.
57
+
58
+ *option_data* - Receive a stream of underlying, price and greeks calculations for multiple Option symbols.
59
+
60
+ *place_braket_order* - Place a braket order for Stock.
61
+
62
+ *place_combo_order* - Place an Option combo order (Google butterfly).
63
+
64
+ *place_order* - Place a simple limit order to buy Stock.
65
+
66
+ *portfolio_csv* - Exports your IB portfolio in a CSV format. Usage:
67
+
68
+ $ ruby example/portfolio_csv [account] > my_portfolio.csv
69
+
70
+ *real_time_data* - Subscribe to real time data for specific symbol.
71
+
72
+ *template* - A blank example to start a new script (setting up all the dependencies).
73
+
74
+ *tick_data* - Subscribe to extended tick types for a single stock symbol.
75
+
76
+ *time_and_sales* - Print out Time&Sales format for Futures symbols.
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This script connects to IB API, subscribes to account info and prints out
4
+ # messages received from IB (update every 3 minute or so)
5
+
6
+ require 'bundler/setup'
7
+ require 'ib-api'
8
+
9
+ # Only for Advisor accounts: you can provide account_code such as U666777 (otherwise the last account is used)
10
+ account_code = ARGV[0] || ''
11
+
12
+ include IB
13
+ # Connect to IB TWS
14
+ accounts = []
15
+ ib = Connection.new client_id: 1113, port: 4002 do | gw | # :port => 7497 # TWS
16
+
17
+ # Subscribe to TWS alerts/errors and account-related messages
18
+ # that TWS sends in response to account data request
19
+ gw.subscribe(:Alert) do |msg|
20
+ ## if an account is not given. but required, (Error 321 indicates this)
21
+ ## fetch data from the last account detected. (The first is most probably the Advisor-Account)
22
+ if msg.code == 321
23
+ gw.send_message :RequestAccountData, :subscribe => true, :account_code => accounts.last
24
+ else
25
+ puts msg.to_human
26
+ end
27
+ end
28
+
29
+ ## Print Account+Portfolio-Values
30
+ gw.subscribe(:AccountValue,
31
+ :PortfolioValue, :AccountUpdateTime) { |msg| puts msg.to_human }
32
+
33
+ ## Just in case: put account-names into accounts-array
34
+ gw.subscribe(:ManagedAccounts){ |msg| accounts = msg.accounts_list.split ',' }
35
+
36
+ # Set log level
37
+ gw.logger.level = Logger::FATAL # DEBUG #FATAL
38
+ end
39
+
40
+ ib.send_message :RequestAccountData, :subscribe => true, :account_code => account_code
41
+
42
+ puts "\nSubscribing to IB account data"
43
+
44
+ ## print message after recieving account-data
45
+ Thread.new do
46
+ sleep 3
47
+ puts "\n******** Press <Enter> to quit *********\n\n"
48
+ end
49
+
50
+ STDIN.gets
51
+ puts "Cancelling account data subscription.."
52
+
53
+ ib.send_message :RequestAccountData, :subscribe => false
54
+ sleep 2
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This script connects to IB API and subscribes to Position Values which are updated regulary
4
+
5
+ require 'bundler/setup'
6
+ require 'ib-api'
7
+
8
+
9
+ # connect to IB TWS.
10
+
11
+
12
+ ib = IB::Connection.new( :client_id => 1110) do | gw | #, :port => 7496 # TWS)
13
+ ## Subcribe to forseable events before the connection is completed
14
+ ## Subscribe to TWS alerts/errors
15
+ gw.subscribe(:Alert, :PositionData){ |msg| puts msg.to_human }
16
+ gw.logger.level = Logger::FATAL # DEBUG -- INFO -- WARN -- ERROR -- FATAL
17
+ end
18
+
19
+ Thread.new do
20
+ sleep 1
21
+ puts "\n******** Press <Enter> to quit *********\n\n"
22
+ end
23
+ # request the AccountSummary
24
+ ib.send_message :RequestPositions
25
+
26
+ STDIN.gets
27
+ puts "\n *** canceling Reqest ..."
28
+ ib.send_message :CancelPositions
29
+ sleep 1
30
+ puts "done."
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This script connects to IB API and subscribes to Account Summary Updates for certain tags
4
+
5
+ require 'bundler/setup'
6
+ require 'ib-api'
7
+
8
+ # Definition of what we want listed
9
+ # possible tags
10
+ # NetLiquidation,
11
+ # TotalCashValue - Total cash including futures pnl
12
+ # SettledCash - For cash accounts, this is the same as
13
+ # TotalCashValue
14
+ # AccruedCash - Net accrued interest
15
+ # BuyingPower - The maximum amount of marginable US stocks the
16
+ # account can buy
17
+ # EquityWithLoanValue - Cash + stocks + bonds + mutual funds
18
+ # PreviousDayEquityWithLoanValue,
19
+ # GrossPositionValue - The sum of the absolute value of all stock
20
+ # and equity option positions
21
+ # RegTEquity,
22
+ # RegTMargin,
23
+ # SMA - Special Memorandum Account
24
+ # InitMarginReq,
25
+ # MaintMarginReq,
26
+ # AvailableFunds,
27
+ # ExcessLiquidity,
28
+ # Cushion - Excess liquidity as a percentage of net liquidation value
29
+ # FullInitMarginReq,
30
+ # FullMaintMarginReq,
31
+ # FullAvailableFunds,
32
+ # FullExcessLiquidity,
33
+ # LookAheadNextChange - Time when look-ahead values take effect
34
+ # LookAheadInitMarginReq,
35
+ # LookAheadMaintMarginReq,
36
+ # LookAheadAvailableFunds,
37
+ # LookAheadExcessLiquidity,
38
+ # HighestSeverity - A measure of how close the account is to liquidation
39
+ # DayTradesRemaining - The Number of Open/Close trades a user
40
+ # could put on before Pattern Day Trading is detected. A value of "-1"
41
+ # means that the user can put on unlimited day trades.
42
+ # Leverage - GrossPositionValue / NetLiquidation
43
+ # $LEDGER - Single flag to relay all cash balance tags*, only in base
44
+ # currency.
45
+ # $LEDGER:CURRENCY - Single flag to relay all cash balance tags*, only in
46
+ # the specified currency.
47
+ # $LEDGER:ALL - Single flag to relay all cash balance tags* in all
48
+ #
49
+ tags = %w( NetLiquidation InitMarginReq DayTradesRemaining )
50
+ # connect to IB TWS.
51
+
52
+
53
+ ib = IB::Connection.new( :client_id => 1112) do | gw | #, :port => 7496 # TWS)
54
+ ## Subcribe to forseable events before the connection is completed
55
+ ## Subscribe to TWS alerts/errors
56
+ gw.subscribe(:Alert, :AccountSummary){ |msg| puts msg.to_human }
57
+ gw.logger.level = Logger::FATAL # DEBUG -- INFO -- WARN -- ERROR -- FATAL
58
+ end
59
+
60
+ Thread.new do
61
+ sleep 1
62
+ puts "\n******** Press <Enter> to quit *********\n\n"
63
+ end
64
+ # request the AccountSummary
65
+ request_id = ib.send_message :RequestAccountSummary, tags: tags.join(',')
66
+
67
+ STDIN.gets
68
+ puts "\n *** canceling Request ..."
69
+ ib.send_message :CancelAccountSummary, id: request_id
70
+ sleep 1
71
+ puts "done."
72
+
73
+
74
+ =begin
75
+ Expected Output
76
+
77
+ delta:~/workspace/ib-ruby/example$ ./account_summary
78
+ <AccountSummary: request_id 8111, account DU167349, tag DayTradesRemaining, value -1.0, currency >
79
+ <AccountSummary: request_id 8111, account DU167349, tag InitMarginReq, value 93402.16, currency EUR >
80
+ <AccountSummary: request_id 8111, account DU167349, tag NetLiquidation, value 990842.34, currency EUR >
81
+ <AccountSummary: request_id 8111, account DF167347, tag InitMarginReq, value 0.0, currency EUR >
82
+ <AccountSummary: request_id 8111, account DF167347, tag NetLiquidation, value 0.0, currency EUR >
83
+ <AccountSummary: request_id 8111, account DU167348, tag DayTradesRemaining, value -1.0, currency >
84
+ <AccountSummary: request_id 8111, account DU167348, tag InitMarginReq, value 135317.73, currency EUR >
85
+ <AccountSummary: request_id 8111, account DU167348, tag NetLiquidation, value 949599.26, currency EUR >
86
+
87
+ ******** Press <Enter> to quit *********
88
+ =end