ib-api 972.0
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 +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
|
+
|