ib-ruby 0.8.1 → 0.8.3

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.
Files changed (128) hide show
  1. data/.gitignore +0 -1
  2. data/HISTORY +5 -0
  3. data/README.md +47 -53
  4. data/Rakefile +2 -1
  5. data/VERSION +1 -1
  6. data/app/assets/javascripts/ib/application.js +15 -0
  7. data/app/assets/javascripts/ib/underlyings.js +2 -0
  8. data/app/assets/stylesheets/ib/application.css +13 -0
  9. data/app/assets/stylesheets/ib/underlyings.css +4 -0
  10. data/app/assets/stylesheets/scaffold.css +56 -0
  11. data/app/controllers/ib/application_controller.rb +5 -0
  12. data/app/controllers/ib/underlyings_controller.rb +87 -0
  13. data/app/helpers/ib/application_helper.rb +4 -0
  14. data/app/helpers/ib/underlyings_helper.rb +4 -0
  15. data/app/models/ib/underlying.rb +5 -0
  16. data/app/views/ib/underlyings/_form.html.erb +33 -0
  17. data/app/views/ib/underlyings/edit.html.erb +6 -0
  18. data/app/views/ib/underlyings/index.html.erb +29 -0
  19. data/app/views/ib/underlyings/new.html.erb +5 -0
  20. data/app/views/ib/underlyings/show.html.erb +25 -0
  21. data/app/views/layouts/ib/application.html.erb +14 -0
  22. data/config/routes.rb +6 -0
  23. data/db/config.yml +19 -0
  24. data/db/migrate/{101_add_executions.rb → 101_add_ib_executions.rb} +2 -2
  25. data/db/migrate/{111_add_bars.rb → 111_add_ib_bars.rb} +2 -2
  26. data/db/migrate/{121_add_order_states.rb → 121_add_ib_order_states.rb} +2 -2
  27. data/db/migrate/{131_add_orders.rb → 131_add_ib_orders.rb} +2 -2
  28. data/db/migrate/{141_add_combo_legs.rb → 141_add_ib_combo_legs.rb} +2 -2
  29. data/db/migrate/{151_add_underlyings.rb → 151_add_ib_underlyings.rb} +2 -2
  30. data/db/migrate/{161_add_contract_details.rb → 161_add_ib_contract_details.rb} +2 -2
  31. data/db/migrate/{171_add_contracts.rb → 171_add_ib_contracts.rb} +2 -2
  32. data/db/schema.rb +245 -0
  33. data/lib/ib/base.rb +97 -0
  34. data/lib/ib/base_properties.rb +140 -0
  35. data/lib/{ib-ruby → ib}/connection.rb +2 -2
  36. data/lib/{ib-ruby → ib}/constants.rb +0 -0
  37. data/lib/{ib-ruby → ib}/db.rb +9 -5
  38. data/lib/ib/engine.rb +35 -0
  39. data/lib/{ib-ruby → ib}/errors.rb +0 -0
  40. data/lib/{ib-ruby → ib}/extensions.rb +2 -2
  41. data/lib/{ib-ruby → ib}/logger.rb +0 -0
  42. data/lib/{ib-ruby → ib}/messages/abstract_message.rb +0 -0
  43. data/lib/{ib-ruby → ib}/messages/incoming/abstract_message.rb +1 -1
  44. data/lib/{ib-ruby → ib}/messages/incoming/alert.rb +0 -0
  45. data/lib/{ib-ruby → ib}/messages/incoming/contract_data.rb +0 -0
  46. data/lib/{ib-ruby → ib}/messages/incoming/delta_neutral_validation.rb +0 -0
  47. data/lib/{ib-ruby → ib}/messages/incoming/execution_data.rb +0 -0
  48. data/lib/{ib-ruby → ib}/messages/incoming/historical_data.rb +0 -0
  49. data/lib/{ib-ruby → ib}/messages/incoming/market_depths.rb +0 -0
  50. data/lib/{ib-ruby → ib}/messages/incoming/next_valid_id.rb +0 -0
  51. data/lib/{ib-ruby → ib}/messages/incoming/open_order.rb +0 -0
  52. data/lib/{ib-ruby → ib}/messages/incoming/order_status.rb +0 -0
  53. data/lib/{ib-ruby → ib}/messages/incoming/portfolio_value.rb +0 -0
  54. data/lib/{ib-ruby → ib}/messages/incoming/real_time_bar.rb +0 -0
  55. data/lib/{ib-ruby → ib}/messages/incoming/scanner_data.rb +0 -0
  56. data/lib/{ib-ruby → ib}/messages/incoming/ticks.rb +0 -0
  57. data/lib/{ib-ruby → ib}/messages/incoming.rb +14 -14
  58. data/lib/{ib-ruby → ib}/messages/outgoing/abstract_message.rb +1 -1
  59. data/lib/{ib-ruby → ib}/messages/outgoing/bar_requests.rb +0 -0
  60. data/lib/{ib-ruby → ib}/messages/outgoing/place_order.rb +0 -0
  61. data/lib/{ib-ruby → ib}/messages/outgoing.rb +5 -5
  62. data/lib/ib/messages.rb +8 -0
  63. data/lib/ib/model.rb +8 -0
  64. data/lib/ib/models.rb +10 -0
  65. data/lib/ib/requires.rb +9 -0
  66. data/lib/{ib-ruby → ib}/socket.rb +0 -0
  67. data/lib/{ib-ruby → ib}/symbols/forex.rb +1 -1
  68. data/lib/{ib-ruby → ib}/symbols/futures.rb +2 -2
  69. data/lib/{ib-ruby → ib}/symbols/options.rb +1 -1
  70. data/lib/{ib-ruby → ib}/symbols/stocks.rb +1 -1
  71. data/lib/ib/symbols.rb +9 -0
  72. data/lib/{ib-ruby → ib}/version.rb +0 -0
  73. data/lib/ib-ruby.rb +2 -24
  74. data/lib/ib.rb +23 -0
  75. data/lib/models/ib/bag.rb +51 -0
  76. data/lib/models/ib/bar.rb +41 -0
  77. data/lib/models/ib/combo_leg.rb +102 -0
  78. data/lib/models/ib/contract.rb +287 -0
  79. data/lib/models/ib/contract_detail.rb +68 -0
  80. data/lib/models/ib/execution.rb +62 -0
  81. data/lib/models/ib/option.rb +60 -0
  82. data/lib/models/ib/order.rb +389 -0
  83. data/lib/models/ib/order_state.rb +126 -0
  84. data/lib/models/ib/underlying.rb +35 -0
  85. data/spec/README.md +34 -2
  86. data/spec/TODO +5 -1
  87. data/spec/comb.rb +13 -0
  88. data/spec/db.rb +1 -1
  89. data/spec/db_helper.rb +3 -3
  90. data/spec/dummy.rb +13 -0
  91. data/spec/gw.rb +4 -0
  92. data/spec/{ib-ruby → ib}/connection_spec.rb +0 -0
  93. data/spec/{ib-ruby → ib}/messages/incoming/alert_spec.rb +0 -0
  94. data/spec/{ib-ruby → ib}/messages/incoming/open_order_spec.rb +0 -0
  95. data/spec/{ib-ruby → ib}/messages/incoming/order_status_spec.rb +16 -17
  96. data/spec/{ib-ruby → ib}/messages/outgoing/account_data_spec.rb +0 -0
  97. data/spec/{ib-ruby → ib}/messages/outgoing/market_data_type_spec.rb +0 -0
  98. data/spec/integration/historic_data_spec.rb +3 -3
  99. data/spec/integration/orders/trades_spec.rb +1 -1
  100. data/spec/{ib-ruby/models → models/ib}/bag_spec.rb +2 -7
  101. data/spec/{ib-ruby/models → models/ib}/bar_spec.rb +1 -6
  102. data/spec/{ib-ruby/models → models/ib}/combo_leg_spec.rb +2 -12
  103. data/spec/{ib-ruby/models → models/ib}/contract_detail_spec.rb +3 -8
  104. data/spec/{ib-ruby/models → models/ib}/contract_spec.rb +4 -12
  105. data/spec/{ib-ruby/models → models/ib}/execution_spec.rb +2 -7
  106. data/spec/{ib-ruby/models → models/ib}/option_spec.rb +1 -6
  107. data/spec/{ib-ruby/models → models/ib}/order_spec.rb +5 -10
  108. data/spec/{ib-ruby/models → models/ib}/order_state_spec.rb +2 -7
  109. data/spec/{ib-ruby/models → models/ib}/underlying_spec.rb +3 -7
  110. data/spec/my.rb +5 -0
  111. data/spec/spec_helper.rb +62 -36
  112. metadata +417 -544
  113. data/lib/ib-ruby/messages.rb +0 -8
  114. data/lib/ib-ruby/models/bag.rb +0 -54
  115. data/lib/ib-ruby/models/bar.rb +0 -43
  116. data/lib/ib-ruby/models/combo_leg.rb +0 -104
  117. data/lib/ib-ruby/models/contract.rb +0 -287
  118. data/lib/ib-ruby/models/contract_detail.rb +0 -70
  119. data/lib/ib-ruby/models/execution.rb +0 -64
  120. data/lib/ib-ruby/models/model.rb +0 -105
  121. data/lib/ib-ruby/models/model_properties.rb +0 -146
  122. data/lib/ib-ruby/models/option.rb +0 -62
  123. data/lib/ib-ruby/models/order.rb +0 -389
  124. data/lib/ib-ruby/models/order_state.rb +0 -128
  125. data/lib/ib-ruby/models/underlying.rb +0 -36
  126. data/lib/ib-ruby/models.rb +0 -15
  127. data/lib/ib-ruby/symbols.rb +0 -9
  128. data/spec/test.rb +0 -61
@@ -1,389 +0,0 @@
1
- module IB
2
- module Models
3
- class Order < Model.for(:order)
4
- include ModelProperties
5
-
6
- # General Notes:
7
- # 1. Placing Orders by con_id - When you place an order by con_id, you must
8
- # provide the con_id AND the exchange. If you provide extra fields when placing
9
- # an order by conid, the order may not work.
10
-
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.
13
-
14
- # Main order fields
15
- prop :local_id, # int: Order id associated with client (volatile).
16
- :client_id, # int: The id of the client that placed this order.
17
- :perm_id, # int: TWS permanent id, remains the same over TWS sessions.
18
- [:quantity, :total_quantity], # int: The order quantity.
19
-
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.
28
-
29
- :limit_price, # double: LIMIT price, used for limit, stop-limit and relative
30
- # orders. In all other cases specify zero. For relative
31
- # orders with no limit price, also specify zero.
32
-
33
- :aux_price, # double: STOP price for stop-limit orders, and the OFFSET amount
34
- # for relative orders. In all other cases, specify zero.
35
-
36
- :oca_group, # String: Identifies a member of a one-cancels-all group.
37
- :oca_type, # int: Tells how to handle remaining orders in an OCA group
38
- # when one order or part of an order executes. Valid values:
39
- # - 1 = Cancel all remaining orders with block
40
- # - 2 = Remaining orders are reduced in size with block
41
- # - 3 = Remaining orders are reduced in size with no block
42
- # If you use a value "with block" your order has
43
- # overfill protection. This means that only one order in
44
- # the group will be routed at a time to remove the
45
- # possibility of an overfill.
46
- :parent_id, # int: The order ID of the parent (original) order, used
47
- # for bracket (STP) and auto trailing stop (TRAIL) orders.
48
- :display_size, # int: publicly disclosed order size for Iceberg orders.
49
-
50
- :trigger_method, # Specifies how Simulated Stop, Stop-Limit and Trailing
51
- # Stop orders are triggered. Valid values are:
52
- # 0 - Default, "double bid/ask" for OTC/US options, "last" otherswise.
53
- # 1 - "double bid/ask" method, stop orders are triggered based on
54
- # two consecutive bid or ask prices.
55
- # 2 - "last" method, stops are triggered based on the last price.
56
- # 3 - double last method.
57
- # 4 - bid/ask method. For a buy order, a single occurrence of the
58
- # bid price must be at or above the trigger price. For a sell
59
- # order, a single occurrence of the ask price must be at or
60
- # below the trigger price.
61
- # 7 - last or bid/ask method. For a buy order, a single bid price
62
- # or the last price must be at or above the trigger price.
63
- # For a sell order, a single ask price or the last price
64
- # must be at or below the trigger price.
65
- # 8 - mid-point method, where the midpoint must be at or above
66
- # (for a buy) or at or below (for a sell) the trigger price,
67
- # and the spread between the bid and ask must be less than
68
- # 0.1% of the midpoint
69
-
70
- :good_after_time, # Indicates that the trade should be submitted after the
71
- # time and date set, format YYYYMMDD HH:MM:SS (seconds are optional).
72
- :good_till_date, # Indicates that the trade should remain working until the
73
- # time and date set, format YYYYMMDD HH:MM:SS (seconds are optional).
74
- # You must set the :tif to GTD when using this string.
75
- # Use an empty String if not applicable.
76
-
77
- :rule_80a, # Individual = 'I', Agency = 'A', AgentOtherMember = 'W',
78
- # IndividualPTIA = 'J', AgencyPTIA = 'U', AgentOtherMemberPTIA = 'M',
79
- # IndividualPT = 'K', AgencyPT = 'Y', AgentOtherMemberPT = 'N'
80
- :min_quantity, # int: Identifies a minimum quantity order type.
81
- :percent_offset, # double: percent offset amount for relative (REL)orders only
82
- :trail_stop_price, # double: for TRAILLIMIT orders only
83
- # As of client v.56, we receive trailing_percent in openOrder
84
- :trailing_percent,
85
-
86
- # Financial advisors only - use an empty String if not applicable.
87
- :fa_group, :fa_profile, :fa_method, :fa_percentage,
88
-
89
- # Institutional orders only!
90
- :origin, # 0=Customer, 1=Firm
91
- :order_ref, # String: Order reference. Customer defined order ID tag.
92
- :short_sale_slot, # 1 - you hold the shares,
93
- # 2 - they will be delivered from elsewhere.
94
- # Only for Action="SSHORT
95
- :designated_location, # String: set when slot==2 only
96
- :exempt_code, # int
97
-
98
- # Clearing info
99
- :account, # String: The account. For institutional customers only.
100
- :settling_firm, # String: Institutional only
101
- :clearing_account, # String: For IBExecution customers: Specifies the
102
- # true beneficiary of the order. This value is required
103
- # for FUT/FOP orders for reporting to the exchange.
104
- :clearing_intent, # IBExecution customers: "", IB, Away, PTA (post trade allocation).
105
-
106
- # SMART routing only
107
- :discretionary_amount, # double: The amount off the limit price
108
- # allowed for discretionary orders.
109
- :nbbo_price_cap, # double: Maximum Smart order distance from the NBBO.
110
-
111
- # BOX or VOL ORDERS ONLY
112
- :auction_strategy, # For BOX exchange only. Valid values:
113
- # 1=AUCTION_MATCH, 2=AUCTION_IMPROVEMENT, 3=AUCTION_TRANSPARENT
114
- :starting_price, # double: Starting price. Valid on BOX orders only.
115
- :stock_ref_price, # double: The stock reference price, used for VOL
116
- # orders to compute the limit price sent to an exchange (whether or not
117
- # Continuous Update is selected), and for price range monitoring.
118
- :delta, # double: Stock delta. Valid on BOX orders only.
119
-
120
- # Pegged to stock or VOL orders. For price improvement option orders
121
- # on BOX and VOL orders with dynamic management:
122
- :stock_range_lower, # double: The lower value for the acceptable
123
- # underlying stock price range.
124
- :stock_range_upper, # double The upper value for the acceptable
125
- # underlying stock price range.
126
-
127
- # VOLATILITY ORDERS ONLY:
128
- # http://www.interactivebrokers.com/en/general/education/pdfnotes/PDF-VolTrader.php
129
- :volatility, # double: What the price is, computed via TWSs Options
130
- # Analytics. For VOL orders, the limit price sent to an
131
- # exchange is not editable, as it is the output of a
132
- # function. Volatility is expressed as a percentage.
133
- :volatility_type, # int: How the volatility is calculated: 1=daily, 2=annual
134
- :reference_price_type, # int: For dynamic management of volatility orders:
135
- # - 1 = Average of National Best Bid or Ask,
136
- # - 2 = National Best Bid when buying a call or selling a put;
137
- # and National Best Ask when selling a call or buying a put.
138
- :continuous_update, # int: Used for dynamic management of volatility orders.
139
- # Determines whether TWS is supposed to update the order price as the underlying
140
- # moves. If selected, the limit price sent to an exchange is modified by TWS
141
- # if the computed price of the option changes enough to warrant doing so. This
142
- # is helpful in keeping the limit price up to date as the underlying price changes.
143
- :delta_neutral_order_type, # String: Enter an order type to instruct TWS
144
- # to submit a delta neutral trade on full or partial execution of the
145
- # VOL order. For no hedge delta order to be sent, specify NONE.
146
- # Valid values - LMT, MKT, MTL, REL, MOC
147
- :delta_neutral_aux_price, # double: Use this field to enter a value if
148
- # the value in the deltaNeutralOrderType field is an order
149
- # type that requires an Aux price, such as a REL order.
150
-
151
- # As of client v.52, we also receive delta... params in openOrder
152
- :delta_neutral_con_id,
153
- :delta_neutral_settling_firm,
154
- :delta_neutral_clearing_account,
155
- :delta_neutral_clearing_intent,
156
-
157
- # HEDGE ORDERS ONLY:
158
- # As of client v.49/50, we can now add hedge orders using the API.
159
- # Hedge orders are child orders that take additional fields. There are four
160
- # types of hedging orders supported by the API: Delta, Beta, FX, Pair.
161
- # All hedge orders must have a parent order submitted first. The hedge order
162
- # should set its :parent_id. If the hedgeType is Beta, the beta sent in the
163
- # hedgeParm can be zero, which means it is not used. Delta is only valid
164
- # if the parent order is an option and the child order is a stock.
165
-
166
- :hedge_type, # String: D = Delta, B = Beta, F = FX or P = Pair
167
- :hedge_param, # String; value depends on the hedgeType; sent from the API
168
- # only if hedge_type is NOT null. It is required for Pair hedge order,
169
- # optional for Beta hedge orders, and ignored for Delta and FX hedge orders.
170
-
171
- # COMBO ORDERS ONLY:
172
- :basis_points, # double: EFP orders only
173
- :basis_points_type, # double: EFP orders only
174
-
175
- # ALGO ORDERS ONLY:
176
- :algo_strategy, # String
177
- :algo_params, # public Vector<TagValue> m_algoParams; ?!
178
-
179
- # SCALE ORDERS ONLY:
180
- :scale_init_level_size, # int: Size of the first (initial) order component.
181
- :scale_subs_level_size, # int: Order size of the subsequent scale order
182
- # components. Used in conjunction with scaleInitLevelSize().
183
- :scale_price_increment, # double: Price increment between scale components.
184
- # This field is required for Scale orders.
185
-
186
- # As of client v.54, we can receive additional scale order fields:
187
- :scale_price_adjust_value,
188
- :scale_price_adjust_interval,
189
- :scale_profit_offset,
190
- :scale_init_position,
191
- :scale_init_fill_qty,
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
- prop :placed_at,
217
- :modified_at,
218
- :leg_prices,
219
- :algo_params,
220
- :combo_params
221
-
222
- alias order_combo_legs leg_prices
223
- alias smart_combo_routing_params combo_params
224
-
225
- serialize :leg_prices
226
- serialize :algo_params, Hash
227
- serialize :combo_params
228
-
229
- # Order is always placed for a contract. Here, we explicitly set this link.
230
- belongs_to :contract
231
-
232
- # Order has a collection of Executions if it was filled
233
- has_many :executions
234
-
235
- # Order has a collection of OrderStates, last one is always current
236
- has_many :order_states
237
-
238
- def order_state
239
- order_states.last
240
- end
241
-
242
- def order_state= state
243
- self.order_states.push case state
244
- when IB::OrderState
245
- state
246
- when Symbol, String
247
- IB::OrderState.new :status => state
248
- end
249
- end
250
-
251
- # Some properties received from IB are separated into OrderState object,
252
- # but they are still readable as Order properties through delegation:
253
- # Properties arriving via OpenOrder message:
254
- [:commission, # double: Shows the commission amount on the order.
255
- :commission_currency, # String: Shows the currency of the commission.
256
- :min_commission, # The possible min range of the actual order commission.
257
- :max_commission, # The possible max range of the actual order commission.
258
- :warning_text, # String: Displays a warning message if warranted.
259
- :init_margin, # Float: The impact the order would have on your initial margin.
260
- :maint_margin, # Float: The impact the order would have on your maintenance margin.
261
- :equity_with_loan, # Float: The impact the order would have on your equity
262
- :status, # String: Displays the order status. See OrderState for values
263
- # Properties arriving via OrderStatus message:
264
- :filled, # int
265
- :remaining, # int
266
- :price, # double
267
- :last_fill_price, # double
268
- :average_price, # double
269
- :average_fill_price, # double
270
- :why_held, # String: comma-separated list of reasons for order to be held.
271
- # Testing Order state:
272
- :new?,
273
- :submitted?,
274
- :pending?,
275
- :active?,
276
- :inactive?,
277
- :complete_fill?,
278
- ].each { |property| define_method(property) { order_state.send(property) } }
279
-
280
- # Order is not valid without correct :local_id
281
- validates_numericality_of :local_id, :perm_id, :client_id, :parent_id,
282
- :quantity, :min_quantity, :display_size,
283
- :only_integer => true, :allow_nil => true
284
-
285
- validates_numericality_of :limit_price, :aux_price, :allow_nil => true
286
-
287
-
288
- def default_attributes
289
- super.merge :aux_price => 0.0,
290
- :discretionary_amount => 0.0,
291
- :parent_id => 0,
292
- :tif => :day,
293
- :order_type => :limit,
294
- :open_close => :open,
295
- :origin => :customer,
296
- :short_sale_slot => :default,
297
- :trigger_method => :default,
298
- :oca_type => :none,
299
- :auction_strategy => :none,
300
- :designated_location => '',
301
- :exempt_code => -1,
302
- :display_size => 0,
303
- :continuous_update => 0,
304
- :delta_neutral_con_id => 0,
305
- :algo_strategy => '',
306
- :transmit => true,
307
- :what_if => false,
308
- :leg_prices => [],
309
- :algo_params => HashWithIndifferentAccess.new, #{},
310
- :combo_params => HashWithIndifferentAccess.new, #{},
311
- :order_state => IB::OrderState.new(:status => 'New',
312
- :filled => 0,
313
- :remaining => 0,
314
- :price => 0,
315
- :average_price => 0)
316
- end
317
-
318
- def serialize_algo
319
- if algo_strategy.nil? || algo_strategy.empty?
320
- ''
321
- else
322
- [algo_strategy,
323
- algo_params.size,
324
- algo_params.to_a]
325
- end
326
- end
327
-
328
- # Placement
329
- def place contract, connection
330
- error "Unable to place order, next_local_id not known" unless connection.next_local_id
331
- self.client_id = connection.server[:client_id]
332
- self.local_id = connection.next_local_id
333
- connection.next_local_id += 1
334
- self.placed_at = Time.now
335
- modify contract, connection, self.placed_at
336
- end
337
-
338
- # Modify Order (convenience wrapper for send_message :PlaceOrder). Returns local_id.
339
- def modify contract, connection, time=Time.now
340
- self.modified_at = time
341
- connection.send_message :PlaceOrder,
342
- :order => self,
343
- :contract => contract,
344
- :local_id => local_id
345
- local_id
346
- end
347
-
348
- # Order comparison
349
- def == other
350
- perm_id && other.perm_id && perm_id == other.perm_id ||
351
- local_id == other.local_id && # ((p __LINE__)||true) &&
352
- (client_id == other.client_id || client_id == 0 || other.client_id == 0) &&
353
- parent_id == other.parent_id &&
354
- tif == other.tif &&
355
- action == other.action &&
356
- order_type == other.order_type &&
357
- quantity == other.quantity &&
358
- (limit_price == other.limit_price || # TODO Floats should be Decimals!
359
- (limit_price - other.limit_price).abs < 0.00001) &&
360
- aux_price == other.aux_price &&
361
- origin == other.origin &&
362
- designated_location == other.designated_location &&
363
- exempt_code == other.exempt_code &&
364
- what_if == other.what_if &&
365
- algo_strategy == other.algo_strategy &&
366
- algo_params == other.algo_params
367
-
368
- # TODO: || compare all attributes!
369
- end
370
-
371
- def to_s #human
372
- "<Order:" + instance_variables.map do |key|
373
- value = instance_variable_get(key)
374
- " #{key}=#{value}" unless value.nil? || value == '' || value == 0
375
- end.compact.join(',') + " >"
376
- end
377
-
378
- def to_human
379
- "<Order: " + ((order_ref && order_ref != '') ? "#{order_ref} " : '') +
380
- "#{self[:order_type]} #{self[:tif]} #{side} #{quantity} " +
381
- "#{status} " + (limit_price ? "#{limit_price} " : '') +
382
- ((aux_price && aux_price != 0) ? "/#{aux_price}" : '') +
383
- "##{local_id}/#{perm_id} from #{client_id}" +
384
- (account ? "/#{account}" : '') +
385
- (commission ? " fee #{commission}" : '') + ">"
386
- end
387
- end # class Order
388
- end # module Models
389
- end # module IB
@@ -1,128 +0,0 @@
1
- module IB
2
- module Models
3
-
4
- # OrderState represents dynamic (changeable) info about a single Order,
5
- # isolating these changes and making Order essentially immutable
6
- class OrderState < Model.for(:order_state)
7
- include ModelProperties
8
-
9
- #p column_names
10
- belongs_to :order
11
-
12
- # Properties arriving via OpenOrder message
13
- prop :init_margin, # Float: The impact the order would have on your initial margin.
14
- :maint_margin, # Float: The impact the order would have on your maintenance margin.
15
- :equity_with_loan, # Float: The impact the order would have on your equity
16
- :commission, # double: Shows the commission amount on the order.
17
- :min_commission, # The possible min range of the actual order commission.
18
- :max_commission, # The possible max range of the actual order commission.
19
- :commission_currency, # String: Shows the currency of the commission.
20
- :warning_text # String: Displays a warning message if warranted.
21
-
22
- # Properties arriving via OrderStatus message:
23
- prop :filled, # int
24
- :remaining, # int
25
- [:price, :last_fill_price,], # double
26
- [:average_price, :average_fill_price], # double
27
- :why_held # String: comma-separated list of reasons for order to be held.
28
-
29
- # Properties arriving in both messages:
30
- prop :local_id, # int: Order id associated with client (volatile).
31
- :perm_id, # int: TWS permanent id, remains the same over TWS sessions.
32
- :client_id, # int: The id of the client that placed this order.
33
- :parent_id, # int: The order ID of the parent (original) order, used
34
- :status => :s # String: Displays the order status. Possible values include:
35
- # - PendingSubmit - indicates that you have transmitted the order, but
36
- # have not yet received confirmation that it has been accepted by the
37
- # order destination. NOTE: This order status is NOT sent back by TWS
38
- # and should be explicitly set by YOU when an order is submitted.
39
- # - PendingCancel - indicates that you have sent a request to cancel
40
- # the order but have not yet received cancel confirmation from the
41
- # order destination. At this point, your order cancel is not confirmed.
42
- # You may still receive an execution while your cancellation request
43
- # is pending. NOTE: This order status is not sent back by TWS and
44
- # should be explicitly set by YOU when an order is canceled.
45
- # - PreSubmitted - indicates that a simulated order type has been
46
- # accepted by the IB system and that this order has yet to be elected.
47
- # The order is held in the IB system until the election criteria are
48
- # met. At that time the order is transmitted to the order destination
49
- # as specified.
50
- # - Submitted - indicates that your order has been accepted at the order
51
- # destination and is working.
52
- # - Cancelled - indicates that the balance of your order has been
53
- # confirmed canceled by the IB system. This could occur unexpectedly
54
- # when IB or the destination has rejected your order.
55
- # - ApiCancelled - canceled via API
56
- # - Filled - indicates that the order has been completely filled.
57
- # - Inactive - indicates that the order has been accepted by the system
58
- # (simulated orders) or an exchange (native orders) but that currently
59
- # the order is inactive due to system, exchange or other issues.
60
-
61
- validates_format_of :status, :without => /^$/, :message => 'must not be empty'
62
- validates_numericality_of :price, :average_price, :allow_nil => true
63
- validates_numericality_of :local_id, :perm_id, :client_id, :parent_id, :filled,
64
- :remaining, :only_integer => true, :allow_nil => true
65
-
66
- ## Testing Order state:
67
-
68
- def new?
69
- status.empty? || status == 'New'
70
- end
71
-
72
- # Order is in a valid, working state on TWS side
73
- def submitted?
74
- status == 'PreSubmitted' || status == 'Submitted'
75
- end
76
-
77
- # Order is in a valid, working state on TWS side
78
- def pending?
79
- submitted? || status == 'PendingSubmit'
80
- end
81
-
82
- # Order is in invalid state
83
- def active?
84
- new? || pending?
85
- end
86
-
87
- # Order is in invalid state
88
- def inactive?
89
- !active? # status == 'Inactive'
90
- end
91
-
92
- def complete_fill?
93
- status == 'Filled' && remaining == 0 # filled >= total_quantity # Manually corrected
94
- end
95
-
96
- # Comparison
97
- def == other
98
- other && other.is_a?(OrderState) &&
99
- status == other.status &&
100
- local_id == other.local_id &&
101
- perm_id == other.perm_id &&
102
- client_id == other.client_id &&
103
- filled == other.filled &&
104
- remaining == other.remaining &&
105
- last_fill_price == other.last_fill_price &&
106
- init_margin == other.init_margin &&
107
- maint_margin == other.maint_margin &&
108
- equity_with_loan == other.equity_with_loan &&
109
- why_held == other.why_held &&
110
- warning_text == other.warning_text &&
111
- commission == other.commission
112
- end
113
-
114
- def to_human
115
- "<OrderState: #{status} ##{local_id}/#{perm_id} from #{client_id}" +
116
- (filled ? " filled #{filled}/#{remaining}" : '') +
117
- (last_fill_price ? " at #{last_fill_price}/#{average_fill_price}" : '') +
118
- (init_margin ? " margin #{init_margin}/#{maint_margin}" : '') +
119
- (equity_with_loan ? " equity #{equity_with_loan}" : '') +
120
- (commission && commission > 0 ? " fee #{commission}" : "") +
121
- (why_held ? " why_held #{why_held}" : '') +
122
- ((warning_text && warning_text != '') ? " warning #{warning_text}" : '') + ">"
123
- end
124
-
125
- alias to_s to_human
126
- end # class Order
127
- end # module Models
128
- end # module IB
@@ -1,36 +0,0 @@
1
- require 'ib-ruby/models/contract_detail'
2
-
3
- module IB
4
- module Models
5
-
6
- # Calculated characteristics of underlying Contract (volatile)
7
- class Underlying < Model.for(:underlying)
8
- include ModelProperties
9
-
10
- has_one :contract
11
-
12
- prop :con_id, # Id of the Underlying Contract
13
- :delta, # double: The underlying stock or future delta.
14
- :price # double: The price of the underlying.
15
-
16
- validates_numericality_of :con_id, :delta, :price #, :allow_nil => true
17
-
18
- def default_attributes
19
- super.merge :con_id => 0
20
- end
21
-
22
- # Serialize under_comp parameters
23
- def serialize
24
- [true, con_id, delta, price]
25
- end
26
-
27
- # Comparison
28
- def == other
29
- con_id == other.con_id && delta == other.delta && price == other.price
30
- end
31
-
32
- end # class Contract
33
- UnderComp = Underlying
34
-
35
- end # module Models
36
- end # module IB
@@ -1,15 +0,0 @@
1
- module IB
2
- module Models
3
-
4
- require 'ib-ruby/models/model_properties'
5
- require 'ib-ruby/models/model'
6
-
7
- require 'ib-ruby/models/contract'
8
- require 'ib-ruby/models/order_state'
9
- require 'ib-ruby/models/order'
10
- require 'ib-ruby/models/combo_leg'
11
- require 'ib-ruby/models/execution'
12
- require 'ib-ruby/models/bar'
13
- end
14
- end
15
-
@@ -1,9 +0,0 @@
1
- module IB
2
- module Symbols
3
- end
4
- end
5
-
6
- require 'ib-ruby/symbols/forex'
7
- require 'ib-ruby/symbols/futures'
8
- require 'ib-ruby/symbols/stocks'
9
- require 'ib-ruby/symbols/options'
data/spec/test.rb DELETED
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- # This script retrieves list of all Orders from TWS
4
-
5
- require 'rubygems'
6
- require 'bundler/setup'
7
- $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
8
-
9
- require 'yaml'
10
- require 'pathname'
11
- require 'ib-ruby/db'
12
-
13
- # Load DB config, determine correct environment
14
- db_file = Pathname.new(__FILE__).realpath.dirname + '../db/config.yml'
15
- raise "Unable to find DB config file: #{db_file}" unless db_file.exist?
16
-
17
- env = RUBY_PLATFORM =~ /java/ ? 'test' : 'test-mri'
18
- db_config = YAML::load_file(db_file)[env]
19
-
20
- # Establish connection to test DB
21
- IB::DB.connect db_config
22
-
23
- require 'ib-ruby'
24
-
25
- # Connect to IB as 0 (TWS) to retrieve all Orders, including TWS-generated ones
26
- ib = IB::Connection.new :client_id => 0 #, :port => 7496 # TWS
27
-
28
- ## Subscribe to TWS alerts/errors and order-related messages
29
- #@counter = 0
30
- #
31
- #ib.subscribe(:Alert, :OrderStatus, :OpenOrderEnd) { |msg| puts msg.to_human }
32
- #
33
- #ib.subscribe(:OpenOrder) do |msg|
34
- # @counter += 1
35
- # puts "#{@counter}: #{msg.to_human}"
36
- # #pp msg.order
37
- #end
38
- #
39
- #ib.send_message :RequestAllOpenOrders
40
- #
41
- ## Wait for IB to respond to our request
42
- #ib.wait_for :OpenOrderEnd
43
- #sleep 1 # Let printer do the job
44
-
45
- combo = IB::Bag.new
46
-
47
- google = IB::Option.new(:symbol => 'GOOG',
48
- :expiry => 201301,
49
- :right => :call,
50
- :strike => 500)
51
-
52
- combo.leg_contracts << google
53
- p combo.leg_contracts
54
- p combo.save
55
-
56
- #combo.legs.should_not be_empty
57
- p combo.leg_contracts
58
- p google.combo
59
-
60
- leg = combo.legs.first
61
- p google.leg