rbtc_arbitrage 2.0.1 → 2.0.2
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/Gemfile.lock +1 -1
- data/lib/rbtc_arbitrage/campbx.rb +3 -4
- data/lib/rbtc_arbitrage/trader/logger.rb +31 -0
- data/lib/rbtc_arbitrage/trader/notifier.rb +60 -0
- data/lib/rbtc_arbitrage/trader.rb +19 -79
- data/lib/rbtc_arbitrage/version.rb +1 -1
- data/lib/rbtc_arbitrage.rb +1 -0
- data/spec/spec_helper.rb +1 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 343e03101953463b1fe628965585c402baf85ec0
|
4
|
+
data.tar.gz: bd1db8a57c03e20a6e7a3c8f8750883159e0625b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f94c8549b48deab8e7d56ef63f0a992358fd948e6a78218f7325c56c3c3f9716950a66c4392dcfb328acbf0a4b07c1216ca512f120a05a90813796a6524708a1
|
7
|
+
data.tar.gz: bb2e4ebc741ecf66bae436ad59e98ddea561106a9219b0f6c18f74f6fcfd12fc5b2f88b7e15311c228da60bcb6a2ba595c7837ca8d5527b367e935a27f07ae7d
|
data/Gemfile.lock
CHANGED
@@ -70,10 +70,10 @@ module CampBX
|
|
70
70
|
request.set_form_data( post_data )
|
71
71
|
end
|
72
72
|
|
73
|
-
|
74
|
-
|
75
|
-
#puts "Post Data: #{post_data}"
|
73
|
+
make_request(http, request)
|
74
|
+
end
|
76
75
|
|
76
|
+
def make_request http, request
|
77
77
|
# CampBX API: max 1 request per 500ms
|
78
78
|
delta = Time.now - @@last
|
79
79
|
#puts delta*1000
|
@@ -90,7 +90,6 @@ module CampBX
|
|
90
90
|
else # HTTP ERROR
|
91
91
|
warn "HTTP Error: + #{res.code}"
|
92
92
|
end
|
93
|
-
|
94
93
|
end
|
95
94
|
|
96
95
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RbtcArbitrage
|
2
|
+
module TraderHelpers
|
3
|
+
module Logger
|
4
|
+
def logger
|
5
|
+
@options[:logger]
|
6
|
+
end
|
7
|
+
|
8
|
+
def log_info
|
9
|
+
lower_ex = @buy_client.exchange.to_s.capitalize
|
10
|
+
higher_ex = @sell_client.exchange.to_s.capitalize
|
11
|
+
logger.info "#{lower_ex}: $#{buyer[:price].round(2)}"
|
12
|
+
logger.info "#{higher_ex}: $#{seller[:price].round(2)}"
|
13
|
+
logger.info "buying #{@options[:volume]} btc from #{lower_ex} for $#{@paid.round(2)}"
|
14
|
+
logger.info "selling #{@options[:volume]} btc on #{higher_ex} for $#{@received.round(2)}"
|
15
|
+
|
16
|
+
log_profit
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def log_profit
|
22
|
+
profit_msg = "profit: $#{(@received - @paid).round(2)} (#{@percent.round(2)}%)"
|
23
|
+
if cutoff = @options[:cutoff]
|
24
|
+
profit_msg << " is #{@percent < cutoff ? 'below' : 'above'} cutoff"
|
25
|
+
profit_msg << " of #{cutoff}%."
|
26
|
+
end
|
27
|
+
logger.info profit_msg
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module RbtcArbitrage
|
2
|
+
module TraderHelpers
|
3
|
+
module Notifier
|
4
|
+
def notify
|
5
|
+
return false unless options[:notify]
|
6
|
+
return false unless @percent > options[:cutoff]
|
7
|
+
setup_pony
|
8
|
+
|
9
|
+
options[:logger].info "Sending email to #{ENV['SENDGRID_EMAIL']}"
|
10
|
+
Pony.mail({
|
11
|
+
body: notification,
|
12
|
+
to: ENV['SENDGRID_EMAIL'],
|
13
|
+
})
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup_pony
|
17
|
+
Pony.options = {
|
18
|
+
from: ENV['FROM_EMAIL'] || "info@example.org",
|
19
|
+
subject: "rbtc_arbitrage notification",
|
20
|
+
via: :smtp,
|
21
|
+
via_options: {
|
22
|
+
address: 'smtp.sendgrid.net',
|
23
|
+
port: '587',
|
24
|
+
domain: 'heroku.com',
|
25
|
+
user_name: ENV['SENDGRID_USERNAME'],
|
26
|
+
password: ENV['SENDGRID_PASSWORD'],
|
27
|
+
authentication: :plain,
|
28
|
+
enable_starttls_auto: true
|
29
|
+
}
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def notification
|
34
|
+
lower_ex = @buy_client.exchange.to_s.capitalize
|
35
|
+
higher_ex = @sell_client.exchange.to_s.capitalize
|
36
|
+
<<-eos
|
37
|
+
Update from your friendly rbtc_arbitrage trader:
|
38
|
+
|
39
|
+
-------------------
|
40
|
+
|
41
|
+
#{lower_ex}: $#{buyer[:price].round(2)}
|
42
|
+
#{higher_ex}: $#{seller[:price].round(2)}
|
43
|
+
buying #{@options[:volume]} btc from #{lower_ex} for $#{@paid.round(2)}
|
44
|
+
selling #{@options[:volume]} btc on #{higher_ex} for $#{@received.round(2)}
|
45
|
+
profit: $#{(@received - @paid).round(2)} (#{@percent.round(2)}%)
|
46
|
+
|
47
|
+
-------------------
|
48
|
+
|
49
|
+
options:
|
50
|
+
|
51
|
+
#{options.reject{|k,v| v.is_a?(Logger)}.collect{|k,v| "#{k}: #{v.to_s}"}.join(" | ")}
|
52
|
+
|
53
|
+
-------------------
|
54
|
+
|
55
|
+
https://github.com/hstove/rbtc_arbitrage
|
56
|
+
eos
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
module RbtcArbitrage
|
2
2
|
class Trader
|
3
|
+
include RbtcArbitrage::TraderHelpers::Notifier
|
4
|
+
include RbtcArbitrage::TraderHelpers::Logger
|
5
|
+
|
3
6
|
attr_reader :buy_client, :sell_client, :received
|
4
7
|
attr_accessor :buyer, :seller, :options
|
5
8
|
|
@@ -64,14 +67,7 @@ module RbtcArbitrage
|
|
64
67
|
raise SecurityError, "--live flag is false. Not executing trade." unless options[:live]
|
65
68
|
get_balance
|
66
69
|
if @percent > @options[:cutoff]
|
67
|
-
|
68
|
-
raise SecurityError, "Not enough funds. Exiting."
|
69
|
-
else
|
70
|
-
logger.info "Trading live!" if options[:verbose]
|
71
|
-
@buy_client.buy
|
72
|
-
@sell_client.sell
|
73
|
-
@buy_client.transfer @sell_client
|
74
|
-
end
|
70
|
+
buy_and_transfer!
|
75
71
|
else
|
76
72
|
logger.info "Not trading live because cutoff is higher than profit." if @options[:verbose]
|
77
73
|
end
|
@@ -82,25 +78,8 @@ module RbtcArbitrage
|
|
82
78
|
buyer[:price] = @buy_client.price(:buy)
|
83
79
|
seller[:price] = @sell_client.price(:sell)
|
84
80
|
prices = [buyer[:price], seller[:price]]
|
85
|
-
@paid = buyer[:price] * 1.006 * @options[:volume]
|
86
|
-
@received = seller[:price] * 0.994 * @options[:volume]
|
87
|
-
@percent = ((received/@paid - 1) * 100).round(2)
|
88
|
-
end
|
89
81
|
|
90
|
-
|
91
|
-
lower_ex = @buy_client.exchange.to_s.capitalize
|
92
|
-
higher_ex = @sell_client.exchange.to_s.capitalize
|
93
|
-
logger.info "#{lower_ex}: $#{buyer[:price].round(2)}"
|
94
|
-
logger.info "#{higher_ex}: $#{seller[:price].round(2)}"
|
95
|
-
logger.info "buying #{@options[:volume]} btc from #{lower_ex} for $#{@paid.round(2)}"
|
96
|
-
logger.info "selling #{@options[:volume]} btc on #{higher_ex} for $#{@received.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
|
82
|
+
calculate_profit
|
104
83
|
end
|
105
84
|
|
106
85
|
def get_balance
|
@@ -108,10 +87,6 @@ module RbtcArbitrage
|
|
108
87
|
@buyer[:btc], @buyer[:usd] = @buy_client.balance
|
109
88
|
end
|
110
89
|
|
111
|
-
def logger
|
112
|
-
@options[:logger]
|
113
|
-
end
|
114
|
-
|
115
90
|
def validate_env
|
116
91
|
[@sell_client, @buy_client].each do |client|
|
117
92
|
client.validate_env
|
@@ -141,59 +116,24 @@ module RbtcArbitrage
|
|
141
116
|
end
|
142
117
|
end
|
143
118
|
|
144
|
-
|
145
|
-
return false unless options[:notify]
|
146
|
-
return false unless @percent > options[:cutoff]
|
147
|
-
setup_pony
|
119
|
+
private
|
148
120
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
})
|
121
|
+
def calculate_profit
|
122
|
+
@paid = buyer[:price] * 1.006 * @options[:volume]
|
123
|
+
@received = seller[:price] * 0.994 * @options[:volume]
|
124
|
+
@percent = ((received/@paid - 1) * 100).round(2)
|
154
125
|
end
|
155
126
|
|
156
|
-
def
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
user_name: ENV['SENDGRID_USERNAME'],
|
166
|
-
password: ENV['SENDGRID_PASSWORD'],
|
167
|
-
authentication: :plain,
|
168
|
-
enable_starttls_auto: true
|
169
|
-
}
|
170
|
-
}
|
127
|
+
def buy_and_transfer!
|
128
|
+
if @paid > buyer[:usd] || @options[:volume] > seller[:btc]
|
129
|
+
raise SecurityError, "Not enough funds. Exiting."
|
130
|
+
else
|
131
|
+
logger.info "Trading live!" if options[:verbose]
|
132
|
+
@buy_client.buy
|
133
|
+
@sell_client.sell
|
134
|
+
@buy_client.transfer @sell_client
|
135
|
+
end
|
171
136
|
end
|
172
137
|
|
173
|
-
def notification
|
174
|
-
lower_ex = @buy_client.exchange.to_s.capitalize
|
175
|
-
higher_ex = @sell_client.exchange.to_s.capitalize
|
176
|
-
<<-eos
|
177
|
-
Update from your friendly rbtc_arbitrage trader:
|
178
|
-
|
179
|
-
-------------------
|
180
|
-
|
181
|
-
#{lower_ex}: $#{buyer[:price].round(2)}
|
182
|
-
#{higher_ex}: $#{seller[:price].round(2)}
|
183
|
-
buying #{@options[:volume]} btc from #{lower_ex} for $#{@paid.round(2)}
|
184
|
-
selling #{@options[:volume]} btc on #{higher_ex} for $#{@received.round(2)}
|
185
|
-
profit: $#{(@received - @paid).round(2)} (#{@percent.round(2)}%)
|
186
|
-
|
187
|
-
-------------------
|
188
|
-
|
189
|
-
options:
|
190
|
-
|
191
|
-
#{options.reject{|k,v| v.is_a?(Logger)}.collect{|k,v| "#{k}: #{v.to_s}"}.join(" | ")}
|
192
|
-
|
193
|
-
-------------------
|
194
|
-
|
195
|
-
https://github.com/hstove/rbtc_arbitrage
|
196
|
-
eos
|
197
|
-
end
|
198
138
|
end
|
199
139
|
end
|
data/lib/rbtc_arbitrage.rb
CHANGED
@@ -6,6 +6,7 @@ require 'btce'
|
|
6
6
|
require 'coinbase'
|
7
7
|
require 'pony'
|
8
8
|
require_relative 'rbtc_arbitrage/client.rb'
|
9
|
+
Dir["#{File.dirname(__FILE__)}/rbtc_arbitrage/trader/*.rb"].each { |f| require(f) }
|
9
10
|
Dir["#{File.dirname(__FILE__)}/rbtc_arbitrage/**/*.rb"].each { |f| require(f) }
|
10
11
|
|
11
12
|
module RbtcArbitrage
|
data/spec/spec_helper.rb
CHANGED
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: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hank Stoever
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -167,6 +167,8 @@ files:
|
|
167
167
|
- lib/rbtc_arbitrage/clients/client.rb.example
|
168
168
|
- lib/rbtc_arbitrage/clients/coinbase_client.rb
|
169
169
|
- lib/rbtc_arbitrage/trader.rb
|
170
|
+
- lib/rbtc_arbitrage/trader/logger.rb
|
171
|
+
- lib/rbtc_arbitrage/trader/notifier.rb
|
170
172
|
- lib/rbtc_arbitrage/version.rb
|
171
173
|
- rbtc_arbitrage.gemspec
|
172
174
|
- spec/cli_spec.rb
|