ib-api 972.0 → 972.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +36 -37
  3. data/README.md +48 -3
  4. data/VERSION +1 -1
  5. data/api.gemspec +1 -1
  6. data/bin/console +4 -8
  7. data/changelog.md +12 -0
  8. data/lib/ib/base_properties.rb +3 -4
  9. data/lib/ib/connection.rb +18 -16
  10. data/lib/ib/logger.rb +1 -1
  11. data/lib/ib/messages/incoming.rb +1 -1
  12. data/lib/ib/messages/incoming/abstract_message.rb +7 -7
  13. data/lib/ib/messages/incoming/account_value.rb +5 -1
  14. data/lib/ib/messages/incoming/contract_data.rb +0 -2
  15. data/lib/ib/messages/incoming/historical_data.rb +25 -5
  16. data/lib/ib/messages/incoming/ticks.rb +21 -60
  17. data/lib/ib/messages/outgoing.rb +4 -2
  18. data/lib/ib/messages/outgoing/abstract_message.rb +3 -3
  19. data/lib/ib/messages/outgoing/bar_requests.rb +4 -5
  20. data/lib/ib/messages/outgoing/request_marketdata.rb +10 -7
  21. data/lib/ib/models.rb +1 -1
  22. data/lib/ib/support.rb +32 -15
  23. data/lib/logging.rb +45 -0
  24. data/lib/models/ib/account.rb +0 -13
  25. data/lib/models/ib/bag.rb +7 -1
  26. data/lib/models/ib/bar.rb +1 -1
  27. data/lib/models/ib/combo_leg.rb +22 -0
  28. data/lib/models/ib/contract.rb +44 -32
  29. data/lib/models/ib/contract_detail.rb +13 -7
  30. data/lib/models/ib/index.rb +1 -1
  31. data/lib/models/ib/option.rb +8 -2
  32. data/lib/models/ib/option_detail.rb +19 -3
  33. data/lib/models/ib/order.rb +5 -0
  34. data/lib/models/ib/spread.rb +168 -0
  35. data/lib/models/ib/stock.rb +9 -3
  36. data/lib/models/ib/underlying.rb +4 -1
  37. data/lib/requires.rb +10 -3
  38. metadata +9 -20
  39. data/example/README.md +0 -76
  40. data/example/account_info +0 -54
  41. data/example/account_positions +0 -30
  42. data/example/account_summary +0 -88
  43. data/example/cancel_orders +0 -74
  44. data/example/fa_accounts +0 -25
  45. data/example/fundamental_data +0 -40
  46. data/example/historic_data_cli +0 -186
  47. data/example/list_orders +0 -45
  48. data/example/portfolio_csv +0 -81
  49. data/example/scanner_data +0 -62
  50. data/example/template +0 -19
  51. data/example/tick_data +0 -28
@@ -1,14 +1,20 @@
1
- require_relative 'contract'
1
+ #require_relative 'contract'
2
2
  module IB
3
3
  class Stock < IB::Contract
4
4
  validates_format_of :sec_type, :with => /\Astock\z/,
5
5
  :message => "should be a Stock"
6
+ validates_format_of :symbol, with: /\A.*\z/,
7
+ message: 'should not be blank'
6
8
  def default_attributes
7
9
  super.merge :sec_type => :stock, currency:'USD', exchange:'SMART'
8
10
  end
9
11
 
10
- def to_human
11
- att = [ symbol, currency, ( exchange == 'SMART' ? nil: exchange ), (primary_exchange.present? && !primary_exchange.empty? ? primary_exchange : nil)].compact
12
+ def to_human
13
+ att = [ symbol,
14
+ currency, ( exchange == 'SMART' ? nil: exchange ),
15
+ (primary_exchange.present? && !primary_exchange.empty? ? primary_exchange : nil),
16
+ @description.present? ? " (#{@description}) " : nil,
17
+ ].compact
12
18
  "<Stock: " + att.join(" ") + ">"
13
19
  end
14
20
 
@@ -1,4 +1,7 @@
1
1
  module IB
2
+ if defined?(Underlying)
3
+ puts "Underlying already a #{defined?(Underlying)}"
4
+ else
2
5
 
3
6
  # Calculated characteristics of underlying Contract (volatile)
4
7
  class Underlying < IB::Model
@@ -30,5 +33,5 @@ module IB
30
33
 
31
34
  end # class Underlying
32
35
  UnderComp = Underlying
33
-
36
+ end
34
37
  end # module IB
data/lib/requires.rb CHANGED
@@ -7,6 +7,13 @@ require 'ib/errors'
7
7
  require 'ib/constants'
8
8
  require 'ib/connection'
9
9
 
10
- require 'ib/models'
11
- require 'ib/messages'
12
-
10
+ # An external model- or database-driver provides the base class for models
11
+ # if the constant DB is defined
12
+ #
13
+ # basically IB::Model has to be assigned to the substitute base class
14
+ # the database-driver requires models and messages at the appropoate time
15
+ unless defined?(DB)
16
+ require 'ib/model'
17
+ require 'ib/models'
18
+ require 'ib/messages'
19
+ end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ib-api
3
3
  version: !ruby/object:Gem::Version
4
- version: '972.0'
4
+ version: '972.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hartmut Bischoff
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-22 00:00:00.000000000 Z
11
+ date: 2021-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.17'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.17'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -103,19 +103,6 @@ files:
103
103
  - bin/console.yml
104
104
  - bin/setup
105
105
  - changelog.md
106
- - example/README.md
107
- - example/account_info
108
- - example/account_positions
109
- - example/account_summary
110
- - example/cancel_orders
111
- - example/fa_accounts
112
- - example/fundamental_data
113
- - example/historic_data_cli
114
- - example/list_orders
115
- - example/portfolio_csv
116
- - example/scanner_data
117
- - example/template
118
- - example/tick_data
119
106
  - lib/extensions/class-extensions.rb
120
107
  - lib/ib-api.rb
121
108
  - lib/ib/base.rb
@@ -155,6 +142,7 @@ files:
155
142
  - lib/ib/socket.rb
156
143
  - lib/ib/support.rb
157
144
  - lib/ib/version.rb
145
+ - lib/logging.rb
158
146
  - lib/models/ib/account.rb
159
147
  - lib/models/ib/account_value.rb
160
148
  - lib/models/ib/bag.rb
@@ -172,6 +160,7 @@ files:
172
160
  - lib/models/ib/order.rb
173
161
  - lib/models/ib/order_state.rb
174
162
  - lib/models/ib/portfolio_value.rb
163
+ - lib/models/ib/spread.rb
175
164
  - lib/models/ib/stock.rb
176
165
  - lib/models/ib/underlying.rb
177
166
  - lib/models/ib/vertical.rb
@@ -196,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
185
  - !ruby/object:Gem::Version
197
186
  version: '0'
198
187
  requirements: []
199
- rubygems_version: 3.0.4
188
+ rubygems_version: 3.2.3
200
189
  signing_key:
201
190
  specification_version: 4
202
191
  summary: Ruby Implementation of the Interactive Brokers TWS API
data/example/README.md DELETED
@@ -1,76 +0,0 @@
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.
data/example/account_info DELETED
@@ -1,54 +0,0 @@
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
@@ -1,30 +0,0 @@
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."
@@ -1,88 +0,0 @@
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
@@ -1,74 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- # This script allows you to cancel either a set of open Orders by their ids,
4
- # or ALL Orders opened via IB API at once. The latter is useful when your
5
- # robot goes crazy and opens gazillions of wrong limit orders.
6
- #
7
- # Accepts the port to connect to as first command-parameter, T)ws or G)ateway, which is the default
8
- #
9
- # Numeric Parameter are interpreted as keys for specific orders to kill
10
-
11
- require 'bundler/setup'
12
- require 'ib-api'
13
- specified_port = ARGV[0] || 'Gateway'
14
- port = case specified_port
15
- when /^[gG]/
16
- ARGV.shift # consume the first argument
17
- 4002
18
- when /^[Tt]/
19
- ARGV.shift # consume the first argument
20
- 7497
21
- end
22
-
23
- # First, connect to IB TWS.
24
- ib = IB::Connection.new client_id: 1111, port: port do | gw |
25
-
26
- # Subscribe to TWS alerts/errors and order-related messages
27
- gw.subscribe(:Alert, :ManagedAccounts, :OpenOrder, :OrderStatus, :OpenOrderEnd) { |msg| puts msg.to_human }
28
- # Set log level
29
- gw.logger.level = Logger::FATAL # DEBUG -- INFO -- WARN -- ERROR -- FATAL
30
- end
31
-
32
- if ARGV.empty?
33
- ib.send_message :RequestGlobalCancel
34
- else
35
- puts "ARGV: #{ARGV}"
36
- # Will only work for Orders placed under the same :client_id
37
- ib.cancel_order *ARGV
38
- puts '-'*55
39
- puts "Remaining Orders"
40
- puts '-'*55
41
- end
42
-
43
- puts '-'*55
44
- puts "Remaining Orders"
45
- ib.send_message :RequestAllOpenOrders
46
- puts '-'*55
47
-
48
- sleep 3
49
-
50
-
51
- ## Expected output
52
- #12:20:25.154 Connected to server, version: 137,
53
- # connection time: 2018-02-27 12:20:25 +0000 local, 2018-02-27T12:20:25+00:00 remote.
54
- #12:20:25.156 Got message 5 (IB::Messages::Incoming::OpenOrder)
55
- #<OpenOrder: <Stock: WFC USD> <Order: LMT GTC buy 100.0 1.13 Submitted #1/1562725191 from 1112/DU167348 fee 0.0>>
56
- #12:20:25.158 Got message 3 (IB::Messages::Incoming::OrderStatus)
57
- #<OrderStatus: <OrderState: Submitted #1/1562725191 from 1112 filled 0.0/100.0 at 0.0/0.0 why_held >>
58
- #12:20:25.197 Got message 53 (IB::Messages::Incoming::OpenOrderEnd)
59
- #<OpenOrderEnd: >
60
- #12:20:25.197 Got message 15 (IB::Messages::Incoming::ManagedAccounts)
61
- #12:20:25.197 No subscribers for message IB::Messages::Incoming::ManagedAccounts!
62
- #12:20:25.197 Got message 9 (IB::Messages::Incoming::NextValidId)
63
- #12:20:25.197 Got next valid order id: 2.
64
- #12:20:25.254 Got message 5 (IB::Messages::Incoming::OpenOrder)
65
- #<OpenOrder: <Stock: WFC USD> <Order: LMT GTC buy 100.0 1.13 PendingCancel #1/1562725191 from 1112/DU167348 fee 0.0>>
66
- #12:20:25.256 Got message 3 (IB::Messages::Incoming::OrderStatus)
67
- #<OrderStatus: <OrderState: PendingCancel #1/1562725191 from 1112 filled 0.0/100.0 at 0.0/0.0 why_held >>
68
- #12:20:25.297 Got message 53 (IB::Messages::Incoming::OpenOrderEnd)
69
- #<OpenOrderEnd: >
70
- #12:20:25.342 Got message 3 (IB::Messages::Incoming::OrderStatus)
71
- #<OrderStatus: <OrderState: Cancelled #1/1562725191 from 1112 filled 0.0/100.0 at 0.0/0.0 why_held >>
72
- #12:20:25.343 Got message 4 (IB::Messages::Incoming::Alert)
73
- #TWS Error 202: Order Canceled - reason:
74
- ##