ib-ruby 0.5.21 → 0.6.1
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 +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
|