rbtc_arbitrage 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/lib/rbtc_arbitrage.rb +1 -1
- data/lib/rbtc_arbitrage/client.rb +3 -4
- data/lib/rbtc_arbitrage/clients/bitstamp_client.rb +1 -1
- data/lib/rbtc_arbitrage/clients/btce_client.rb +58 -0
- data/lib/rbtc_arbitrage/clients/campbx_client.rb +48 -0
- data/lib/rbtc_arbitrage/clients/client.rb.example +46 -0
- data/lib/rbtc_arbitrage/clients/mtgox_client.rb +1 -1
- data/lib/rbtc_arbitrage/version.rb +1 -1
- data/rbtc_arbitrage.gemspec +1 -1
- data/spec/client_spec.rb +15 -0
- data/spec/clients/btce_client_spec.rb +88 -0
- data/spec/clients/campbx_client_spec.rb +66 -0
- data/spec/clients/mtgox_client_spec.rb +1 -0
- data/spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/calls_btc-e.yml +91 -0
- data/spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/fetches_price_for_buy_correctly.yml +47 -0
- data/spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/fetches_price_for_sell_correctly.yml +47 -0
- data/spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_balance/fetches_the_balance_correctly.yml +95 -0
- data/spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_price/fetches_price_for_buy_correctly.yml +49 -0
- data/spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_price/fetches_price_for_sell_correctly.yml +49 -0
- metadata +25 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 148434f269c04f443fcfff7fa4296afcd99c3ebd
|
4
|
+
data.tar.gz: 108d60840e184dbb14e8349ca7983a6edeb599b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6502ed6e3c1af4bb81c35b125ee91be0883893d1d494ffcc99e92a3066acac804b6d29cc8223f649836e7f7a7a03a51a71be2e3ab6c147ff00f3bffa81737f97
|
7
|
+
data.tar.gz: 6b6652d8fadd9e974282594882b605586da5284d7aa1be6a55a6523dd41a2c2f73930410d916d3c3ebfc0aa4a79bc89bf7058997372fa193ea0aee880264527c
|
data/.travis.yml
CHANGED
@@ -13,3 +13,8 @@ env:
|
|
13
13
|
- secure: ksmMGyDkwmIUkJIHzdrAld+GN2KEm9l8dtxZikoP7B9zRymhnPhImDfZHbByFV0DIZmNiUMFvNLIIpgznjpFdpcEjCbLQnfniKTscMyQZ1pvOesCyaPnSHBENRDsADFCG/TMeP5VXtUUL2k/eNIzHU0cVJT8JaEMdihPDy+mrO8=
|
14
14
|
- secure: I3rS8d84BoCsZo9c/PcY6F/GDThVu/rPKMjTUGHkbtWXVD8E809JxaWavu/+EesyUhn8dDGwMRUc+4d6gtk+QeQVOyLkkPIaCII4puJEHqdyJpqrJlsZbXaGO/JJ6mx2y0I6wDryKeLhZqVn6VdxycF+7OTqYdCFGV+o49wirIU=
|
15
15
|
- secure: kih2LqMwQDZErJFU4hslPZcAdtYwQIYyzxnkObIWtIQpLAVQNssbISLBe5ogWNXi8FyiEktAH5Yy0orjTp2ynmrA6rE6NU/vD3oBDeeI7CCd+13weeIW+uReyixuI5zn6zzJLHdxn+rUwowfdYrt9vF54uEjKCVL32pbLZjdavk=
|
16
|
+
- secure: Y4BCviYqCE0JnumhmuIdGp79qQUMiTjBPruQszf65vivmD3jKXXldY0AzUpxUpHwHVAI755Xyc80IuIFQfo+w2gykK18DFKVuKjRqxxqzRKMzf6sB+haXOm0vK0+2y2E1q9EX7DygXuxuDtGRAOKsvPRZWgPERH67bR+e2mR4+0=
|
17
|
+
- secure: bKrqQ2Q2Rp7aR8yGYLplTCPLXck3BbpJsCirxoX6mJpDUsZTiM+sCxHKDnTeBptNaFfJe1JKb0xKhzu9CuY2gHi+XtrUu/yAq4M0+3vWG8h7Ios4ztI2BTnM4yi6vYaKkhdRrHFPdNdiL1/+bWW9/4SH1yOfw17UpnT3YbBdX4s=
|
18
|
+
- secure: YLXu/SNHJrhqc6Go9Tk7A2Dwf8XncZtGfRKwSbMb6WdNNw/8Zfd49tcf6FbiJS/THah5j/x4+X6kcxbCzgxndfIqpJNSn5gndYLWHIMWZ4B+ppM76SyvqsyrCWWWBcbnuKI8/FhN+1jvdKCRC1XO5hFbdBLqXMXjrcqTFF78k/Y=
|
19
|
+
- secure: IFyJX6lAmBpef0I50UPCy6L5IRxqRKoPhv74s5y0FPB4chrir7iMZ7Sd1IczxV7ly4Dt7hdALHP1qMTmkcGmTV6YOzwR46G4JAwWtX2xlf4OYk4jey7qjNsS6iijD6dvdYjqSKUuGaX3Til3kUOLcA3hhINvHxj5unv2pHB2W70=
|
20
|
+
- secure: YiYtCBJNfgWuzQ059RMmZxM00bs4c/GuqaEaKufLPPByJHHt3z4jCNT5lurox/RIqSYTv+1Nvgor1xJZF4VPDIhtoCpVRe3g5Pvubrp4gWQry11ta0f1JhPSrm5ORlF1hpHPfzHHSh+/YVmKcO8agQAaIgfKcXDzsE6j5QqiGWQ=
|
data/lib/rbtc_arbitrage.rb
CHANGED
@@ -14,10 +14,9 @@ module RbtcArbitrage
|
|
14
14
|
self
|
15
15
|
end
|
16
16
|
|
17
|
-
def validate_keys
|
18
|
-
|
19
|
-
|
20
|
-
key = "#{prefix}_#{suffix}"
|
17
|
+
def validate_keys *args
|
18
|
+
args.each do |key|
|
19
|
+
key = key.to_s.upcase
|
21
20
|
if ENV[key].blank?
|
22
21
|
raise ArgumentError, "Exiting because missing required ENV variable $#{key}."
|
23
22
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module RbtcArbitrage
|
2
|
+
module Clients
|
3
|
+
class BtceClient
|
4
|
+
include RbtcArbitrage::Client
|
5
|
+
|
6
|
+
def exchange
|
7
|
+
:btce
|
8
|
+
end
|
9
|
+
|
10
|
+
def balance
|
11
|
+
return @balance if @balance
|
12
|
+
balances = interface.get_info["return"]["funds"]
|
13
|
+
@balance = [balances["btc"], balances["usd"]]
|
14
|
+
end
|
15
|
+
|
16
|
+
def interface
|
17
|
+
end
|
18
|
+
|
19
|
+
def validate_env
|
20
|
+
validate_keys :btce_key, :btce_secret, :btce_address
|
21
|
+
end
|
22
|
+
|
23
|
+
def trade action
|
24
|
+
warning = "BTC-E does not support API bitcoin transfer. "
|
25
|
+
warning << "If you really want to trade, you will have "
|
26
|
+
warning << "to manually send bitcoin. Enter 'accept' to continue. \n> "
|
27
|
+
@options[:logger].warn warning if @options[:verbose]
|
28
|
+
return false unless gets.chomp == "accept"
|
29
|
+
opts = {
|
30
|
+
type: action,
|
31
|
+
rate: price(action),
|
32
|
+
amount: @options[:volume],
|
33
|
+
pair: "btc_usd"
|
34
|
+
}
|
35
|
+
interface.trade opts
|
36
|
+
end
|
37
|
+
|
38
|
+
def price action
|
39
|
+
return @ticker[action.to_s] if @ticker
|
40
|
+
@ticker = Btce::Ticker.new("btc_usd").json["ticker"]
|
41
|
+
@ticker[action.to_s]
|
42
|
+
end
|
43
|
+
|
44
|
+
def transfer client
|
45
|
+
if @options[:verbose]
|
46
|
+
error = "BTC-E does not have a 'transfer' API.\n"
|
47
|
+
error << "You must transfer bitcoin manually."
|
48
|
+
@options[:logger].error error
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def interface
|
53
|
+
opts = {key: ENV['BTCE_KEY'], secret: ENV['BTCE_SECRET']}
|
54
|
+
@interface ||= Btce::TradeAPI.new(opts)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module RbtcArbitrage
|
2
|
+
module Clients
|
3
|
+
class CampbxClient
|
4
|
+
include RbtcArbitrage::Client
|
5
|
+
|
6
|
+
def exchange
|
7
|
+
:campbx
|
8
|
+
end
|
9
|
+
|
10
|
+
def balance
|
11
|
+
return @balance if @balance
|
12
|
+
funds = interface.my_funds
|
13
|
+
[funds["Total BTC"].to_f, funds["Total USD"].to_f]
|
14
|
+
end
|
15
|
+
|
16
|
+
def interface
|
17
|
+
@interface ||= CampBX::API.new(ENV['CAMPBX_KEY'],ENV['CAMPBX_SECRET'])
|
18
|
+
end
|
19
|
+
|
20
|
+
def validate_env
|
21
|
+
validate_keys :campbx_key, :campbx_secret
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def trade action
|
26
|
+
trade_mode = "Quick#{action.to_s.capitalize}"
|
27
|
+
interface.trade_enter trade_mode, @options[:volume], price(action)
|
28
|
+
end
|
29
|
+
|
30
|
+
def price action
|
31
|
+
return @price if @price
|
32
|
+
action = {
|
33
|
+
buy: "Best Ask",
|
34
|
+
sell: "Best Bid",
|
35
|
+
}[action]
|
36
|
+
@price = interface.xticker[action].to_f
|
37
|
+
end
|
38
|
+
|
39
|
+
def transfer client
|
40
|
+
interface.send_btc client.address, @options[:volume]
|
41
|
+
end
|
42
|
+
|
43
|
+
def address
|
44
|
+
@address ||= interface.get_btc_address
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module RbtcArbitrage
|
2
|
+
module Clients
|
3
|
+
class ExchangeClient
|
4
|
+
include RbtcArbitrage::Client
|
5
|
+
|
6
|
+
# return a symbol as the name
|
7
|
+
# of this exchange
|
8
|
+
def exchange
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns an array of Floats.
|
12
|
+
# The first element is the balance in BTC;
|
13
|
+
# The second is in USD.
|
14
|
+
def balance
|
15
|
+
end
|
16
|
+
|
17
|
+
def interface
|
18
|
+
end
|
19
|
+
|
20
|
+
# Configures the client's API keys.
|
21
|
+
def validate_env
|
22
|
+
end
|
23
|
+
|
24
|
+
# `action` is :buy or :sell
|
25
|
+
def trade action
|
26
|
+
end
|
27
|
+
|
28
|
+
# `action` is :buy or :sell
|
29
|
+
# Returns a Numeric type.
|
30
|
+
def price action
|
31
|
+
end
|
32
|
+
|
33
|
+
# Transfers BTC to the address of a different
|
34
|
+
# exchange.
|
35
|
+
def transfer client
|
36
|
+
end
|
37
|
+
|
38
|
+
# If there is an API method to fetch your
|
39
|
+
# BTC address, implement this, otherwise
|
40
|
+
# remove this method and set the ENV
|
41
|
+
# variable [this-exchange-name-in-caps]_ADDRESS
|
42
|
+
def address
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -17,7 +17,7 @@ module RbtcArbitrage
|
|
17
17
|
# Configures the MtGox
|
18
18
|
# client's API keys.
|
19
19
|
def validate_env
|
20
|
-
validate_keys
|
20
|
+
validate_keys :mtgox_key, :mtgox_secret, :mtgox_address
|
21
21
|
MtGox.configure do |config|
|
22
22
|
config.key = ENV["MTGOX_KEY"]
|
23
23
|
config.secret = ENV["MTGOX_SECRET"]
|
data/rbtc_arbitrage.gemspec
CHANGED
@@ -26,6 +26,6 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_dependency "activemodel", ">= 3.1"
|
27
27
|
spec.add_dependency "activesupport", ">= 3.1"
|
28
28
|
spec.add_dependency "thor"
|
29
|
-
spec.add_dependency "btce"
|
29
|
+
spec.add_dependency "btce", '0.2.4'
|
30
30
|
spec.add_dependency "bitstamp"
|
31
31
|
end
|
data/spec/client_spec.rb
CHANGED
@@ -15,4 +15,19 @@ describe RbtcArbitrage::Client do
|
|
15
15
|
client.should_receive(:trade).with(:buy)
|
16
16
|
client.buy
|
17
17
|
end
|
18
|
+
|
19
|
+
describe RbtcArbitrage::Clients do
|
20
|
+
RbtcArbitrage.clients.each do |client|
|
21
|
+
required_methods = [:trade, :balance, :validate_env, :exchange]
|
22
|
+
required_methods << [:price, :transfer, :address]
|
23
|
+
required_methods.flatten!
|
24
|
+
describe client do
|
25
|
+
it "has all requred methods" do
|
26
|
+
required_methods.each do |meth|
|
27
|
+
client.new.methods.should include(meth)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
18
33
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RbtcArbitrage::Clients::BtceClient do
|
4
|
+
let(:client) { RbtcArbitrage::Clients::BtceClient.new(verbose: false) }
|
5
|
+
let(:btce) { client.interface }
|
6
|
+
|
7
|
+
it { client.exchange.should == :btce }
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
btce.stub(:get_info) {
|
11
|
+
{
|
12
|
+
"success" => 1,
|
13
|
+
"return" => {
|
14
|
+
"funds" => {
|
15
|
+
"usd" => 2.57460659,
|
16
|
+
"btc" => 0.00012226,
|
17
|
+
"ltc" => 3.00815559,
|
18
|
+
"nmc" => 0,
|
19
|
+
"rur" => 8.0116908,
|
20
|
+
"eur" => 0,
|
21
|
+
"nvc" => 0,
|
22
|
+
"trc" => 0,
|
23
|
+
"ppc" => 0,
|
24
|
+
"ftc" => 0,
|
25
|
+
"xpm" => 0},
|
26
|
+
"rights" => {
|
27
|
+
"info" => 1,
|
28
|
+
"trade" => 0,
|
29
|
+
"withdraw" => 0
|
30
|
+
},
|
31
|
+
"transaction_count" => 120,
|
32
|
+
"open_orders" => 1,
|
33
|
+
"server_time"=>1385947487
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#balance" do
|
40
|
+
it "fetches the balance correctly", :vcr do
|
41
|
+
balances = btce.get_info["return"]["funds"]
|
42
|
+
expected = [balances["btc"], balances["usd"]]
|
43
|
+
client.balance.should eql(expected)
|
44
|
+
client.balance.each do |b|
|
45
|
+
b.should be_a(Float)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#price" do
|
51
|
+
[:buy, :sell].each do |action|
|
52
|
+
it "fetches price for #{action} correctly", :vcr do
|
53
|
+
client.price(action).should be_a(Float)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "calls btc-e", :vcr do
|
58
|
+
ticker = Btce::Ticker.new("btc_usd").json["ticker"]
|
59
|
+
client.price(:sell).should == ticker["sell"]
|
60
|
+
client.price(:buy).should == ticker["buy"]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#trade" do
|
65
|
+
it "calls CampBX" do
|
66
|
+
client.stub(:gets) { 'accept' }
|
67
|
+
|
68
|
+
client.instance_variable_set(:@ticker, {"sell" => 10, "buy" => 11})
|
69
|
+
opts = {pair: "btc_usd", type: :sell, rate: 10, amount: 0.01}
|
70
|
+
btce.should_receive(:trade).with(opts)
|
71
|
+
client.trade(:sell)
|
72
|
+
|
73
|
+
opts[:type] = :buy
|
74
|
+
opts[:rate] = 11
|
75
|
+
btce.should_receive(:trade).with(opts)
|
76
|
+
client.trade(:buy)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#transfer" do
|
81
|
+
it "calls CampBX correctly" do
|
82
|
+
client.options[:verbose] = true
|
83
|
+
sell_client = RbtcArbitrage::Clients::BitstampClient.new
|
84
|
+
client.options[:logger].should_receive(:error)
|
85
|
+
client.transfer(sell_client)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RbtcArbitrage::Clients::CampbxClient do
|
4
|
+
let(:client) { RbtcArbitrage::Clients::CampbxClient.new }
|
5
|
+
let(:campbx) { client.interface }
|
6
|
+
|
7
|
+
before(:each) { client.validate_env }
|
8
|
+
|
9
|
+
it { client.exchange.should == :campbx }
|
10
|
+
|
11
|
+
describe "#balance" do
|
12
|
+
it "fetches the balance correctly", :vcr do
|
13
|
+
balances = campbx.my_funds
|
14
|
+
expected = [balances["Total BTC"].to_f, balances["Total USD"].to_f]
|
15
|
+
client.balance.should == expected
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#price" do
|
20
|
+
[:buy, :sell].each do |action|
|
21
|
+
it "fetches price for #{action} correctly", :vcr do
|
22
|
+
client.price(action).should be_a(Float)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "calls CampBX" do
|
27
|
+
hash = Hashie::Mash.new("Best Bid" => 10)
|
28
|
+
hash.should_receive(:[]).with("Best Bid")
|
29
|
+
campbx.should_receive(:xticker) { hash }
|
30
|
+
client.price(:sell)
|
31
|
+
|
32
|
+
client.instance_variable_set(:@price, nil)
|
33
|
+
hash = Hashie::Mash.new("Best Ask" => 10)
|
34
|
+
hash.should_receive(:[]).with("Best Ask")
|
35
|
+
campbx.should_receive(:xticker) { hash }
|
36
|
+
client.price(:buy)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#trade" do
|
41
|
+
it "calls CampBX" do
|
42
|
+
client.instance_variable_set(:@price, 10)
|
43
|
+
campbx.should_receive(:trade_enter).with("QuickSell",0.01,10)
|
44
|
+
client.trade(:sell)
|
45
|
+
|
46
|
+
client.instance_variable_set(:@price, 11)
|
47
|
+
campbx.should_receive(:trade_enter).with("QuickBuy",0.01,11)
|
48
|
+
client.trade(:buy)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#transfer" do
|
53
|
+
it "calls CampBX correctly" do
|
54
|
+
sell_client = RbtcArbitrage::Clients::BitstampClient.new
|
55
|
+
campbx.should_receive(:send_btc).with(sell_client.address, 0.01)
|
56
|
+
client.transfer sell_client
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#address" do
|
61
|
+
it "calls campbx" do
|
62
|
+
campbx.should_receive(:get_btc_address)
|
63
|
+
client.address
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -25,6 +25,7 @@ describe RbtcArbitrage::Clients::MtGoxClient do
|
|
25
25
|
MtGox.should_receive(:ticker) { hash }
|
26
26
|
client.price(:sell)
|
27
27
|
|
28
|
+
client.instance_variable_set(:@price, nil)
|
28
29
|
hash = Hashie::Mash.new(sell: 10)
|
29
30
|
hash.should_receive(:sell)
|
30
31
|
MtGox.should_receive(:ticker) { hash }
|
@@ -0,0 +1,91 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://btc-e.com/api/2/btc_usd/ticker
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- '*/*'
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- cloudflare-nginx
|
23
|
+
Date:
|
24
|
+
- Sun, 22 Dec 2013 22:16:28 GMT
|
25
|
+
Content-Type:
|
26
|
+
- text/html; charset=utf-8
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Set-Cookie:
|
32
|
+
- __cfduid=d1f8cab4bb52538ed98053a854f645b891387750587941; expires=Mon, 23-Dec-2019
|
33
|
+
23:50:00 GMT; path=/; domain=.btc-e.com; HttpOnly
|
34
|
+
X-Frame-Options:
|
35
|
+
- DENY
|
36
|
+
Expires:
|
37
|
+
- Thu, 01 Jan 1970 00:00:01 GMT
|
38
|
+
Cache-Control:
|
39
|
+
- no-cache
|
40
|
+
Cf-Ray:
|
41
|
+
- e102d36ad9f0293
|
42
|
+
body:
|
43
|
+
encoding: UTF-8
|
44
|
+
string: '{"ticker":{"high":659.99902,"low":572.09998,"avg":616.0495,"vol":14435222.43502,"vol_cur":23193.90705,"last":610.684,"buy":613.992,"sell":613.185,"updated":1387750587,"server_time":1387750588}}'
|
45
|
+
http_version:
|
46
|
+
recorded_at: Sun, 22 Dec 2013 22:16:28 GMT
|
47
|
+
- request:
|
48
|
+
method: get
|
49
|
+
uri: https://btc-e.com/api/2/btc_usd/ticker
|
50
|
+
body:
|
51
|
+
encoding: US-ASCII
|
52
|
+
string: ''
|
53
|
+
headers:
|
54
|
+
Accept-Encoding:
|
55
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
56
|
+
Accept:
|
57
|
+
- '*/*'
|
58
|
+
User-Agent:
|
59
|
+
- Ruby
|
60
|
+
response:
|
61
|
+
status:
|
62
|
+
code: 200
|
63
|
+
message: OK
|
64
|
+
headers:
|
65
|
+
Server:
|
66
|
+
- cloudflare-nginx
|
67
|
+
Date:
|
68
|
+
- Sun, 22 Dec 2013 22:16:28 GMT
|
69
|
+
Content-Type:
|
70
|
+
- text/html; charset=utf-8
|
71
|
+
Transfer-Encoding:
|
72
|
+
- chunked
|
73
|
+
Connection:
|
74
|
+
- keep-alive
|
75
|
+
Set-Cookie:
|
76
|
+
- __cfduid=d58ae9f8e9b973513f80e342b90bcbdb31387750588525; expires=Mon, 23-Dec-2019
|
77
|
+
23:50:00 GMT; path=/; domain=.btc-e.com; HttpOnly
|
78
|
+
X-Frame-Options:
|
79
|
+
- DENY
|
80
|
+
Expires:
|
81
|
+
- Thu, 01 Jan 1970 00:00:01 GMT
|
82
|
+
Cache-Control:
|
83
|
+
- no-cache
|
84
|
+
Cf-Ray:
|
85
|
+
- e102d3a42aa0293
|
86
|
+
body:
|
87
|
+
encoding: UTF-8
|
88
|
+
string: '{"ticker":{"high":659.99902,"low":572.09998,"avg":616.0495,"vol":14435222.43502,"vol_cur":23193.90705,"last":610.684,"buy":613.992,"sell":613.185,"updated":1387750587,"server_time":1387750588}}'
|
89
|
+
http_version:
|
90
|
+
recorded_at: Sun, 22 Dec 2013 22:16:28 GMT
|
91
|
+
recorded_with: VCR 2.7.0
|
@@ -0,0 +1,47 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://btc-e.com/api/2/btc_usd/ticker
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- '*/*'
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- cloudflare-nginx
|
23
|
+
Date:
|
24
|
+
- Sun, 22 Dec 2013 22:13:52 GMT
|
25
|
+
Content-Type:
|
26
|
+
- text/html; charset=utf-8
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Set-Cookie:
|
32
|
+
- __cfduid=de7ec8d7456b1f37e41e2b0fe4a09cfba1387750431811; expires=Mon, 23-Dec-2019
|
33
|
+
23:50:00 GMT; path=/; domain=.btc-e.com; HttpOnly
|
34
|
+
X-Frame-Options:
|
35
|
+
- DENY
|
36
|
+
Expires:
|
37
|
+
- Thu, 01 Jan 1970 00:00:01 GMT
|
38
|
+
Cache-Control:
|
39
|
+
- no-cache
|
40
|
+
Cf-Ray:
|
41
|
+
- e102966dc670669
|
42
|
+
body:
|
43
|
+
encoding: UTF-8
|
44
|
+
string: '{"ticker":{"high":659.99902,"low":572.09998,"avg":616.0495,"vol":14402660.31015,"vol_cur":23140.70104,"last":613.1,"buy":614.99,"sell":612.7,"updated":1387750431,"server_time":1387750432}}'
|
45
|
+
http_version:
|
46
|
+
recorded_at: Sun, 22 Dec 2013 22:13:52 GMT
|
47
|
+
recorded_with: VCR 2.7.0
|
@@ -0,0 +1,47 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://btc-e.com/api/2/btc_usd/ticker
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- '*/*'
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- cloudflare-nginx
|
23
|
+
Date:
|
24
|
+
- Sun, 22 Dec 2013 22:13:52 GMT
|
25
|
+
Content-Type:
|
26
|
+
- text/html; charset=utf-8
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Set-Cookie:
|
32
|
+
- __cfduid=d5173355cf2a4f0a2af0f2ee70de42a711387750432284; expires=Mon, 23-Dec-2019
|
33
|
+
23:50:00 GMT; path=/; domain=.btc-e.com; HttpOnly
|
34
|
+
X-Frame-Options:
|
35
|
+
- DENY
|
36
|
+
Expires:
|
37
|
+
- Thu, 01 Jan 1970 00:00:01 GMT
|
38
|
+
Cache-Control:
|
39
|
+
- no-cache
|
40
|
+
Cf-Ray:
|
41
|
+
- e102969cbd00669
|
42
|
+
body:
|
43
|
+
encoding: UTF-8
|
44
|
+
string: '{"ticker":{"high":659.99902,"low":572.09998,"avg":616.0495,"vol":14402660.31015,"vol_cur":23140.70104,"last":613.1,"buy":614.99,"sell":612.7,"updated":1387750431,"server_time":1387750432}}'
|
45
|
+
http_version:
|
46
|
+
recorded_at: Sun, 22 Dec 2013 22:13:52 GMT
|
47
|
+
recorded_with: VCR 2.7.0
|
@@ -0,0 +1,95 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://campbx.com/api/myfunds.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, 22 Dec 2013 20:52:46 GMT
|
24
|
+
Content-Type:
|
25
|
+
- application/json
|
26
|
+
Transfer-Encoding:
|
27
|
+
- chunked
|
28
|
+
Connection:
|
29
|
+
- keep-alive
|
30
|
+
Set-Cookie:
|
31
|
+
- __cfduid=dcf93eb6010f388100750784fd2ba7ad51387745566048; 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, 22 Dec 2013 21:52:45 GMT
|
41
|
+
Cf-Ray:
|
42
|
+
- e0fb29b52190657
|
43
|
+
body:
|
44
|
+
encoding: UTF-8
|
45
|
+
string: "\r\n{\"Total USD\":\"1.41\",\"Total BTC\":\"0.00790000\",\"Liquid USD\":\"1.41\",\"Liquid
|
46
|
+
BTC\":\"0.00790000\",\"Margin Account USD\":\"0.00\",\"Margin Account BTC\":\"0.00000000\"}"
|
47
|
+
http_version:
|
48
|
+
recorded_at: Sun, 22 Dec 2013 20:52:46 GMT
|
49
|
+
- request:
|
50
|
+
method: post
|
51
|
+
uri: https://campbx.com/api/myfunds.php
|
52
|
+
headers:
|
53
|
+
Accept-Encoding:
|
54
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
55
|
+
Accept:
|
56
|
+
- '*/*'
|
57
|
+
User-Agent:
|
58
|
+
- Ruby
|
59
|
+
Content-Type:
|
60
|
+
- application/x-www-form-urlencoded
|
61
|
+
response:
|
62
|
+
status:
|
63
|
+
code: 200
|
64
|
+
message: OK
|
65
|
+
headers:
|
66
|
+
Server:
|
67
|
+
- cloudflare-nginx
|
68
|
+
Date:
|
69
|
+
- Sun, 22 Dec 2013 20:52:47 GMT
|
70
|
+
Content-Type:
|
71
|
+
- application/json
|
72
|
+
Transfer-Encoding:
|
73
|
+
- chunked
|
74
|
+
Connection:
|
75
|
+
- keep-alive
|
76
|
+
Set-Cookie:
|
77
|
+
- __cfduid=d4b55f5f94eb19005616f2b37678ae4d31387745567323; expires=Mon, 23-Dec-2019
|
78
|
+
23:50:00 GMT; path=/; domain=.campbx.com; HttpOnly
|
79
|
+
X-Frame-Options:
|
80
|
+
- SAMEORIGIN
|
81
|
+
Cache-Control:
|
82
|
+
- no-cache, must-revalidate, max-age=3600
|
83
|
+
Vary:
|
84
|
+
- Accept-Encoding
|
85
|
+
Expires:
|
86
|
+
- Sun, 22 Dec 2013 21:52:46 GMT
|
87
|
+
Cf-Ray:
|
88
|
+
- e0fb2a340cd012d
|
89
|
+
body:
|
90
|
+
encoding: UTF-8
|
91
|
+
string: "\r\n{\"Total USD\":\"1.41\",\"Total BTC\":\"0.00790000\",\"Liquid USD\":\"1.41\",\"Liquid
|
92
|
+
BTC\":\"0.00790000\",\"Margin Account USD\":\"0.00\",\"Margin Account BTC\":\"0.00000000\"}"
|
93
|
+
http_version:
|
94
|
+
recorded_at: Sun, 22 Dec 2013 20:52:47 GMT
|
95
|
+
recorded_with: VCR 2.7.0
|
@@ -0,0 +1,49 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://campbx.com/api/xticker.php
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- '*/*'
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- cloudflare-nginx
|
23
|
+
Date:
|
24
|
+
- Sun, 22 Dec 2013 20:54:39 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Set-Cookie:
|
32
|
+
- __cfduid=d98aba474beb6580e3a16963937d1feab1387745679008; 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, 22 Dec 2013 21:54:38 GMT
|
42
|
+
Cf-Ray:
|
43
|
+
- e0fb55dc03e012d
|
44
|
+
body:
|
45
|
+
encoding: UTF-8
|
46
|
+
string: '{"Last Trade":"629.99","Best Bid":"611.00","Best Ask":"634.49"}'
|
47
|
+
http_version:
|
48
|
+
recorded_at: Sun, 22 Dec 2013 20:54:39 GMT
|
49
|
+
recorded_with: VCR 2.7.0
|
@@ -0,0 +1,49 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://campbx.com/api/xticker.php
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- '*/*'
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- cloudflare-nginx
|
23
|
+
Date:
|
24
|
+
- Sun, 22 Dec 2013 20:54:40 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Set-Cookie:
|
32
|
+
- __cfduid=ddfbcf00e20688eca7437a961caf31c281387745680288; 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, 22 Dec 2013 21:54:39 GMT
|
42
|
+
Cf-Ray:
|
43
|
+
- e0fb565c0b4012d
|
44
|
+
body:
|
45
|
+
encoding: UTF-8
|
46
|
+
string: '{"Last Trade":"629.99","Best Bid":"611.00","Best Ask":"634.49"}'
|
47
|
+
http_version:
|
48
|
+
recorded_at: Sun, 22 Dec 2013 20:54:40 GMT
|
49
|
+
recorded_with: VCR 2.7.0
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbtc_arbitrage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hank Stoever
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -112,16 +112,16 @@ dependencies:
|
|
112
112
|
name: btce
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - '
|
115
|
+
- - '='
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: 0.2.4
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - '
|
122
|
+
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: 0.2.4
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: bitstamp
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -159,6 +159,9 @@ files:
|
|
159
159
|
- lib/rbtc_arbitrage/cli.rb
|
160
160
|
- lib/rbtc_arbitrage/client.rb
|
161
161
|
- lib/rbtc_arbitrage/clients/bitstamp_client.rb
|
162
|
+
- lib/rbtc_arbitrage/clients/btce_client.rb
|
163
|
+
- lib/rbtc_arbitrage/clients/campbx_client.rb
|
164
|
+
- lib/rbtc_arbitrage/clients/client.rb.example
|
162
165
|
- lib/rbtc_arbitrage/clients/mtgox_client.rb
|
163
166
|
- lib/rbtc_arbitrage/trader.rb
|
164
167
|
- lib/rbtc_arbitrage/version.rb
|
@@ -166,6 +169,8 @@ files:
|
|
166
169
|
- spec/cli_spec.rb
|
167
170
|
- spec/client_spec.rb
|
168
171
|
- spec/clients/bitstamp_client_spec.rb
|
172
|
+
- spec/clients/btce_client_spec.rb
|
173
|
+
- spec/clients/campbx_client_spec.rb
|
169
174
|
- spec/clients/mtgox_client_spec.rb
|
170
175
|
- spec/rbtc_arbitrage_spec.rb
|
171
176
|
- spec/spec_helper.rb
|
@@ -173,6 +178,12 @@ files:
|
|
173
178
|
- spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_price/fetches_price_for_buy_correctly.yml
|
174
179
|
- spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_price/fetches_price_for_sell_correctly.yml
|
175
180
|
- spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_price/fetches_prices_correctly.yml
|
181
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/calls_btc-e.yml
|
182
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/fetches_price_for_buy_correctly.yml
|
183
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/fetches_price_for_sell_correctly.yml
|
184
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_balance/fetches_the_balance_correctly.yml
|
185
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_price/fetches_price_for_buy_correctly.yml
|
186
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_price/fetches_price_for_sell_correctly.yml
|
176
187
|
- spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_balance/fetches_the_balance_correctly.yml
|
177
188
|
- spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_buy_correctly.yml
|
178
189
|
- spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_sell_correctly.yml
|
@@ -213,6 +224,8 @@ test_files:
|
|
213
224
|
- spec/cli_spec.rb
|
214
225
|
- spec/client_spec.rb
|
215
226
|
- spec/clients/bitstamp_client_spec.rb
|
227
|
+
- spec/clients/btce_client_spec.rb
|
228
|
+
- spec/clients/campbx_client_spec.rb
|
216
229
|
- spec/clients/mtgox_client_spec.rb
|
217
230
|
- spec/rbtc_arbitrage_spec.rb
|
218
231
|
- spec/spec_helper.rb
|
@@ -220,6 +233,12 @@ test_files:
|
|
220
233
|
- spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_price/fetches_price_for_buy_correctly.yml
|
221
234
|
- spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_price/fetches_price_for_sell_correctly.yml
|
222
235
|
- spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_price/fetches_prices_correctly.yml
|
236
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/calls_btc-e.yml
|
237
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/fetches_price_for_buy_correctly.yml
|
238
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/fetches_price_for_sell_correctly.yml
|
239
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_balance/fetches_the_balance_correctly.yml
|
240
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_price/fetches_price_for_buy_correctly.yml
|
241
|
+
- spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_price/fetches_price_for_sell_correctly.yml
|
223
242
|
- spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_balance/fetches_the_balance_correctly.yml
|
224
243
|
- spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_buy_correctly.yml
|
225
244
|
- spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_sell_correctly.yml
|