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.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/Gemfile +17 -14
  4. data/Gemfile.lock +26 -28
  5. data/lib/rbtc_arbitrage.rb +2 -2
  6. data/lib/rbtc_arbitrage/cli.rb +1 -1
  7. data/lib/rbtc_arbitrage/trader.rb +8 -2
  8. data/lib/rbtc_arbitrage/version.rb +1 -1
  9. data/rbtc_arbitrage.gemspec +1 -3
  10. data/spec/clients/bitstamp_client_spec.rb +2 -2
  11. data/spec/rbtc_arbitrage_spec.rb +1 -1
  12. data/spec/spec_helper.rb +1 -1
  13. data/spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_transfer/calls_Bitstamp_correctly.yml +48 -0
  14. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/should_raise_SecurityError_if_not_live.yml +46 -48
  15. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/raises_SecurityError_if_not_enough_BTC.yml +52 -52
  16. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/raises_SecurityError_if_not_enough_USD.yml +49 -46
  17. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/should_fetch_balance.yml +43 -173
  18. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/shouldn_t_raise_security_error.yml +87 -168
  19. data/spec/support/cassettes/RbtcArbitrage_Trader/_fetch_prices/gets_the_right_price_set.yml +101 -98
  20. data/spec/trader_spec.rb +4 -4
  21. metadata +6 -56
  22. data/lib/rbtc_arbitrage/clients/mtgox_client.rb +0 -56
  23. data/spec/clients/mtgox_client_spec.rb +0 -53
  24. data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_balance/fetches_the_balance_correctly.yml +0 -77
  25. data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_buy_correctly.yml +0 -44
  26. data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_sell_correctly.yml +0 -44
  27. 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: 62369ae5921161c77cf12861468a5a030c341501
4
- data.tar.gz: 455e70c7cef5c338ad71b61fde1f83748b7afbd2
3
+ metadata.gz: 835177735b2d220e4b1ef228124f49b09fa9ad45
4
+ data.tar.gz: 0418bcfd189c5e7f8d693cc550c449e7efa200bf
5
5
  SHA512:
6
- metadata.gz: 6b4fc22945496444b7fcb510bb5f8e3b22ac1c35f14c35d384cffd72d9c700a7ffe5e80b776ba114522a8c2beaff0120275f26a7f28947372479e02ac29433f7
7
- data.tar.gz: fc36f51cac71e6e4ed8ff34d566d8ba884c57e5dc4ba436f942ba790da274bc9b279918a232cbe157b33a83ab6fc41ffd8817937d27538bfeb74eb48cf012601
6
+ metadata.gz: a28ac69bfc9ae19adc1c2ad6fb2a7e265be0ca83aea5880291ed77aed2493b35d4aff366bd5ad3276520a216a150fa06e246c85a82787d0d8958c6af399b4578
7
+ data.tar.gz: 86a46a9bc74c016967f81b1478bf220b91f19b7a612e222785289ef66306c0ae8859ba3bbcf2a34e48935ab945fd130bbcf21f3109b189bbd6164fb48da44724
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "bitstamp"]
2
+ path = bitstamp
3
+ url = https://github.com/kojnapp/bitstamp.git
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
- gem 'rspec'
6
- gem "activemodel", ">= 3.1"
7
- gem "activesupport", ">= 3.1"
8
- gem 'guard'
9
- gem 'ruby_gntp'
10
- # gem 'awesome_print'
11
- gem 'guard-rspec'
12
- gem 'simplecov'
13
- gem 'coveralls', require: false
14
- gem "webmock"
15
- gem 'vcr'
16
- gem 'codeclimate-test-reporter'
17
- gem 'hashie'
18
- gem 'sinatra'
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 (1.4.6)
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.2)
20
- activesupport (= 4.0.2)
25
+ activemodel (4.0.4)
26
+ activesupport (= 4.0.4)
21
27
  builder (~> 3.1.0)
22
- activesupport (4.0.2)
23
- i18n (~> 0.6, >= 0.6.4)
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.14)
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.12.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.14)
93
+ monkey-patch (0.0.16)
93
94
  activesupport
94
- mtgox (1.1.0)
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.3)
101
- pony (1.6.2)
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.3)
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.4.15)
150
- polyglot
151
- polyglot (>= 0.3.1)
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
@@ -1,7 +1,7 @@
1
+ require 'bundler'
2
+ Bundler.require(:default)
1
3
  require 'thor'
2
- require 'mtgox'
3
4
  require_relative 'rbtc_arbitrage/campbx.rb'
4
- require 'bitstamp'
5
5
  require 'btce'
6
6
  require 'coinbase'
7
7
  require 'pony'
@@ -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: "mtgox"
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] || :mtgox
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
- logger.info "profit: $#{(@received - @paid).round(2)} (#{@percent.round(2)}%)"
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
@@ -1,3 +1,3 @@
1
1
  module RbtcArbitrage
2
- VERSION = "1.4.6"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -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::MtGoxClient.new
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
@@ -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::MtGoxClient)
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
@@ -13,7 +13,7 @@ SimpleCov.start do
13
13
  end
14
14
 
15
15
  require 'bundler'
16
- Bundler.require
16
+ Bundler.require(:default, :development)
17
17
 
18
18
  VCR.configure do |c|
19
19
  c.cassette_library_dir = 'spec/support/cassettes'
@@ -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://data.mtgox.com/api/1/BTCUSD/ticker
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/1.4.4
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
- - Fri, 13 Dec 2013 23:46:00 GMT
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: '{"result":"success","return":{"high":{"value":"990.00000","value_int":"99000000","display":"$990.00","display_short":"$990.00","currency":"USD"},"low":{"value":"882.15864","value_int":"88215864","display":"$882.16","display_short":"$882.16","currency":"USD"},"avg":{"value":"929.35648","value_int":"92935648","display":"$929.36","display_short":"$929.36","currency":"USD"},"vwap":{"value":"930.71887","value_int":"93071887","display":"$930.72","display_short":"$930.72","currency":"USD"},"vol":{"value":"16658.49512372","value_int":"1665849512372","display":"16,658.50\u00a0BTC","display_short":"16,658.50\u00a0BTC","currency":"BTC"},"last_local":{"value":"933.00000","value_int":"93300000","display":"$933.00","display_short":"$933.00","currency":"USD"},"last_orig":{"value":"933.00000","value_int":"93300000","display":"$933.00","display_short":"$933.00","currency":"USD"},"last_all":{"value":"933.00000","value_int":"93300000","display":"$933.00","display_short":"$933.00","currency":"USD"},"last":{"value":"933.00000","value_int":"93300000","display":"$933.00","display_short":"$933.00","currency":"USD"},"buy":{"value":"923.01500","value_int":"92301500","display":"$923.02","display_short":"$923.02","currency":"USD"},"sell":{"value":"932.99500","value_int":"93299500","display":"$933.00","display_short":"$933.00","currency":"USD"},"item":"BTC","now":"1386978350330653"}}'
46
+ string: '{"Last Trade":"582.01","Best Bid":"598.00","Best Ask":"599.99"}'
42
47
  http_version:
43
- recorded_at: Fri, 13 Dec 2013 23:45:59 GMT
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
- Date:
57
- - Fri, 13 Dec 2013 23:46:01 GMT
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
- - Fri, 13 Dec 2013 23:46:01 GMT
70
- Connection:
71
- - close
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
- - incap_ses_124_99025=1AGJPcUZxAWETOnVAYq4ATmcq1IAAAAAsPOre1PyXZcqEJH1uY4Qfg==;
76
+ - incap_ses_209_99025=/Pt0LzC6viGfdmvjkIXmAkNVLlMAAAAAaFpHwp3YsMhz5noifqhXyg==;
78
77
  path=/; Domain=.bitstamp.net
79
- - nlbi_99025=/DSMfH+W5Ew2ED96Itob8gAAAAAGzFr9JBde9Z+4ZeBXJbWF; path=/; Domain=.bitstamp.net
80
- - visid_incap_99025=QgG3duHHS6OybwUjvo9t3Ticq1IAAAAAQUIPAAAAAABm3P8tzeXhQXHryTzg9Y1Y;
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
- - 5-187947047-187947137 NNNY CT(197 197 0) RT(1386978360501 172) q(0 0 4 0)
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": "920.42", "last": "883.00", "timestamp": "1386978349", "bid":
90
- "879.36", "volume": "14666.53257818", "low": "850.00", "ask": "883.00"}'
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: Fri, 13 Dec 2013 23:46:00 GMT
93
- recorded_with: VCR 2.7.0
90
+ recorded_at: Sun, 23 Mar 2014 03:30:11 GMT
91
+ recorded_with: VCR 2.8.0