ib-ruby 0.5.9 → 0.5.10

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -81,3 +81,7 @@
81
81
  == 0.5.9 / 2011-12-16
82
82
 
83
83
  * Sample scripts to place and cancel orders added
84
+
85
+ == 0.5.10 / 2011-12-19
86
+
87
+ * Bag Contract subclass added
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.9
1
+ 0.5.10
data/bin/depth_of_market CHANGED
@@ -15,7 +15,7 @@ require 'ib-ruby'
15
15
  # corresponds to what symbol ourselves, because the ticks don't include any other
16
16
  # identifying information. The choice of ticker ids is, as far as I can tell, arbitrary.
17
17
  @market = {123 => IB::Symbols::Stocks[:wfc],
18
- 456 => IB::Symbols::Futures[:ym],
18
+ 456 => IB::Symbols::Futures[:es],
19
19
  789 => IB::Symbols::Forex[:gbpusd]
20
20
  }
21
21
 
data/bin/global_cancel CHANGED
@@ -14,8 +14,7 @@ require 'ib-ruby'
14
14
  # First, connect to IB TWS.
15
15
  ib = IB::Connection.new
16
16
 
17
- # Subscribe to TWS alerts/errors and account-related messages
18
- # that TWS sends in response to account data request
17
+ # Subscribe to TWS alerts/errors and order-related messages
19
18
  ib.subscribe(:Alert, :OpenOrder, :OrderStatus) { |msg| puts msg.to_human }
20
19
 
21
20
  ib.send_message :RequestGlobalCancel
data/bin/list_orders ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This script connects to IB API, subscribes to account info and prints out
4
+ # messages received from IB (update every 3 minute or so)
5
+
6
+ require 'pathname'
7
+ LIB_DIR = (Pathname.new(__FILE__).dirname + '../lib/').realpath.to_s
8
+ $LOAD_PATH.unshift LIB_DIR unless $LOAD_PATH.include?(LIB_DIR)
9
+
10
+ require 'rubygems'
11
+ require 'bundler/setup'
12
+ require 'ib-ruby'
13
+
14
+ # First, connect to IB TWS.
15
+ ib = IB::Connection.new :client_id => 0
16
+
17
+ # Subscribe to TWS alerts/errors and order-related messages
18
+ ib.subscribe(:Alert, :OpenOrder, :OrderStatus) { |msg| puts msg.to_human }
19
+
20
+ ib.send_message :RequestAllOpenOrders
21
+
22
+ puts "\n******** Press <Enter> to cancel... *********\n\n"
23
+ gets
data/bin/place_order CHANGED
@@ -14,8 +14,7 @@ require 'ib-ruby'
14
14
  # First, connect to IB TWS.
15
15
  ib = IB::Connection.new
16
16
 
17
- # Subscribe to TWS alerts/errors and account-related messages
18
- # that TWS sends in response to account data request
17
+ # Subscribe to TWS alerts/errors and order-related messages
19
18
  ib.subscribe(:Alert, :OpenOrder, :OrderStatus) { |msg| puts msg.to_human }
20
19
 
21
20
  wfc = IB::Symbols::Stocks[:wfc]
@@ -108,7 +108,14 @@ module IB
108
108
  [:parent_id, :int],
109
109
  [:last_fill_price, :decimal],
110
110
  [:client_id, :int],
111
- [:why_held, :string]
111
+ [:why_held, :string] do
112
+ "<OrderStatus: #{@data[:status]} filled: #{@data[:filled]}/#{@data[:remaining]+@data[:filled]}" +
113
+ " @ last/avg: #{@data[:last_fill_price]}/#{@data[:average_fill_price]}" +
114
+ (@data[:parent_id] > 0 ? "parent_id: #{@data[:parent_id]}" : "") +
115
+ (@data[:why_held] != "" ? "why_held: #{@data[:why_held]}" : "") +
116
+ " id/perm: #{@data[:id]}/#{@data[:perm_id]}>"
117
+ end
118
+
112
119
 
113
120
  AccountValue = def_message(6, [:key, :string],
114
121
  [:value, :string],
@@ -364,15 +371,15 @@ module IB
364
371
 
365
372
  @order = Models::Order.new :id => @socket.read_int
366
373
 
367
- @contract = Models::Contract.new :con_id => @socket.read_string,
368
- :symbol => @socket.read_string,
369
- :sec_type => @socket.read_string,
370
- :expiry => @socket.read_string,
371
- :strike => @socket.read_decimal,
372
- :right => @socket.read_string,
373
- :exchange => @socket.read_string,
374
- :currency => @socket.read_string,
375
- :local_symbol => @socket.read_string
374
+ @contract = Models::Contract.build :con_id => @socket.read_string,
375
+ :symbol => @socket.read_string,
376
+ :sec_type => @socket.read_string,
377
+ :expiry => @socket.read_string,
378
+ :strike => @socket.read_decimal,
379
+ :right => @socket.read_string,
380
+ :exchange => @socket.read_string,
381
+ :currency => @socket.read_string,
382
+ :local_symbol => @socket.read_string
376
383
 
377
384
  @order.action = @socket.read_string
378
385
  @order.total_quantity = @socket.read_int
@@ -474,6 +481,10 @@ module IB
474
481
  @order.commission_currency = @socket.read_string
475
482
  @order.warning_text = @socket.read_string
476
483
  end
484
+
485
+ def to_human
486
+ "<OpenOrder: #{@contract.to_human} #{@order.to_human}>"
487
+ end
477
488
  end # OpenOrder
478
489
 
479
490
  class PortfolioValue < AbstractMessage
@@ -484,16 +495,16 @@ module IB
484
495
  def load
485
496
  super
486
497
 
487
- @contract = Models::Contract.new :con_id => @socket.read_int,
488
- :symbol => @socket.read_string,
489
- :sec_type => @socket.read_string,
490
- :expiry => @socket.read_string,
491
- :strike => @socket.read_decimal,
492
- :right => @socket.read_string,
493
- :multiplier => @socket.read_string,
494
- :primary_exchange => @socket.read_string,
495
- :currency => @socket.read_string,
496
- :local_symbol => @socket.read_string
498
+ @contract = Models::Contract.build :con_id => @socket.read_int,
499
+ :symbol => @socket.read_string,
500
+ :sec_type => @socket.read_string,
501
+ :expiry => @socket.read_string,
502
+ :strike => @socket.read_decimal,
503
+ :right => @socket.read_string,
504
+ :multiplier => @socket.read_string,
505
+ :primary_exchange => @socket.read_string,
506
+ :currency => @socket.read_string,
507
+ :local_symbol => @socket.read_string
497
508
  load_map [:position, :int],
498
509
  [:market_price, :decimal],
499
510
  [:market_value, :decimal],
@@ -521,34 +532,34 @@ module IB
521
532
  load_map [:id, :int] # request id
522
533
 
523
534
  @contract =
524
- Models::Contract.new :symbol => @socket.read_string,
525
- :sec_type => @socket.read_string,
526
- :expiry => @socket.read_string,
527
- :strike => @socket.read_decimal,
528
- :right => @socket.read_string,
529
- :exchange => @socket.read_string,
530
- :currency => @socket.read_string,
531
- :local_symbol => @socket.read_string,
532
-
533
- :market_name => @socket.read_string,
534
- :trading_class => @socket.read_string,
535
- :con_id => @socket.read_int,
536
- :min_tick => @socket.read_decimal,
537
- :multiplier => @socket.read_string,
538
- :order_types => @socket.read_string,
539
- :valid_exchanges => @socket.read_string,
540
- :price_magnifier => @socket.read_int,
541
-
542
- :under_con_id => @socket.read_int,
543
- :long_name => @socket.read_string,
544
- :primary_exchange => @socket.read_string,
545
- :contract_month => @socket.read_string,
546
- :industry => @socket.read_string,
547
- :category => @socket.read_string,
548
- :subcategory => @socket.read_string,
549
- :time_zone => @socket.read_string,
550
- :trading_hours => @socket.read_string,
551
- :liquid_hours => @socket.read_string
535
+ Models::Contract.build :symbol => @socket.read_string,
536
+ :sec_type => @socket.read_string,
537
+ :expiry => @socket.read_string,
538
+ :strike => @socket.read_decimal,
539
+ :right => @socket.read_string,
540
+ :exchange => @socket.read_string,
541
+ :currency => @socket.read_string,
542
+ :local_symbol => @socket.read_string,
543
+
544
+ :market_name => @socket.read_string,
545
+ :trading_class => @socket.read_string,
546
+ :con_id => @socket.read_int,
547
+ :min_tick => @socket.read_decimal,
548
+ :multiplier => @socket.read_string,
549
+ :order_types => @socket.read_string,
550
+ :valid_exchanges => @socket.read_string,
551
+ :price_magnifier => @socket.read_int,
552
+
553
+ :under_con_id => @socket.read_int,
554
+ :long_name => @socket.read_string,
555
+ :primary_exchange => @socket.read_string,
556
+ :contract_month => @socket.read_string,
557
+ :industry => @socket.read_string,
558
+ :category => @socket.read_string,
559
+ :subcategory => @socket.read_string,
560
+ :time_zone => @socket.read_string,
561
+ :trading_hours => @socket.read_string,
562
+ :liquid_hours => @socket.read_string
552
563
  end
553
564
  end # ContractData
554
565
  ContractDetails = ContractData
@@ -564,15 +575,15 @@ module IB
564
575
  [:order_id, :int]
565
576
 
566
577
  @contract =
567
- Models::Contract.new :con_id => @socket.read_int,
568
- :symbol => @socket.read_string,
569
- :sec_type => @socket.read_string,
570
- :expiry => @socket.read_string,
571
- :strike => @socket.read_decimal,
572
- :right => @socket.read_string,
573
- :exchange => @socket.read_string,
574
- :currency => @socket.read_string,
575
- :local_symbol => @socket.read_string
578
+ Models::Contract.build :con_id => @socket.read_int,
579
+ :symbol => @socket.read_string,
580
+ :sec_type => @socket.read_string,
581
+ :expiry => @socket.read_string,
582
+ :strike => @socket.read_decimal,
583
+ :right => @socket.read_string,
584
+ :exchange => @socket.read_string,
585
+ :currency => @socket.read_string,
586
+ :local_symbol => @socket.read_string
576
587
  @execution =
577
588
  Models::Execution.new :order_id => @data[:order_id],
578
589
  :exec_id => @socket.read_string,
@@ -648,32 +659,32 @@ module IB
648
659
  load_map [:id, :int] # request id
649
660
 
650
661
  @contract =
651
- Models::Contract.new :symbol => @socket.read_string,
652
- :sec_type => @socket.read_string,
653
- :cusip => @socket.read_string,
654
- :coupon => @socket.read_decimal,
655
- :maturity => @socket.read_string,
656
- :issue_date => @socket.read_string,
657
- :ratings => @socket.read_string,
658
- :bond_type => @socket.read_string,
659
- :coupon_type => @socket.read_string,
660
- :convertible => @socket.read_boolean,
661
- :callable => @socket.read_boolean,
662
- :puttable => @socket.read_boolean,
663
- :desc_append => @socket.read_string,
664
- :exchange => @socket.read_string,
665
- :currency => @socket.read_string,
666
- :market_name => @socket.read_string,
667
- :trading_class => @socket.read_string,
668
- :con_id => @socket.read_int,
669
- :min_tick => @socket.read_decimal,
670
- :order_types => @socket.read_string,
671
- :valid_exchanges => @socket.read_string,
672
- :valid_next_option_date => @socket.read_string,
673
- :valid_next_option_type => @socket.read_string,
674
- :valid_next_option_partial => @socket.read_string,
675
- :notes => @socket.read_string,
676
- :long_name => @socket.read_string
662
+ Models::Contract.build :symbol => @socket.read_string,
663
+ :sec_type => @socket.read_string,
664
+ :cusip => @socket.read_string,
665
+ :coupon => @socket.read_decimal,
666
+ :maturity => @socket.read_string,
667
+ :issue_date => @socket.read_string,
668
+ :ratings => @socket.read_string,
669
+ :bond_type => @socket.read_string,
670
+ :coupon_type => @socket.read_string,
671
+ :convertible => @socket.read_boolean,
672
+ :callable => @socket.read_boolean,
673
+ :puttable => @socket.read_boolean,
674
+ :desc_append => @socket.read_string,
675
+ :exchange => @socket.read_string,
676
+ :currency => @socket.read_string,
677
+ :market_name => @socket.read_string,
678
+ :trading_class => @socket.read_string,
679
+ :con_id => @socket.read_int,
680
+ :min_tick => @socket.read_decimal,
681
+ :order_types => @socket.read_string,
682
+ :valid_exchanges => @socket.read_string,
683
+ :valid_next_option_date => @socket.read_string,
684
+ :valid_next_option_type => @socket.read_string,
685
+ :valid_next_option_partial => @socket.read_string,
686
+ :notes => @socket.read_string,
687
+ :long_name => @socket.read_string
677
688
  end
678
689
  end # BondContractData
679
690
 
@@ -698,17 +709,17 @@ module IB
698
709
 
699
710
  @data[:results] = Array.new(@data[:count]) do |index|
700
711
  {:rank => @socket.read_int,
701
- :contract => Contract.new(:con_id => @socket.read_int,
702
- :symbol => @socket.read_str,
703
- :sec_type => @socket.read_str,
704
- :expiry => @socket.read_str,
705
- :strike => @socket.read_decimal,
706
- :right => @socket.read_str,
707
- :exchange => @socket.read_str,
708
- :currency => @socket.read_str,
709
- :local_symbol => @socket.read_str,
710
- :market_name => @socket.read_str,
711
- :trading_class => @socket.read_str),
712
+ :contract => Contract.build(:con_id => @socket.read_int,
713
+ :symbol => @socket.read_str,
714
+ :sec_type => @socket.read_str,
715
+ :expiry => @socket.read_str,
716
+ :strike => @socket.read_decimal,
717
+ :right => @socket.read_str,
718
+ :exchange => @socket.read_str,
719
+ :currency => @socket.read_str,
720
+ :local_symbol => @socket.read_str,
721
+ :market_name => @socket.read_str,
722
+ :trading_class => @socket.read_str),
712
723
  :distance => @socket.read_str,
713
724
  :benchmark => @socket.read_str,
714
725
  :projection => @socket.read_str,
@@ -765,10 +776,10 @@ module IB
765
776
  super
766
777
  load_map [:id, :int] # request id
767
778
 
768
- @contract = Models::Contract.new :under_comp => true,
769
- :under_con_id => @socket.read_int,
770
- :under_delta => @socket.read_decimal,
771
- :under_price => @socket.read_decimal
779
+ @contract = Models::Contract.build :under_comp => true,
780
+ :under_con_id => @socket.read_int,
781
+ :under_delta => @socket.read_decimal,
782
+ :under_price => @socket.read_decimal
772
783
  end
773
784
  end # DeltaNeutralValidation
774
785
 
@@ -0,0 +1,32 @@
1
+ require 'ib-ruby/models/contract'
2
+
3
+ module IB
4
+ module Models
5
+ class Contract
6
+ # "BAG" is not really a contract, but a combination (combo) of securities.
7
+ # AKA basket or bag of securities. Individual securities in combo are represented
8
+ # by ComboLeg objects.
9
+ class Bag < Contract
10
+
11
+ def initialize opts = {}
12
+ super opts
13
+ @sec_type = IB::SECURITY_TYPES[:bag]
14
+ end
15
+
16
+ def description
17
+ @description || to_human
18
+ end
19
+
20
+ def to_human
21
+ "<Bag: " + [symbol, exchange, currency].join(" ") + " legs: " +
22
+ (@combo_legs_description ||
23
+ @combo_legs.map do |leg|
24
+ "#{leg.action} #{leg.ratio} * #{leg.con_id}"
25
+ end.join('|')) + ">"
26
+ end
27
+
28
+ end # class Bag
29
+ TYPES[IB::SECURITY_TYPES[:bag]] = Bag
30
+ end # class Contract
31
+ end # module Models
32
+ end # module IB
@@ -13,12 +13,6 @@ module IB
13
13
  self.local_symbol = value.sub(/ /, ' '*(22-value.size))
14
14
  end
15
15
 
16
- def initialize opts = {}
17
- super opts
18
- @sec_type = IB::SECURITY_TYPES[:option]
19
- @description ||= osi ? osi : "#{symbol} #{strike} #{right} #{expiry}"
20
- end
21
-
22
16
  # Make valid IB Contract definition from OSI (Option Symbology Initiative) code.
23
17
  # NB: Simply making a new Contract with *local_symbol* (osi) property set to a
24
18
  # valid OSI code works just as well, just do NOT set *expiry*, *right* or
@@ -48,7 +42,18 @@ module IB
48
42
  :strike => strike
49
43
  end
50
44
 
45
+ def initialize opts = {}
46
+ super opts
47
+ @sec_type = IB::SECURITY_TYPES[:option]
48
+ @description ||= osi ? osi : "#{symbol} #{strike} #{right} #{expiry}"
49
+ end
50
+
51
+ def to_human
52
+ "<Option: " + [symbol, expiry, right, strike, exchange, currency].join("-") + ">"
53
+ end
51
54
  end # class Option
55
+
56
+ TYPES[IB::SECURITY_TYPES[:option]] = Option
52
57
  end # class Contract
53
58
  end # module Models
54
59
  end # module IB
@@ -6,7 +6,27 @@ module IB
6
6
  module Models
7
7
  class Contract < Model
8
8
 
9
- BAG_SEC_TYPE = "BAG"
9
+ # Specialized Contract subclasses representing different security types
10
+ TYPES = {}
11
+ #BAG_SEC_TYPE = "BAG"
12
+
13
+ # This returns a Contract initialized from the serialize_ib_ruby format string.
14
+ def self.build opts = {}
15
+ type = opts[:sec_type]
16
+ if TYPES[type]
17
+ TYPES[type].new opts
18
+ else
19
+ Contract.new opts
20
+ end
21
+ end
22
+
23
+ # This returns a Contract initialized from the serialize_ib_ruby format string.
24
+ def self.from_ib_ruby string
25
+ c = Contract.new
26
+ c.symbol, c.sec_type, c.expiry, c.strike, c.right, c.multiplier,
27
+ c.exchange, c.primary_exchange, c.currency, c.local_symbol = string.split(":")
28
+ c
29
+ end
10
30
 
11
31
  # Fields are Strings unless noted otherwise
12
32
  attr_accessor :con_id, # int: The unique contract identifier.
@@ -206,14 +226,6 @@ module IB
206
226
  serialize.join(":")
207
227
  end
208
228
 
209
- # This returns a Contract initialized from the serialize_ib_ruby format string.
210
- def self.from_ib_ruby string
211
- c = Contract.new
212
- c.symbol, c.sec_type, c.expiry, c.strike, c.right, c.multiplier,
213
- c.exchange, c.primary_exchange, c.currency, c.local_symbol = string.split(":")
214
- c
215
- end
216
-
217
229
  # Serialize under_comp parameters
218
230
  def serialize_under_comp *args
219
231
  # EClientSocket.java, line 471:
@@ -238,18 +250,28 @@ module IB
238
250
  combo_legs.map { |leg| leg.serialize *fields }]
239
251
  end
240
252
 
253
+ def to_s
254
+ "<Contract: " + instance_variables.map do |key|
255
+ unless key == :@summary
256
+ value = send(key[1..-1])
257
+ " #{key}=#{value}" unless value.nil? || value == '' || value == 0
258
+ end
259
+ end.compact.join(',') + " >"
260
+ end
261
+
241
262
  def to_human
242
- "<Contract: " + [symbol, expiry, sec_type, strike, right, exchange, currency].join("-") + ">"
263
+ "<Contract: " + [symbol, sec_type, expiry, strike, right, exchange, currency].join("-") + ">"
243
264
  end
244
265
 
245
266
  def to_short
246
267
  "#{symbol}#{expiry}#{strike}#{right}#{exchange}#{currency}"
247
268
  end
248
269
 
249
- def to_s
250
- to_human
251
- end
252
-
253
270
  end # class Contract
254
271
  end # module Models
255
272
  end # module IB
273
+
274
+ # TODO Where should we require this?
275
+ require 'ib-ruby/models/contract/option'
276
+ require 'ib-ruby/models/contract/bag'
277
+
@@ -337,13 +337,16 @@ module IB
337
337
  end
338
338
 
339
339
  def to_s #human
340
- "<Order::" + #self.class.
341
- instance_variables.map do |key|
342
- value = instance_variable_get(key)
343
- " #{key}=#{value}" unless value.nil? || value == '' || value == 0
344
- end.compact.join(',') + " >"
340
+ "<Order:" + instance_variables.map do |key|
341
+ value = instance_variable_get(key)
342
+ " #{key}=#{value}" unless value.nil? || value == '' || value == 0
343
+ end.compact.join(',') + " >"
345
344
  end
346
345
 
346
+ def to_human
347
+ "<Order: #{@status} #{@order_type} #{@action} #{@total_quantity} @ #{@limit_price}" +
348
+ " #{@tif} id/perm: #{@id}/#{@perm_id}>"
349
+ end
347
350
  end # class Order
348
351
  end # module Models
349
352
  end # module IB
@@ -12,8 +12,7 @@
12
12
  module IB
13
13
  module Symbols
14
14
 
15
- # Get the next valid quarter month >= today, for finding the
16
- # front month of quarterly futures.
15
+ # Get the next valid quarter month >= today, for finding the front month of quarterly futures.
17
16
  #
18
17
  # N.B. This will not work as expected near/after expiration during that month, as
19
18
  # volume rolls over to the next quarter even though the current month is still valid!
@@ -29,7 +28,6 @@ module IB
29
28
  end
30
29
  end
31
30
 
32
- #
33
31
  # WARNING: This is currently broken. It returns the next
34
32
  # quarterly expiration month after the current month. Many futures
35
33
  # instruments have monthly contracts for the near months. This
@@ -45,14 +43,13 @@ module IB
45
43
  "#{ self.next_quarter_year(time) }#{ self.next_quarter_month(time) }"
46
44
  end
47
45
 
48
- #
49
46
  # Convenience method; generates a Models::Contract instance for a futures
50
47
  # contract with the given parameters.
51
48
  #
52
49
  # If expiry is nil, it will use the end month of the current
53
50
  # quarter. This will be wrong for most contracts most of the time,
54
51
  # since most contracts have the majority of their volume in a
55
- # nearby intraquarter month.
52
+ # nearby intraquarter month.
56
53
  #
57
54
  # It is recommended that you specify an expiration date manually
58
55
  # until next_expiry is fixed. Expiry should be a string in the
@@ -68,7 +65,6 @@ module IB
68
65
  :description => description)
69
66
  end
70
67
 
71
-
72
68
  Futures ={
73
69
  :ym => Models::Contract.new(:symbol => "YM",
74
70
  :expiry => self.next_expiry(Time.now),
data/lib/ib-ruby.rb CHANGED
@@ -7,8 +7,4 @@ require 'ib-ruby/constants'
7
7
  require 'ib-ruby/connection'
8
8
  require 'ib-ruby/models'
9
9
  require 'ib-ruby/messages'
10
-
11
- # TODO Where should we require this?
12
- require 'ib-ruby/models/contract/option'
13
-
14
10
  require 'ib-ruby/symbols'
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: ib-ruby
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.5.9
5
+ version: 0.5.10
6
6
  platform: ruby
7
7
  authors:
8
8
  - Paul Legato
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-12-16 00:00:00 -08:00
14
+ date: 2011-12-19 00:00:00 -08:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
@@ -47,6 +47,7 @@ executables:
47
47
  - global_cancel
48
48
  - historic_data
49
49
  - historic_data_cli
50
+ - list_orders
50
51
  - market_data
51
52
  - option_data
52
53
  - place_order
@@ -63,6 +64,7 @@ files:
63
64
  - bin/global_cancel
64
65
  - bin/historic_data
65
66
  - bin/historic_data_cli
67
+ - bin/list_orders
66
68
  - bin/market_data
67
69
  - bin/option_data
68
70
  - bin/place_order
@@ -75,6 +77,7 @@ files:
75
77
  - lib/ib-ruby/messages.rb
76
78
  - lib/ib-ruby/models/bar.rb
77
79
  - lib/ib-ruby/models/combo_leg.rb
80
+ - lib/ib-ruby/models/contract/bag.rb
78
81
  - lib/ib-ruby/models/contract/option.rb
79
82
  - lib/ib-ruby/models/contract.rb
80
83
  - lib/ib-ruby/models/execution.rb