rbtc_arbitrage 1.4.6 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitmodules +3 -0
- data/Gemfile +17 -14
- data/Gemfile.lock +26 -28
- data/lib/rbtc_arbitrage.rb +2 -2
- data/lib/rbtc_arbitrage/cli.rb +1 -1
- data/lib/rbtc_arbitrage/trader.rb +8 -2
- data/lib/rbtc_arbitrage/version.rb +1 -1
- data/rbtc_arbitrage.gemspec +1 -3
- data/spec/clients/bitstamp_client_spec.rb +2 -2
- data/spec/rbtc_arbitrage_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_transfer/calls_Bitstamp_correctly.yml +48 -0
- data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/should_raise_SecurityError_if_not_live.yml +46 -48
- data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/raises_SecurityError_if_not_enough_BTC.yml +52 -52
- data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/raises_SecurityError_if_not_enough_USD.yml +49 -46
- data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/should_fetch_balance.yml +43 -173
- data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/shouldn_t_raise_security_error.yml +87 -168
- data/spec/support/cassettes/RbtcArbitrage_Trader/_fetch_prices/gets_the_right_price_set.yml +101 -98
- data/spec/trader_spec.rb +4 -4
- metadata +6 -56
- data/lib/rbtc_arbitrage/clients/mtgox_client.rb +0 -56
- data/spec/clients/mtgox_client_spec.rb +0 -53
- data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_balance/fetches_the_balance_correctly.yml +0 -77
- data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_buy_correctly.yml +0 -44
- data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_sell_correctly.yml +0 -44
- data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_prices_correctly.yml +0 -85
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 835177735b2d220e4b1ef228124f49b09fa9ad45
|
4
|
+
data.tar.gz: 0418bcfd189c5e7f8d693cc550c449e7efa200bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a28ac69bfc9ae19adc1c2ad6fb2a7e265be0ca83aea5880291ed77aed2493b35d4aff366bd5ad3276520a216a150fa06e246c85a82787d0d8958c6af399b4578
|
7
|
+
data.tar.gz: 86a46a9bc74c016967f81b1478bf220b91f19b7a612e222785289ef66306c0ae8859ba3bbcf2a34e48935ab945fd130bbcf21f3109b189bbd6164fb48da44724
|
data/.gitmodules
ADDED
data/Gemfile
CHANGED
@@ -2,17 +2,20 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in rbtc_arbitrage.gemspec
|
4
4
|
gemspec
|
5
|
-
|
6
|
-
gem
|
7
|
-
gem "
|
8
|
-
gem
|
9
|
-
gem '
|
10
|
-
|
11
|
-
gem '
|
12
|
-
gem '
|
13
|
-
gem '
|
14
|
-
gem
|
15
|
-
gem
|
16
|
-
gem '
|
17
|
-
gem '
|
18
|
-
gem '
|
5
|
+
group :development do
|
6
|
+
gem 'rspec'
|
7
|
+
gem "activemodel", ">= 3.1"
|
8
|
+
gem "activesupport", ">= 3.1"
|
9
|
+
gem 'guard'
|
10
|
+
gem 'ruby_gntp'
|
11
|
+
# gem 'awesome_print'
|
12
|
+
gem 'guard-rspec'
|
13
|
+
gem 'simplecov'
|
14
|
+
gem 'coveralls', require: false
|
15
|
+
gem "webmock"
|
16
|
+
gem 'vcr'
|
17
|
+
gem 'codeclimate-test-reporter'
|
18
|
+
gem 'hashie'
|
19
|
+
gem 'sinatra'
|
20
|
+
end
|
21
|
+
gem 'bitstamp', path: '../bitstamp'
|
data/Gemfile.lock
CHANGED
@@ -1,37 +1,38 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rbtc_arbitrage (
|
4
|
+
rbtc_arbitrage (2.0.0)
|
5
5
|
activemodel (>= 3.1)
|
6
6
|
activesupport (>= 3.1)
|
7
|
-
bitstamp
|
8
|
-
bitstamp
|
9
7
|
btce (= 0.2.4)
|
10
8
|
coinbase (= 1.2.6)
|
11
9
|
faraday (= 0.8.8)
|
12
|
-
mtgox
|
13
10
|
pony
|
14
11
|
thor
|
15
12
|
|
13
|
+
PATH
|
14
|
+
remote: ../bitstamp
|
15
|
+
specs:
|
16
|
+
bitstamp (0.4.0)
|
17
|
+
activemodel (>= 3.1)
|
18
|
+
activesupport (>= 3.1)
|
19
|
+
curb (> 0.8.1)
|
20
|
+
ruby-hmac (= 0.4.0)
|
21
|
+
|
16
22
|
GEM
|
17
23
|
remote: https://rubygems.org/
|
18
24
|
specs:
|
19
|
-
activemodel (4.0.
|
20
|
-
activesupport (= 4.0.
|
25
|
+
activemodel (4.0.4)
|
26
|
+
activesupport (= 4.0.4)
|
21
27
|
builder (~> 3.1.0)
|
22
|
-
activesupport (4.0.
|
23
|
-
i18n (~> 0.6, >= 0.6.
|
28
|
+
activesupport (4.0.4)
|
29
|
+
i18n (~> 0.6, >= 0.6.9)
|
24
30
|
minitest (~> 4.2)
|
25
31
|
multi_json (~> 1.3)
|
26
32
|
thread_safe (~> 0.1)
|
27
33
|
tzinfo (~> 0.3.37)
|
28
34
|
addressable (2.3.5)
|
29
|
-
atomic (1.1.
|
30
|
-
bitstamp (0.3.0)
|
31
|
-
activemodel (>= 3.1)
|
32
|
-
activesupport (>= 3.1)
|
33
|
-
curb (> 0.8.1)
|
34
|
-
ruby-hmac (= 0.4.0)
|
35
|
+
atomic (1.1.16)
|
35
36
|
btce (0.2.4)
|
36
37
|
monkey-patch
|
37
38
|
builder (3.1.4)
|
@@ -70,7 +71,7 @@ GEM
|
|
70
71
|
guard (>= 2.1.1)
|
71
72
|
rspec (~> 3.0.0.beta, >= 2.14, < 4.0)
|
72
73
|
hashie (2.0.5)
|
73
|
-
httparty (0.
|
74
|
+
httparty (0.13.0)
|
74
75
|
json (~> 1.8)
|
75
76
|
multi_xml (>= 0.5.2)
|
76
77
|
i18n (0.6.9)
|
@@ -89,16 +90,13 @@ GEM
|
|
89
90
|
minitest (4.7.5)
|
90
91
|
money (5.1.1)
|
91
92
|
i18n (~> 0.6.0)
|
92
|
-
monkey-patch (0.0.
|
93
|
+
monkey-patch (0.0.16)
|
93
94
|
activesupport
|
94
|
-
|
95
|
-
faraday (~> 0.8, < 0.10)
|
96
|
-
json (~> 1.7, >= 1.7.7)
|
97
|
-
multi_json (1.8.2)
|
95
|
+
multi_json (1.9.2)
|
98
96
|
multi_xml (0.5.5)
|
99
97
|
multipart-post (1.2.0)
|
100
|
-
polyglot (0.3.
|
101
|
-
pony (1.
|
98
|
+
polyglot (0.3.4)
|
99
|
+
pony (1.8)
|
102
100
|
mail (>= 2.0)
|
103
101
|
pry (0.9.12.4)
|
104
102
|
coderay (~> 1.0)
|
@@ -141,15 +139,14 @@ GEM
|
|
141
139
|
term-ansicolor (1.2.2)
|
142
140
|
tins (~> 0.8)
|
143
141
|
thor (0.18.1)
|
144
|
-
thread_safe (0.1
|
145
|
-
atomic
|
142
|
+
thread_safe (0.3.1)
|
143
|
+
atomic (>= 1.1.7, < 2)
|
146
144
|
tilt (1.4.1)
|
147
145
|
timers (1.1.0)
|
148
146
|
tins (0.13.1)
|
149
|
-
treetop (1.
|
150
|
-
polyglot
|
151
|
-
|
152
|
-
tzinfo (0.3.38)
|
147
|
+
treetop (1.5.3)
|
148
|
+
polyglot (~> 0.3)
|
149
|
+
tzinfo (0.3.39)
|
153
150
|
vcr (2.8.0)
|
154
151
|
webmock (1.16.1)
|
155
152
|
addressable (>= 2.2.7)
|
@@ -161,6 +158,7 @@ PLATFORMS
|
|
161
158
|
DEPENDENCIES
|
162
159
|
activemodel (>= 3.1)
|
163
160
|
activesupport (>= 3.1)
|
161
|
+
bitstamp!
|
164
162
|
bundler (~> 1.3)
|
165
163
|
codeclimate-test-reporter
|
166
164
|
coveralls
|
data/lib/rbtc_arbitrage.rb
CHANGED
data/lib/rbtc_arbitrage/cli.rb
CHANGED
@@ -7,7 +7,7 @@ module RbtcArbitrage
|
|
7
7
|
option :volume, type: :numeric, default: 0.01, desc: "The amount of bitcoins to trade per transaction."
|
8
8
|
option :verbose, type: :boolean, default: true, desc: "Whether you wish to log information."
|
9
9
|
option :buyer, type: :string, default: "bitstamp"
|
10
|
-
option :seller, type: :string, default: "
|
10
|
+
option :seller, type: :string, default: "campbx"
|
11
11
|
option :repeat, type: :numeric, default: nil
|
12
12
|
option :notify, type: :boolean, default: false
|
13
13
|
def trade
|
@@ -22,7 +22,7 @@ module RbtcArbitrage
|
|
22
22
|
set_key opts, :notify, false
|
23
23
|
exchange = opts[:buyer] || :bitstamp
|
24
24
|
@buy_client = client_for_exchange(exchange)
|
25
|
-
exchange = opts[:seller] || :
|
25
|
+
exchange = opts[:seller] || :campbx
|
26
26
|
@sell_client = client_for_exchange(exchange)
|
27
27
|
self
|
28
28
|
end
|
@@ -94,7 +94,13 @@ module RbtcArbitrage
|
|
94
94
|
logger.info "#{higher_ex}: $#{seller[:price].round(2)}"
|
95
95
|
logger.info "buying #{@options[:volume]} btc from #{lower_ex} for $#{@paid.round(2)}"
|
96
96
|
logger.info "selling #{@options[:volume]} btc on #{higher_ex} for $#{@received.round(2)}"
|
97
|
-
|
97
|
+
|
98
|
+
profit_msg = "profit: $#{(@received - @paid).round(2)} (#{@percent.round(2)}%)"
|
99
|
+
if cutoff = @options[:cutoff]
|
100
|
+
profit_msg << " is #{@percent < cutoff ? 'below' : 'above'} cutoff"
|
101
|
+
profit_msg << " of #{cutoff}%."
|
102
|
+
end
|
103
|
+
logger.info profit_msg
|
98
104
|
end
|
99
105
|
|
100
106
|
def get_balance
|
data/rbtc_arbitrage.gemspec
CHANGED
@@ -21,14 +21,12 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
|
24
|
-
spec.add_dependency "mtgox"
|
25
24
|
spec.add_dependency "faraday", "0.8.8"
|
26
|
-
spec.add_dependency "bitstamp"
|
25
|
+
# spec.add_dependency "bitstamp"
|
27
26
|
spec.add_dependency "activemodel", ">= 3.1"
|
28
27
|
spec.add_dependency "activesupport", ">= 3.1"
|
29
28
|
spec.add_dependency "thor"
|
30
29
|
spec.add_dependency "btce", '0.2.4'
|
31
|
-
spec.add_dependency "bitstamp"
|
32
30
|
spec.add_dependency "coinbase", '1.2.6'
|
33
31
|
spec.add_dependency "pony"
|
34
32
|
end
|
@@ -44,8 +44,8 @@ describe RbtcArbitrage::Clients::BitstampClient do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
describe "#transfer" do
|
47
|
-
it "calls Bitstamp correctly" do
|
48
|
-
sell_client = RbtcArbitrage::Clients::
|
47
|
+
it "calls Bitstamp correctly", :vcr do
|
48
|
+
sell_client = RbtcArbitrage::Clients::CampbxClient.new
|
49
49
|
Bitstamp.should_receive(:transfer).with(0.01, sell_client.address)
|
50
50
|
client.transfer sell_client
|
51
51
|
end
|
data/spec/rbtc_arbitrage_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe RbtcArbitrage do
|
|
4
4
|
describe ".clients" do
|
5
5
|
it "includes clients" do
|
6
6
|
clients = RbtcArbitrage.clients
|
7
|
-
clients.should include(RbtcArbitrage::Clients::
|
7
|
+
clients.should include(RbtcArbitrage::Clients::CampbxClient)
|
8
8
|
clients.should include(RbtcArbitrage::Clients::BitstampClient)
|
9
9
|
end
|
10
10
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://campbx.com/api/getbtcaddr.php
|
6
|
+
headers:
|
7
|
+
Accept-Encoding:
|
8
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
9
|
+
Accept:
|
10
|
+
- '*/*'
|
11
|
+
User-Agent:
|
12
|
+
- Ruby
|
13
|
+
Content-Type:
|
14
|
+
- application/x-www-form-urlencoded
|
15
|
+
response:
|
16
|
+
status:
|
17
|
+
code: 200
|
18
|
+
message: OK
|
19
|
+
headers:
|
20
|
+
Server:
|
21
|
+
- cloudflare-nginx
|
22
|
+
Date:
|
23
|
+
- Sun, 23 Mar 2014 03:35:04 GMT
|
24
|
+
Content-Type:
|
25
|
+
- application/json
|
26
|
+
Transfer-Encoding:
|
27
|
+
- chunked
|
28
|
+
Connection:
|
29
|
+
- keep-alive
|
30
|
+
Set-Cookie:
|
31
|
+
- __cfduid=d690eee91be78c2c7e475be75dadde6551395545704073; expires=Mon, 23-Dec-2019
|
32
|
+
23:50:00 GMT; path=/; domain=.campbx.com; HttpOnly
|
33
|
+
X-Frame-Options:
|
34
|
+
- SAMEORIGIN
|
35
|
+
Cache-Control:
|
36
|
+
- no-cache, must-revalidate, max-age=3600
|
37
|
+
Vary:
|
38
|
+
- Accept-Encoding
|
39
|
+
Expires:
|
40
|
+
- Sun, 23 Mar 2014 04:34:58 GMT
|
41
|
+
Cf-Ray:
|
42
|
+
- 10f793aa06040657-SJC
|
43
|
+
body:
|
44
|
+
encoding: UTF-8
|
45
|
+
string: "\r\n{\"Success\":\"16rQQYMTTKb9cnnSX3xYkN4hcKXoYcYURi\",\"Expiry\":3802802}"
|
46
|
+
http_version:
|
47
|
+
recorded_at: Sun, 23 Mar 2014 03:35:04 GMT
|
48
|
+
recorded_with: VCR 2.8.0
|
@@ -2,45 +2,50 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: get
|
5
|
-
uri: https://
|
5
|
+
uri: https://campbx.com/api/xticker.php
|
6
6
|
body:
|
7
7
|
encoding: US-ASCII
|
8
8
|
string: ''
|
9
9
|
headers:
|
10
|
-
Accept:
|
11
|
-
- application/json
|
12
|
-
User-Agent:
|
13
|
-
- mtgox gem 1.1.0
|
14
10
|
Accept-Encoding:
|
15
11
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- '*/*'
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
16
|
response:
|
17
17
|
status:
|
18
18
|
code: 200
|
19
19
|
message: OK
|
20
20
|
headers:
|
21
21
|
Server:
|
22
|
-
- nginx
|
23
|
-
Content-Type:
|
24
|
-
- application/json; charset=utf-8
|
25
|
-
X-Powered-By:
|
26
|
-
- PHP/5.5.4
|
27
|
-
Access-Control-Allow-Origin:
|
28
|
-
- '*'
|
29
|
-
Content-Length:
|
30
|
-
- '1377'
|
31
|
-
Cache-Control:
|
32
|
-
- public, max-age=23
|
33
|
-
Expires:
|
34
|
-
- Fri, 13 Dec 2013 23:46:23 GMT
|
22
|
+
- cloudflare-nginx
|
35
23
|
Date:
|
36
|
-
-
|
24
|
+
- Sun, 23 Mar 2014 03:30:11 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
37
29
|
Connection:
|
38
30
|
- keep-alive
|
31
|
+
Set-Cookie:
|
32
|
+
- __cfduid=d5959036b6f71a1846c956b349605ab471395545410818; expires=Mon, 23-Dec-2019
|
33
|
+
23:50:00 GMT; path=/; domain=.campbx.com; HttpOnly
|
34
|
+
X-Frame-Options:
|
35
|
+
- SAMEORIGIN
|
36
|
+
Cache-Control:
|
37
|
+
- no-cache, must-revalidate, max-age=3600
|
38
|
+
Vary:
|
39
|
+
- Accept-Encoding
|
40
|
+
Expires:
|
41
|
+
- Sun, 23 Mar 2014 04:30:05 GMT
|
42
|
+
Cf-Ray:
|
43
|
+
- 10f78c819b1e012b-SJC
|
39
44
|
body:
|
40
45
|
encoding: UTF-8
|
41
|
-
string: '{"
|
46
|
+
string: '{"Last Trade":"582.01","Best Bid":"598.00","Best Ask":"599.99"}'
|
42
47
|
http_version:
|
43
|
-
recorded_at:
|
48
|
+
recorded_at: Sun, 23 Mar 2014 03:30:11 GMT
|
44
49
|
- request:
|
45
50
|
method: get
|
46
51
|
uri: https://www.bitstamp.net/api/ticker/
|
@@ -53,41 +58,34 @@ http_interactions:
|
|
53
58
|
code: 200
|
54
59
|
message: OK
|
55
60
|
headers:
|
56
|
-
|
57
|
-
-
|
58
|
-
Server:
|
59
|
-
- Apache
|
60
|
-
Content-Language:
|
61
|
-
- en
|
62
|
-
Expires:
|
63
|
-
- Fri, 13 Dec 2013 23:46:01 GMT
|
64
|
-
Vary:
|
65
|
-
- Accept-Language
|
66
|
-
Cache-Control:
|
67
|
-
- max-age=0
|
61
|
+
Etag:
|
62
|
+
- '"120627-a0-4f53dbbb126b1"'
|
68
63
|
Last-Modified:
|
69
|
-
-
|
70
|
-
|
71
|
-
-
|
72
|
-
Transfer-Encoding:
|
73
|
-
- chunked
|
64
|
+
- Sun, 23 Mar 2014 03:29:57 GMT
|
65
|
+
Content-Length:
|
66
|
+
- '160'
|
74
67
|
Content-Type:
|
75
68
|
- application/json
|
69
|
+
Cache-Control:
|
70
|
+
- max-age=10, public
|
71
|
+
Expires:
|
72
|
+
- Sun, 23 Mar 2014 03:30:21 GMT
|
73
|
+
Date:
|
74
|
+
- Sun, 23 Mar 2014 03:30:11 GMT
|
76
75
|
Set-Cookie:
|
77
|
-
-
|
76
|
+
- incap_ses_209_99025=/Pt0LzC6viGfdmvjkIXmAkNVLlMAAAAAaFpHwp3YsMhz5noifqhXyg==;
|
78
77
|
path=/; Domain=.bitstamp.net
|
79
|
-
-
|
80
|
-
|
81
|
-
expires=Sun, 13 Dec 2015 10:19:32 GMT; path=/; Domain=.bitstamp.net
|
78
|
+
- visid_incap_99025=2EcA4uXSRZ+SzOE2AsWMxENVLlMAAAAAQUIPAAAAAADDQabegou/a5tQLDR/2oR9;
|
79
|
+
expires=Mon, 21 Mar 2016 09:10:12 GMT; path=/; Domain=.bitstamp.net
|
82
80
|
X-Iinfo:
|
83
|
-
-
|
84
|
-
r(4 6) U6
|
81
|
+
- 10-57915944-0 0CNN RT(1395545410761 287) q(0 -1 -1 0) r(0 -1)
|
85
82
|
X-Cdn:
|
86
83
|
- Incapsula
|
87
84
|
body:
|
88
85
|
encoding: ASCII-8BIT
|
89
|
-
string: '{"high": "
|
90
|
-
"
|
86
|
+
string: '{"high": "571.70", "last": "565.14", "timestamp": "1395545393", "bid":
|
87
|
+
"563.11", "vwap": "556.51", "volume": "13035.98901950", "low": "541.00", "ask":
|
88
|
+
"567.39"}'
|
91
89
|
http_version:
|
92
|
-
recorded_at:
|
93
|
-
recorded_with: VCR 2.
|
90
|
+
recorded_at: Sun, 23 Mar 2014 03:30:11 GMT
|
91
|
+
recorded_with: VCR 2.8.0
|