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
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'ib/messages/abstract_message'
|
2
|
+
|
3
|
+
module IB
|
4
|
+
module Messages
|
5
|
+
module Outgoing
|
6
|
+
|
7
|
+
# Container for specific message classes, keyed by their message_ids
|
8
|
+
Classes = {}
|
9
|
+
|
10
|
+
class AbstractMessage < IB::Messages::AbstractMessage
|
11
|
+
|
12
|
+
def initialize data={}
|
13
|
+
@data = data
|
14
|
+
@created_at = Time.now
|
15
|
+
end
|
16
|
+
|
17
|
+
# This causes the message to send itself over the server socket in server[:socket].
|
18
|
+
# "server" is the @server instance variable from the IB object.
|
19
|
+
# You can also use this to e.g. get the server version number.
|
20
|
+
#
|
21
|
+
# Subclasses can either override this method for precise control over how
|
22
|
+
# stuff gets sent to the server, or else define a method encode() that returns
|
23
|
+
# an Array of elements that ought to be sent to the server by calling to_s on
|
24
|
+
# each one and postpending a '\0'.
|
25
|
+
#
|
26
|
+
def send_to socket
|
27
|
+
### debugging of outgoing Messages
|
28
|
+
# puts "------sendto ---------(debugging output in outgoing/abstract_message)"
|
29
|
+
# puts socket.prepare_message( self.preprocess).inspect.split('\x00')[3..-1].inspect
|
30
|
+
# puts "------sendto ---------"
|
31
|
+
socket.send_messages self.preprocess #.each {|data| socket.write_data data}
|
32
|
+
end
|
33
|
+
|
34
|
+
# Same message representation as logged by TWS into API messages log file
|
35
|
+
def to_s
|
36
|
+
self.preprocess.join('-')
|
37
|
+
end
|
38
|
+
|
39
|
+
# Pre-process encoded message Array before sending into socket, such as
|
40
|
+
# changing booleans into 0/1 and stuff
|
41
|
+
def preprocess
|
42
|
+
self.encode.flatten.map {|data| data == true ? 1 : data == false ? 0 : data }
|
43
|
+
end
|
44
|
+
|
45
|
+
# Encode message content into (possibly, nested) Array of values.
|
46
|
+
# At minimum, encoded Outgoing message contains message_id and version.
|
47
|
+
# Most messages also contain (ticker, request or order) :id.
|
48
|
+
# Then, content of @data Hash is encoded per instructions in data_map.
|
49
|
+
# This method may be modified by message subclasses!
|
50
|
+
#
|
51
|
+
# If the version is zero, omit its apperance (for historical data)
|
52
|
+
def encode
|
53
|
+
## create a proper request_id and erase :id and :ticker_id if nessesary
|
54
|
+
if self.class.properties?.include?(:request_id)
|
55
|
+
@data[:request_id] = if @data[:request_id].blank? && @data[:ticker_id].blank? && @data[:id].blank?
|
56
|
+
rand(9999)
|
57
|
+
else
|
58
|
+
@data[:id] || @data[:ticker_id] || @data[:request_id]
|
59
|
+
end
|
60
|
+
@data[:id] = @data[:ticker_id] = nil
|
61
|
+
end
|
62
|
+
[
|
63
|
+
self.class.version.zero? ? self.class.message_id : [ self.class.message_id, self.class.version ],
|
64
|
+
@data[:id] || @data[:ticker_id] ||# @data[:request_id] || # id, ticker_id, local_id, order_id
|
65
|
+
@data[:local_id] || @data[:order_id] || [], # do not appear in data_map
|
66
|
+
self.class.data_map.map do |(field, default_method, args)| # but request_id does
|
67
|
+
case
|
68
|
+
when default_method.nil?
|
69
|
+
@data[field]
|
70
|
+
|
71
|
+
when default_method.is_a?(Symbol) # method name with args
|
72
|
+
@data[field].send default_method, *args
|
73
|
+
|
74
|
+
when default_method.respond_to?(:call) # callable with args
|
75
|
+
default_method.call @data[field], *args
|
76
|
+
|
77
|
+
else # default
|
78
|
+
@data[field].nil? ? default_method : @data[field] # may be false still
|
79
|
+
end
|
80
|
+
end
|
81
|
+
]
|
82
|
+
# TWS wants to receive booleans as 1 or 0
|
83
|
+
end
|
84
|
+
|
85
|
+
end # AbstractMessage
|
86
|
+
end # module Outgoing
|
87
|
+
end # module Messages
|
88
|
+
end # module IB
|
@@ -0,0 +1,112 @@
|
|
1
|
+
|
2
|
+
module IB
|
3
|
+
module Messages
|
4
|
+
module Outgoing
|
5
|
+
|
6
|
+
RequestManagedAccounts = def_message 17
|
7
|
+
|
8
|
+
# @data = { :subscribe => boolean,
|
9
|
+
# :account_code => Advisor accounts only. Empty ('') for a standard account. }
|
10
|
+
RequestAccountUpdates = RequestAccountData = def_message([6, 2],
|
11
|
+
[:subscribe, true],
|
12
|
+
:account_code)
|
13
|
+
=begin
|
14
|
+
Call this method to request and keep up to date the data that appears
|
15
|
+
on the TWS Account Window Summary tab. The data is returned by
|
16
|
+
accountSummary().
|
17
|
+
|
18
|
+
Note: This request is designed for an FA managed account but can be
|
19
|
+
used for any multi-account structure.
|
20
|
+
|
21
|
+
reqId:int - The ID of the data request. Ensures that responses are matched
|
22
|
+
to requests If several requests are in process.
|
23
|
+
groupName:str - Set to All to returnrn account summary data for all
|
24
|
+
accounts, or set to a specific Advisor Account Group name that has
|
25
|
+
already been created in TWS Global Configuration.
|
26
|
+
tags:str - A comma-separated list of account tags. Available tags are:
|
27
|
+
accountountType
|
28
|
+
NetLiquidation,
|
29
|
+
TotalCashValue - Total cash including futures pnl
|
30
|
+
SettledCash - For cash accounts, this is the same as
|
31
|
+
TotalCashValue
|
32
|
+
AccruedCash - Net accrued interest
|
33
|
+
BuyingPower - The maximum amount of marginable US stocks the
|
34
|
+
account can buy
|
35
|
+
EquityWithLoanValue - Cash + stocks + bonds + mutual funds
|
36
|
+
PreviousDayEquityWithLoanValue,
|
37
|
+
GrossPositionValue - The sum of the absolute value of all stock
|
38
|
+
and equity option positions
|
39
|
+
RegTEquity,
|
40
|
+
RegTMargin,
|
41
|
+
SMA - Special Memorandum Account
|
42
|
+
InitMarginReq,
|
43
|
+
MaintMarginReq,
|
44
|
+
AvailableFunds,
|
45
|
+
ExcessLiquidity,
|
46
|
+
Cushion - Excess liquidity as a percentage of net liquidation value
|
47
|
+
FullInitMarginReq,
|
48
|
+
FullMaintMarginReq,
|
49
|
+
FullAvailableFunds,
|
50
|
+
FullExcessLiquidity,
|
51
|
+
LookAheadNextChange - Time when look-ahead values take effect
|
52
|
+
LookAheadInitMarginReq,
|
53
|
+
LookAheadMaintMarginReq,
|
54
|
+
LookAheadAvailableFunds,
|
55
|
+
LookAheadExcessLiquidity,
|
56
|
+
HighestSeverity - A measure of how close the account is to liquidation
|
57
|
+
DayTradesRemaining - The Number of Open/Close trades a user
|
58
|
+
could put on before Pattern Day Trading is detected. A value of "-1"
|
59
|
+
means that the user can put on unlimited day trades.
|
60
|
+
Leverage - GrossPositionValue / NetLiquidation
|
61
|
+
$LEDGER - Single flag to relay all cash balance tags*, only in base
|
62
|
+
currency.
|
63
|
+
$LEDGER:CURRENCY - Single flag to relay all cash balance tags*, only in
|
64
|
+
the specified currency.
|
65
|
+
$LEDGER:ALL - Single flag to relay all cash balance tags* in all
|
66
|
+
currencies.
|
67
|
+
|
68
|
+
=end
|
69
|
+
RequestAccountSummary = def_message( 62,
|
70
|
+
:request_id, # autogenerated if not specified
|
71
|
+
[:group, 'All'],
|
72
|
+
:tags )
|
73
|
+
|
74
|
+
CancelAccountSummary = def_message 63 # :request_id required
|
75
|
+
|
76
|
+
# Note: The reqPositions function is not available in Introducing
|
77
|
+
# Broker or Financial Advisor master accounts that have very large
|
78
|
+
# numbers of subaccounts (> 50) to optimize the performance of TWS/IB
|
79
|
+
# Gateway v973+. Instead the function reqPositionsMulti can be used
|
80
|
+
# to subscribe to updates from individual subaccounts. Also not
|
81
|
+
# available with IBroker accounts configured for on-demand account
|
82
|
+
# lookup.
|
83
|
+
RequestPositions = def_message 61
|
84
|
+
CancelPositions = def_message 64
|
85
|
+
|
86
|
+
|
87
|
+
# The function reqPositionsMulti can be used with any
|
88
|
+
# account structure to subscribe to positions updates for multiple
|
89
|
+
# accounts and/or models. The account and model parameters are
|
90
|
+
# optional if there are not multiple accounts or models available.
|
91
|
+
RequestPositionsMulti = def_message( 74, :request_id, # autogenerated
|
92
|
+
[ :account, 'ALL' ],
|
93
|
+
[:model_code, nil ] )
|
94
|
+
|
95
|
+
CancelPositionsMulti = def_message( 75, :request_id ) # required
|
96
|
+
|
97
|
+
RequestAccountUpdatesMulti = def_message( 76, :request_id, # autogenerated
|
98
|
+
[ :account, 'ALL'], # account or account-group
|
99
|
+
[:model_code, nil],
|
100
|
+
[:leger_and_nlv, nil ])
|
101
|
+
CancelAccountUpdatesMulti = def_message 77, :request_id # required
|
102
|
+
end # module outgoing
|
103
|
+
end # module messages
|
104
|
+
end # module ib
|
105
|
+
|
106
|
+
# REQ_POSITIONS = 61
|
107
|
+
# REQ_ACCOUNT_SUMMARY = 62
|
108
|
+
# CANCEL_ACCOUNT_SUMMARY = 63
|
109
|
+
# CANCEL_POSITIONS = 64
|
110
|
+
|
111
|
+
# REQ_ACCOUNT_UPDATES_MULTI = 76
|
112
|
+
# CANCEL_ACCOUNT_UPDATES_MULTI = 77
|
@@ -0,0 +1,250 @@
|
|
1
|
+
module IB
|
2
|
+
module Messages
|
3
|
+
module Outgoing
|
4
|
+
|
5
|
+
# Messages that request bar data have special processing of @data
|
6
|
+
|
7
|
+
class BarRequestMessage < AbstractMessage
|
8
|
+
# Preprocessor for some data fields
|
9
|
+
def parse data
|
10
|
+
type = data[:data_type] || data[:what_to_show]
|
11
|
+
data_type = DATA_TYPES.invert[type] || type
|
12
|
+
unless DATA_TYPES.keys.include?(data_type)
|
13
|
+
error ":data_type must be one of #{DATA_TYPES.inspect}", :args
|
14
|
+
end
|
15
|
+
|
16
|
+
#size = data[:bar_size] || data[:size]
|
17
|
+
#bar_size = BAR_SIZES.invert[size] || size
|
18
|
+
# unless BAR_SIZES.keys.include?(bar_size)
|
19
|
+
# error ":bar_size must be one of #{BAR_SIZES.inspect}", :args
|
20
|
+
# end
|
21
|
+
|
22
|
+
contract = data[:contract].is_a?(IB::Contract) ?
|
23
|
+
data[:contract] : IB::Contract.from_ib_ruby(data[:contract])
|
24
|
+
|
25
|
+
[data_type, nil, contract]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# data = { :id => ticker_id (int),
|
30
|
+
# :contract => Contract ,
|
31
|
+
# :bar_size => int/Symbol? Currently only 5 second bars are supported,
|
32
|
+
# if any other value is used, an exception will be thrown.,
|
33
|
+
# :data_type => Symbol: Determines the nature of data being extracted.
|
34
|
+
# :trades, :midpoint, :bid, :ask, :bid_ask,
|
35
|
+
# :historical_volatility, :option_implied_volatility,
|
36
|
+
# :option_volume, :option_open_interest
|
37
|
+
# - converts to "TRADES," "MIDPOINT," "BID," etc...
|
38
|
+
# :use_rth => int: 0 - all data available during the time span requested
|
39
|
+
# is returned, even data bars covering time intervals where the
|
40
|
+
# market in question was illiquid. 1 - only data within the
|
41
|
+
# "Regular Trading Hours" of the product in question is returned,
|
42
|
+
# even if the time span requested falls partially or completely
|
43
|
+
# outside of them.
|
44
|
+
#
|
45
|
+
# Version 3
|
46
|
+
RequestRealTimeBars = def_message [ 50, 3 ], BarRequestMessage,
|
47
|
+
:request_id # autogenerated if not specified
|
48
|
+
|
49
|
+
class RequestRealTimeBars
|
50
|
+
def parse data
|
51
|
+
data_type, bar_size, contract = super data
|
52
|
+
|
53
|
+
size = data[:bar_size] || data[:size]
|
54
|
+
bar_size = 5 # only 5 sec bars are supported --> for future use ::> size.to_i
|
55
|
+
[data_type, bar_size, contract]
|
56
|
+
end
|
57
|
+
|
58
|
+
def encode
|
59
|
+
data_type, bar_size, contract = parse @data
|
60
|
+
|
61
|
+
[super,
|
62
|
+
contract.serialize_short(:primary_exchange), # include primary exchange in request
|
63
|
+
bar_size,
|
64
|
+
data_type.to_s.upcase,
|
65
|
+
@data[:use_rth] ,
|
66
|
+
"XYZ" # not suported realtimebars option string
|
67
|
+
]
|
68
|
+
end
|
69
|
+
end # RequestRealTimeBars
|
70
|
+
|
71
|
+
## python reference (9.74)
|
72
|
+
# def reqHistoricalData(self, reqId:TickerId , contract:Contract, endDateTime:str,
|
73
|
+
# durationStr:str, barSizeSetting:str, whatToShow:str,
|
74
|
+
# useRTH:int, formatDate:int, keepUpToDate:bool, chartOptions:TagValueList)
|
75
|
+
RequestHistoricalData = def_message [20, 0], BarRequestMessage,
|
76
|
+
:request_id # autogenerated if not specified
|
77
|
+
|
78
|
+
# - data = {
|
79
|
+
# :contract => Contract: requested ticker description
|
80
|
+
# :end_date_time => String: "yyyymmdd HH:mm:ss", with optional time zone
|
81
|
+
# allowed after a space: "20050701 18:26:44 GMT"
|
82
|
+
# :duration => String, time span the request will cover, and is specified
|
83
|
+
# using the format: <integer> <unit>, eg: '1 D', valid units are:
|
84
|
+
# '1 S' (seconds, default if no unit is specified)
|
85
|
+
# '1 D' (days)
|
86
|
+
# '1 W' (weeks)
|
87
|
+
# '1 M' (months)
|
88
|
+
# '1 Y' (years, currently limited to one)
|
89
|
+
# :bar_size => String: Specifies the size of the bars that will be returned
|
90
|
+
# (within IB/TWS limits). Valid values include:
|
91
|
+
# '1 sec'
|
92
|
+
# '5 secs'
|
93
|
+
# '15 secs'
|
94
|
+
# '30 secs'
|
95
|
+
# '1 min'
|
96
|
+
# '2 mins'
|
97
|
+
# '3 mins'
|
98
|
+
# '5 mins'
|
99
|
+
# '15 mins'
|
100
|
+
# '30 min'
|
101
|
+
# '1 hour'
|
102
|
+
# '1 day'
|
103
|
+
# :what_to_show => Symbol: Determines the nature of data being extracted.
|
104
|
+
# Valid values:
|
105
|
+
# :trades, :midpoint, :bid, :ask, :bid_ask,
|
106
|
+
# :historical_volatility, :option_implied_volatility,
|
107
|
+
# :option_volume, :option_open_interest
|
108
|
+
# - converts to "TRADES," "MIDPOINT," "BID," etc...
|
109
|
+
# :use_rth => int: 0 - all data available during the time span requested
|
110
|
+
# is returned, even data bars covering time intervals where the
|
111
|
+
# market in question was illiquid. 1 - only data within the
|
112
|
+
# "Regular Trading Hours" of the product in question is returned,
|
113
|
+
# even if the time span requested falls partially or completely
|
114
|
+
# outside of them.
|
115
|
+
# :format_date => int: 1 - text format, like "20050307 11:32:16".
|
116
|
+
# 2 - offset from 1970-01-01 in sec (UNIX epoch)
|
117
|
+
# }
|
118
|
+
#
|
119
|
+
# - NB: using the D :duration only returns bars in whole days, so requesting "1 D"
|
120
|
+
# for contract ending at 08:05 will only return 1 bar, for 08:00 on that day.
|
121
|
+
# But requesting "86400 S" gives 86400/barlengthsecs bars before the end Time.
|
122
|
+
#
|
123
|
+
# - Note also that the :duration for any request must be such that the start Time is not
|
124
|
+
# more than one year before the CURRENT-Time-less-one-day (not 1 year before the end
|
125
|
+
# Time in the Request)
|
126
|
+
#
|
127
|
+
# Bar Size Max Duration
|
128
|
+
# -------- ------------
|
129
|
+
# 1 sec 2000 S
|
130
|
+
# 5 sec 10000 S
|
131
|
+
# 15 sec 30000 S
|
132
|
+
# 30 sec 86400 S
|
133
|
+
# 1 minute 86400 S, 6 D
|
134
|
+
# 2 minutes 86400 S, 6 D
|
135
|
+
# 5 minutes 86400 S, 6 D
|
136
|
+
# 15 minutes 86400 S, 6 D, 20 D, 2 W
|
137
|
+
# 30 minutes 86400 S, 34 D, 4 W, 1 M
|
138
|
+
# 1 hour 86400 S, 34 D, 4 w, 1 M
|
139
|
+
# 1 day 60 D, 12 M, 52 W, 1 Y
|
140
|
+
#
|
141
|
+
# - NB: as of 4/07 there is no historical data available for forex spot.
|
142
|
+
#
|
143
|
+
# - data[:contract] may either be a Contract object or a String. A String should be
|
144
|
+
# in serialize_ib_ruby format; that is, it should be a colon-delimited string in
|
145
|
+
# the format (e.g. for Globex British pound futures contract expiring in Sep-2008):
|
146
|
+
#
|
147
|
+
#
|
148
|
+
# - Fields not needed for a particular security should be left blank (e.g. strike
|
149
|
+
# and right are only relevant for options.)
|
150
|
+
#
|
151
|
+
# - A Contract object will be automatically serialized into the required format.
|
152
|
+
#
|
153
|
+
# - See also http://chuckcaplan.com/twsapi/index.php/void%20reqIntradayData%28%29
|
154
|
+
# for general information about how TWS handles historic data requests, whence
|
155
|
+
# the following has been adapted:
|
156
|
+
#
|
157
|
+
# - The server providing historical prices appears to not always be
|
158
|
+
# available outside of market hours. If you call it outside of its
|
159
|
+
# supported time period, or if there is otherwise a problem with
|
160
|
+
# it, you will receive error #162 "Historical Market Data Service
|
161
|
+
# query failed.:HMDS query returned no data."
|
162
|
+
#
|
163
|
+
# - For backfill on futures data, you may need to leave the Primary
|
164
|
+
# Exchange field of the Contract structure blank; see
|
165
|
+
# http://www.interactivebrokers.com/discus/messages/2/28477.html?1114646754
|
166
|
+
#
|
167
|
+
# - Version 6 implemented --> the version is not transmitted anymore
|
168
|
+
class RequestHistoricalData
|
169
|
+
def parse data
|
170
|
+
data_type, bar_size, contract = super data
|
171
|
+
|
172
|
+
size = data[:bar_size] || data[:size]
|
173
|
+
bar_size = BAR_SIZES.invert[size] || size
|
174
|
+
unless BAR_SIZES.keys.include?(bar_size)
|
175
|
+
error ":bar_size must be one of #{BAR_SIZES.inspect}", :args
|
176
|
+
end
|
177
|
+
[data_type, bar_size, contract]
|
178
|
+
end
|
179
|
+
|
180
|
+
def encode
|
181
|
+
data_type, bar_size, contract = parse @data
|
182
|
+
|
183
|
+
[super.flatten,
|
184
|
+
contract.serialize_long[0..-1], # omit sec_id_type and sec_id
|
185
|
+
@data[:end_date_time],
|
186
|
+
bar_size,
|
187
|
+
@data[:duration],
|
188
|
+
@data[:use_rth],
|
189
|
+
data_type.to_s.upcase,
|
190
|
+
2 , # @data[:format_date], format-date is hard-coded as int_date in incoming/historicalData
|
191
|
+
contract.serialize_legs ,
|
192
|
+
@data[:keep_up_todate], # 0 / 1
|
193
|
+
'XYZ' # chartOptions:TagValueList - For internal use only. Use default value XYZ.
|
194
|
+
]
|
195
|
+
end
|
196
|
+
end # RequestHistoricalData
|
197
|
+
|
198
|
+
end # module Outgoing
|
199
|
+
end # module Messages
|
200
|
+
end # module IB
|
201
|
+
|
202
|
+
## python documentaion
|
203
|
+
# """Requests contracts' historical data. When requesting historical data, a
|
204
|
+
# finishing time and date is required along with a duration string. The
|
205
|
+
# resulting bars will be returned in EWrapper.historicalData()
|
206
|
+
# reqId:TickerId - The id of the request. Must be a unique value. When the
|
207
|
+
# market data returns, it whatToShowill be identified by this tag. This is also
|
208
|
+
# used when canceling the market data.
|
209
|
+
# contract:Contract - This object contains a description of the contract for which
|
210
|
+
# market data is being requested.
|
211
|
+
# endDateTime:str - Defines a query end date and time at any point during the past 6 mos.
|
212
|
+
# Valid values include any date/time within the past six months in the format:
|
213
|
+
# yyyymmdd HH:mm:ss ttt
|
214
|
+
# where "ttt" is the optional time zone.
|
215
|
+
# durationStr:str - Set the query duration up to one week, using a time unit
|
216
|
+
# of seconds, days or weeks. Valid values include any integer followed by a space
|
217
|
+
# and then S (seconds), D (days) or W (week). If no unit is specified, seconds is used.
|
218
|
+
# barSizeSetting:str - Specifies the size of the bars that will be returned (within IB/TWS listimits).
|
219
|
+
# Valid values include:
|
220
|
+
# 1 sec
|
221
|
+
# 5 secs
|
222
|
+
# 15 secs
|
223
|
+
# 30 secs
|
224
|
+
# 1 min
|
225
|
+
# 2 mins
|
226
|
+
# 3 mins
|
227
|
+
# 5 mins
|
228
|
+
# 15 mins
|
229
|
+
# 30 mins
|
230
|
+
# 1 hour
|
231
|
+
# 1 day
|
232
|
+
# whatToShow:str - Determines the nature of data beinging extracted. Valid values include:
|
233
|
+
# TRADES
|
234
|
+
# MIDPOINT
|
235
|
+
# BID
|
236
|
+
# ASK
|
237
|
+
# BID_ASK
|
238
|
+
# HISTORICAL_VOLATILITY
|
239
|
+
# OPTION_IMPLIED_VOLATILITY
|
240
|
+
# useRTH:int - Determines whether to return all data available during the requested time span,
|
241
|
+
# or only data that falls within regular trading hours. Valid values include:
|
242
|
+
# 0 - all data is returned even where the market in question was outside of its
|
243
|
+
# regular trading hours.
|
244
|
+
# 1 - only data within the regular trading hours is returned, even if the
|
245
|
+
# requested time span falls partially or completely outside of the RTH.
|
246
|
+
# formatDate: int - Determines the date format applied to returned bars. validd values include:
|
247
|
+
# 1 - dates applying to bars returned in the format: yyyymmdd{space}{space}hh:mm:dd
|
248
|
+
# 2 - dates are returned as a long integer specifying the number of seconds since
|
249
|
+
# 1/1/1970 GMT.
|
250
|
+
# chartOptions:TagValueList - For internal use only. Use default value XYZ. """
|