ib-ruby 0.5.21 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +8 -0
- data/README.md +46 -27
- data/TODO +13 -2
- data/VERSION +1 -1
- data/bin/generic_data.rb +26 -0
- data/bin/place_order +1 -1
- data/lib/ib-ruby/connection.rb +126 -65
- data/lib/ib-ruby/messages/incoming.rb +3 -3
- data/lib/ib-ruby/models/bar.rb +11 -11
- data/lib/ib-ruby/models/combo_leg.rb +23 -29
- data/lib/ib-ruby/models/contract/bag.rb +34 -2
- data/lib/ib-ruby/models/contract/option.rb +2 -2
- data/lib/ib-ruby/models/contract.rb +151 -197
- data/lib/ib-ruby/models/execution.rb +27 -45
- data/lib/ib-ruby/models/model.rb +10 -4
- data/lib/ib-ruby/models/model_properties.rb +63 -0
- data/lib/ib-ruby/models/order.rb +274 -320
- data/lib/ib-ruby/symbols/stocks.rb +11 -5
- data/spec/account_helper.rb +80 -0
- data/spec/ib-ruby/connection_spec.rb +195 -52
- data/spec/ib-ruby/messages/incoming_spec.rb +4 -4
- data/spec/ib-ruby/models/combo_leg_spec.rb +1 -0
- data/spec/ib-ruby/models/contract_spec.rb +1 -1
- data/spec/ib-ruby/models/execution_spec.rb +73 -0
- data/spec/integration/account_info_spec.rb +12 -59
- data/spec/integration/contract_info_spec.rb +23 -37
- data/spec/integration/depth_data_spec.rb +4 -4
- data/spec/integration/historic_data_spec.rb +15 -27
- data/spec/integration/market_data_spec.rb +74 -61
- data/spec/integration/option_data_spec.rb +5 -48
- data/spec/integration/orders/execution_spec.rb +26 -31
- data/spec/integration/orders/open_order +2 -0
- data/spec/integration/orders/placement_spec.rb +28 -28
- data/spec/integration/orders/valid_ids_spec.rb +11 -11
- data/spec/integration_helper.rb +46 -32
- data/spec/message_helper.rb +4 -38
- data/spec/spec_helper.rb +2 -3
- metadata +9 -2
@@ -7,19 +7,20 @@ describe "Orders", :connected => true, :integration => true do
|
|
7
7
|
context "Placing wrong order", :slow => true do
|
8
8
|
|
9
9
|
before(:all) do
|
10
|
-
|
11
|
-
|
10
|
+
@ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
|
11
|
+
|
12
|
+
@ib.wait_for :NextValidId
|
12
13
|
|
13
14
|
place_order IB::Symbols::Stocks[:wfc],
|
14
15
|
:limit_price => 9.131313 # Weird non-acceptable price
|
15
|
-
wait_for 1
|
16
|
+
@ib.wait_for 1
|
16
17
|
end
|
17
18
|
|
18
19
|
after(:all) { close_connection }
|
19
20
|
|
20
21
|
it 'does not place new Order' do
|
21
|
-
@received[:OpenOrder].should be_empty
|
22
|
-
@received[:OrderStatus].should be_empty
|
22
|
+
@ib.received[:OpenOrder].should be_empty
|
23
|
+
@ib.received[:OrderStatus].should be_empty
|
23
24
|
end
|
24
25
|
|
25
26
|
it 'still changes client`s next_order_id' do
|
@@ -28,7 +29,7 @@ describe "Orders", :connected => true, :integration => true do
|
|
28
29
|
end
|
29
30
|
|
30
31
|
context 'received :Alert message' do
|
31
|
-
subject { @received[:Alert].last }
|
32
|
+
subject { @ib.received[:Alert].last }
|
32
33
|
|
33
34
|
it { should be_an IB::Messages::Incoming::Alert }
|
34
35
|
it { should be_error }
|
@@ -40,12 +41,12 @@ describe "Orders", :connected => true, :integration => true do
|
|
40
41
|
|
41
42
|
context "Off-market stock order" do
|
42
43
|
before(:all) do
|
43
|
-
|
44
|
-
wait_for
|
44
|
+
@ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
|
45
|
+
@ib.wait_for :NextValidId
|
45
46
|
|
46
47
|
place_order IB::Symbols::Stocks[:wfc],
|
47
48
|
:limit_price => 9.13 # Set acceptable price
|
48
|
-
wait_for
|
49
|
+
@ib.wait_for [:OpenOrder, 3], [:OrderStatus, 2]
|
49
50
|
end
|
50
51
|
|
51
52
|
after(:all) { close_connection }
|
@@ -58,8 +59,8 @@ describe "Orders", :connected => true, :integration => true do
|
|
58
59
|
@ib.next_order_id.should == @order_id_before + 1
|
59
60
|
end
|
60
61
|
|
61
|
-
it { @received[:OpenOrder].should have_at_least(1).open_order_message }
|
62
|
-
it { @received[:OrderStatus].should have_at_least(1).status_message }
|
62
|
+
it { @ib.received[:OpenOrder].should have_at_least(1).open_order_message }
|
63
|
+
it { @ib.received[:OrderStatus].should have_at_least(1).status_message }
|
63
64
|
|
64
65
|
it 'receives confirmation of Order submission' do
|
65
66
|
open_order_should_be /Submitted/ # ()Pre)Submitted
|
@@ -69,9 +70,8 @@ describe "Orders", :connected => true, :integration => true do
|
|
69
70
|
|
70
71
|
context "Retrieving placed orders" do
|
71
72
|
before(:all) do
|
72
|
-
@ib.send_message :
|
73
|
-
|
74
|
-
wait_for { received?(:OpenOrderEnd) }
|
73
|
+
@ib.send_message :RequestOpenOrders
|
74
|
+
@ib.wait_for :OpenOrderEnd
|
75
75
|
end
|
76
76
|
|
77
77
|
after(:all) { clean_connection } # Clear logs and message collector
|
@@ -80,10 +80,10 @@ describe "Orders", :connected => true, :integration => true do
|
|
80
80
|
@ib.next_order_id.should == @order_id_after
|
81
81
|
end
|
82
82
|
|
83
|
-
it { @received[:OpenOrder].should have_exactly(1).open_order_message }
|
84
|
-
it { @received[:OrderStatus].should have_exactly(1).status_message }
|
85
|
-
it { @received[:OpenOrderEnd].should have_exactly(1).order_end_message }
|
86
|
-
it { @received[:Alert].should have_exactly(0).alert_messages }
|
83
|
+
it { @ib.received[:OpenOrder].should have_exactly(1).open_order_message }
|
84
|
+
it { @ib.received[:OrderStatus].should have_exactly(1).status_message }
|
85
|
+
it { @ib.received[:OpenOrderEnd].should have_exactly(1).order_end_message }
|
86
|
+
it { @ib.received[:Alert].should have_exactly(0).alert_messages }
|
87
87
|
|
88
88
|
it 'receives OpenOrder and OrderStatus for placed order' do
|
89
89
|
open_order_should_be /Submitted/
|
@@ -95,7 +95,7 @@ describe "Orders", :connected => true, :integration => true do
|
|
95
95
|
before(:all) do
|
96
96
|
@ib.cancel_order @order_id_placed
|
97
97
|
|
98
|
-
wait_for
|
98
|
+
@ib.wait_for :OrderStatus, :Alert
|
99
99
|
end
|
100
100
|
|
101
101
|
after(:all) { clean_connection } # Clear logs and message collector
|
@@ -105,18 +105,18 @@ describe "Orders", :connected => true, :integration => true do
|
|
105
105
|
end
|
106
106
|
|
107
107
|
it 'does not receive OpenOrder message' do
|
108
|
-
received?(:OpenOrder).should be_false
|
108
|
+
@ib.received?(:OpenOrder).should be_false
|
109
109
|
end
|
110
110
|
|
111
|
-
it { @received[:OrderStatus].should have_exactly(1).status_message }
|
112
|
-
it { @received[:Alert].should have_exactly(1).alert_message }
|
111
|
+
it { @ib.received[:OrderStatus].should have_exactly(1).status_message }
|
112
|
+
it { @ib.received[:Alert].should have_exactly(1).alert_message }
|
113
113
|
|
114
114
|
it 'receives cancellation Order Status' do
|
115
115
|
order_status_should_be /Cancel/ # Cancelled / PendingCancel
|
116
116
|
end
|
117
117
|
|
118
118
|
it 'receives Order cancelled Alert' do
|
119
|
-
alert = @received[:Alert].first
|
119
|
+
alert = @ib.received[:Alert].first
|
120
120
|
alert.should be_an IB::Messages::Incoming::Alert
|
121
121
|
alert.message.should =~ /Order Canceled - reason:/
|
122
122
|
end
|
@@ -126,22 +126,22 @@ describe "Orders", :connected => true, :integration => true do
|
|
126
126
|
before(:all) do
|
127
127
|
@ib.cancel_order rand(99999999)
|
128
128
|
|
129
|
-
wait_for
|
129
|
+
@ib.wait_for :Alert
|
130
130
|
end
|
131
131
|
|
132
|
-
it { @received[:Alert].should have_exactly(1).alert_message }
|
132
|
+
it { @ib.received[:Alert].should have_exactly(1).alert_message }
|
133
133
|
|
134
134
|
it 'does not increase client`s next_order_id further' do
|
135
135
|
@ib.next_order_id.should == @order_id_after
|
136
136
|
end
|
137
137
|
|
138
138
|
it 'does not receive Order messages' do
|
139
|
-
received?(:OrderStatus).should be_false
|
140
|
-
received?(:OpenOrder).should be_false
|
139
|
+
@ib.received?(:OrderStatus).should be_false
|
140
|
+
@ib.received?(:OpenOrder).should be_false
|
141
141
|
end
|
142
142
|
|
143
143
|
it 'receives unable to find Order Alert' do
|
144
|
-
alert = @received[:Alert].first
|
144
|
+
alert = @ib.received[:Alert].first
|
145
145
|
alert.should be_an IB::Messages::Incoming::Alert
|
146
146
|
alert.message.should =~ /Can't find order with id =/
|
147
147
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'integration_helper'
|
2
2
|
|
3
3
|
shared_examples_for 'Received single id' do
|
4
|
-
subject { @received[:
|
4
|
+
subject { @ib.received[:NextValidId].first }
|
5
5
|
|
6
6
|
after(:all) { clean_connection }
|
7
7
|
|
8
|
-
it { @received[:
|
8
|
+
it { @ib.received[:NextValidId].should have_exactly(1).message }
|
9
9
|
|
10
10
|
it 'receives next valid for Order placement' do
|
11
|
-
subject.should be_an IB::Messages::Incoming::
|
11
|
+
subject.should be_an IB::Messages::Incoming::NextValidId
|
12
12
|
subject.order_id.should be_an Integer
|
13
13
|
@id[:at_connect] ||= subject.order_id # just assign once
|
14
14
|
end
|
@@ -19,7 +19,7 @@ shared_examples_for 'Received single id' do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
shared_examples_for 'Received single id after request' do
|
22
|
-
subject { @received[:
|
22
|
+
subject { @ib.received[:NextValidId].first }
|
23
23
|
|
24
24
|
it_behaves_like 'Received single id'
|
25
25
|
|
@@ -28,7 +28,7 @@ shared_examples_for 'Received single id after request' do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'does not receive :OpenOrderEnd message' do
|
31
|
-
@received[:OpenOrderEnd].should be_empty
|
31
|
+
@ib.received[:OpenOrderEnd].should be_empty
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'does not reconnect to server' do
|
@@ -40,8 +40,8 @@ describe 'Ids valid for Order placement', :connected => true, :integration => tr
|
|
40
40
|
|
41
41
|
before(:all) do
|
42
42
|
verify_account
|
43
|
-
|
44
|
-
wait_for
|
43
|
+
@ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
|
44
|
+
@ib.wait_for 3, :OpenOrderEnd, :NextValidId
|
45
45
|
@id = {} # Moving id between contexts. Feels dirty.
|
46
46
|
end
|
47
47
|
|
@@ -51,10 +51,10 @@ describe 'Ids valid for Order placement', :connected => true, :integration => tr
|
|
51
51
|
|
52
52
|
it_behaves_like 'Received single id'
|
53
53
|
|
54
|
-
it { @received[:OpenOrderEnd].should have_exactly(1).message }
|
54
|
+
it { @ib.received[:OpenOrderEnd].should have_exactly(1).message }
|
55
55
|
|
56
56
|
it 'receives also :OpenOrderEnd message' do
|
57
|
-
@received[:OpenOrderEnd].first.should be_an IB::Messages::Incoming::OpenOrderEnd
|
57
|
+
@ib.received[:OpenOrderEnd].first.should be_an IB::Messages::Incoming::OpenOrderEnd
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'logs connection notification' do
|
@@ -65,7 +65,7 @@ describe 'Ids valid for Order placement', :connected => true, :integration => tr
|
|
65
65
|
context 'Requesting valid order id' do
|
66
66
|
before(:all) do
|
67
67
|
@ib.send_message :RequestIds
|
68
|
-
wait_for
|
68
|
+
@ib.wait_for :NextValidId
|
69
69
|
end
|
70
70
|
|
71
71
|
it_behaves_like 'Received single id after request'
|
@@ -74,7 +74,7 @@ describe 'Ids valid for Order placement', :connected => true, :integration => tr
|
|
74
74
|
context 'Requested number of valid ids is just silently ignored by TWS' do
|
75
75
|
before(:all) do
|
76
76
|
@ib.send_message :RequestIds, :number => 5
|
77
|
-
wait_for
|
77
|
+
@ib.wait_for :NextValidId
|
78
78
|
end
|
79
79
|
|
80
80
|
it_behaves_like 'Received single id after request'
|
data/spec/integration_helper.rb
CHANGED
@@ -1,31 +1,47 @@
|
|
1
1
|
require 'message_helper'
|
2
|
+
require 'account_helper'
|
3
|
+
|
4
|
+
shared_examples_for 'Received Market Data' do
|
5
|
+
context "received :Alert message " do
|
6
|
+
subject { @ib.received[:Alert].first }
|
7
|
+
|
8
|
+
it { should be_an IB::Messages::Incoming::Alert }
|
9
|
+
it { should be_warning }
|
10
|
+
it { should_not be_error }
|
11
|
+
its(:code) { should be_an Integer }
|
12
|
+
its(:message) { should =~ /Market data farm connection is OK/ }
|
13
|
+
its(:to_human) { should =~ /TWS Warning/ }
|
14
|
+
end
|
2
15
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
account = OPTS[:connection][:account] || OPTS[:connection][:account_name]
|
16
|
-
raise "Please configure IB PAPER ACCOUNT in spec/spec_helper.rb" unless account
|
17
|
-
|
18
|
-
connect_and_receive :AccountValue
|
19
|
-
@ib.send_message :RequestAccountData, :subscribe => true
|
20
|
-
|
21
|
-
wait_for { received? :AccountValue }
|
22
|
-
raise "Unable to verify IB PAPER ACCOUNT" unless received? :AccountValue
|
23
|
-
|
24
|
-
received = @received[:AccountValue].first.account_name
|
25
|
-
raise "Connected to wrong account #{received}, expected #{account}" if account != received
|
16
|
+
context "received :TickPrice message" do
|
17
|
+
subject { @ib.received[:TickPrice].first }
|
18
|
+
|
19
|
+
it { should be_an IB::Messages::Incoming::TickPrice }
|
20
|
+
its(:tick_type) { should be_an Integer }
|
21
|
+
its(:type) { should be_a Symbol }
|
22
|
+
its(:price) { should be_a Float }
|
23
|
+
its(:size) { should be_an Integer }
|
24
|
+
its(:data) { should be_a Hash }
|
25
|
+
its(:ticker_id) { should == 456 } # ticker_id
|
26
|
+
its(:to_human) { should =~ /TickPrice/ }
|
27
|
+
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
+
context "received :TickSize message", :if => :us_trading_hours do
|
30
|
+
before(:all) do
|
31
|
+
@ib.wait_for 3, :TickSize
|
32
|
+
end
|
33
|
+
|
34
|
+
subject { @ib.received[:TickSize].first }
|
35
|
+
|
36
|
+
it { should be_an IB::Messages::Incoming::TickSize }
|
37
|
+
its(:type) { should_not be_nil }
|
38
|
+
its(:data) { should be_a Hash }
|
39
|
+
its(:tick_type) { should be_an Integer }
|
40
|
+
its(:type) { should be_a Symbol }
|
41
|
+
its(:size) { should be_an Integer }
|
42
|
+
its(:ticker_id) { should == 456 }
|
43
|
+
its(:to_human) { should =~ /TickSize/ }
|
44
|
+
end
|
29
45
|
end
|
30
46
|
|
31
47
|
### Helpers for placing and verifying orders
|
@@ -51,7 +67,7 @@ def check_status item, status
|
|
51
67
|
end
|
52
68
|
|
53
69
|
def order_status_should_be status, index=0
|
54
|
-
msg = @received[:OrderStatus][index]
|
70
|
+
msg = @ib.received[:OrderStatus][index]
|
55
71
|
msg.should be_an IB::Messages::Incoming::OrderStatus
|
56
72
|
msg.order_id.should == @order_id_placed
|
57
73
|
msg.perm_id.should be_an Integer
|
@@ -75,7 +91,7 @@ def order_status_should_be status, index=0
|
|
75
91
|
end
|
76
92
|
|
77
93
|
def open_order_should_be status, index=0
|
78
|
-
msg = @received[:OpenOrder][index]
|
94
|
+
msg = @ib.received[:OpenOrder][index]
|
79
95
|
msg.should be_an IB::Messages::Incoming::OpenOrder
|
80
96
|
msg.order.should == @order
|
81
97
|
msg.contract.should == @contract
|
@@ -84,13 +100,13 @@ def open_order_should_be status, index=0
|
|
84
100
|
end
|
85
101
|
|
86
102
|
def execution_should_be side, opts={}
|
87
|
-
msg = @received[:ExecutionData][opts[:index] || -1]
|
103
|
+
msg = @ib.received[:ExecutionData][opts[:index] || -1]
|
88
104
|
msg.request_id.should == (opts[:request_id] || -1)
|
89
105
|
msg.contract.should == @contract
|
90
106
|
|
91
107
|
exec = msg.execution
|
92
108
|
exec.perm_id.should be_an Integer
|
93
|
-
exec.perm_id.should == @received[:OpenOrder].last.order.perm_id if @received
|
109
|
+
exec.perm_id.should == @ib.received[:OpenOrder].last.order.perm_id if @ib.received?(:OpenOrder)
|
94
110
|
exec.client_id.should == OPTS[:connection][:client_id]
|
95
111
|
exec.order_id.should be_an Integer
|
96
112
|
exec.order_id.should == @order.order_id if @order
|
@@ -98,7 +114,7 @@ def execution_should_be side, opts={}
|
|
98
114
|
exec.time.should =~ /\d\d:\d\d:\d\d/
|
99
115
|
exec.account_name.should == OPTS[:connection][:account_name]
|
100
116
|
exec.exchange.should == 'IDEALPRO'
|
101
|
-
exec.side.
|
117
|
+
exec.side.should == side
|
102
118
|
exec.shares.should == 20000
|
103
119
|
exec.cumulative_quantity.should == 20000
|
104
120
|
exec.price.should be > 1
|
@@ -106,5 +122,3 @@ def execution_should_be side, opts={}
|
|
106
122
|
exec.price.should == exec.average_price
|
107
123
|
exec.liquidation.should == 0
|
108
124
|
end
|
109
|
-
|
110
|
-
|
data/spec/message_helper.rb
CHANGED
@@ -2,15 +2,6 @@ require 'spec_helper'
|
|
2
2
|
require 'thread'
|
3
3
|
require 'stringio'
|
4
4
|
|
5
|
-
def print_subject
|
6
|
-
it 'prints out message' do
|
7
|
-
p subject
|
8
|
-
p subject.to_human
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
alias ps print_subject
|
13
|
-
|
14
5
|
## Logger helpers
|
15
6
|
|
16
7
|
def mock_logger
|
@@ -42,31 +33,16 @@ end
|
|
42
33
|
|
43
34
|
## Connection helpers
|
44
35
|
|
45
|
-
def connect_and_receive *message_types
|
46
|
-
|
47
|
-
# Start disconnected (we need to set up catch-all subscriber first)
|
48
|
-
@ib = IB::Connection.new OPTS[:connection].merge(:connect => false,
|
49
|
-
:reader => false,
|
50
|
-
:logger => mock_logger)
|
51
|
-
|
52
|
-
# Hash of received messages, keyed by message type
|
53
|
-
@received = Hash.new { |hash, key| hash[key] = Array.new }
|
54
|
-
|
55
|
-
# Catch all messages of given types and put them inside @received Hash
|
56
|
-
@ib.subscribe(*message_types) { |msg| @received[msg.message_type] << msg }
|
57
|
-
|
58
|
-
@ib.connect # We only connect after everything is subscribed
|
59
|
-
@ib.start_reader
|
60
|
-
end
|
61
|
-
|
62
36
|
# Clear logs and message collector. Output may be silenced.
|
63
37
|
def clean_connection
|
64
38
|
unless OPTS[:silent]
|
65
|
-
puts @received.map { |type, msg| [" #{type}:", msg.map(&:to_human)] } if @received
|
39
|
+
#puts @received.map { |type, msg| [" #{type}:", msg.map(&:to_human)] } if @received
|
40
|
+
puts @ib.received.map { |type, msg| [" #{type}:", msg.map(&:to_human)] }
|
66
41
|
puts " Logs:", log_entries if @stdout
|
67
42
|
end
|
68
43
|
@stdout.string = '' if @stdout
|
69
|
-
@
|
44
|
+
@ib.clear_received
|
45
|
+
@received.clear if @received # In connection_spec
|
70
46
|
end
|
71
47
|
|
72
48
|
def close_connection
|
@@ -74,13 +50,3 @@ def close_connection
|
|
74
50
|
@ib.close if @ib
|
75
51
|
clean_connection
|
76
52
|
end
|
77
|
-
|
78
|
-
#noinspection RubyArgCount
|
79
|
-
def wait_for time = 2, &condition
|
80
|
-
timeout = Time.now + time
|
81
|
-
sleep 0.1 until timeout < Time.now || condition && condition.call
|
82
|
-
end
|
83
|
-
|
84
|
-
def received? symbol, times=1
|
85
|
-
@received[symbol].size >= times
|
86
|
-
end
|
data/spec/spec_helper.rb
CHANGED
@@ -13,8 +13,7 @@ RSpec.configure do |config|
|
|
13
13
|
# 17:15 - 17:00 (ET) Sunday-Friday Forex 22:15 - 22:00 (UTC)
|
14
14
|
!(t.wday > 0 && t.wday < 5 || t.wday == 5 && t.hour < 22)
|
15
15
|
end
|
16
|
-
|
17
|
-
end # :slow => true
|
16
|
+
end
|
18
17
|
}
|
19
18
|
# config.filter = { :focus => true }
|
20
19
|
# config.include(UserExampleHelpers)
|
@@ -25,7 +24,7 @@ end
|
|
25
24
|
|
26
25
|
# Top level metadata for test suite level hacking
|
27
26
|
OPTS = {
|
28
|
-
:silent => false, #true, # Verbosity of test outputs
|
27
|
+
:silent => true, #false, #true, # Verbosity of test outputs
|
29
28
|
:brokertron => false, # Use mock (Brokertron) instead of paper account
|
30
29
|
}
|
31
30
|
|
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
|
+
version: 0.6.1
|
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: 2012-03-
|
14
|
+
date: 2012-03-14 00:00:00 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -55,6 +55,7 @@ executables:
|
|
55
55
|
- cancel_orders
|
56
56
|
- contract_details
|
57
57
|
- depth_of_market
|
58
|
+
- generic_data.rb
|
58
59
|
- historic_data
|
59
60
|
- historic_data_cli
|
60
61
|
- list_orders
|
@@ -72,6 +73,7 @@ files:
|
|
72
73
|
- bin/cancel_orders
|
73
74
|
- bin/contract_details
|
74
75
|
- bin/depth_of_market
|
76
|
+
- bin/generic_data.rb
|
75
77
|
- bin/historic_data
|
76
78
|
- bin/historic_data_cli
|
77
79
|
- bin/list_orders
|
@@ -98,6 +100,7 @@ files:
|
|
98
100
|
- lib/ib-ruby/models/contract.rb
|
99
101
|
- lib/ib-ruby/models/execution.rb
|
100
102
|
- lib/ib-ruby/models/model.rb
|
103
|
+
- lib/ib-ruby/models/model_properties.rb
|
101
104
|
- lib/ib-ruby/models/order.rb
|
102
105
|
- lib/ib-ruby/models/contract/bag.rb
|
103
106
|
- lib/ib-ruby/models/contract/option.rb
|
@@ -105,6 +108,7 @@ files:
|
|
105
108
|
- lib/ib-ruby/symbols/futures.rb
|
106
109
|
- lib/ib-ruby/symbols/options.rb
|
107
110
|
- lib/ib-ruby/symbols/stocks.rb
|
111
|
+
- spec/account_helper.rb
|
108
112
|
- spec/integration_helper.rb
|
109
113
|
- spec/message_helper.rb
|
110
114
|
- spec/README.md
|
@@ -114,6 +118,7 @@ files:
|
|
114
118
|
- spec/ib-ruby/messages/outgoing_spec.rb
|
115
119
|
- spec/ib-ruby/models/combo_leg_spec.rb
|
116
120
|
- spec/ib-ruby/models/contract_spec.rb
|
121
|
+
- spec/ib-ruby/models/execution_spec.rb
|
117
122
|
- spec/ib-ruby/models/order_spec.rb
|
118
123
|
- spec/integration/account_info_spec.rb
|
119
124
|
- spec/integration/contract_info_spec.rb
|
@@ -166,6 +171,7 @@ signing_key:
|
|
166
171
|
specification_version: 3
|
167
172
|
summary: Ruby Implementation of the Interactive Brokers TWS API
|
168
173
|
test_files:
|
174
|
+
- spec/account_helper.rb
|
169
175
|
- spec/integration_helper.rb
|
170
176
|
- spec/message_helper.rb
|
171
177
|
- spec/README.md
|
@@ -175,6 +181,7 @@ test_files:
|
|
175
181
|
- spec/ib-ruby/messages/outgoing_spec.rb
|
176
182
|
- spec/ib-ruby/models/combo_leg_spec.rb
|
177
183
|
- spec/ib-ruby/models/contract_spec.rb
|
184
|
+
- spec/ib-ruby/models/execution_spec.rb
|
178
185
|
- spec/ib-ruby/models/order_spec.rb
|
179
186
|
- spec/integration/account_info_spec.rb
|
180
187
|
- spec/integration/contract_info_spec.rb
|