bitex_bot 0.6.1 → 0.9.0
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -3
- data/Gemfile +3 -1
- data/bitex_bot.gemspec +5 -2
- data/lib/bitex_bot/database.rb +2 -2
- data/lib/bitex_bot/models/api_wrappers/api_wrapper.rb +47 -35
- data/lib/bitex_bot/models/api_wrappers/bitex/bitex_api_wrapper.rb +178 -0
- data/lib/bitex_bot/models/api_wrappers/bitstamp/bitstamp_api_wrapper.rb +62 -45
- data/lib/bitex_bot/models/api_wrappers/itbit/itbit_api_wrapper.rb +52 -28
- data/lib/bitex_bot/models/api_wrappers/kraken/kraken_api_wrapper.rb +61 -28
- data/lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb +12 -6
- data/lib/bitex_bot/models/buy_closing_flow.rb +3 -2
- data/lib/bitex_bot/models/buy_opening_flow.rb +31 -6
- data/lib/bitex_bot/models/closing_flow.rb +37 -22
- data/lib/bitex_bot/models/open_buy.rb +1 -3
- data/lib/bitex_bot/models/open_sell.rb +1 -3
- data/lib/bitex_bot/models/opening_flow.rb +42 -28
- data/lib/bitex_bot/models/order_book_simulator.rb +14 -13
- data/lib/bitex_bot/models/sell_closing_flow.rb +3 -2
- data/lib/bitex_bot/models/sell_opening_flow.rb +29 -4
- data/lib/bitex_bot/robot.rb +28 -43
- data/lib/bitex_bot/settings.rb +2 -0
- data/lib/bitex_bot/version.rb +1 -1
- data/settings.rb.sample +23 -5
- data/spec/bitex_bot/settings_spec.rb +13 -6
- data/spec/factories/bitex_ask.rb +14 -0
- data/spec/factories/bitex_bid.rb +14 -0
- data/spec/factories/bitex_buy.rb +7 -7
- data/spec/factories/bitex_sell.rb +7 -7
- data/spec/factories/buy_opening_flow.rb +10 -10
- data/spec/factories/open_buy.rb +8 -8
- data/spec/factories/open_sell.rb +8 -8
- data/spec/factories/sell_opening_flow.rb +10 -10
- data/spec/fixtures/bitstamp/balance.yml +63 -0
- data/spec/fixtures/bitstamp/order_book.yml +60 -0
- data/spec/fixtures/bitstamp/orders/all.yml +62 -0
- data/spec/fixtures/bitstamp/orders/failure_sell.yml +60 -0
- data/spec/fixtures/bitstamp/orders/successful_buy.yml +62 -0
- data/spec/fixtures/bitstamp/transactions.yml +244 -0
- data/spec/fixtures/bitstamp/user_transactions.yml +223 -0
- data/spec/models/api_wrappers/bitex_api_wrapper_spec.rb +147 -0
- data/spec/models/api_wrappers/bitstamp_api_wrapper_spec.rb +134 -140
- data/spec/models/api_wrappers/itbit_api_wrapper_spec.rb +9 -3
- data/spec/models/api_wrappers/kraken_api_wrapper_spec.rb +142 -73
- data/spec/models/bitex_api_spec.rb +4 -4
- data/spec/models/buy_closing_flow_spec.rb +19 -24
- data/spec/models/buy_opening_flow_spec.rb +102 -83
- data/spec/models/order_book_simulator_spec.rb +5 -0
- data/spec/models/robot_spec.rb +7 -4
- data/spec/models/sell_closing_flow_spec.rb +21 -25
- data/spec/models/sell_opening_flow_spec.rb +100 -80
- data/spec/spec_helper.rb +3 -1
- data/spec/support/bitex_stubs.rb +80 -40
- data/spec/support/bitstamp/bitstamp_api_wrapper_stubs.rb +2 -2
- data/spec/support/bitstamp/bitstamp_stubs.rb +3 -3
- data/spec/support/vcr.rb +8 -0
- data/spec/support/webmock.rb +8 -0
- metadata +77 -10
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe BitexBot::BuyOpeningFlow do
|
4
|
-
before(:each) {
|
4
|
+
before(:each) { BitexBot::Robot.setup }
|
5
5
|
|
6
6
|
let(:store) { BitexBot::Store.create }
|
7
7
|
|
@@ -13,19 +13,23 @@ describe BitexBot::BuyOpeningFlow do
|
|
13
13
|
|
14
14
|
describe 'when creating a buying flow' do
|
15
15
|
it 'spends 50 usd' do
|
16
|
-
|
17
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
bitstamp_api_wrapper_order_book.bids,
|
22
|
-
|
16
|
+
stub_bitex_active_orders
|
17
|
+
BitexBot::Settings.stub(time_to_live: 3, buying: double(amount_to_spend_per_order: 50, profit: 0))
|
18
|
+
|
19
|
+
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
20
|
+
100,
|
21
|
+
bitstamp_api_wrapper_order_book.bids,
|
22
|
+
bitstamp_api_wrapper_transactions_stub,
|
23
|
+
0.5,
|
24
|
+
0.25,
|
25
|
+
store
|
26
|
+
)
|
23
27
|
|
24
28
|
flow.order_id.should == 12345
|
25
29
|
flow.value_to_use.should == 50
|
30
|
+
flow.suggested_closing_price.should == 20
|
26
31
|
flow.price.should <= flow.suggested_closing_price
|
27
32
|
flow.price.round(14).should == '19.85074626865672'.to_d
|
28
|
-
flow.suggested_closing_price.should == 20
|
29
33
|
end
|
30
34
|
|
31
35
|
let(:order_id) { 12_345 }
|
@@ -39,49 +43,44 @@ describe BitexBot::BuyOpeningFlow do
|
|
39
43
|
it 'spends 100 usd' do
|
40
44
|
suggested_closing_price = 15.to_d
|
41
45
|
|
42
|
-
BitexBot::Settings.stub(
|
43
|
-
|
44
|
-
|
46
|
+
BitexBot::Settings.stub(time_to_live: 3, buying: double(amount_to_spend_per_order: amount_to_spend, profit: 0))
|
47
|
+
stub_bitex_active_orders
|
48
|
+
|
49
|
+
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
50
|
+
btc_balance,
|
51
|
+
order_book,
|
52
|
+
transactions,
|
53
|
+
maker_fee,
|
54
|
+
taker_fee,
|
55
|
+
store
|
45
56
|
)
|
46
|
-
stub_bitex_orders
|
47
|
-
|
48
|
-
flow =
|
49
|
-
BitexBot::BuyOpeningFlow.create_for_market(
|
50
|
-
btc_balance,
|
51
|
-
order_book,
|
52
|
-
transactions,
|
53
|
-
maker_fee,
|
54
|
-
taker_fee,
|
55
|
-
store
|
56
|
-
)
|
57
57
|
|
58
58
|
flow.order_id.should eq order_id
|
59
59
|
flow.value_to_use.should eq amount_to_spend
|
60
|
-
flow.price.should <= suggested_closing_price
|
61
60
|
flow.suggested_closing_price.should eq suggested_closing_price
|
61
|
+
flow.price.should <= suggested_closing_price
|
62
62
|
end
|
63
63
|
|
64
64
|
let(:other_fx_rate) { 10.to_d }
|
65
65
|
|
66
66
|
it 'spends 100 usd with other fx_rate' do
|
67
|
-
suggested_closing_price =
|
67
|
+
suggested_closing_price = 15.to_d
|
68
68
|
|
69
69
|
BitexBot::Settings.stub(
|
70
70
|
buying_foreign_exchange_rate: other_fx_rate,
|
71
71
|
time_to_live: 3,
|
72
72
|
buying: double(amount_to_spend_per_order: amount_to_spend, profit: 0)
|
73
73
|
)
|
74
|
-
|
75
|
-
|
76
|
-
flow =
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
)
|
74
|
+
stub_bitex_active_orders
|
75
|
+
|
76
|
+
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
77
|
+
btc_balance,
|
78
|
+
order_book,
|
79
|
+
transactions,
|
80
|
+
maker_fee,
|
81
|
+
taker_fee,
|
82
|
+
store
|
83
|
+
)
|
85
84
|
|
86
85
|
flow.order_id.should eq order_id
|
87
86
|
flow.value_to_use.should eq amount_to_spend
|
@@ -90,13 +89,17 @@ describe BitexBot::BuyOpeningFlow do
|
|
90
89
|
end
|
91
90
|
|
92
91
|
it 'lowers the price to pay on bitex to take a profit' do
|
93
|
-
|
94
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
bitstamp_api_wrapper_order_book.bids,
|
99
|
-
|
92
|
+
stub_bitex_active_orders
|
93
|
+
BitexBot::Settings.stub(time_to_live: 3, buying: double(amount_to_spend_per_order: 100, profit: 50.to_d))
|
94
|
+
|
95
|
+
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
96
|
+
100_000,
|
97
|
+
bitstamp_api_wrapper_order_book.bids,
|
98
|
+
bitstamp_api_wrapper_transactions_stub,
|
99
|
+
0.5,
|
100
|
+
0.25,
|
101
|
+
store
|
102
|
+
)
|
100
103
|
|
101
104
|
flow.order_id.should == 12345
|
102
105
|
flow.value_to_use.should == 100
|
@@ -108,13 +111,17 @@ describe BitexBot::BuyOpeningFlow do
|
|
108
111
|
it 'fails when there is a problem placing the bid on bitex' do
|
109
112
|
Bitex::Bid.stub(:create!) { raise StandardError.new('Cannot Create') }
|
110
113
|
|
111
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
112
|
-
buying: double(amount_to_spend_per_order: 100, profit: 0))
|
114
|
+
BitexBot::Settings.stub(time_to_live: 3, buying: double(amount_to_spend_per_order: 100, profit: 0))
|
113
115
|
|
114
116
|
expect do
|
115
|
-
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
116
|
-
|
117
|
-
|
117
|
+
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
118
|
+
100_000,
|
119
|
+
bitstamp_api_wrapper_order_book.bids,
|
120
|
+
bitstamp_api_wrapper_transactions_stub,
|
121
|
+
0.5,
|
122
|
+
0.25,
|
123
|
+
store
|
124
|
+
)
|
118
125
|
|
119
126
|
flow.should be_nil
|
120
127
|
BitexBot::BuyOpeningFlow.count.should == 0
|
@@ -122,14 +129,18 @@ describe BitexBot::BuyOpeningFlow do
|
|
122
129
|
end
|
123
130
|
|
124
131
|
it 'fails when there are not enough bitcoin to sell in the other exchange' do
|
125
|
-
|
126
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
127
|
-
buying: double(amount_to_spend_per_order: 100, profit: 0))
|
132
|
+
stub_bitex_active_orders
|
133
|
+
BitexBot::Settings.stub(time_to_live: 3, buying: double(amount_to_spend_per_order: 100, profit: 0))
|
128
134
|
|
129
135
|
expect do
|
130
|
-
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
131
|
-
|
132
|
-
|
136
|
+
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
137
|
+
1,
|
138
|
+
bitstamp_api_wrapper_order_book.bids,
|
139
|
+
bitstamp_api_wrapper_transactions_stub,
|
140
|
+
0.5,
|
141
|
+
0.25,
|
142
|
+
store
|
143
|
+
)
|
133
144
|
|
134
145
|
flow.should be_nil
|
135
146
|
BitexBot::BuyOpeningFlow.count.should == 0
|
@@ -138,13 +149,17 @@ describe BitexBot::BuyOpeningFlow do
|
|
138
149
|
|
139
150
|
it 'prioritizes profit from store' do
|
140
151
|
store = BitexBot::Store.new(buying_profit: 0.5)
|
141
|
-
|
142
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
bitstamp_api_wrapper_order_book.bids,
|
147
|
-
|
152
|
+
stub_bitex_active_orders
|
153
|
+
BitexBot::Settings.stub(time_to_live: 3, buying: double(amount_to_spend_per_order: 50, profit: 0))
|
154
|
+
|
155
|
+
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
156
|
+
100,
|
157
|
+
bitstamp_api_wrapper_order_book.bids,
|
158
|
+
bitstamp_api_wrapper_transactions_stub,
|
159
|
+
0.5,
|
160
|
+
0.25,
|
161
|
+
store
|
162
|
+
)
|
148
163
|
|
149
164
|
flow.price.round(13).should == '19.7514925373134'.to_d
|
150
165
|
end
|
@@ -186,32 +201,32 @@ describe BitexBot::BuyOpeningFlow do
|
|
186
201
|
end
|
187
202
|
|
188
203
|
it 'does not register buys from another order book' do
|
189
|
-
flow.order_id.should == 12345
|
190
204
|
Bitex::Trade.stub(all: [build(:bitex_buy, id: 23456, order_book: :btc_ars)])
|
191
205
|
|
192
|
-
|
193
|
-
|
194
|
-
end.not_to change { BitexBot::OpenBuy.count }
|
206
|
+
flow.order_id.should == 12345
|
207
|
+
expect { BitexBot::BuyOpeningFlow.sync_open_positions.should be_empty }.not_to change { BitexBot::OpenBuy.count }
|
195
208
|
BitexBot::OpenBuy.count.should == 0
|
196
209
|
end
|
197
210
|
|
198
211
|
it 'does not register buys from unknown bids' do
|
199
212
|
stub_bitex_transactions
|
200
213
|
|
201
|
-
expect
|
202
|
-
BitexBot::BuyOpeningFlow.sync_open_positions.should be_empty
|
203
|
-
end.not_to change { BitexBot::OpenBuy.count }
|
214
|
+
expect { BitexBot::BuyOpeningFlow.sync_open_positions.should be_empty }.not_to change { BitexBot::OpenBuy.count }
|
204
215
|
end
|
205
216
|
end
|
206
217
|
|
207
218
|
it 'cancels the associated bitex bid' do
|
208
|
-
|
209
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
bitstamp_api_wrapper_order_book.bids,
|
214
|
-
|
219
|
+
stub_bitex_active_orders
|
220
|
+
BitexBot::Settings.stub(time_to_live: 3, buying: double(amount_to_spend_per_order: 50, profit: 0))
|
221
|
+
|
222
|
+
flow = BitexBot::BuyOpeningFlow.create_for_market(
|
223
|
+
100,
|
224
|
+
bitstamp_api_wrapper_order_book.bids,
|
225
|
+
bitstamp_api_wrapper_transactions_stub,
|
226
|
+
0.5,
|
227
|
+
0.25,
|
228
|
+
store
|
229
|
+
)
|
215
230
|
|
216
231
|
flow.finalise!
|
217
232
|
flow.should be_settling
|
@@ -220,15 +235,19 @@ describe BitexBot::BuyOpeningFlow do
|
|
220
235
|
end
|
221
236
|
|
222
237
|
it 'order has expected order book' do
|
223
|
-
|
224
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
bitstamp_api_wrapper_order_book.bids,
|
229
|
-
|
238
|
+
stub_bitex_active_orders
|
239
|
+
BitexBot::Settings.stub(time_to_live: 3, buying: double(amount_to_spend_per_order: 50, profit: 0))
|
240
|
+
|
241
|
+
flow = subject.class.create_for_market(
|
242
|
+
100,
|
243
|
+
bitstamp_api_wrapper_order_book.bids,
|
244
|
+
bitstamp_api_wrapper_transactions_stub,
|
245
|
+
0.5,
|
246
|
+
0.25,
|
247
|
+
store
|
248
|
+
)
|
230
249
|
|
231
250
|
order = subject.class.order_class.find(flow.order_id)
|
232
|
-
order.order_book.should eq BitexBot::
|
251
|
+
order.order_book.should eq BitexBot::Robot.maker.base_quote.to_sym
|
233
252
|
end
|
234
253
|
end
|
@@ -1,6 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe BitexBot::OrderBookSimulator do
|
4
|
+
before(:each) do
|
5
|
+
BitexBot::Robot.taker = double(base: 'btc', quote: 'usd')
|
6
|
+
BitexBot::Robot.maker = double(base: 'btc', quote: 'usd')
|
7
|
+
end
|
8
|
+
|
4
9
|
describe 'when buying on bitex to sell somewhere else' do
|
5
10
|
def simulate(volatility, amount)
|
6
11
|
BitexBot::OrderBookSimulator.run(volatility, bitstamp_api_wrapper_transactions_stub,
|
data/spec/models/robot_spec.rb
CHANGED
@@ -4,7 +4,10 @@ describe BitexBot::Robot do
|
|
4
4
|
let(:taker_settings) do
|
5
5
|
BitexBot::SettingsClass.new(
|
6
6
|
bitstamp: {
|
7
|
-
api_key: 'YOUR_API_KEY',
|
7
|
+
api_key: 'YOUR_API_KEY',
|
8
|
+
secret: 'YOUR_API_SECRET',
|
9
|
+
client_id: 'YOUR_BITSTAMP_USERNAME',
|
10
|
+
order_book: 'btcusd'
|
8
11
|
}
|
9
12
|
)
|
10
13
|
end
|
@@ -35,7 +38,7 @@ describe BitexBot::Robot do
|
|
35
38
|
ltc_reserved: 100.00000000, # LTC reserved in open orders
|
36
39
|
ltc_available: 150.00000000 # LTC available for trading
|
37
40
|
})
|
38
|
-
|
41
|
+
stub_bitex_active_orders
|
39
42
|
stub_bitstamp_sell
|
40
43
|
stub_bitstamp_buy
|
41
44
|
stub_bitstamp_api_wrapper_balance
|
@@ -47,7 +50,7 @@ describe BitexBot::Robot do
|
|
47
50
|
let(:bot) { BitexBot::Robot.new }
|
48
51
|
|
49
52
|
it 'Starts out by creating opening flows that timeout' do
|
50
|
-
|
53
|
+
stub_bitex_active_orders
|
51
54
|
stub_bitstamp_api_wrapper_order_book
|
52
55
|
bot.trade!
|
53
56
|
|
@@ -187,7 +190,7 @@ describe BitexBot::Robot do
|
|
187
190
|
end
|
188
191
|
|
189
192
|
it 'notifies exceptions and sleeps' do
|
190
|
-
BitstampApiWrapper.stub(:balance) { raise StandardError.new('oh moova') }
|
193
|
+
BitstampApiWrapper.any_instance.stub(:balance) { raise StandardError.new('oh moova') }
|
191
194
|
|
192
195
|
expect { bot.trade! }.to change { Mail::TestMailer.deliveries.count }.by(1)
|
193
196
|
end
|
@@ -4,7 +4,10 @@ describe BitexBot::SellClosingFlow do
|
|
4
4
|
let(:taker_settings) do
|
5
5
|
BitexBot::SettingsClass.new(
|
6
6
|
bitstamp: {
|
7
|
-
api_key: 'YOUR_API_KEY',
|
7
|
+
api_key: 'YOUR_API_KEY',
|
8
|
+
secret: 'YOUR_API_SECRET',
|
9
|
+
client_id: 'YOUR_BITSTAMP_USERNAME',
|
10
|
+
order_book: 'btcusd'
|
8
11
|
}
|
9
12
|
)
|
10
13
|
end
|
@@ -61,8 +64,8 @@ describe BitexBot::SellClosingFlow do
|
|
61
64
|
|
62
65
|
describe 'when there are errors placing the closing order' do
|
63
66
|
it 'keeps trying to place a closed position on bitstamp errors' do
|
64
|
-
BitstampApiWrapper.stub(send_order: nil)
|
65
|
-
BitstampApiWrapper.stub(find_lost: nil)
|
67
|
+
BitstampApiWrapper.any_instance.stub(send_order: nil)
|
68
|
+
BitstampApiWrapper.any_instance.stub(find_lost: nil)
|
66
69
|
|
67
70
|
open = create :open_sell
|
68
71
|
expect do
|
@@ -81,9 +84,9 @@ describe BitexBot::SellClosingFlow do
|
|
81
84
|
end
|
82
85
|
|
83
86
|
it 'retries until it finds the lost order' do
|
84
|
-
BitstampApiWrapper.stub(send_order: nil)
|
85
|
-
BitstampApiWrapper.stub(:orders) do
|
86
|
-
[
|
87
|
+
BitstampApiWrapper.any_instance.stub(send_order: nil)
|
88
|
+
BitstampApiWrapper.any_instance.stub(:orders) do
|
89
|
+
[ApiWrapper::Order.new(1, :buy, 290, 2, 1.minute.ago.to_i)]
|
87
90
|
end
|
88
91
|
|
89
92
|
open = create(:open_sell)
|
@@ -126,7 +129,7 @@ describe BitexBot::SellClosingFlow do
|
|
126
129
|
flow = BitexBot::SellClosingFlow.last
|
127
130
|
stub_bitstamp_orders_into_transactions
|
128
131
|
|
129
|
-
flow.sync_closed_positions
|
132
|
+
flow.sync_closed_positions
|
130
133
|
|
131
134
|
close = flow.close_positions.last
|
132
135
|
close.amount.should == '583.905'.to_d
|
@@ -147,7 +150,7 @@ describe BitexBot::SellClosingFlow do
|
|
147
150
|
subject.class.close_open_positions
|
148
151
|
|
149
152
|
stub_bitstamp_orders_into_transactions
|
150
|
-
flow.sync_closed_positions
|
153
|
+
flow.sync_closed_positions
|
151
154
|
end
|
152
155
|
|
153
156
|
it 'syncs the executed orders, calculates profit with other fx rate' do
|
@@ -161,13 +164,11 @@ describe BitexBot::SellClosingFlow do
|
|
161
164
|
BitexBot::SellClosingFlow.close_open_positions
|
162
165
|
flow = BitexBot::SellClosingFlow.last
|
163
166
|
|
164
|
-
expect
|
165
|
-
flow.sync_closed_positions(Bitstamp.orders.all, Bitstamp.user_transactions.all)
|
166
|
-
end.not_to change{ BitexBot::CloseSell.count }
|
167
|
+
expect { flow.sync_closed_positions }.not_to change{ BitexBot::CloseSell.count }
|
167
168
|
flow.should_not be_done
|
168
169
|
|
169
170
|
# Immediately calling sync again does not try to cancel the ask.
|
170
|
-
flow.sync_closed_positions
|
171
|
+
flow.sync_closed_positions
|
171
172
|
Bitstamp.orders.all.size.should == 1
|
172
173
|
|
173
174
|
# Partially executes order, and 61 seconds after that
|
@@ -175,18 +176,15 @@ describe BitexBot::SellClosingFlow do
|
|
175
176
|
stub_bitstamp_orders_into_transactions(ratio: 0.5)
|
176
177
|
Timecop.travel 61.seconds.from_now
|
177
178
|
Bitstamp.orders.all.size.should == 1
|
178
|
-
expect
|
179
|
-
|
180
|
-
end.not_to change{ BitexBot::CloseSell.count }
|
179
|
+
expect { flow.sync_closed_positions }.not_to change{ BitexBot::CloseSell.count }
|
180
|
+
|
181
181
|
Bitstamp.orders.all.size.should == 0
|
182
182
|
flow.should_not be_done
|
183
183
|
|
184
184
|
# Next time we try to sync_closed_positions the flow
|
185
185
|
# detects the previous close_buy was cancelled correctly so
|
186
186
|
# it syncs it's total amounts and tries to place a new one.
|
187
|
-
expect
|
188
|
-
flow.sync_closed_positions(Bitstamp.orders.all, Bitstamp.user_transactions.all)
|
189
|
-
end.to change{ BitexBot::CloseSell.count }.by(1)
|
187
|
+
expect { flow.sync_closed_positions }.to change{ BitexBot::CloseSell.count }.by(1)
|
190
188
|
|
191
189
|
flow.close_positions.first.tap do |close|
|
192
190
|
close.amount.should == '291.9525'.to_d
|
@@ -197,7 +195,7 @@ describe BitexBot::SellClosingFlow do
|
|
197
195
|
# this closing flow done.
|
198
196
|
stub_bitstamp_orders_into_transactions
|
199
197
|
|
200
|
-
flow.sync_closed_positions
|
198
|
+
flow.sync_closed_positions
|
201
199
|
flow.close_positions.last.tap do |close|
|
202
200
|
close.amount.should == '291.953597'.to_d
|
203
201
|
close.quantity.should == '1.0049'.to_d
|
@@ -213,15 +211,13 @@ describe BitexBot::SellClosingFlow do
|
|
213
211
|
|
214
212
|
20.times do
|
215
213
|
Timecop.travel 60.seconds.from_now
|
216
|
-
flow.sync_closed_positions
|
214
|
+
flow.sync_closed_positions
|
217
215
|
end
|
218
216
|
|
219
217
|
stub_bitstamp_orders_into_transactions(ratio: 0.999)
|
220
218
|
Bitstamp.orders.all.first.cancel!
|
221
219
|
|
222
|
-
expect
|
223
|
-
flow.sync_closed_positions(Bitstamp.orders.all, Bitstamp.user_transactions.all)
|
224
|
-
end.not_to change{ BitexBot::CloseSell.count }
|
220
|
+
expect { flow.sync_closed_positions }.not_to change{ BitexBot::CloseSell.count }
|
225
221
|
|
226
222
|
flow.should be_done
|
227
223
|
flow.crypto_profit.should == '-0.0224895'.to_d
|
@@ -236,12 +232,12 @@ describe BitexBot::SellClosingFlow do
|
|
236
232
|
|
237
233
|
60.times do
|
238
234
|
Timecop.travel 60.seconds.from_now
|
239
|
-
flow.sync_closed_positions
|
235
|
+
flow.sync_closed_positions
|
240
236
|
end
|
241
237
|
|
242
238
|
stub_bitstamp_orders_into_transactions
|
243
239
|
|
244
|
-
flow.sync_closed_positions
|
240
|
+
flow.sync_closed_positions
|
245
241
|
flow.reload.should be_done
|
246
242
|
flow.crypto_profit.should == '-0.1709'.to_d
|
247
243
|
flow.fiat_profit.should == '20.08575'.to_d
|