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.
Files changed (38) hide show
  1. data/HISTORY +8 -0
  2. data/README.md +46 -27
  3. data/TODO +13 -2
  4. data/VERSION +1 -1
  5. data/bin/generic_data.rb +26 -0
  6. data/bin/place_order +1 -1
  7. data/lib/ib-ruby/connection.rb +126 -65
  8. data/lib/ib-ruby/messages/incoming.rb +3 -3
  9. data/lib/ib-ruby/models/bar.rb +11 -11
  10. data/lib/ib-ruby/models/combo_leg.rb +23 -29
  11. data/lib/ib-ruby/models/contract/bag.rb +34 -2
  12. data/lib/ib-ruby/models/contract/option.rb +2 -2
  13. data/lib/ib-ruby/models/contract.rb +151 -197
  14. data/lib/ib-ruby/models/execution.rb +27 -45
  15. data/lib/ib-ruby/models/model.rb +10 -4
  16. data/lib/ib-ruby/models/model_properties.rb +63 -0
  17. data/lib/ib-ruby/models/order.rb +274 -320
  18. data/lib/ib-ruby/symbols/stocks.rb +11 -5
  19. data/spec/account_helper.rb +80 -0
  20. data/spec/ib-ruby/connection_spec.rb +195 -52
  21. data/spec/ib-ruby/messages/incoming_spec.rb +4 -4
  22. data/spec/ib-ruby/models/combo_leg_spec.rb +1 -0
  23. data/spec/ib-ruby/models/contract_spec.rb +1 -1
  24. data/spec/ib-ruby/models/execution_spec.rb +73 -0
  25. data/spec/integration/account_info_spec.rb +12 -59
  26. data/spec/integration/contract_info_spec.rb +23 -37
  27. data/spec/integration/depth_data_spec.rb +4 -4
  28. data/spec/integration/historic_data_spec.rb +15 -27
  29. data/spec/integration/market_data_spec.rb +74 -61
  30. data/spec/integration/option_data_spec.rb +5 -48
  31. data/spec/integration/orders/execution_spec.rb +26 -31
  32. data/spec/integration/orders/open_order +2 -0
  33. data/spec/integration/orders/placement_spec.rb +28 -28
  34. data/spec/integration/orders/valid_ids_spec.rb +11 -11
  35. data/spec/integration_helper.rb +46 -32
  36. data/spec/message_helper.rb +4 -38
  37. data/spec/spec_helper.rb +2 -3
  38. metadata +9 -2
@@ -4,8 +4,8 @@ describe "Request Contract Info", :connected => true, :integration => true do
4
4
 
5
5
  before(:all) do
6
6
  verify_account
7
- connect_and_receive :NextValidID, :Alert, :ContractData, :ContractDataEnd
8
- wait_for { received? :NextValidID }
7
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
8
+ @ib.wait_for :NextValidId
9
9
  end
10
10
 
11
11
  after(:all) { close_connection }
@@ -15,20 +15,17 @@ describe "Request Contract Info", :connected => true, :integration => true do
15
15
  before(:all) do
16
16
  @contract = IB::Models::Contract.new :symbol => 'AAPL',
17
17
  :sec_type => IB::SECURITY_TYPES[:stock]
18
- @ib.send_message :RequestContractData,
19
- :id => 111,
20
- :contract => @contract
21
-
22
- wait_for(3) { received? :ContractDataEnd }
18
+ @ib.send_message :RequestContractData, :id => 111, :contract => @contract
19
+ @ib.wait_for 3, :ContractDataEnd
23
20
  end
24
21
 
25
22
  after(:all) { clean_connection } # Clear logs and message collector
26
23
 
27
- it { @received[:ContractData].should have_exactly(2).contract_data }
28
- it { @received[:ContractDataEnd].should have_exactly(1).contract_data_end }
24
+ it { @ib.received[:ContractData].should have_exactly(2).contract_data }
25
+ it { @ib.received[:ContractDataEnd].should have_exactly(1).contract_data_end }
29
26
 
30
27
  it 'receives Contract Data for requested contract' do
31
- msg = @received[:ContractData].first
28
+ msg = @ib.received[:ContractData].first
32
29
  msg.request_id.should == 111
33
30
  msg.contract.should == @contract
34
31
  end
@@ -36,7 +33,7 @@ describe "Request Contract Info", :connected => true, :integration => true do
36
33
  it 'receives Contract Data with extended fields' do
37
34
  # Returns 2 contracts, one for NASDAQ and one for IBIS - internal crossing?
38
35
 
39
- @received[:ContractData].each do |msg|
36
+ @ib.received[:ContractData].each do |msg|
40
37
  contract = msg.contract
41
38
  contract.symbol.should == 'AAPL'
42
39
 
@@ -68,19 +65,16 @@ describe "Request Contract Info", :connected => true, :integration => true do
68
65
  :expiry => "201301",
69
66
  :right => "CALL",
70
67
  :strike => 500
71
- @ib.send_message :RequestContractData,
72
- :id => 123,
73
- :contract => @contract
74
-
75
- wait_for(3) { received? :ContractDataEnd }
68
+ @ib.send_message :RequestContractData, :id => 123, :contract => @contract
69
+ @ib.wait_for 3, :ContractDataEnd
76
70
  end
77
71
 
78
72
  after(:all) { clean_connection } # Clear logs and message collector
79
73
 
80
- subject { @received[:ContractData].first }
74
+ subject { @ib.received[:ContractData].first }
81
75
 
82
- it { @received[:ContractData].should have_exactly(1).contract_data }
83
- it { @received[:ContractDataEnd].should have_exactly(1).contract_data_end }
76
+ it { @ib.received[:ContractData].should have_exactly(1).contract_data }
77
+ it { @ib.received[:ContractDataEnd].should have_exactly(1).contract_data_end }
84
78
 
85
79
  it 'receives Contract Data for requested contract' do
86
80
  subject.request_id.should == 123
@@ -117,20 +111,16 @@ describe "Request Contract Info", :connected => true, :integration => true do
117
111
  :currency => "USD",
118
112
  :exchange => "IDEALPRO",
119
113
  :sec_type => IB::SECURITY_TYPES[:forex]
120
-
121
- @ib.send_message :RequestContractData,
122
- :id => 135,
123
- :contract => @contract
124
-
125
- wait_for(3) { received? :ContractDataEnd }
114
+ @ib.send_message :RequestContractData, :id => 135, :contract => @contract
115
+ @ib.wait_for 3, :ContractDataEnd
126
116
  end
127
117
 
128
118
  after(:all) { clean_connection } # Clear logs and message collector
129
119
 
130
- subject { @received[:ContractData].first }
120
+ subject { @ib.received[:ContractData].first }
131
121
 
132
- it { @received[:ContractData].should have_exactly(1).contract_data }
133
- it { @received[:ContractDataEnd].should have_exactly(1).contract_data_end }
122
+ it { @ib.received[:ContractData].should have_exactly(1).contract_data }
123
+ it { @ib.received[:ContractDataEnd].should have_exactly(1).contract_data_end }
134
124
 
135
125
  it 'receives Contract Data for requested contract' do
136
126
  subject.request_id.should == 135
@@ -164,20 +154,16 @@ describe "Request Contract Info", :connected => true, :integration => true do
164
154
 
165
155
  before(:all) do
166
156
  @contract = IB::Symbols::Futures[:ym] # Mini Dow Jones Industrial
167
-
168
- @ib.send_message :RequestContractData,
169
- :id => 147,
170
- :contract => @contract
171
-
172
- wait_for(3) { received? :ContractDataEnd }
157
+ @ib.send_message :RequestContractData, :id => 147, :contract => @contract
158
+ @ib.wait_for 3, :ContractDataEnd
173
159
  end
174
160
 
175
161
  after(:all) { clean_connection } # Clear logs and message collector
176
162
 
177
- subject { @received[:ContractData].first }
163
+ subject { @ib.received[:ContractData].first }
178
164
 
179
- it { @received[:ContractData].should have_exactly(1).contract_data }
180
- it { @received[:ContractDataEnd].should have_exactly(1).contract_data_end }
165
+ it { @ib.received[:ContractData].should have_exactly(1).contract_data }
166
+ it { @ib.received[:ContractDataEnd].should have_exactly(1).contract_data_end }
181
167
 
182
168
  it 'receives Contract Data for requested contract' do
183
169
  subject.request_id.should == 147
@@ -5,12 +5,12 @@ describe 'Request Depth of Market Data', :connected => true,
5
5
 
6
6
  before(:all) do
7
7
  verify_account
8
- connect_and_receive :Alert, :MarketDepth
8
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
9
9
 
10
10
  @ib.send_message :RequestMarketDepth, :id => 456, :num_rows => 3,
11
11
  :contract => IB::Symbols::Forex[:eurusd]
12
12
 
13
- wait_for(3) { received? :MarketDepth, 8 }
13
+ @ib.wait_for 10, [:MarketDepth, 8]
14
14
  end
15
15
 
16
16
  after(:all) do
@@ -18,9 +18,9 @@ describe 'Request Depth of Market Data', :connected => true,
18
18
  close_connection
19
19
  end
20
20
 
21
- subject { @received[:MarketDepth].last }
21
+ subject { @ib.received[:MarketDepth].last }
22
22
 
23
- it { @received[:MarketDepth].should have_at_least(8).depth_data }
23
+ it { @ib.received[:MarketDepth].should have_at_least(8).depth_data }
24
24
 
25
25
  it { should be_an IB::Messages::Incoming::MarketDepth }
26
26
  its(:request_id) { should == 456 }
@@ -2,38 +2,33 @@ require 'integration_helper'
2
2
 
3
3
  describe 'Request Historic Data', :connected => true, :integration => true do
4
4
 
5
+ CORRECT_OPTS = {:id => 456,
6
+ :contract => IB::Symbols::Stocks[:wfc],
7
+ :end_date_time => Time.now.to_ib,
8
+ :duration => '1 D',
9
+ :bar_size => '15 mins',
10
+ :what_to_show => :trades,
11
+ :format_date => 1}
5
12
  before(:all) do
6
13
  verify_account
7
- connect_and_receive :Alert, :HistoricalData
14
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
8
15
  end
9
16
 
10
17
  after(:all) do
11
- @ib.send_message :CancelHistoricalData, :id => 456
18
+ #@ib.send_message :CancelHistoricalData, :id => 456
12
19
  close_connection
13
20
  end
14
21
 
15
22
  context 'Wrong Requests' do
16
23
  it 'raises if incorrect bar size' do
17
24
  expect do
18
- @ib.send_message :RequestHistoricalData, :id => 456,
19
- :contract => IB::Symbols::Stocks[:wfc],
20
- :end_date_time => Time.now.to_ib,
21
- :duration => '1 D',
22
- :bar_size => '11 min',
23
- :what_to_show => :trades,
24
- :format_date => 1
25
+ @ib.send_message :RequestHistoricalData, CORRECT_OPTS.merge(:bar_size => '11 min')
25
26
  end.to raise_error /bar_size must be one of/
26
27
  end
27
28
 
28
29
  it 'raises if incorrect what_to_show' do
29
30
  expect do
30
- @ib.send_message :RequestHistoricalData, :id => 456,
31
- :contract => IB::Symbols::Stocks[:wfc],
32
- :end_date_time => Time.now.to_ib,
33
- :duration => '1 D',
34
- :bar_size => '15 mins',
35
- :what_to_show => :nonsense,
36
- :format_date => 1
31
+ @ib.send_message :RequestHistoricalData, CORRECT_OPTS.merge(:what_to_show => :nonsense)
37
32
  end.to raise_error /:what_to_show must be one of/
38
33
  end
39
34
  end
@@ -41,20 +36,13 @@ describe 'Request Historic Data', :connected => true, :integration => true do
41
36
  context 'Correct Request' do
42
37
  before(:all) do
43
38
  # No historical data for GBP/CASH@IDEALPRO
44
- @ib.send_message :RequestHistoricalData, :id => 456,
45
- :contract => IB::Symbols::Stocks[:wfc],
46
- :end_date_time => Time.now.to_ib,
47
- :duration => '1 D',
48
- :bar_size => '15 mins',
49
- :what_to_show => :trades,
50
- :format_date => 1
51
-
52
- wait_for(3) { received? :HistoricalData }
39
+ @ib.send_message :RequestHistoricalData, CORRECT_OPTS
40
+ @ib.wait_for 5, :HistoricalData
53
41
  end
54
42
 
55
- subject { @received[:HistoricalData].last }
43
+ subject { @ib.received[:HistoricalData].last }
56
44
 
57
- it { @received[:HistoricalData].should have_at_least(1).historic_data }
45
+ it { @ib.received[:HistoricalData].should have_at_least(1).historic_data }
58
46
 
59
47
  it { should be_an IB::Messages::Incoming::HistoricalData }
60
48
  its(:request_id) { should == 456 }
@@ -1,17 +1,25 @@
1
1
  require 'integration_helper'
2
+ #!/usr/bin/env ruby
2
3
 
4
+ require 'ib-ruby'
5
+
6
+ #OPTS[:silent] = false
3
7
  describe 'Request Market Data', :connected => true, :integration => true do
4
8
 
5
- context 'when subscribed to :Tick... messages' do
9
+ require 'ib-ruby'
10
+ before(:all) { verify_account }
6
11
 
12
+ context 'US Stocks market', :if => :us_trading_hours do
7
13
  before(:all) do
8
- verify_account
9
- connect_and_receive :Alert, :TickPrice, :TickSize
10
-
11
- ##TODO consider a follow the sun market lookup for windening the types tested
12
- @ib.send_message :RequestMarketData, :id => 456,
13
- :contract => IB::Symbols::Forex[:eurusd]
14
- wait_for(3) { received? :TickPrice }
14
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
15
+ @contract = IB::Models::Contract.new(:symbol => 'AAPL',
16
+ :exchange => "Smart",
17
+ :currency => "USD",
18
+ :sec_type => IB::SECURITY_TYPES[:stock],
19
+ :description => "Apple"
20
+ )
21
+ @ib.send_message :RequestMarketData, :id => 456, :contract => @contract
22
+ @ib.wait_for 5, :TickSize, :TickString
15
23
  end
16
24
 
17
25
  after(:all) do
@@ -19,79 +27,84 @@ describe 'Request Market Data', :connected => true, :integration => true do
19
27
  close_connection
20
28
  end
21
29
 
22
- context "received :Alert message " do
23
- subject { @received[:Alert].first }
30
+ it_behaves_like 'Received Market Data'
24
31
 
25
- it { should be_an IB::Messages::Incoming::Alert }
26
- it { should be_warning }
27
- it { should_not be_error }
28
- its(:code) { should be_an Integer }
29
- its(:message) { should =~ /Market data farm connection is OK/ }
30
- its(:to_human) { should =~ /TWS Warning/ }
31
- end
32
+ context "received :TickString message" do
33
+ subject { @ib.received[:TickString].first }
32
34
 
33
- context "received :TickPrice message" do
34
- subject { @received[:TickPrice].first }
35
-
36
- it { should be_an IB::Messages::Incoming::TickPrice }
35
+ it { should be_an IB::Messages::Incoming::TickString }
37
36
  its(:tick_type) { should be_an Integer }
38
37
  its(:type) { should be_a Symbol }
39
- its(:price) { should be_a Float }
40
- its(:size) { should be_an Integer }
38
+ its(:value) { should be_a String }
41
39
  its(:data) { should be_a Hash }
42
40
  its(:ticker_id) { should == 456 } # ticker_id
43
- its(:to_human) { should =~ /TickPrice/ }
41
+ its(:to_human) { should =~ /TickString/ }
44
42
  end
43
+ end
44
+
45
+ context 'FOREX market' do
46
+ context 'when subscribed to :Tick... messages' do
45
47
 
46
- context "received :TickSize message", :if => :forex_trading_hours do
47
48
  before(:all) do
48
- wait_for(3) { received? :TickSize }
49
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
50
+
51
+ ##TODO consider a follow the sun market lookup for windening the types tested
52
+ @ib.subscribe(:Alert, :TickPrice, :TickSize) {}
53
+ @ib.send_message :RequestMarketData, :id => 456,
54
+ :contract => IB::Symbols::Forex[:eurusd]
55
+
56
+ @ib.wait_for 3, :TickPrice, :TickSize
49
57
  end
50
58
 
51
- subject { @received[:TickSize].first }
59
+ after(:all) do
60
+ @ib.send_message :CancelMarketData, :id => 456
61
+ close_connection
62
+ end
52
63
 
53
- it { should be_an IB::Messages::Incoming::TickSize }
54
- its(:type) { should_not be_nil }
55
- its(:data) { should be_a Hash }
56
- its(:tick_type) { should be_an Integer }
57
- its(:type) { should be_a Symbol }
58
- its(:size) { should be_an Integer }
59
- its(:ticker_id) { should == 456 }
60
- its(:to_human) { should =~ /TickSize/ }
61
- end
62
- end # when subscribed to :Tick... messages
64
+ it_behaves_like 'Received Market Data'
63
65
 
64
- context 'when NOT subscribed to :Tick... messages', :slow => true do
66
+ it 'logs no warning about unhandled :Alert message' do
67
+ should_not_log /No subscribers for message .*:Alert/
68
+ end
65
69
 
66
- before(:all) do
67
- connect_and_receive :NextValidID
70
+ it 'logs no warning about unhandled :Tick... messages' do
71
+ should_not_log /No subscribers for message .*:TickPrice/
72
+ end
68
73
 
69
- @ib.send_message :RequestMarketData, :id => 456,
70
- :contract => IB::Symbols::Forex[:eurusd]
71
- wait_for(2)
72
- end
74
+ it 'logs no warning about unhandled :Tick... messages', :if => :forex_trading_hours do
75
+ should_not_log /No subscribers for message .*:TickSize/
76
+ end
73
77
 
74
- after(:all) do
75
- @ib.send_message :CancelMarketData, :id => 456
76
- close_connection
77
- end
78
+ end # when subscribed to :Tick... messages
78
79
 
79
- it "logs warning about unhandled :OpenOrderEnd message" do
80
- should_log /No subscribers for message .*:OpenOrderEnd/
81
- end
80
+ context 'when NOT subscribed to :Tick... messages', :slow => true do
82
81
 
83
- it "logs warning about unhandled :Alert message" do
84
- should_log /No subscribers for message .*:Alert/
85
- end
82
+ before(:all) do
83
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
86
84
 
87
- it "logs warning about unhandled :Tick... messages" do
88
- should_log /No subscribers for message .*:TickPrice/
89
- end
85
+ @ib.send_message :RequestMarketData, :id => 456,
86
+ :contract => IB::Symbols::Forex[:eurusd]
87
+ @ib.wait_for 3, :TickPrice, :TickSize
88
+ end
90
89
 
91
- it "logs warning about unhandled :Tick... messages", :if => :forex_trading_hours do
92
- should_log /No subscribers for message .*:TickSize/
93
- end
90
+ after(:all) do
91
+ @ib.send_message :CancelMarketData, :id => 456
92
+ close_connection
93
+ end
94
+
95
+ it 'logs warning about unhandled :Alert message' do
96
+ should_log /No subscribers for message .*:Alert/
97
+ end
98
+
99
+ it 'logs warning about unhandled :Tick... messages' do
100
+ should_log /No subscribers for message .*:TickPrice/
101
+ end
102
+
103
+ it 'logs warning about unhandled :Tick... messages', :if => :forex_trading_hours do
104
+ should_log /No subscribers for message .*:TickSize/
105
+ end
94
106
 
95
- end # NOT subscribed to :Tick... messages
107
+ end # NOT subscribed to :Tick... messages
108
+ end
96
109
 
97
110
  end # Request Market Data
@@ -1,22 +1,15 @@
1
1
  require 'integration_helper'
2
2
 
3
- def wait_for_all_ticks
4
- wait_for(5) do
5
- received?(:TickPrice) && received?(:TickSize) &&
6
- received?(:TickOption) && received?(:TickString)
7
- end
8
- end
9
-
10
3
  describe 'Request Market Data for Options', :if => :us_trading_hours,
11
4
  :connected => true, :integration => true do
12
5
 
13
6
  before(:all) do
14
7
  verify_account
15
- connect_and_receive :Alert, :TickPrice, :TickSize, :TickOption, :TickString
8
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
16
9
 
17
10
  @ib.send_message :RequestMarketData, :id => 456,
18
11
  :contract => IB::Symbols::Options[:aapl500]
19
- wait_for_all_ticks
12
+ @ib.wait_for 5, :TickPrice, :TickSize, :TickString, :TickOption
20
13
  end
21
14
 
22
15
  after(:all) do
@@ -24,46 +17,10 @@ describe 'Request Market Data for Options', :if => :us_trading_hours,
24
17
  close_connection
25
18
  end
26
19
 
27
- context "received :Alert message " do
28
- subject { @received[:Alert].first }
29
-
30
- it { should be_an IB::Messages::Incoming::Alert }
31
- it { should be_warning }
32
- it { should_not be_error }
33
- its(:code) { should be_an Integer }
34
- its(:message) { should =~ /Market data farm connection is OK/ }
35
- its(:to_human) { should =~ /TWS Warning/ }
36
- end
37
-
38
- context "received :TickPrice message" do
39
- subject { @received[:TickPrice].first }
40
-
41
- it { should be_an IB::Messages::Incoming::TickPrice }
42
- its(:tick_type) { should be_an Integer }
43
- its(:type) { should be_a Symbol }
44
- its(:price) { should be_a Float }
45
- its(:size) { should be_an Integer }
46
- its(:can_auto_execute) { should be_an Integer }
47
- its(:data) { should be_a Hash }
48
- its(:ticker_id) { should == 456 } # ticker_id
49
- its(:to_human) { should =~ /TickPrice/ }
50
- end
51
-
52
- context "received :TickSize message" do
53
- subject { @received[:TickSize].first }
54
-
55
- it { should be_an IB::Messages::Incoming::TickSize }
56
- its(:type) { should_not be_nil }
57
- its(:data) { should be_a Hash }
58
- its(:tick_type) { should be_an Integer }
59
- its(:type) { should be_a Symbol }
60
- its(:size) { should be_an Integer }
61
- its(:ticker_id) { should == 456 }
62
- its(:to_human) { should =~ /TickSize/ }
63
- end
20
+ it_behaves_like 'Received Market Data'
64
21
 
65
22
  context "received :TickOption message" do
66
- subject { @received[:TickOption].first }
23
+ subject { @ib.received[:TickOption].first }
67
24
 
68
25
  it { should be_an IB::Messages::Incoming::TickOption }
69
26
  its(:type) { should_not be_nil }
@@ -82,7 +39,7 @@ describe 'Request Market Data for Options', :if => :us_trading_hours,
82
39
  end
83
40
 
84
41
  context "received :TickString message" do
85
- subject { @received[:TickString].first }
42
+ subject { @ib.received[:TickString].first }
86
43
 
87
44
  it { should be_an IB::Messages::Incoming::TickString }
88
45
  its(:type) { should_not be_nil }
@@ -1,14 +1,5 @@
1
1
  require 'integration_helper'
2
2
 
3
- # TODO: RequestExecutions (with filters?)
4
-
5
- def wait_for_execution_and_commission
6
- wait_for(5) do
7
- received?(:ExecutionData) && received?(:OpenOrder) &&
8
- @received[:OpenOrder].last.order.commission
9
- end
10
- end
11
-
12
3
  describe "Trades", :connected => true, :integration => true, :slow => true do
13
4
 
14
5
  before(:all) { verify_account }
@@ -17,9 +8,8 @@ describe "Trades", :connected => true, :integration => true, :slow => true do
17
8
 
18
9
  before(:all) do
19
10
  @contract = IB::Symbols::Forex[:eurusd]
20
- connect_and_receive :NextValidID, :Alert, :ExecutionData, :ExecutionDataEnd,
21
- :OpenOrder, :OrderStatus, :OpenOrderEnd
22
- wait_for { received? :NextValidID }
11
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
12
+ @ib.wait_for :NextValidId
23
13
  end
24
14
 
25
15
  after(:all) { close_connection }
@@ -32,7 +22,9 @@ describe "Trades", :connected => true, :integration => true, :slow => true do
32
22
  :limit_price => 2,
33
23
  :action => 'BUY'
34
24
 
35
- wait_for_execution_and_commission
25
+ @ib.wait_for(5, :ExecutionData, :OpenOrder) do
26
+ @ib.received[:OpenOrder].last.order.commission
27
+ end
36
28
  end
37
29
 
38
30
  after(:all) do
@@ -45,19 +37,19 @@ describe "Trades", :connected => true, :integration => true, :slow => true do
45
37
  @ib.next_order_id.should == @order_id_before + 1
46
38
  end
47
39
 
48
- it { @received[:OpenOrder].should have_at_least(1).open_order_message }
49
- it { @received[:OrderStatus].should have_at_least(1).status_message }
50
- it { @received[:ExecutionData].should have_exactly(1).execution_data }
51
- it { @received[:ExecutionDataEnd].should be_empty }
40
+ it { @ib.received[:OpenOrder].should have_at_least(1).open_order_message }
41
+ it { @ib.received[:OrderStatus].should have_at_least(1).status_message }
42
+ it { @ib.received[:ExecutionData].should have_exactly(1).execution_data }
43
+ it { @ib.received[:ExecutionDataEnd].should be_empty }
52
44
 
53
45
  it 'receives filled OpenOrder' do
54
46
  open_order_should_be 'Filled', -1
55
- msg = @received[:OpenOrder].last
47
+ msg = @ib.received[:OpenOrder].last
56
48
  msg.order.commission.should == 2.5
57
49
  end
58
50
 
59
51
  it 'receives Execution Data' do
60
- execution_should_be 'BUY'
52
+ execution_should_be :buy
61
53
  end
62
54
 
63
55
  it 'receives OrderStatus with fill details' do
@@ -73,7 +65,9 @@ describe "Trades", :connected => true, :integration => true, :slow => true do
73
65
  :limit_price => 1,
74
66
  :action => 'SELL'
75
67
 
76
- wait_for_execution_and_commission
68
+ @ib.wait_for(5, :ExecutionData, :OpenOrder) do
69
+ @ib.received[:OpenOrder].last.order.commission
70
+ end
77
71
  end
78
72
 
79
73
  after(:all) do
@@ -86,18 +80,18 @@ describe "Trades", :connected => true, :integration => true, :slow => true do
86
80
  @ib.next_order_id.should == @order_id_before + 1
87
81
  end
88
82
 
89
- it { @received[:OpenOrder].should have_at_least(1).open_order_message }
90
- it { @received[:OrderStatus].should have_at_least(1).status_message }
91
- it { @received[:ExecutionData].should have_exactly(1).execution_data }
83
+ it { @ib.received[:OpenOrder].should have_at_least(1).open_order_message }
84
+ it { @ib.received[:OrderStatus].should have_at_least(1).status_message }
85
+ it { @ib.received[:ExecutionData].should have_exactly(1).execution_data }
92
86
 
93
87
  it 'receives filled OpenOrder' do
94
88
  open_order_should_be 'Filled', -1
95
- msg = @received[:OpenOrder].last
89
+ msg = @ib.received[:OpenOrder].last
96
90
  msg.order.commission.should == 2.5
97
91
  end
98
92
 
99
93
  it 'receives Execution Data' do
100
- execution_should_be 'SELL'
94
+ execution_should_be :sell
101
95
  end
102
96
 
103
97
  it 'receives OrderStatus with fill details' do
@@ -106,28 +100,29 @@ describe "Trades", :connected => true, :integration => true, :slow => true do
106
100
  end # Placing SELL
107
101
 
108
102
  context "Request executions" do
103
+ # TODO: RequestExecutions with filters?
109
104
 
110
105
  before(:all) do
111
106
  @ib.send_message :RequestExecutions,
112
107
  :request_id => 456,
113
108
  :client_id => OPTS[:connection][:client_id],
114
- :time => (Time.now-10).to_ib
115
- wait_for(3) { received?(:ExecutionData) }
109
+ :time => (Time.now-10).to_ib # Time zone problems possible
110
+ @ib.wait_for 3, :ExecutionData
116
111
  end
117
112
 
118
113
  #after(:all) { clean_connection }
119
114
 
120
115
  it 'does not receive Order-related messages' do
121
- @received[:OpenOrder].should be_empty
122
- @received[:OrderStatus].should be_empty
116
+ @ib.received[:OpenOrder].should be_empty
117
+ @ib.received[:OrderStatus].should be_empty
123
118
  end
124
119
 
125
120
  it 'receives ExecutionData messages' do
126
- @received[:ExecutionData].should have_at_least(1).execution_data
121
+ @ib.received[:ExecutionData].should have_at_least(1).execution_data
127
122
  end
128
123
 
129
124
  it 'receives Execution Data' do
130
- execution_should_be 'SELL', :request_id => 456
125
+ execution_should_be :sell, :request_id => 456
131
126
  end
132
127
  end # Request executions
133
128
  end # Forex order
@@ -1,3 +1,5 @@
1
+ This is just a dump file to compare received order messages:
2
+
1
3
  [#<IB::Messages::Incoming::OpenOrder:0xfdc #<IB::Messages::Incoming::OpenOrder:0x10b8 #<IB::Messages::Incoming::OpenOrder:0x1198
2
4
  @contract= @contract= @contract=
3
5
  #<IB::Models::Contract:0xfe0 #<IB::Models::Contract:0x10bc #<IB::Models::Contract:0x119c