ib-ruby 0.5.9 → 0.5.10

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/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