ib-api 972.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +50 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +105 -0
- data/Guardfile +24 -0
- data/LICENSE +674 -0
- data/README.md +65 -0
- data/Rakefile +11 -0
- data/VERSION +1 -0
- data/api.gemspec +43 -0
- data/bin/console +95 -0
- data/bin/console.yml +3 -0
- data/bin/setup +8 -0
- data/changelog.md +7 -0
- data/example/README.md +76 -0
- data/example/account_info +54 -0
- data/example/account_positions +30 -0
- data/example/account_summary +88 -0
- data/example/cancel_orders +74 -0
- data/example/fa_accounts +25 -0
- data/example/fundamental_data +40 -0
- data/example/historic_data_cli +186 -0
- data/example/list_orders +45 -0
- data/example/portfolio_csv +81 -0
- data/example/scanner_data +62 -0
- data/example/template +19 -0
- data/example/tick_data +28 -0
- data/lib/extensions/class-extensions.rb +87 -0
- data/lib/ib-api.rb +7 -0
- data/lib/ib/base.rb +103 -0
- data/lib/ib/base_properties.rb +160 -0
- data/lib/ib/connection.rb +450 -0
- data/lib/ib/constants.rb +393 -0
- data/lib/ib/errors.rb +44 -0
- data/lib/ib/logger.rb +26 -0
- data/lib/ib/messages.rb +99 -0
- data/lib/ib/messages/abstract_message.rb +101 -0
- data/lib/ib/messages/incoming.rb +251 -0
- data/lib/ib/messages/incoming/abstract_message.rb +116 -0
- data/lib/ib/messages/incoming/account_value.rb +78 -0
- data/lib/ib/messages/incoming/alert.rb +34 -0
- data/lib/ib/messages/incoming/contract_data.rb +102 -0
- data/lib/ib/messages/incoming/delta_neutral_validation.rb +23 -0
- data/lib/ib/messages/incoming/execution_data.rb +50 -0
- data/lib/ib/messages/incoming/historical_data.rb +84 -0
- data/lib/ib/messages/incoming/market_depths.rb +44 -0
- data/lib/ib/messages/incoming/next_valid_id.rb +18 -0
- data/lib/ib/messages/incoming/open_order.rb +277 -0
- data/lib/ib/messages/incoming/order_status.rb +85 -0
- data/lib/ib/messages/incoming/portfolio_value.rb +78 -0
- data/lib/ib/messages/incoming/real_time_bar.rb +32 -0
- data/lib/ib/messages/incoming/scanner_data.rb +54 -0
- data/lib/ib/messages/incoming/ticks.rb +268 -0
- data/lib/ib/messages/outgoing.rb +437 -0
- data/lib/ib/messages/outgoing/abstract_message.rb +88 -0
- data/lib/ib/messages/outgoing/account_requests.rb +112 -0
- data/lib/ib/messages/outgoing/bar_requests.rb +250 -0
- data/lib/ib/messages/outgoing/place_order.rb +209 -0
- data/lib/ib/messages/outgoing/request_marketdata.rb +99 -0
- data/lib/ib/messages/outgoing/request_tick_data.rb +21 -0
- data/lib/ib/model.rb +4 -0
- data/lib/ib/models.rb +14 -0
- data/lib/ib/server_versions.rb +114 -0
- data/lib/ib/socket.rb +185 -0
- data/lib/ib/support.rb +160 -0
- data/lib/ib/version.rb +6 -0
- data/lib/models/ib/account.rb +85 -0
- data/lib/models/ib/account_value.rb +33 -0
- data/lib/models/ib/bag.rb +55 -0
- data/lib/models/ib/bar.rb +31 -0
- data/lib/models/ib/combo_leg.rb +105 -0
- data/lib/models/ib/condition.rb +245 -0
- data/lib/models/ib/contract.rb +415 -0
- data/lib/models/ib/contract_detail.rb +108 -0
- data/lib/models/ib/execution.rb +67 -0
- data/lib/models/ib/forex.rb +13 -0
- data/lib/models/ib/future.rb +15 -0
- data/lib/models/ib/index.rb +15 -0
- data/lib/models/ib/option.rb +78 -0
- data/lib/models/ib/option_detail.rb +55 -0
- data/lib/models/ib/order.rb +519 -0
- data/lib/models/ib/order_state.rb +152 -0
- data/lib/models/ib/portfolio_value.rb +64 -0
- data/lib/models/ib/stock.rb +16 -0
- data/lib/models/ib/underlying.rb +34 -0
- data/lib/models/ib/vertical.rb +96 -0
- data/lib/requires.rb +12 -0
- metadata +203 -0
data/lib/ib/errors.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
module IB
|
2
|
+
|
3
|
+
# Error handling
|
4
|
+
class Error < RuntimeError
|
5
|
+
end
|
6
|
+
|
7
|
+
class ArgumentError < ArgumentError
|
8
|
+
end
|
9
|
+
|
10
|
+
class SymbolError < ArgumentError
|
11
|
+
end
|
12
|
+
|
13
|
+
class LoadError < LoadError
|
14
|
+
end
|
15
|
+
|
16
|
+
class FlexError < RuntimeError
|
17
|
+
end
|
18
|
+
|
19
|
+
class TransmissionError < RuntimeError
|
20
|
+
end
|
21
|
+
end # module IB
|
22
|
+
|
23
|
+
# Patching Object with universally accessible top level error method.
|
24
|
+
# The method is used throughout the lib instead of plainly raising exceptions.
|
25
|
+
# This allows lib user to easily inject user-specific error handling into the lib
|
26
|
+
# by just replacing Object#error method.
|
27
|
+
def error message, type=:standard, backtrace=nil
|
28
|
+
e = case type
|
29
|
+
when :standard
|
30
|
+
IB::Error.new message
|
31
|
+
when :args
|
32
|
+
IB::ArgumentError.new message
|
33
|
+
when :symbol
|
34
|
+
IB::SymbolError.new message
|
35
|
+
when :load
|
36
|
+
IB::LoadError.new message
|
37
|
+
when :flex
|
38
|
+
IB::FlexError.new message
|
39
|
+
when :reader
|
40
|
+
IB::TransmissionError.new message
|
41
|
+
end
|
42
|
+
e.set_backtrace(backtrace) if backtrace
|
43
|
+
raise e
|
44
|
+
end
|
data/lib/ib/logger.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "logger"
|
2
|
+
module LogDev
|
3
|
+
# define default_logger
|
4
|
+
def default_logger
|
5
|
+
@default_logger ||= Logger.new(STDOUT).tap do |l|
|
6
|
+
l.formatter = proc do |severity, datetime, progname, msg|
|
7
|
+
# "#{datetime.strftime("%d.%m.(%X)")}#{"%5s" % severity}->#{progname}##{msg}\n"
|
8
|
+
## the default logger displays the message only
|
9
|
+
msg.to_s + "\n"
|
10
|
+
end
|
11
|
+
l.level = Logger::INFO
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def default_logger= logger
|
17
|
+
@default_logger = logger
|
18
|
+
end
|
19
|
+
|
20
|
+
# Add universally accessible log method/accessor into Object
|
21
|
+
def log *args
|
22
|
+
default_logger.tap do |logger|
|
23
|
+
logger.fatal *args unless args.empty?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end # module
|
data/lib/ib/messages.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'ib/server_versions'
|
2
|
+
module IB
|
3
|
+
|
4
|
+
module Messages
|
5
|
+
# This gem supports incoming/outgoing IB messages compatible with the following
|
6
|
+
# IB client/server versions:
|
7
|
+
CLIENT_VERSION = 66 # => API V 9.71
|
8
|
+
SERVER_VERSION = "v"+ MIN_CLIENT_VER.to_s + ".." + MAX_CLIENT_VER.to_s # extracted from the python-client
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'ib/messages/outgoing'
|
13
|
+
require 'ib/messages/incoming'
|
14
|
+
|
15
|
+
__END__
|
16
|
+
// Client version history
|
17
|
+
//
|
18
|
+
// 6 = Added parentId to orderStatus
|
19
|
+
// 7 = The new execDetails event returned for an order filled status and reqExecDetails
|
20
|
+
// Also market depth is available.
|
21
|
+
// 8 = Added lastFillPrice to orderStatus() event and permId to execution details
|
22
|
+
// 9 = Added 'averageCost', 'unrealizedPNL', and 'unrealizedPNL' to updatePortfolio event
|
23
|
+
// 10 = Added 'serverId' to the 'open order' & 'order status' events.
|
24
|
+
// We send back all the API open orders upon connection.
|
25
|
+
// Added new methods reqAllOpenOrders, reqAutoOpenOrders()
|
26
|
+
// Added FA support - reqExecution has filter.
|
27
|
+
// - reqAccountUpdates takes acct code.
|
28
|
+
// 11 = Added permId to openOrder event.
|
29
|
+
// 12 = requsting open order attributes ignoreRth, hidden, and discretionary
|
30
|
+
// 13 = added goodAfterTime
|
31
|
+
// 14 = always send size on bid/ask/last tick
|
32
|
+
// 15 = send allocation description string on openOrder
|
33
|
+
// 16 = can receive account name in account and portfolio updates, and fa params in openOrder
|
34
|
+
// 17 = can receive liquidation field in exec reports, and notAutoAvailable field in mkt data
|
35
|
+
// 18 = can receive good till date field in open order messages, and request intraday backfill
|
36
|
+
// 19 = can receive rthOnly flag in ORDER_STATUS
|
37
|
+
// 20 = expects TWS time string on connection after server version >= 20.
|
38
|
+
// 21 = can receive bond contract details.
|
39
|
+
// 22 = can receive price magnifier in version 2 contract details message
|
40
|
+
// 23 = support for scanner
|
41
|
+
// 24 = can receive volatility order parameters in open order messages
|
42
|
+
// 25 = can receive HMDS query start and end times
|
43
|
+
// 26 = can receive option vols in option market data messages
|
44
|
+
// 27 = can receive delta neutral order type and delta neutral aux price in place order version 20: API 8.85
|
45
|
+
// 28 = can receive option model computation ticks: API 8.9
|
46
|
+
// 29 = can receive trail stop limit price in open order and can place them: API 8.91
|
47
|
+
// 30 = can receive extended bond contract def, new ticks, and trade count in bars
|
48
|
+
// 31 = can receive EFP extensions to scanner and market data, and combo legs on open orders
|
49
|
+
// ; can receive RT bars
|
50
|
+
// 32 = can receive TickType.LAST_TIMESTAMP
|
51
|
+
// ; can receive "whyHeld" in order status messages
|
52
|
+
// 33 = can receive ScaleNumComponents and ScaleComponentSize is open order messages
|
53
|
+
// 34 = can receive whatIf orders / order state
|
54
|
+
// 35 = can receive contId field for Contract objects
|
55
|
+
// 36 = can receive outsideRth field for Order objects
|
56
|
+
// 37 = can receive clearingAccount and clearingIntent for Order objects
|
57
|
+
// 38 = can receive multiplier and primaryExchange in portfolio updates
|
58
|
+
// ; can receive cumQty and avgPrice in execution
|
59
|
+
// ; can receive fundamental data
|
60
|
+
// ; can receive underComp for Contract objects
|
61
|
+
// ; can receive reqId and end marker in contractDetails/bondContractDetails
|
62
|
+
// ; can receive ScaleInitComponentSize and ScaleSubsComponentSize for Order objects
|
63
|
+
// 39 = can receive underConId in contractDetails
|
64
|
+
// 40 = can receive algoStrategy/algoParams in openOrder
|
65
|
+
// 41 = can receive end marker for openOrder
|
66
|
+
// ; can receive end marker for account download
|
67
|
+
// ; can receive end marker for executions download
|
68
|
+
// 42 = can receive deltaNeutralValidation
|
69
|
+
// 43 = can receive longName(companyName)
|
70
|
+
// ; can receive listingExchange
|
71
|
+
// ; can receive RTVolume tick
|
72
|
+
// 44 = can receive end market for ticker snapshot
|
73
|
+
// 45 = can receive notHeld field in openOrder
|
74
|
+
// 46 = can receive contractMonth, industry, category, subcategory fields in contractDetails
|
75
|
+
// ; can receive timeZoneId, tradingHours, liquidHours fields in contractDetails
|
76
|
+
// 47 = can receive gamma, vega, theta, undPrice fields in TICK_OPTION_COMPUTATION
|
77
|
+
// 48 = can receive exemptCode in openOrder
|
78
|
+
// 49 = can receive hedgeType and hedgeParam in openOrder
|
79
|
+
// 50 = can receive optOutSmartRouting field in openOrder
|
80
|
+
// 51 = can receive smartComboRoutingParams in openOrder
|
81
|
+
// 52 = can receive deltaNeutralConId, deltaNeutralSettlingFirm, deltaNeutralClearingAccount and deltaNeutralClearingIntent in openOrder
|
82
|
+
// 53 = can receive orderRef in execution
|
83
|
+
// 54 = can receive scale order fields (PriceAdjustValue, PriceAdjustInterval, ProfitOffset, AutoReset,
|
84
|
+
// InitPosition, InitFillQty and RandomPercent) in openOrder
|
85
|
+
// 55 = can receive orderComboLegs (price) in openOrder
|
86
|
+
// 56 = can receive trailingPercent in openOrder
|
87
|
+
// 57 = can receive commissionReport message
|
88
|
+
// 58 = can receive CUSIP/ISIN/etc. in contractDescription/bondContractDescription
|
89
|
+
// 59 = can receive evRule, evMultiplier in contractDescription/bondContractDescription/executionDetails
|
90
|
+
// can receive multiplier in executionDetails
|
91
|
+
// 60 = can receive deltaNeutralOpenClose, deltaNeutralShortSale, deltaNeutralShortSaleSlot and …deltaNeutralDesignatedLocation in openOrder
|
92
|
+
// 61 = can receive multiplier in openOrder
|
93
|
+
// can receive tradingClass in openOrder, updatePortfolio, execDetails and position
|
94
|
+
// 62 = can receive avgCost in position message
|
95
|
+
// 63 = can receive verifyMessageAPI, verifyCompleted, displayGroupList and displayGroupUpdated messages
|
96
|
+
// 64 = can receive solicited attrib in openOrder message
|
97
|
+
// 65 = can receive verifyAndAuthMessageAPI and verifyAndAuthCompleted messages
|
98
|
+
// 66 = can receive randomize size and randomize price order fields
|
99
|
+
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module IB
|
2
|
+
module Messages
|
3
|
+
|
4
|
+
# This is just a basic generic message from the server.
|
5
|
+
#
|
6
|
+
# Class variables:
|
7
|
+
# @message_id - int: message id.
|
8
|
+
# @message_type - Symbol: message type (e.g. :OpenOrderEnd)
|
9
|
+
#
|
10
|
+
# Instance attributes (at least):
|
11
|
+
# @version - int: current version of message format.
|
12
|
+
# @data - Hash of actual data read from a stream.
|
13
|
+
class AbstractMessage
|
14
|
+
|
15
|
+
# Class methods
|
16
|
+
def self.data_map # Map for converting between structured message and raw data
|
17
|
+
@data_map ||= []
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.version # Per class, minimum message version supported
|
21
|
+
@version || 1
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.message_id
|
25
|
+
@message_id
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns message type Symbol (e.g. :OpenOrderEnd)
|
29
|
+
def self.message_type
|
30
|
+
to_s.split(/::/).last.to_sym
|
31
|
+
end
|
32
|
+
|
33
|
+
def message_id
|
34
|
+
self.class.message_id
|
35
|
+
end
|
36
|
+
|
37
|
+
def request_id
|
38
|
+
@data[:request_id].presence || nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def message_type
|
42
|
+
self.class.message_type
|
43
|
+
end
|
44
|
+
|
45
|
+
attr_accessor :created_at, :data
|
46
|
+
|
47
|
+
def self.properties?
|
48
|
+
@given_arguments
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def to_human
|
53
|
+
"<#{self.message_type}:" +
|
54
|
+
@data.map do |key, value|
|
55
|
+
unless [:version].include?(key)
|
56
|
+
" #{key} #{ value.is_a?(Hash) ? value.inspect : value}"
|
57
|
+
end
|
58
|
+
end.compact.join(',') + " >"
|
59
|
+
end
|
60
|
+
|
61
|
+
end # class AbstractMessage
|
62
|
+
|
63
|
+
# Macro that defines short message classes using a one-liner.
|
64
|
+
# First arg is either a [message_id, version] pair or just message_id (version 1)
|
65
|
+
# data_map contains instructions for processing @data Hash. Format:
|
66
|
+
# Incoming messages: [field, type] or [group, field, type]
|
67
|
+
# Outgoing messages: field, [field, default] or [field, method, [args]]
|
68
|
+
def def_message message_id_version, *data_map, &to_human
|
69
|
+
base = data_map.first.is_a?(Class) ? data_map.shift : self::AbstractMessage
|
70
|
+
message_id, version = message_id_version
|
71
|
+
|
72
|
+
# Define new message class
|
73
|
+
message_class = Class.new(base) do
|
74
|
+
@message_id, @version = message_id, version || 1
|
75
|
+
@data_map = data_map
|
76
|
+
@given_arguments =[]
|
77
|
+
|
78
|
+
@data_map.each do |(name, _, type_args)|
|
79
|
+
dont_process = name == :request_id # [ :request_id, :local_id, :id ].include? name.to_sym
|
80
|
+
@given_arguments << name.to_sym
|
81
|
+
# Avoid redefining existing accessor methods
|
82
|
+
unless instance_methods.include?(name.to_s) || instance_methods.include?(name.to_sym) || dont_process
|
83
|
+
if type_args.is_a?(Symbol) # This is Incoming with [group, field, type]
|
84
|
+
attr_reader name
|
85
|
+
else
|
86
|
+
define_method(name) { @data[name] }
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
define_method(:to_human, &to_human) if to_human
|
92
|
+
end
|
93
|
+
|
94
|
+
# Add defined message class to Classes Hash keyed by its message_id
|
95
|
+
self::Classes[message_id] = message_class
|
96
|
+
|
97
|
+
message_class
|
98
|
+
end
|
99
|
+
|
100
|
+
end # module Messages
|
101
|
+
end # module IB
|
@@ -0,0 +1,251 @@
|
|
1
|
+
require 'ib/messages/incoming/abstract_message'
|
2
|
+
|
3
|
+
# EClientSocket.java uses sendMax() rather than send() for a number of these.
|
4
|
+
# It sends an EOL rather than a number if the value == Integer.MAX_VALUE (or Double.MAX_VALUE).
|
5
|
+
# These fields are initialized to this MAX_VALUE.
|
6
|
+
# This has been implemented with nils in Ruby to represent the case where an EOL should be sent.
|
7
|
+
|
8
|
+
# TODO: Don't instantiate messages, use their classes as just namespace for .encode/decode
|
9
|
+
# TODO: realize Message#fire method that raises EWrapper events
|
10
|
+
|
11
|
+
module IB
|
12
|
+
module Messages
|
13
|
+
|
14
|
+
# Incoming IB messages (received from TWS/Gateway)
|
15
|
+
module Incoming
|
16
|
+
extend Messages # def_message macros
|
17
|
+
|
18
|
+
### Define short message classes in-line:
|
19
|
+
|
20
|
+
|
21
|
+
NewsBulletins =
|
22
|
+
def_message 14, [:request_id, :int], # unique incrementing bulletin ID.
|
23
|
+
[:type, :int], # Type of bulletin. Valid values include:
|
24
|
+
# 1 = Regular news bulletin
|
25
|
+
# 2 = Exchange no longer available for trading
|
26
|
+
# 3 = Exchange is available for trading
|
27
|
+
[:text, :string], # The bulletin's message text.
|
28
|
+
[:exchange, :string] # Exchange from which this message originated.
|
29
|
+
|
30
|
+
|
31
|
+
# Receives an converted XML document that describes the valid parameters that a scanner
|
32
|
+
# subscription can have (for outgoing RequestScannerSubscription message).
|
33
|
+
ScannerParameters = def_message 19, [:xml, :xml]
|
34
|
+
|
35
|
+
class ScannerParameters
|
36
|
+
# returns a List of Hashes specifing Instruments.
|
37
|
+
# > C.received[:ScannerParameters].first.instruments.first
|
38
|
+
# => {:name=>"US Stocks",
|
39
|
+
# :type=>"STK",
|
40
|
+
# :filters=>"AFTERHRSCHANGEPERC,AVGOPTVOLUME,AVGPRICETARGET,AVGRATING,AVGTARGET2PRICERATIO,AVGVOLUME,AVGVOLUME_USD,CHANGEOPENPERC,CHANGEPERC,EMA_20,EMA_50,EMA_100,EMA_200,PRICE_VS_EMA_20,PRICE_VS_EMA_50,PRICE_VS_EMA_100,PRICE_VS_EMA_200,DAYSTOCOVER,DIVIB,DIVYIELD,DIVYIELDIB,FEERATE,FIRSTTRADEDATE,GROWTHRATE,HALTED,HASOPTIONS,HISTDIVIB,HISTDIVYIELDIB,IMBALANCE,IMBALANCEADVRATIOPERC,IMPVOLAT,IMPVOLATOVERHIST,INSIDEROFFLOATPERC,INSTITUTIONALOFFLOATPERC,MACD,MACD_SIGNAL,MACD_HISTOGRAM,MKTCAP,MKTCAP_USD,NEXTDIVAMOUNT,NEXTDIVDATE,NUMPRICETARGETS,NUMRATINGS,NUMSHARESINSIDER,NUMSHARESINSTITUTIONAL,NUMSHARESSHORT,OPENGAPPERC,OPTVOLUME,OPTVOLUMEPCRATIO,PERATIO,PILOT,PPO,PPO_SIGNAL,PPO_HISTOGRAM,PRICE,PRICE2BK,PRICE2TANBK,PRICERANGE,PRICE_USD,QUICKRATIO,REBATERATE,REGIMBALANCE,REGIMBALANCEADVRATIOPERC,RETEQUITY,SHORTABLESHARES,SHORTOFFLOATPERC,SHORTSALERESTRICTED,SIC,ISSUER_COUNTRY_CODE,SOCSACT,SOCSNET,STKTYPE,STVOLUME_3MIN,STVOLUME_5MIN,STVOLUME_10MIN,TRADECOUNT,TRADERATE,UNSHORTABLE,VOLUME,VOLUMERATE,VOLUME_USD,RCGLTCLASS,RCGLTENDDATE,RCGLTIVALUE,RCGLTTRADE,RCGITCLASS,RCGITENDDATE,RCGITIVALUE,RCGITTRADE,RCGSTCLASS,RCGSTENDDATE,RCGSTIVALUE,RCGSTTRADE",
|
41
|
+
# :group=>"STK.GLOBAL",
|
42
|
+
# :shortName=>"US",
|
43
|
+
# :cloudScanNotSupported=>"false"}
|
44
|
+
def instruments
|
45
|
+
@data[:xml][:ScanParameterResponse][:InstrumentList].first[:Instrument]
|
46
|
+
end
|
47
|
+
|
48
|
+
# returns a List of Hashes specifing ScanTypes
|
49
|
+
# > C.received[:ScannerParameters].first.scan_types.first
|
50
|
+
# => {:displayName=>"Assets Under Management (AltaVista) Desc",
|
51
|
+
# :scanCode=>"SCAN_etfAssets_DESC",
|
52
|
+
# :instruments=>"ETF.EQ.US,ETF.FI.US",
|
53
|
+
# :absoluteColumns=>"false",
|
54
|
+
# :Columns=>{:ColumnSetRef=>{:colId=>"0", :name=>"PctPerf", :display=>"false", :displayType=>"DATA"},
|
55
|
+
# :Column=>{:colId=>"6031", :name=>"Assets Under Management", :display=>"true", :displayType=>"DATA"}},
|
56
|
+
# :supportsSorting=>"true",
|
57
|
+
# :respSizeLimit=>"2147483647", :snapshotSizeLimit=>"2147483647",
|
58
|
+
# :searchDefault=>"false", :access=>"unrestricted"}
|
59
|
+
#
|
60
|
+
|
61
|
+
def scan_types
|
62
|
+
@data[:xml][:ScanParameterResponse][:ScanTypeList][:ScanType]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Receives the current system time on the server side.
|
67
|
+
CurrentTime = def_message 49, [:time, :int] # long!
|
68
|
+
|
69
|
+
|
70
|
+
HeadTimeStamp = def_message( [88, 0], [:request_id, :int], [:date, :int_date] ) do
|
71
|
+
# def to_human
|
72
|
+
"<#{self.message_type}:" +
|
73
|
+
"Request #{request_id}, First Historical Datapoint @ #{date.to_s}«"
|
74
|
+
end
|
75
|
+
|
76
|
+
# Receive Reuters global fundamental market data. There must be a subscription to
|
77
|
+
# Reuters Fundamental set up in Account Management before you can receive this data.
|
78
|
+
FundamentalData = def_message 51, [:request_id, :int], [:xml, :xml]
|
79
|
+
|
80
|
+
ContractDataEnd = def_message 52, [:request_id, :int]
|
81
|
+
|
82
|
+
OpenOrderEnd = def_message 53
|
83
|
+
|
84
|
+
AccountDownloadEnd = def_message 54, [:account_name, :string]
|
85
|
+
|
86
|
+
ExecutionDataEnd = def_message 55, [:request_id, :int]
|
87
|
+
|
88
|
+
MarketDataType = def_message 58, [:request_id, :int], [:market_data_type, :int] do
|
89
|
+
"<#{self.message_type}:" +
|
90
|
+
" switched to »#{MARKET_DATA_TYPES[market_data_type]}«" # to_human
|
91
|
+
end
|
92
|
+
|
93
|
+
CommissionReport =
|
94
|
+
def_message 59, [:exec_id, :string],
|
95
|
+
[:commission, :decimal], # Commission amount.
|
96
|
+
[:currency, :string], # Commission currency
|
97
|
+
[:realized_pnl, :decimal_max],
|
98
|
+
[:yield, :decimal_max],
|
99
|
+
[:yield_redemption_date, :int] # YYYYMMDD format
|
100
|
+
|
101
|
+
SecurityDefinitionOptionParameter = OptionChainDefinition = def_message [75,0] ,
|
102
|
+
[:request_id, :int],
|
103
|
+
[:exchange, :string],
|
104
|
+
[:con_id, :int], # underlying_con_id
|
105
|
+
[:trading_class, :string],
|
106
|
+
[:multiplier, :int]
|
107
|
+
|
108
|
+
class OptionChainDefinition
|
109
|
+
using IBSupport # defines tws-method for Array (socket.rb)
|
110
|
+
def load
|
111
|
+
super
|
112
|
+
load_map [:expirations, :array, proc { @buffer.read_date }],
|
113
|
+
[:strikes, :array, proc { @buffer.read_decimal } ]
|
114
|
+
end
|
115
|
+
def expirations
|
116
|
+
@data[:expirations]
|
117
|
+
end
|
118
|
+
def strikes
|
119
|
+
@data[:strikes]
|
120
|
+
end
|
121
|
+
|
122
|
+
def to_human
|
123
|
+
"OptionChainDefinition #{trading_class}@#{exchange} [#{multiplier} X ] strikes: #{strikes.first} - #{strikes.last} expirations: #{expirations.first} - #{expirations.last}"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
OptionChainDefinitionEnd = SecurityDefinitionOptionParameterEnd = def_message [76,0 ],
|
130
|
+
[ :request_id, :int ]
|
131
|
+
|
132
|
+
|
133
|
+
#<- 1-9-789--USD-CASH-----IDEALPRO--CAD------
|
134
|
+
#-> ---81-123-5.0E-5--0-
|
135
|
+
|
136
|
+
MarketDepthExchanges = def_message [80,0],
|
137
|
+
[ :request_id, :int ]
|
138
|
+
|
139
|
+
TickRequestParameters = def_message [81, 0], [ :ticker_id, :int ],
|
140
|
+
[ :min_tick, :decimal],
|
141
|
+
[ :exchange, :string ],
|
142
|
+
[ :snapshot_prermissions, :int ]
|
143
|
+
# class TickRequestParameters
|
144
|
+
# def load
|
145
|
+
# simple_load
|
146
|
+
# end
|
147
|
+
# end
|
148
|
+
|
149
|
+
### Require standalone source files for more complex message classes:
|
150
|
+
|
151
|
+
require 'ib/messages/incoming/alert'
|
152
|
+
require 'ib/messages/incoming/contract_data'
|
153
|
+
require 'ib/messages/incoming/delta_neutral_validation'
|
154
|
+
require 'ib/messages/incoming/execution_data'
|
155
|
+
require 'ib/messages/incoming/historical_data'
|
156
|
+
require 'ib/messages/incoming/market_depths'
|
157
|
+
require 'ib/messages/incoming/next_valid_id'
|
158
|
+
require 'ib/messages/incoming/open_order'
|
159
|
+
require 'ib/messages/incoming/order_status'
|
160
|
+
require 'ib/messages/incoming/account_value'
|
161
|
+
require 'ib/messages/incoming/portfolio_value'
|
162
|
+
require 'ib/messages/incoming/real_time_bar'
|
163
|
+
require 'ib/messages/incoming/scanner_data'
|
164
|
+
require 'ib/messages/incoming/ticks'
|
165
|
+
|
166
|
+
end # module Incoming
|
167
|
+
end # module Messages
|
168
|
+
end # module IB
|
169
|
+
|
170
|
+
|
171
|
+
__END__
|
172
|
+
// incoming msg id's
|
173
|
+
## api 9.71v (python)
|
174
|
+
# incoming msg id's
|
175
|
+
class IN:
|
176
|
+
TICK_PRICE = 1
|
177
|
+
TICK_SIZE = 2
|
178
|
+
ORDER_STATUS = 3
|
179
|
+
ERR_MSG = 4
|
180
|
+
OPEN_ORDER = 5
|
181
|
+
ACCT_VALUE = 6
|
182
|
+
PORTFOLIO_VALUE = 7
|
183
|
+
ACCT_UPDATE_TIME = 8
|
184
|
+
NEXT_VALID_ID = 9
|
185
|
+
CONTRACT_DATA = 10
|
186
|
+
EXECUTION_DATA = 11
|
187
|
+
MARKET_DEPTH = 12
|
188
|
+
MARKET_DEPTH_L2 = 13
|
189
|
+
NEWS_BULLETINS = 14
|
190
|
+
MANAGED_ACCTS = 15
|
191
|
+
RECEIVE_FA = 16
|
192
|
+
HISTORICAL_DATA = 17
|
193
|
+
BOND_CONTRACT_DATA = 18
|
194
|
+
SCANNER_PARAMETERS = 19
|
195
|
+
SCANNER_DATA = 20
|
196
|
+
TICK_OPTION_COMPUTATION = 21
|
197
|
+
TICK_GENERIC = 45
|
198
|
+
TICK_STRING = 46
|
199
|
+
TICK_EFP = 47
|
200
|
+
CURRENT_TIME = 49
|
201
|
+
REAL_TIME_BARS = 50
|
202
|
+
FUNDAMENTAL_DATA = 51
|
203
|
+
CONTRACT_DATA_END = 52
|
204
|
+
OPEN_ORDER_END = 53
|
205
|
+
ACCT_DOWNLOAD_END = 54
|
206
|
+
EXECUTION_DATA_END = 55
|
207
|
+
DELTA_NEUTRAL_VALIDATION = 56
|
208
|
+
TICK_SNAPSHOT_END = 57
|
209
|
+
MARKET_DATA_TYPE = 58
|
210
|
+
COMMISSION_REPORT = 59 ##
|
211
|
+
### const below are new in api 9.71
|
212
|
+
POSITION_DATA = 61
|
213
|
+
POSITION_END = 62
|
214
|
+
ACCOUNT_SUMMARY = 63
|
215
|
+
ACCOUNT_SUMMARY_END = 64
|
216
|
+
VERIFY_MESSAGE_API = 65
|
217
|
+
VERIFY_COMPLETED = 66
|
218
|
+
DISPLAY_GROUP_LIST = 67
|
219
|
+
DISPLAY_GROUP_UPDATED = 68
|
220
|
+
VERIFY_AND_AUTH_MESSAGE_API = 69
|
221
|
+
VERIFY_AND_AUTH_COMPLETED = 70
|
222
|
+
POSITION_MULTI = 71
|
223
|
+
POSITION_MULTI_END = 72
|
224
|
+
ACCOUNT_UPDATE_MULTI = 73
|
225
|
+
ACCOUNT_UPDATE_MULTI_END = 74
|
226
|
+
SECURITY_DEFINITION_OPTION_PARAMETER = 75
|
227
|
+
SECURITY_DEFINITION_OPTION_PARAMETER_END = 76
|
228
|
+
SOFT_DOLLAR_TIERS = 77
|
229
|
+
FAMILY_CODES = 78
|
230
|
+
SYMBOL_SAMPLES = 79
|
231
|
+
MKT_DEPTH_EXCHANGES = 80
|
232
|
+
TICK_REQ_PARAMS = 81
|
233
|
+
SMART_COMPONENTS = 82
|
234
|
+
NEWS_ARTICLE = 83
|
235
|
+
TICK_NEWS = 84
|
236
|
+
NEWS_PROVIDERS = 85
|
237
|
+
HISTORICAL_NEWS = 86
|
238
|
+
HISTORICAL_NEWS_END = 87
|
239
|
+
HEAD_TIMESTAMP = 88
|
240
|
+
HISTOGRAM_DATA = 89
|
241
|
+
HISTORICAL_DATA_UPDATE = 90
|
242
|
+
REROUTE_MKT_DATA_REQ = 91
|
243
|
+
REROUTE_MKT_DEPTH_REQ = 92
|
244
|
+
MARKET_RULE = 93
|
245
|
+
PNL = 94
|
246
|
+
PNL_SINGLE = 95
|
247
|
+
HISTORICAL_TICKS = 96
|
248
|
+
HISTORICAL_TICKS_BID_ASK = 97
|
249
|
+
HISTORICAL_TICKS_LAST = 98
|
250
|
+
TICK_BY_TICK = 99
|
251
|
+
|