ib-ruby 0.7.4 → 0.7.6
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.
- data/.gitignore +3 -0
- data/HISTORY +8 -0
- data/README.md +2 -2
- data/Rakefile +15 -0
- data/TODO +7 -2
- data/VERSION +1 -1
- data/bin/account_info +1 -1
- data/bin/cancel_orders +1 -1
- data/bin/contract_details +1 -1
- data/bin/depth_of_market +1 -1
- data/bin/fa_accounts +1 -1
- data/bin/fundamental_data +42 -0
- data/bin/historic_data +1 -1
- data/bin/historic_data_cli +1 -1
- data/bin/list_orders +1 -2
- data/bin/market_data +1 -1
- data/bin/option_data +1 -1
- data/bin/place_combo_order +1 -1
- data/bin/place_order +1 -1
- data/bin/template +1 -4
- data/bin/tick_data +2 -2
- data/bin/time_and_sales +1 -1
- data/lib/ib-ruby.rb +4 -0
- data/lib/ib-ruby/connection.rb +50 -34
- data/lib/ib-ruby/constants.rb +232 -37
- data/lib/ib-ruby/db.rb +25 -0
- data/lib/ib-ruby/extensions.rb +51 -1
- data/lib/ib-ruby/messages/abstract_message.rb +0 -8
- data/lib/ib-ruby/messages/incoming.rb +18 -493
- data/lib/ib-ruby/messages/incoming/abstract_message.rb +100 -0
- data/lib/ib-ruby/messages/incoming/alert.rb +34 -0
- data/lib/ib-ruby/messages/incoming/contract_data.rb +82 -0
- data/lib/ib-ruby/messages/incoming/delta_neutral_validation.rb +20 -0
- data/lib/ib-ruby/messages/incoming/execution_data.rb +59 -0
- data/lib/ib-ruby/messages/incoming/historical_data.rb +55 -0
- data/lib/ib-ruby/messages/incoming/market_depths.rb +44 -0
- data/lib/ib-ruby/messages/incoming/open_order.rb +32 -16
- data/lib/ib-ruby/messages/incoming/order_status.rb +67 -0
- data/lib/ib-ruby/messages/incoming/portfolio_value.rb +39 -0
- data/lib/ib-ruby/messages/incoming/real_time_bar.rb +32 -0
- data/lib/ib-ruby/messages/incoming/scanner_data.rb +49 -0
- data/lib/ib-ruby/messages/outgoing.rb +25 -223
- data/lib/ib-ruby/messages/outgoing/abstract_message.rb +61 -0
- data/lib/ib-ruby/messages/outgoing/bar_requests.rb +149 -0
- data/lib/ib-ruby/messages/outgoing/place_order.rb +24 -0
- data/lib/ib-ruby/models.rb +4 -0
- data/lib/ib-ruby/models/bar.rb +31 -14
- data/lib/ib-ruby/models/combo_leg.rb +48 -23
- data/lib/ib-ruby/models/contracts.rb +2 -2
- data/lib/ib-ruby/models/contracts/bag.rb +11 -7
- data/lib/ib-ruby/models/contracts/contract.rb +90 -66
- data/lib/ib-ruby/models/contracts/option.rb +16 -7
- data/lib/ib-ruby/models/execution.rb +34 -18
- data/lib/ib-ruby/models/model.rb +15 -7
- data/lib/ib-ruby/models/model_properties.rb +101 -44
- data/lib/ib-ruby/models/order.rb +176 -187
- data/lib/ib-ruby/models/order_state.rb +99 -0
- data/lib/ib-ruby/symbols/forex.rb +10 -10
- data/lib/ib-ruby/symbols/futures.rb +6 -6
- data/lib/ib-ruby/symbols/stocks.rb +3 -3
- data/spec/account_helper.rb +4 -5
- data/spec/combo_helper.rb +4 -4
- data/spec/db.rb +18 -0
- data/spec/ib-ruby/messages/{incoming_spec.rb → incoming/alert_spec.rb} +1 -0
- data/spec/ib-ruby/messages/incoming/open_order_spec.rb +100 -0
- data/spec/ib-ruby/messages/incoming/order_status_spec.rb +74 -0
- data/spec/ib-ruby/messages/{outgoing_spec.rb → outgoing/account_data_spec.rb} +0 -0
- data/spec/ib-ruby/messages/outgoing/market_data_type_spec.rb +44 -0
- data/spec/ib-ruby/models/bag_spec.rb +97 -0
- data/spec/ib-ruby/models/bar_spec.rb +45 -0
- data/spec/ib-ruby/models/combo_leg_spec.rb +56 -40
- data/spec/ib-ruby/models/contract_spec.rb +134 -170
- data/spec/ib-ruby/models/execution_spec.rb +35 -50
- data/spec/ib-ruby/models/option_spec.rb +127 -0
- data/spec/ib-ruby/models/order_spec.rb +89 -68
- data/spec/ib-ruby/models/order_state_spec.rb +55 -0
- data/spec/integration/contract_info_spec.rb +4 -6
- data/spec/integration/fundamental_data_spec.rb +41 -0
- data/spec/integration/historic_data_spec.rb +4 -4
- data/spec/integration/market_data_spec.rb +1 -3
- data/spec/integration/orders/attached_spec.rb +8 -10
- data/spec/integration/orders/combo_spec.rb +2 -2
- data/spec/integration/orders/execution_spec.rb +0 -1
- data/spec/integration/orders/placement_spec.rb +1 -3
- data/spec/integration/orders/valid_ids_spec.rb +1 -2
- data/spec/message_helper.rb +1 -1
- data/spec/model_helper.rb +211 -0
- data/spec/order_helper.rb +44 -37
- data/spec/spec_helper.rb +36 -23
- data/spec/v.rb +7 -0
- data/tasks/doc.rake +1 -1
- metadata +116 -12
- data/spec/integration/orders/open_order +0 -98
data/lib/ib-ruby/models/order.rb
CHANGED
@@ -1,94 +1,30 @@
|
|
1
|
-
require 'ib-ruby/models/model'
|
2
|
-
|
3
|
-
# TODO: Implement equals() according to the criteria in IB's Java client.
|
4
|
-
|
5
1
|
module IB
|
6
2
|
module Models
|
7
|
-
class Order < Model
|
3
|
+
class Order < Model.for(:order)
|
4
|
+
include ModelProperties
|
8
5
|
|
9
6
|
# General Notes:
|
10
7
|
# 1. Placing Orders by con_id - When you place an order by con_id, you must
|
11
8
|
# provide the con_id AND the exchange. If you provide extra fields when placing
|
12
9
|
# an order by conid, the order may not work.
|
13
10
|
|
14
|
-
# 2. Order IDs - Each order you place must have a unique Order ID.
|
15
|
-
#
|
16
|
-
# from your API application.
|
17
|
-
|
18
|
-
# Constants used in Order objects. Drawn from Order.java
|
19
|
-
Origin_Customer = 0
|
20
|
-
Origin_Firm = 1
|
21
|
-
|
22
|
-
Opt_Unknown = '?'
|
23
|
-
Opt_Broker_Dealer = 'b'
|
24
|
-
Opt_Customer = 'c'
|
25
|
-
Opt_Firm = 'f'
|
26
|
-
Opt_Isemm = 'm'
|
27
|
-
Opt_Farmm = 'n'
|
28
|
-
Opt_Specialist = 'y'
|
29
|
-
|
30
|
-
OCA_Cancel_with_block = 1
|
31
|
-
OCA_Reduce_with_block = 2
|
32
|
-
OCA_Reduce_non_block = 3
|
33
|
-
|
34
|
-
# Box orders consts:
|
35
|
-
Box_Auction_Match = 1
|
36
|
-
Box_Auction_Improvement = 2
|
37
|
-
Box_Auction_Transparent = 3
|
38
|
-
|
39
|
-
# Volatility orders consts:
|
40
|
-
Volatility_Type_Daily = 1
|
41
|
-
Volatility_Type_Annual = 2
|
42
|
-
Volatility_Ref_Price_Average = 1
|
43
|
-
Volatility_Ref_Price_BidOrAsk = 2
|
11
|
+
# 2. Order IDs - Each order you place must have a unique Order ID. Increment
|
12
|
+
# your own Order IDs to avoid conflicts between orders placed from your API application.
|
44
13
|
|
45
14
|
# Main order fields
|
46
15
|
prop :order_id, # int: Order id associated with client (volatile).
|
47
16
|
:client_id, # int: The id of the client that placed this order.
|
48
17
|
:perm_id, # int: TWS permanent id, remains the same over TWS sessions.
|
49
|
-
:action, # String: Identifies the side: BUY/SELL/SSHORT
|
50
18
|
:total_quantity, # int: The order quantity.
|
51
19
|
|
52
|
-
:order_type, # String:
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
# TRAIL LIMIT Trailing Stop Limit
|
61
|
-
# TRAIL LIT Trailing Limit if Touched
|
62
|
-
# TRAIL MIT Trailing Market If Touched
|
63
|
-
# Speed of Execution:
|
64
|
-
# MKT Market
|
65
|
-
# MIT Market-if-Touched
|
66
|
-
# MOC Market-on-Close MKTCLSL ?
|
67
|
-
# MOO Market-on-Open
|
68
|
-
# PEG MKT Pegged-to-Market
|
69
|
-
# REL Relative
|
70
|
-
# Price Improvement:
|
71
|
-
# BOX TOP Box Top
|
72
|
-
# LOC Limit-on-Close LMTCLS ?
|
73
|
-
# LOO Limit-on-Open
|
74
|
-
# LIT Limit if Touched
|
75
|
-
# PEG MID Pegged-to-Midpoint
|
76
|
-
# VWAP VWAP-Guaranteed
|
77
|
-
# Advanced Trading:
|
78
|
-
# OCA One-Cancels-All
|
79
|
-
# VOL Volatility
|
80
|
-
# SCALE Scale
|
81
|
-
# Other (no abbreviation):
|
82
|
-
# Bracket
|
83
|
-
# At Auction
|
84
|
-
# Discretionary
|
85
|
-
# Sweep-to-Fill
|
86
|
-
# Price Improvement Auction
|
87
|
-
# Block
|
88
|
-
# Hidden
|
89
|
-
# Iceberg/Reserve
|
90
|
-
# All-or-None
|
91
|
-
# Fill-or-Kill
|
20
|
+
:order_type, # String: Order type.
|
21
|
+
# Limit Risk: MTL / MKT PRT / QUOTE / STP / STP LMT / TRAIL / TRAIL LIMIT / TRAIL LIT / TRAIL MIT
|
22
|
+
# Speed of Execution: MKT / MIT / MOC / MOO / PEG MKT / REL
|
23
|
+
# Price Improvement: BOX TOP / LOC / LOO / LIT / PEG MID / VWAP
|
24
|
+
# Advanced Trading: OCA / VOL / SCALE
|
25
|
+
# Other (no abbreviation): Bracket, Auction, Discretionary, Sweep-to-Fill,
|
26
|
+
# Price Improvement Auction, Block, Hidden, Iceberg/Reserve, All-or-None, Fill-or-Kill
|
27
|
+
# See 'ib-ruby/constants.rb' ORDER_TYPES for a complete list of valid values.
|
92
28
|
|
93
29
|
:limit_price, # double: LIMIT price, used for limit, stop-limit and relative
|
94
30
|
# orders. In all other cases specify zero. For relative
|
@@ -97,12 +33,6 @@ module IB
|
|
97
33
|
:aux_price, # double: STOP price for stop-limit orders, and the OFFSET amount
|
98
34
|
# for relative orders. In all other cases, specify zero.
|
99
35
|
|
100
|
-
:tif, # String: Time to Market:
|
101
|
-
# DAY
|
102
|
-
# GAT Good-after-Time/Date
|
103
|
-
# GTD Good-till-Date/Time
|
104
|
-
# GTC Good-till-Canceled
|
105
|
-
# IOC Immediate-or-Cancel
|
106
36
|
:oca_group, # String: Identifies a member of a one-cancels-all group.
|
107
37
|
:oca_type, # int: Tells how to handle remaining orders in an OCA group
|
108
38
|
# when one order or part of an order executes. Valid values:
|
@@ -113,17 +43,13 @@ module IB
|
|
113
43
|
# overfill protection. This means that only one order in
|
114
44
|
# the group will be routed at a time to remove the
|
115
45
|
# possibility of an overfill.
|
116
|
-
:transmit, # bool:if false, order will be created but not transmitted.
|
117
46
|
:parent_id, # int: The order ID of the parent (original) order, used
|
118
47
|
# for bracket (STP) and auto trailing stop (TRAIL) orders.
|
119
|
-
:block_order, # bool: the order is an ISE Block order.
|
120
|
-
:sweep_to_fill, # bool: the order is a Sweep-to-Fill order.
|
121
48
|
:display_size, # int: publicly disclosed order size for Iceberg orders.
|
122
49
|
|
123
50
|
:trigger_method, # Specifies how Simulated Stop, Stop-Limit and Trailing
|
124
51
|
# Stop orders are triggered. Valid values are:
|
125
|
-
# 0 - Default, "double bid/ask"
|
126
|
-
# and US options orders, "last" method will be used all others.
|
52
|
+
# 0 - Default, "double bid/ask" for OTC/US options, "last" otherswise.
|
127
53
|
# 1 - "double bid/ask" method, stop orders are triggered based on
|
128
54
|
# two consecutive bid or ask prices.
|
129
55
|
# 2 - "last" method, stops are triggered based on the last price.
|
@@ -141,29 +67,16 @@ module IB
|
|
141
67
|
# and the spread between the bid and ask must be less than
|
142
68
|
# 0.1% of the midpoint
|
143
69
|
|
144
|
-
:what_if, # bool: Use to request pre-trade commissions and margin
|
145
|
-
# information. If set to true, margin and commissions data is received
|
146
|
-
# back via the OrderState() object for the openOrder() callback.
|
147
|
-
:not_held, # public boolean m_notHeld; // Not Held
|
148
|
-
:outside_rth, # bool: allows orders to also trigger or fill outside
|
149
|
-
# of regular trading hours. (WAS: ignore_rth)
|
150
|
-
:hidden, # bool: the order will not be visible when viewing
|
151
|
-
# the market depth. Only for ISLAND exchange.
|
152
70
|
:good_after_time, # Indicates that the trade should be submitted after the
|
153
71
|
# time and date set, format YYYYMMDD HH:MM:SS (seconds are optional).
|
154
72
|
:good_till_date, # Indicates that the trade should remain working until the
|
155
73
|
# time and date set, format YYYYMMDD HH:MM:SS (seconds are optional).
|
156
74
|
# You must set the :tif to GTD when using this string.
|
157
75
|
# Use an empty String if not applicable.
|
158
|
-
:override_percentage_constraints, # bool: Precautionary constraints defined on
|
159
|
-
# the TWS Presets page ensure that your price and size order values are reasonable.
|
160
|
-
# Orders sent from the API are also validated against these safety constraints,
|
161
|
-
# unless this parameter is set to True.
|
162
76
|
|
163
77
|
:rule_80a, # Individual = 'I', Agency = 'A', AgentOtherMember = 'W',
|
164
78
|
# IndividualPTIA = 'J', AgencyPTIA = 'U', AgentOtherMemberPTIA = 'M',
|
165
79
|
# IndividualPT = 'K', AgencyPT = 'Y', AgentOtherMemberPT = 'N'
|
166
|
-
:all_or_none, # bool: yes=1, no=0
|
167
80
|
:min_quantity, # int: Identifies a minimum quantity order type.
|
168
81
|
:percent_offset, # double: percent offset amount for relative (REL)orders only
|
169
82
|
:trail_stop_price, # double: for TRAILLIMIT orders only
|
@@ -174,7 +87,6 @@ module IB
|
|
174
87
|
:fa_group, :fa_profile, :fa_method, :fa_percentage,
|
175
88
|
|
176
89
|
# Institutional orders only!
|
177
|
-
:open_close, # String: O=Open, C=Close
|
178
90
|
:origin, # 0=Customer, 1=Firm
|
179
91
|
:order_ref, # String: Order reference. Customer defined order ID tag.
|
180
92
|
:short_sale_slot, # 1 - you hold the shares,
|
@@ -194,10 +106,7 @@ module IB
|
|
194
106
|
# SMART routing only
|
195
107
|
:discretionary_amount, # double: The amount off the limit price
|
196
108
|
# allowed for discretionary orders.
|
197
|
-
:etrade_only, # bool: Trade with electronic quotes.
|
198
|
-
:firm_quote_only, # bool: Trade with firm quotes.
|
199
109
|
:nbbo_price_cap, # double: Maximum Smart order distance from the NBBO.
|
200
|
-
:opt_out_smart_routing, # Australian exchange only, default false
|
201
110
|
|
202
111
|
# BOX or VOL ORDERS ONLY
|
203
112
|
:auction_strategy, # For BOX exchange only. Valid values:
|
@@ -216,6 +125,7 @@ module IB
|
|
216
125
|
# underlying stock price range.
|
217
126
|
|
218
127
|
# VOLATILITY ORDERS ONLY:
|
128
|
+
# http://www.interactivebrokers.com/en/general/education/pdfnotes/PDF-VolTrader.php
|
219
129
|
:volatility, # double: What the price is, computed via TWSs Options
|
220
130
|
# Analytics. For VOL orders, the limit price sent to an
|
221
131
|
# exchange is not editable, as it is the output of a
|
@@ -233,6 +143,7 @@ module IB
|
|
233
143
|
:delta_neutral_order_type, # String: Enter an order type to instruct TWS
|
234
144
|
# to submit a delta neutral trade on full or partial execution of the
|
235
145
|
# VOL order. For no hedge delta order to be sent, specify NONE.
|
146
|
+
# Valid values - LMT, MKT, MTL, REL, MOC
|
236
147
|
:delta_neutral_aux_price, # double: Use this field to enter a value if
|
237
148
|
# the value in the deltaNeutralOrderType field is an order
|
238
149
|
# type that requires an Aux price, such as a REL order.
|
@@ -276,83 +187,103 @@ module IB
|
|
276
187
|
:scale_price_adjust_value,
|
277
188
|
:scale_price_adjust_interval,
|
278
189
|
:scale_profit_offset,
|
279
|
-
:scale_auto_reset,
|
280
190
|
:scale_init_position,
|
281
191
|
:scale_init_fill_qty,
|
282
|
-
:
|
283
|
-
|
284
|
-
|
285
|
-
#
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
#
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
#
|
296
|
-
#
|
297
|
-
#
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
#
|
303
|
-
#
|
304
|
-
#
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
192
|
+
:scale_auto_reset => :bool,
|
193
|
+
:scale_random_percent => :bool
|
194
|
+
|
195
|
+
# Properties with complex processing logics
|
196
|
+
prop :tif, # String: Time in Force (time to market): DAY/GAT/GTD/GTC/IOC
|
197
|
+
:what_if => :bool, # Only return pre-trade commissions and margin info, do not place
|
198
|
+
:not_held => :bool, # Not Held
|
199
|
+
:outside_rth => :bool, # Order may trigger or fill outside of regular hours. (WAS: ignore_rth)
|
200
|
+
:hidden => :bool, # Order will not be visible in market depth. ISLAND only.
|
201
|
+
:transmit => :bool, # If false, order will be created but not transmitted.
|
202
|
+
:block_order => :bool, # This is an ISE Block order.
|
203
|
+
:sweep_to_fill => :bool, # This is a Sweep-to-Fill order.
|
204
|
+
:override_percentage_constraints => :bool,
|
205
|
+
# TWS Presets page constraints ensure that your price and size order values
|
206
|
+
# are reasonable. Orders sent from the API are also validated against these
|
207
|
+
# safety constraints, unless this parameter is set to True.
|
208
|
+
:all_or_none => :bool, # AON
|
209
|
+
:etrade_only => :bool, # Trade with electronic quotes.
|
210
|
+
:firm_quote_only => :bool, # Trade with firm quotes.
|
211
|
+
:opt_out_smart_routing => :bool, # Australian exchange only, default false
|
212
|
+
:open_close => PROPS[:open_close], # Originally String: O=Open, C=Close ()
|
213
|
+
# for ComboLeg compatibility: SAME = 0; OPEN = 1; CLOSE = 2; UNKNOWN = 3;
|
214
|
+
[:side, :action] => PROPS[:side] # String: Action/side: BUY/SELL/SSHORT/SSHORTX
|
215
|
+
|
216
|
+
# Some properties received from IB are separated into OrderState object,
|
217
|
+
# but they are still readable as Order properties through delegation.
|
218
|
+
#
|
219
|
+
# Properties arriving via OpenOrder message:
|
220
|
+
[:commission, # double: Shows the commission amount on the order.
|
221
|
+
:commission_currency, # String: Shows the currency of the commission.
|
222
|
+
:min_commission, # The possible min range of the actual order commission.
|
223
|
+
:max_commission, # The possible max range of the actual order commission.
|
224
|
+
:warning_text, # String: Displays a warning message if warranted.
|
225
|
+
:init_margin, # Float: The impact the order would have on your initial margin.
|
226
|
+
:maint_margin, # Float: The impact the order would have on your maintenance margin.
|
227
|
+
:equity_with_loan, # Float: The impact the order would have on your equity
|
228
|
+
:status, # String: Displays the order status. See OrderState for values
|
229
|
+
# Properties arriving via OrderStatus message:
|
230
|
+
:filled, # int
|
231
|
+
:remaining, # int
|
232
|
+
:average_fill_price, # double
|
233
|
+
:last_fill_price, # double
|
234
|
+
:why_held # String: comma-separated list of reasons for order to be held.
|
235
|
+
].each { |property| define_method(property) { order_state.send(property) } }
|
322
236
|
|
323
237
|
# Returned in OpenOrder for Bag Contracts
|
324
238
|
# public Vector<OrderComboLeg> m_orderComboLegs
|
325
|
-
attr_accessor :leg_prices, :combo_params
|
239
|
+
attr_accessor :leg_prices, :combo_params, :order_state
|
326
240
|
alias order_combo_legs leg_prices
|
327
241
|
alias smart_combo_routing_params combo_params
|
328
242
|
|
243
|
+
# TODO: :created_at, :placed_at, :modified_at accessors
|
244
|
+
|
245
|
+
# Order is not valid without correct :order_id
|
246
|
+
validates_numericality_of :order_id, :only_integer => true
|
247
|
+
|
329
248
|
DEFAULT_PROPS = {:aux_price => 0.0,
|
249
|
+
:discretionary_amount => 0.0,
|
330
250
|
:parent_id => 0,
|
331
|
-
:tif =>
|
332
|
-
:
|
333
|
-
:open_close =>
|
334
|
-
:origin =>
|
335
|
-
:
|
251
|
+
:tif => :day,
|
252
|
+
:order_type => :limit,
|
253
|
+
:open_close => :open,
|
254
|
+
:origin => :customer,
|
255
|
+
:short_sale_slot => :default,
|
256
|
+
:trigger_method => :default,
|
257
|
+
:oca_type => :none,
|
258
|
+
:auction_strategy => :none,
|
336
259
|
:designated_location => '',
|
337
260
|
:exempt_code => -1,
|
338
|
-
:
|
261
|
+
:display_size => 0,
|
262
|
+
:continuous_update => 0,
|
339
263
|
:delta_neutral_con_id => 0,
|
340
|
-
:delta_neutral_settling_firm => '',
|
341
|
-
:delta_neutral_clearing_account => '',
|
342
|
-
:delta_neutral_clearing_intent => '',
|
343
264
|
:algo_strategy => '',
|
265
|
+
# TODO: Add simple defaults to prop ?
|
266
|
+
:transmit => true,
|
344
267
|
:what_if => false,
|
268
|
+
:hidden => false,
|
269
|
+
:etrade_only => false,
|
270
|
+
:firm_quote_only => false,
|
271
|
+
:block_order => false,
|
272
|
+
:all_or_none => false,
|
273
|
+
:sweep_to_fill => false,
|
345
274
|
:not_held => false,
|
275
|
+
:outside_rth => false,
|
346
276
|
:scale_auto_reset => false,
|
347
277
|
:scale_random_percent => false,
|
348
278
|
:opt_out_smart_routing => false,
|
349
|
-
:
|
279
|
+
:override_percentage_constraints => false,
|
350
280
|
}
|
351
281
|
|
352
282
|
def initialize opts = {}
|
353
283
|
@leg_prices = []
|
354
284
|
@algo_params = {}
|
355
285
|
@combo_params = {}
|
286
|
+
@order_state = IB::OrderState.new
|
356
287
|
super opts
|
357
288
|
end
|
358
289
|
|
@@ -360,40 +291,51 @@ module IB
|
|
360
291
|
# mixed with data from associated contract. Ugly mix, indeed.
|
361
292
|
def serialize_with server, contract
|
362
293
|
[contract.serialize_long(:con_id, :sec_id),
|
363
|
-
|
294
|
+
# main order fields
|
295
|
+
case side
|
296
|
+
when :short
|
297
|
+
'SSHORT'
|
298
|
+
when :short_exempt
|
299
|
+
'SSHORTX'
|
300
|
+
else
|
301
|
+
side.to_sup
|
302
|
+
end,
|
364
303
|
total_quantity,
|
365
|
-
order_type,
|
304
|
+
self[:order_type], # Internal code, 'LMT' instead of :limit
|
366
305
|
limit_price,
|
367
306
|
aux_price,
|
368
|
-
tif,
|
307
|
+
self[:tif],
|
369
308
|
oca_group,
|
370
309
|
account,
|
371
|
-
open_close,
|
372
|
-
origin,
|
310
|
+
open_close.to_sup[0..0],
|
311
|
+
self[:origin],
|
373
312
|
order_ref,
|
374
313
|
transmit,
|
375
314
|
parent_id,
|
376
315
|
block_order,
|
377
316
|
sweep_to_fill,
|
378
317
|
display_size,
|
379
|
-
trigger_method,
|
318
|
+
self[:trigger_method],
|
380
319
|
outside_rth, # was: ignore_rth
|
381
320
|
hidden,
|
382
321
|
contract.serialize_legs(:extended),
|
383
322
|
|
384
|
-
#
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
#
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
323
|
+
# This is specific to PlaceOrder v.38, NOT supported by API yet!
|
324
|
+
#
|
325
|
+
## Support for per-leg prices in Order
|
326
|
+
#if server[:server_version] >= 61 && contract.bag?
|
327
|
+
# leg_prices.empty? ? 0 : [leg_prices.size] + leg_prices
|
328
|
+
#else
|
329
|
+
# []
|
330
|
+
#end,
|
331
|
+
#
|
332
|
+
## Support for combo routing params in Order
|
333
|
+
#if server[:server_version] >= 57 && contract.bag?
|
334
|
+
# p 'Here!'
|
335
|
+
# combo_params.empty? ? 0 : [combo_params.size] + combo_params.to_a
|
336
|
+
#else
|
337
|
+
# []
|
338
|
+
#end,
|
397
339
|
|
398
340
|
'', # deprecated shares_allocation field
|
399
341
|
discretionary_amount,
|
@@ -403,10 +345,10 @@ module IB
|
|
403
345
|
fa_method,
|
404
346
|
fa_percentage,
|
405
347
|
fa_profile,
|
406
|
-
short_sale_slot, #
|
348
|
+
self[:short_sale_slot], # 0 only for retail, 1 or 2 for institution (Institutional)
|
407
349
|
designated_location, # only populate when short_sale_slot == 2 (Institutional)
|
408
350
|
exempt_code,
|
409
|
-
oca_type,
|
351
|
+
self[:oca_type],
|
410
352
|
rule_80a,
|
411
353
|
settling_firm,
|
412
354
|
all_or_none,
|
@@ -415,23 +357,66 @@ module IB
|
|
415
357
|
etrade_only,
|
416
358
|
firm_quote_only,
|
417
359
|
nbbo_price_cap,
|
418
|
-
auction_strategy,
|
360
|
+
self[:auction_strategy],
|
419
361
|
starting_price,
|
420
362
|
stock_ref_price,
|
421
363
|
delta,
|
422
364
|
stock_range_lower,
|
423
365
|
stock_range_upper,
|
424
366
|
override_percentage_constraints,
|
425
|
-
volatility, #
|
426
|
-
volatility_type, #
|
427
|
-
delta_neutral_order_type,
|
428
|
-
delta_neutral_aux_price, #
|
429
|
-
|
430
|
-
|
367
|
+
volatility, # Volatility orders
|
368
|
+
self[:volatility_type], #
|
369
|
+
self[:delta_neutral_order_type],
|
370
|
+
delta_neutral_aux_price, #
|
371
|
+
|
372
|
+
# Support for delta neutral orders with parameters
|
373
|
+
if server[:server_version] >= 58 && delta_neutral_order_type
|
374
|
+
[delta_neutral_con_id,
|
375
|
+
delta_neutral_settling_firm,
|
376
|
+
delta_neutral_clearing_account,
|
377
|
+
self[:delta_neutral_clearing_intent]
|
378
|
+
]
|
379
|
+
else
|
380
|
+
[]
|
381
|
+
end,
|
382
|
+
|
383
|
+
continuous_update, # Volatility orders
|
384
|
+
self[:reference_price_type], # Volatility orders
|
385
|
+
|
431
386
|
trail_stop_price, # TRAIL_STOP_LIMIT stop price
|
387
|
+
|
388
|
+
# Support for trailing percent
|
389
|
+
server[:server_version] >= 62 ? trailing_percent : [],
|
390
|
+
|
432
391
|
scale_init_level_size, # Scale Orders
|
433
392
|
scale_subs_level_size, # Scale Orders
|
434
393
|
scale_price_increment, # Scale Orders
|
394
|
+
|
395
|
+
# Support extended scale orders parameters
|
396
|
+
if server[:server_version] >= 60 &&
|
397
|
+
scale_price_increment && scale_price_increment > 0
|
398
|
+
[scale_price_adjust_value,
|
399
|
+
scale_price_adjust_interval,
|
400
|
+
scale_profit_offset,
|
401
|
+
scale_auto_reset,
|
402
|
+
scale_init_position,
|
403
|
+
scale_init_fill_qty,
|
404
|
+
scale_random_percent
|
405
|
+
]
|
406
|
+
else
|
407
|
+
[]
|
408
|
+
end,
|
409
|
+
|
410
|
+
# TODO: Need to add support for hedgeType, not working ATM - beta only
|
411
|
+
#if (m_serverVersion >= MIN_SERVER_VER_HEDGE_ORDERS) {
|
412
|
+
# send (order.m_hedgeType);
|
413
|
+
# if (!IsEmpty(order.m_hedgeType)) send (order.m_hedgeParam);
|
414
|
+
#}
|
415
|
+
#
|
416
|
+
#if (m_serverVersion >= MIN_SERVER_VER_OPT_OUT_SMART_ROUTING) {
|
417
|
+
# send (order.m_optOutSmartRouting);
|
418
|
+
#}
|
419
|
+
|
435
420
|
clearing_account,
|
436
421
|
clearing_intent,
|
437
422
|
not_held,
|
@@ -483,9 +468,13 @@ module IB
|
|
483
468
|
end
|
484
469
|
|
485
470
|
def to_human
|
486
|
-
"<Order:
|
487
|
-
"
|
488
|
-
(
|
471
|
+
"<Order: " + ((order_ref && order_ref != '') ? "#{order_ref} " : '') +
|
472
|
+
"#{self[:order_type]} #{self[:tif]} #{side} #{total_quantity} " +
|
473
|
+
"#{status} " + (limit_price ? "#{limit_price} " : '') +
|
474
|
+
((aux_price && aux_price != 0) ? "/#{aux_price}" : '') +
|
475
|
+
"##{order_id}/#{perm_id} from #{client_id}" +
|
476
|
+
(account ? "/#{account}" : '') +
|
477
|
+
(commission ? " fee #{commission}" : '') + ">"
|
489
478
|
end
|
490
479
|
end # class Order
|
491
480
|
end # module Models
|