bitex_bot 0.6.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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::SellOpeningFlow do
|
4
|
-
before(:each) {
|
4
|
+
before(:each) { BitexBot::Robot.setup }
|
5
5
|
|
6
6
|
let(:store) { BitexBot::Store.create }
|
7
7
|
|
@@ -13,13 +13,17 @@ describe BitexBot::SellOpeningFlow do
|
|
13
13
|
|
14
14
|
describe 'when creating a selling flow' do
|
15
15
|
it 'sells 2 bitcoin' do
|
16
|
-
|
17
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
bitstamp_api_wrapper_order_book.asks,
|
22
|
-
|
16
|
+
stub_bitex_active_orders
|
17
|
+
BitexBot::Settings.stub(time_to_live: 3, selling: double(quantity_to_sell_per_order: 2, profit: 0))
|
18
|
+
|
19
|
+
flow = BitexBot::SellOpeningFlow.create_for_market(
|
20
|
+
1000,
|
21
|
+
bitstamp_api_wrapper_order_book.asks,
|
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 == 2
|
@@ -37,21 +41,17 @@ describe BitexBot::SellOpeningFlow do
|
|
37
41
|
let(:transactions) { bitstamp_api_wrapper_transactions_stub }
|
38
42
|
|
39
43
|
it 'sells 4 bitcoin' do
|
40
|
-
BitexBot::Settings.stub(
|
41
|
-
|
42
|
-
|
44
|
+
BitexBot::Settings.stub(time_to_live: 3, selling: double(quantity_to_sell_per_order: amount_to_sell, profit: 0))
|
45
|
+
stub_bitex_active_orders
|
46
|
+
|
47
|
+
flow = BitexBot::SellOpeningFlow.create_for_market(
|
48
|
+
btc_balance,
|
49
|
+
orderbook,
|
50
|
+
transactions,
|
51
|
+
maker_fee,
|
52
|
+
taker_fee,
|
53
|
+
store
|
43
54
|
)
|
44
|
-
stub_bitex_orders
|
45
|
-
|
46
|
-
flow =
|
47
|
-
BitexBot::SellOpeningFlow.create_for_market(
|
48
|
-
btc_balance,
|
49
|
-
orderbook,
|
50
|
-
transactions,
|
51
|
-
maker_fee,
|
52
|
-
taker_fee,
|
53
|
-
store
|
54
|
-
)
|
55
55
|
|
56
56
|
flow.order_id.should eq order_id
|
57
57
|
flow.value_to_use.should eq amount_to_sell
|
@@ -66,17 +66,16 @@ describe BitexBot::SellOpeningFlow do
|
|
66
66
|
time_to_live: 3,
|
67
67
|
selling: double(quantity_to_sell_per_order: amount_to_sell, profit: 0)
|
68
68
|
)
|
69
|
-
|
70
|
-
|
71
|
-
flow =
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
)
|
69
|
+
stub_bitex_active_orders
|
70
|
+
|
71
|
+
flow = BitexBot::SellOpeningFlow.create_for_market(
|
72
|
+
btc_balance,
|
73
|
+
orderbook,
|
74
|
+
transactions,
|
75
|
+
maker_fee,
|
76
|
+
taker_fee,
|
77
|
+
store
|
78
|
+
)
|
80
79
|
|
81
80
|
flow.order_id.should eq order_id
|
82
81
|
flow.value_to_use.should eq amount_to_sell
|
@@ -84,13 +83,17 @@ describe BitexBot::SellOpeningFlow do
|
|
84
83
|
end
|
85
84
|
|
86
85
|
it 'raises the price to charge on bitex to take a profit' do
|
87
|
-
|
88
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
bitstamp_api_wrapper_order_book.asks,
|
93
|
-
|
86
|
+
stub_bitex_active_orders
|
87
|
+
BitexBot::Settings.stub(time_to_live: 3, selling: double(quantity_to_sell_per_order: 4, profit: 50.to_d))
|
88
|
+
|
89
|
+
flow = BitexBot::SellOpeningFlow.create_for_market(
|
90
|
+
1000,
|
91
|
+
bitstamp_api_wrapper_order_book.asks,
|
92
|
+
bitstamp_api_wrapper_transactions_stub,
|
93
|
+
0.5,
|
94
|
+
0.25,
|
95
|
+
store
|
96
|
+
)
|
94
97
|
|
95
98
|
flow.order_id.should == 12345
|
96
99
|
flow.value_to_use.should == 4
|
@@ -101,13 +104,17 @@ describe BitexBot::SellOpeningFlow do
|
|
101
104
|
|
102
105
|
it 'fails when there is a problem placing the ask on bitex' do
|
103
106
|
Bitex::Ask.stub(:create!) { raise StandardError.new('Cannot Create') }
|
104
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
105
|
-
selling: double(quantity_to_sell_per_order: 4, profit: 50))
|
107
|
+
BitexBot::Settings.stub(time_to_live: 3, selling: double(quantity_to_sell_per_order: 4, profit: 50))
|
106
108
|
|
107
109
|
expect do
|
108
|
-
flow = BitexBot::SellOpeningFlow.create_for_market(
|
109
|
-
|
110
|
-
|
110
|
+
flow = BitexBot::SellOpeningFlow.create_for_market(
|
111
|
+
100_000,
|
112
|
+
bitstamp_api_wrapper_order_book.asks,
|
113
|
+
bitstamp_api_wrapper_transactions_stub,
|
114
|
+
0.5,
|
115
|
+
0.25,
|
116
|
+
store
|
117
|
+
)
|
111
118
|
|
112
119
|
flow.should be_nil
|
113
120
|
BitexBot::SellOpeningFlow.count.should == 0
|
@@ -115,14 +122,18 @@ describe BitexBot::SellOpeningFlow do
|
|
115
122
|
end
|
116
123
|
|
117
124
|
it 'fails when there are not enough USD to re-buy in the other exchange' do
|
118
|
-
|
119
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
120
|
-
selling: double(quantity_to_sell_per_order: 4, profit: 50))
|
125
|
+
stub_bitex_active_orders
|
126
|
+
BitexBot::Settings.stub(time_to_live: 3, selling: double(quantity_to_sell_per_order: 4, profit: 50))
|
121
127
|
|
122
128
|
expect do
|
123
|
-
flow = BitexBot::SellOpeningFlow.create_for_market(
|
124
|
-
|
125
|
-
|
129
|
+
flow = BitexBot::SellOpeningFlow.create_for_market(
|
130
|
+
1,
|
131
|
+
bitstamp_api_wrapper_order_book.asks,
|
132
|
+
bitstamp_api_wrapper_transactions_stub,
|
133
|
+
0.5,
|
134
|
+
0.25,
|
135
|
+
store
|
136
|
+
)
|
126
137
|
|
127
138
|
flow.should be_nil
|
128
139
|
BitexBot::SellOpeningFlow.count.should == 0
|
@@ -130,20 +141,25 @@ describe BitexBot::SellOpeningFlow do
|
|
130
141
|
end
|
131
142
|
|
132
143
|
it 'Prioritizes profit from store' do
|
133
|
-
|
134
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
135
|
-
selling: double(quantity_to_sell_per_order: 2, profit: 0))
|
144
|
+
stub_bitex_active_orders
|
145
|
+
BitexBot::Settings.stub(time_to_live: 3, selling: double(quantity_to_sell_per_order: 2, profit: 0))
|
136
146
|
|
137
147
|
store = BitexBot::Store.new(selling_profit: 0.5)
|
138
|
-
flow = BitexBot::SellOpeningFlow.create_for_market(
|
139
|
-
|
140
|
-
|
148
|
+
flow = BitexBot::SellOpeningFlow.create_for_market(
|
149
|
+
1000,
|
150
|
+
bitstamp_api_wrapper_order_book.asks,
|
151
|
+
bitstamp_api_wrapper_transactions_stub,
|
152
|
+
0.5,
|
153
|
+
0.25,
|
154
|
+
store
|
155
|
+
)
|
141
156
|
|
142
157
|
flow.price.round(14).should == '20.25112781954887'.to_d
|
143
158
|
end
|
144
159
|
end
|
145
160
|
|
146
161
|
describe 'when fetching open positions' do
|
162
|
+
before(:each) { BitexBot::Robot.setup }
|
147
163
|
let(:flow) { create(:sell_opening_flow) }
|
148
164
|
|
149
165
|
it 'only gets sells' do
|
@@ -184,29 +200,29 @@ describe BitexBot::SellOpeningFlow do
|
|
184
200
|
Bitex::Trade.stub(all: [build(:bitex_sell, id: 23456, order_book: :btc_ars)])
|
185
201
|
|
186
202
|
flow.order_id.should == 12345
|
187
|
-
expect
|
188
|
-
BitexBot::SellOpeningFlow.sync_open_positions.should be_empty
|
189
|
-
end.not_to change { BitexBot::OpenSell.count }
|
203
|
+
expect { BitexBot::SellOpeningFlow.sync_open_positions.should be_empty }.not_to change { BitexBot::OpenSell.count }
|
190
204
|
BitexBot::OpenSell.count.should == 0
|
191
205
|
end
|
192
206
|
|
193
207
|
it 'does not register buys from unknown bids' do
|
194
208
|
stub_bitex_transactions
|
195
209
|
|
196
|
-
expect
|
197
|
-
BitexBot::SellOpeningFlow.sync_open_positions.should be_empty
|
198
|
-
end.not_to change { BitexBot::OpenSell.count }
|
210
|
+
expect { BitexBot::SellOpeningFlow.sync_open_positions.should be_empty }.not_to change { BitexBot::OpenSell.count }
|
199
211
|
end
|
200
212
|
end
|
201
213
|
|
202
214
|
it 'cancels the associated bitex bid' do
|
203
|
-
|
204
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
bitstamp_api_wrapper_order_book.asks,
|
209
|
-
|
215
|
+
stub_bitex_active_orders
|
216
|
+
BitexBot::Settings.stub(time_to_live: 3, selling: double(quantity_to_sell_per_order: 4, profit: 50))
|
217
|
+
|
218
|
+
flow = BitexBot::SellOpeningFlow.create_for_market(
|
219
|
+
1000,
|
220
|
+
bitstamp_api_wrapper_order_book.asks,
|
221
|
+
bitstamp_api_wrapper_transactions_stub,
|
222
|
+
0.5,
|
223
|
+
0.25,
|
224
|
+
store
|
225
|
+
)
|
210
226
|
|
211
227
|
flow.finalise!
|
212
228
|
flow.should be_settling
|
@@ -215,15 +231,19 @@ describe BitexBot::SellOpeningFlow do
|
|
215
231
|
end
|
216
232
|
|
217
233
|
it 'order has expected order book' do
|
218
|
-
|
219
|
-
BitexBot::Settings.stub(time_to_live: 3,
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
bitstamp_api_wrapper_order_book.asks,
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
234
|
+
stub_bitex_active_orders
|
235
|
+
BitexBot::Settings.stub(time_to_live: 3, selling: double(quantity_to_sell_per_order: 2, profit: 0))
|
236
|
+
|
237
|
+
flow = described_class.create_for_market(
|
238
|
+
1000,
|
239
|
+
bitstamp_api_wrapper_order_book.asks,
|
240
|
+
bitstamp_api_wrapper_transactions_stub,
|
241
|
+
0.5,
|
242
|
+
0.25,
|
243
|
+
store
|
244
|
+
)
|
245
|
+
|
246
|
+
order = described_class.order_class.find(flow.order_id)
|
247
|
+
order.order_book.should eq BitexBot::Robot.maker.base_quote.to_sym
|
228
248
|
end
|
229
249
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,13 +7,15 @@ BitexBot::Settings.load_test
|
|
7
7
|
require 'byebug'
|
8
8
|
require 'database_cleaner'
|
9
9
|
require 'factory_bot'
|
10
|
+
require 'faker'
|
11
|
+
require 'rspec/its'
|
10
12
|
require 'shoulda/matchers'
|
11
13
|
require 'timecop'
|
12
14
|
require 'webmock/rspec'
|
13
15
|
|
14
16
|
require 'bitex_bot'
|
15
17
|
FactoryBot.find_definitions
|
16
|
-
Dir[File.
|
18
|
+
Dir[File.expand_path('support/**/*.rb', __dir__)].each { |f| require f }
|
17
19
|
|
18
20
|
# Automatically do rake db:test:prepare
|
19
21
|
ActiveRecord::Migration.maintain_test_schema!
|
data/spec/support/bitex_stubs.rb
CHANGED
@@ -4,61 +4,101 @@ module BitexStubs
|
|
4
4
|
mattr_accessor(:active_bids) { {} }
|
5
5
|
mattr_accessor(:active_asks) { {} }
|
6
6
|
|
7
|
-
def
|
8
|
-
Bitex::Order.stub(:
|
9
|
-
BitexStubs.active_bids + BitexStubs.active_asks
|
10
|
-
end
|
7
|
+
def stub_bitex_active_orders
|
8
|
+
Bitex::Order.stub(all: BitexStubs.active_bids.merge(BitexStubs.active_asks))
|
11
9
|
|
12
|
-
Bitex::Bid.stub(:find)
|
13
|
-
BitexStubs.bids[id]
|
14
|
-
end
|
10
|
+
Bitex::Bid.stub(:find) { |id| BitexStubs.bids[id] }
|
15
11
|
|
16
|
-
Bitex::Ask.stub(:find)
|
17
|
-
BitexStubs.asks[id]
|
18
|
-
end
|
12
|
+
Bitex::Ask.stub(:find) { |id| BitexStubs.asks[id] }
|
19
13
|
|
20
14
|
Bitex::Bid.stub(:create!) do |order_book, to_spend, price|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
bid.status = :cancelled
|
31
|
-
BitexStubs.active_bids.delete(bid.id)
|
32
|
-
bid
|
15
|
+
build(:bitex_bid, id: 12_345, order_book: order_book, status: :executing, amount: to_spend, remaining_amount: to_spend, price: price).tap do |bid|
|
16
|
+
bid.stub(:cancel!) do
|
17
|
+
bid.tap do
|
18
|
+
bid.status = :cancelled
|
19
|
+
BitexStubs.active_bids.delete(bid.id)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
BitexStubs.bids[bid.id] = bid
|
23
|
+
BitexStubs.active_bids[bid.id] = bid
|
33
24
|
end
|
34
|
-
BitexStubs.bids[bid.id] = bid
|
35
|
-
BitexStubs.active_bids[bid.id] = bid
|
36
|
-
bid
|
37
25
|
end
|
38
26
|
|
39
27
|
Bitex::Ask.stub(:create!) do |order_book, to_sell, price|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
ask.status = :cancelled
|
50
|
-
BitexStubs.active_asks.delete(ask.id)
|
51
|
-
ask
|
28
|
+
build(:bitex_ask, id: 12_345, order_book: order_book, quantity: to_sell, remaining_quantity: to_sell, price: price, status: :executing).tap do |ask|
|
29
|
+
ask.stub(:cancel!) do
|
30
|
+
ask.tap do
|
31
|
+
ask.status = :cancelled
|
32
|
+
BitexStubs.active_asks.delete(ask.id)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
BitexStubs.asks[ask.id] = ask
|
36
|
+
BitexStubs.active_asks[ask.id] = ask
|
52
37
|
end
|
53
|
-
BitexStubs.asks[ask.id] = ask
|
54
|
-
BitexStubs.active_asks[ask.id] = ask
|
55
|
-
ask
|
56
38
|
end
|
57
39
|
end
|
58
40
|
|
59
41
|
def stub_bitex_transactions(*extra_transactions)
|
60
42
|
Bitex::Trade.stub(all: extra_transactions + [build(:bitex_buy), build(:bitex_sell)])
|
61
43
|
end
|
44
|
+
|
45
|
+
# {
|
46
|
+
# usd_balance: 10000.0,
|
47
|
+
# usd_reserved: 2000.0,
|
48
|
+
# usd_available: 8000.0,
|
49
|
+
# btc_balance: 20.0,
|
50
|
+
# btc_reserved: 5.0,
|
51
|
+
# btc_available: 15.0,
|
52
|
+
# fee: 0.5,
|
53
|
+
# btc_deposit_address: "1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
54
|
+
# }
|
55
|
+
def stub_bitex_balance
|
56
|
+
Bitex::Profile.stub(:get) do
|
57
|
+
{
|
58
|
+
usd_balance: 10_000.to_d,
|
59
|
+
usd_reserved: 2_000.to_d,
|
60
|
+
usd_available: 8_000.to_d,
|
61
|
+
btc_balance: 20.to_d,
|
62
|
+
btc_reserved: 5.to_d,
|
63
|
+
btc_available: 15.to_d,
|
64
|
+
fee: 0.5.to_d,
|
65
|
+
btc_deposit_address: '1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# <Bitex::Bid:0x007ff7efe1f228
|
71
|
+
# @id=12345678, @created_at=1999-12-31 21:10:00 -0300, @order_book=:btc_usd, @price=0.1e4, @status=:received,
|
72
|
+
# @reason=:not_cancelled, @issuer="User#1", @amount=0.1e3, @remaining_amount=0.1e3, @produced_quantity=0.1e2
|
73
|
+
# >
|
74
|
+
# <Bitex::Ask:0x007f94a2658f68
|
75
|
+
# @id=12345678, @created_at=1999-12-31 21:10:00 -0300, @order_book=:btc_usd, @price=0.1e4, @status=:received,
|
76
|
+
# @reason=:not_cancelled, @issuer="User#1", @quantity=0.1e3, @remaining_quantity=0.1e3, @produced_amount=0.1e2
|
77
|
+
# >
|
78
|
+
def stub_bitex_orders
|
79
|
+
Bitex::Order.stub(all: [build(:bitex_bid), build(:bitex_ask)])
|
80
|
+
end
|
81
|
+
|
82
|
+
def stub_bitex_order_book
|
83
|
+
Bitex::MarketData.stub(:order_book) do
|
84
|
+
{
|
85
|
+
bids: [[639.21, 1.95], [637.0, 0.47], [630.0, 1.58]],
|
86
|
+
asks: [[642.4, 0.4], [643.3, 0.95], [644.3, 0.25]]
|
87
|
+
}
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# <Bitex::Buy:0x007ff9a2979390
|
92
|
+
# @id=12345678, @created_at=1999-12-31 21:10:00 -0300, @order_book=:btc_usd, @quantity=0.2e1, @amount=0.6e3, @fee=0.5e-1,
|
93
|
+
# @price=0.3e3, @bid_id=123
|
94
|
+
# >
|
95
|
+
# <Bitex::Sell:0x007ff9a2978710
|
96
|
+
# @id=12345678, @created_at=1999-12-31 21:10:00 -0300, @order_book=:btc_usd, @quantity=0.2e1, @amount=0.6e3, @fee=0.5e-1,
|
97
|
+
# @price=0.3e3, @ask_id=456i
|
98
|
+
# >
|
99
|
+
def stub_bitex_trades
|
100
|
+
Bitex::Trade.stub(all: [build(:bitex_buy), build(:bitex_sell)])
|
101
|
+
end
|
62
102
|
end
|
63
103
|
|
64
104
|
RSpec.configuration.include BitexStubs
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module BitstampApiWrapperStubs
|
2
2
|
def stub_bitstamp_api_wrapper_order_book
|
3
|
-
BitstampApiWrapper.stub(order_book: bitstamp_api_wrapper_order_book)
|
3
|
+
BitstampApiWrapper.any_instance.stub(order_book: bitstamp_api_wrapper_order_book)
|
4
4
|
end
|
5
5
|
|
6
6
|
def bitstamp_api_wrapper_order_book
|
@@ -16,7 +16,7 @@ module BitstampApiWrapperStubs
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def stub_bitstamp_api_wrapper_balance(usd = nil, coin = nil, fee = nil)
|
19
|
-
BitstampApiWrapper.stub(:balance) do
|
19
|
+
BitstampApiWrapper.any_instance.stub(:balance) do
|
20
20
|
ApiWrapper::BalanceSummary.new(
|
21
21
|
ApiWrapper::Balance.new((coin || 10).to_d, 0.to_d, (coin || 10).to_d),
|
22
22
|
ApiWrapper::Balance.new((usd || 100).to_d, 0.to_d, (usd || 100).to_d),
|
@@ -33,7 +33,7 @@ module BitstampStubs
|
|
33
33
|
transactions = orders.collect do |o|
|
34
34
|
usd = o.amount * o.price
|
35
35
|
usd, btc = o.type == 0 ? [-usd, o.amount] : [usd, -o.amount]
|
36
|
-
|
36
|
+
Bitstamp::UserTransaction.new(usd: (usd * ratio).to_s, btc: (btc * ratio).to_s,
|
37
37
|
btc_usd: o.price.to_s, order_id: o.id, fee: '0.5', type: 2,
|
38
38
|
datetime: DateTime.now.to_s)
|
39
39
|
end
|
@@ -50,7 +50,7 @@ module BitstampStubs
|
|
50
50
|
Bitstamp.orders.stub(all: orders)
|
51
51
|
Bitstamp.orders.stub(:sell) do |args|
|
52
52
|
remote_id = Bitstamp.orders.all.size + 1 if remote_id.nil?
|
53
|
-
ask =
|
53
|
+
ask = Bitstamp::Order.new(amount: args[:amount], price: args[:price], type: 1, id: remote_id,
|
54
54
|
datetime: DateTime.now.to_s)
|
55
55
|
ask.stub(:cancel!) do
|
56
56
|
orders = Bitstamp.orders.all.reject { |o| o.id.to_s == ask.id.to_s && o.type == 1 }
|
@@ -67,7 +67,7 @@ module BitstampStubs
|
|
67
67
|
Bitstamp.orders.stub(all: orders)
|
68
68
|
Bitstamp.orders.stub(:buy) do |args|
|
69
69
|
remote_id = Bitstamp.orders.all.size + 1 if remote_id.nil?
|
70
|
-
bid =
|
70
|
+
bid = Bitstamp::Order.new(amount: args[:amount], price: args[:price], type: 0, id: remote_id,
|
71
71
|
datetime: DateTime.now.to_s)
|
72
72
|
bid.stub(:cancel!) do
|
73
73
|
orders = Bitstamp.orders.all.reject { |o| o.id.to_s == bid.id.to_s && o.type == 0 }
|
data/spec/support/vcr.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitex_bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nubis
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-01-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - "
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: hashie
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,16 +99,16 @@ dependencies:
|
|
99
99
|
name: itbit
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- -
|
102
|
+
- - ">="
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version: 0
|
104
|
+
version: '0'
|
105
105
|
type: :runtime
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- -
|
109
|
+
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version: 0
|
111
|
+
version: '0'
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
113
|
name: kraken_client
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
@@ -193,6 +193,20 @@ dependencies:
|
|
193
193
|
- - ">="
|
194
194
|
- !ruby/object:Gem::Version
|
195
195
|
version: '0'
|
196
|
+
- !ruby/object:Gem::Dependency
|
197
|
+
name: faker
|
198
|
+
requirement: !ruby/object:Gem::Requirement
|
199
|
+
requirements:
|
200
|
+
- - ">="
|
201
|
+
- !ruby/object:Gem::Version
|
202
|
+
version: '0'
|
203
|
+
type: :development
|
204
|
+
prerelease: false
|
205
|
+
version_requirements: !ruby/object:Gem::Requirement
|
206
|
+
requirements:
|
207
|
+
- - ">="
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
version: '0'
|
196
210
|
- !ruby/object:Gem::Dependency
|
197
211
|
name: rspec
|
198
212
|
requirement: !ruby/object:Gem::Requirement
|
@@ -207,6 +221,20 @@ dependencies:
|
|
207
221
|
- - ">="
|
208
222
|
- !ruby/object:Gem::Version
|
209
223
|
version: '0'
|
224
|
+
- !ruby/object:Gem::Dependency
|
225
|
+
name: rspec-its
|
226
|
+
requirement: !ruby/object:Gem::Requirement
|
227
|
+
requirements:
|
228
|
+
- - ">="
|
229
|
+
- !ruby/object:Gem::Version
|
230
|
+
version: '0'
|
231
|
+
type: :development
|
232
|
+
prerelease: false
|
233
|
+
version_requirements: !ruby/object:Gem::Requirement
|
234
|
+
requirements:
|
235
|
+
- - ">="
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: '0'
|
210
238
|
- !ruby/object:Gem::Dependency
|
211
239
|
name: rspec-mocks
|
212
240
|
requirement: !ruby/object:Gem::Requirement
|
@@ -277,6 +305,20 @@ dependencies:
|
|
277
305
|
- - ">="
|
278
306
|
- !ruby/object:Gem::Version
|
279
307
|
version: '0'
|
308
|
+
- !ruby/object:Gem::Dependency
|
309
|
+
name: vcr
|
310
|
+
requirement: !ruby/object:Gem::Requirement
|
311
|
+
requirements:
|
312
|
+
- - ">="
|
313
|
+
- !ruby/object:Gem::Version
|
314
|
+
version: '0'
|
315
|
+
type: :development
|
316
|
+
prerelease: false
|
317
|
+
version_requirements: !ruby/object:Gem::Requirement
|
318
|
+
requirements:
|
319
|
+
- - ">="
|
320
|
+
- !ruby/object:Gem::Version
|
321
|
+
version: '0'
|
280
322
|
- !ruby/object:Gem::Dependency
|
281
323
|
name: webmock
|
282
324
|
requirement: !ruby/object:Gem::Requirement
|
@@ -315,6 +357,7 @@ files:
|
|
315
357
|
- lib/bitex_bot.rb
|
316
358
|
- lib/bitex_bot/database.rb
|
317
359
|
- lib/bitex_bot/models/api_wrappers/api_wrapper.rb
|
360
|
+
- lib/bitex_bot/models/api_wrappers/bitex/bitex_api_wrapper.rb
|
318
361
|
- lib/bitex_bot/models/api_wrappers/bitstamp/bitstamp_api_wrapper.rb
|
319
362
|
- lib/bitex_bot/models/api_wrappers/itbit/itbit_api_wrapper.rb
|
320
363
|
- lib/bitex_bot/models/api_wrappers/kraken/kraken_api_wrapper.rb
|
@@ -336,12 +379,22 @@ files:
|
|
336
379
|
- lib/bitex_bot/version.rb
|
337
380
|
- settings.rb.sample
|
338
381
|
- spec/bitex_bot/settings_spec.rb
|
382
|
+
- spec/factories/bitex_ask.rb
|
383
|
+
- spec/factories/bitex_bid.rb
|
339
384
|
- spec/factories/bitex_buy.rb
|
340
385
|
- spec/factories/bitex_sell.rb
|
341
386
|
- spec/factories/buy_opening_flow.rb
|
342
387
|
- spec/factories/open_buy.rb
|
343
388
|
- spec/factories/open_sell.rb
|
344
389
|
- spec/factories/sell_opening_flow.rb
|
390
|
+
- spec/fixtures/bitstamp/balance.yml
|
391
|
+
- spec/fixtures/bitstamp/order_book.yml
|
392
|
+
- spec/fixtures/bitstamp/orders/all.yml
|
393
|
+
- spec/fixtures/bitstamp/orders/failure_sell.yml
|
394
|
+
- spec/fixtures/bitstamp/orders/successful_buy.yml
|
395
|
+
- spec/fixtures/bitstamp/transactions.yml
|
396
|
+
- spec/fixtures/bitstamp/user_transactions.yml
|
397
|
+
- spec/models/api_wrappers/bitex_api_wrapper_spec.rb
|
345
398
|
- spec/models/api_wrappers/bitstamp_api_wrapper_spec.rb
|
346
399
|
- spec/models/api_wrappers/itbit_api_wrapper_spec.rb
|
347
400
|
- spec/models/api_wrappers/kraken_api_wrapper_spec.rb
|
@@ -356,6 +409,8 @@ files:
|
|
356
409
|
- spec/support/bitex_stubs.rb
|
357
410
|
- spec/support/bitstamp/bitstamp_api_wrapper_stubs.rb
|
358
411
|
- spec/support/bitstamp/bitstamp_stubs.rb
|
412
|
+
- spec/support/vcr.rb
|
413
|
+
- spec/support/webmock.rb
|
359
414
|
homepage: ''
|
360
415
|
licenses:
|
361
416
|
- MIT
|
@@ -382,12 +437,22 @@ specification_version: 4
|
|
382
437
|
summary: A trading robot to do arbitrage between bitex.la and other exchanges!
|
383
438
|
test_files:
|
384
439
|
- spec/bitex_bot/settings_spec.rb
|
440
|
+
- spec/factories/bitex_ask.rb
|
441
|
+
- spec/factories/bitex_bid.rb
|
385
442
|
- spec/factories/bitex_buy.rb
|
386
443
|
- spec/factories/bitex_sell.rb
|
387
444
|
- spec/factories/buy_opening_flow.rb
|
388
445
|
- spec/factories/open_buy.rb
|
389
446
|
- spec/factories/open_sell.rb
|
390
447
|
- spec/factories/sell_opening_flow.rb
|
448
|
+
- spec/fixtures/bitstamp/balance.yml
|
449
|
+
- spec/fixtures/bitstamp/order_book.yml
|
450
|
+
- spec/fixtures/bitstamp/orders/all.yml
|
451
|
+
- spec/fixtures/bitstamp/orders/failure_sell.yml
|
452
|
+
- spec/fixtures/bitstamp/orders/successful_buy.yml
|
453
|
+
- spec/fixtures/bitstamp/transactions.yml
|
454
|
+
- spec/fixtures/bitstamp/user_transactions.yml
|
455
|
+
- spec/models/api_wrappers/bitex_api_wrapper_spec.rb
|
391
456
|
- spec/models/api_wrappers/bitstamp_api_wrapper_spec.rb
|
392
457
|
- spec/models/api_wrappers/itbit_api_wrapper_spec.rb
|
393
458
|
- spec/models/api_wrappers/kraken_api_wrapper_spec.rb
|
@@ -402,3 +467,5 @@ test_files:
|
|
402
467
|
- spec/support/bitex_stubs.rb
|
403
468
|
- spec/support/bitstamp/bitstamp_api_wrapper_stubs.rb
|
404
469
|
- spec/support/bitstamp/bitstamp_stubs.rb
|
470
|
+
- spec/support/vcr.rb
|
471
|
+
- spec/support/webmock.rb
|