rbtc_arbitrage 1.3.0 → 1.4.0
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/.travis.yml +3 -0
- data/Gemfile.lock +12 -1
- data/bin/rbtc +1 -0
- data/lib/rbtc_arbitrage/cli.rb +1 -0
- data/lib/rbtc_arbitrage/trader.rb +57 -0
- data/lib/rbtc_arbitrage/version.rb +1 -1
- data/lib/rbtc_arbitrage.rb +1 -0
- data/rbtc_arbitrage.gemspec +1 -0
- data/spec/trader_spec.rb +91 -0
- metadata +16 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 35a3e079318e368f33db37bb070cef7acd9dc3d5
|
|
4
|
+
data.tar.gz: 23327807ba84e9d20b99e170d25b4088c64b7587
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8dbab32dba09e0ae422ca3ecc5bfe20dba8f5e76de1af1efaa0c8f8a537151d78fd6345472bd737288f623f088834915acffdd7e44f4872cf4dc6aaf54d09fbd
|
|
7
|
+
data.tar.gz: cb577476f076d7f1285cff313bd80dac03f077b8ec53a973df02aa0605ff071d406c8f8c5988d7bf0dbd817264a8d26105ebe535a2a52f4cfaf43c9b958d9839
|
data/.travis.yml
CHANGED
|
@@ -19,3 +19,6 @@ env:
|
|
|
19
19
|
- secure: IFyJX6lAmBpef0I50UPCy6L5IRxqRKoPhv74s5y0FPB4chrir7iMZ7Sd1IczxV7ly4Dt7hdALHP1qMTmkcGmTV6YOzwR46G4JAwWtX2xlf4OYk4jey7qjNsS6iijD6dvdYjqSKUuGaX3Til3kUOLcA3hhINvHxj5unv2pHB2W70=
|
|
20
20
|
- secure: YiYtCBJNfgWuzQ059RMmZxM00bs4c/GuqaEaKufLPPByJHHt3z4jCNT5lurox/RIqSYTv+1Nvgor1xJZF4VPDIhtoCpVRe3g5Pvubrp4gWQry11ta0f1JhPSrm5ORlF1hpHPfzHHSh+/YVmKcO8agQAaIgfKcXDzsE6j5QqiGWQ=
|
|
21
21
|
- secure: TCrSkWTG2A7ZHxU/J82R1oRn3+ISYHOZmukvBT/OkOh35yjhtig3KhroYki67guCClVxov+ZPvCRUKgmsEoVng1ljk/ZXyyNf4QNVccEJxHCwIRiqs36jlC2ebd8g+JJUPrnnWGO/U5vBm+WlrOb4lFlIsBuCYI+FBAFYTPmKEs=
|
|
22
|
+
- secure: cePvBAt6j7UwybsP6Cs5a7mwaXMHDteXC1ENsNMy69qV5mae7oRKqsfavZ8ar33apNXqALXDWiDnHH7wPccMl3GXIquHE7I73lAOcEu4V+f7nHqqFuJezA12IL0swOQhDNK23C5ibkFftlpG2jTxHpaRLaDNCuv404cREalwwgA=
|
|
23
|
+
- secure: PLTV2N3BYlqXmDDuOuZGk83YApX3oEIpskkWHUGj8f3wBpjOSPxuLBdpSGMXRqT2kIMJqle65gqlYpwh4NcTgqL93iNAT9fh7WDyNx/SUL+Mz04kphAC6N0VPyg7nvTi33bDbkmAAFNc+1yoWKAlB2gjKKXFtdxTwMp4SjvNsfs=
|
|
24
|
+
- secure: nyFUNdswDOM0UgW3T/jeEvIyZPSGq+ZEpyYw6KGpwb7a5F1DbAfoSy6zJGWK6S3vKf6814e43HmawhJlhcD9KYOV783O7KYu54FTmhZ/SP9QhNV+w1hiKKRQcTlJdjbPIuO5piuMDMCPacCJa+C9YO0lhhxfZ+/6F4SNR1fteN0=
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
rbtc_arbitrage (1.
|
|
4
|
+
rbtc_arbitrage (1.4.0)
|
|
5
5
|
activemodel (>= 3.1)
|
|
6
6
|
activesupport (>= 3.1)
|
|
7
7
|
bitstamp
|
|
@@ -9,6 +9,7 @@ PATH
|
|
|
9
9
|
btce (= 0.2.4)
|
|
10
10
|
coinbase (= 1.2.4)
|
|
11
11
|
mtgox
|
|
12
|
+
pony
|
|
12
13
|
thor
|
|
13
14
|
|
|
14
15
|
GEM
|
|
@@ -78,6 +79,10 @@ GEM
|
|
|
78
79
|
rb-fsevent (>= 0.9.3)
|
|
79
80
|
rb-inotify (>= 0.9)
|
|
80
81
|
lumberjack (1.0.4)
|
|
82
|
+
mail (2.2.7)
|
|
83
|
+
activesupport (>= 2.3.6)
|
|
84
|
+
mime-types
|
|
85
|
+
treetop (>= 1.4.5)
|
|
81
86
|
method_source (0.8.2)
|
|
82
87
|
mime-types (2.0)
|
|
83
88
|
minitest (4.7.5)
|
|
@@ -91,6 +96,9 @@ GEM
|
|
|
91
96
|
multi_json (1.8.2)
|
|
92
97
|
multi_xml (0.5.5)
|
|
93
98
|
multipart-post (1.2.0)
|
|
99
|
+
polyglot (0.3.3)
|
|
100
|
+
pony (1.6.2)
|
|
101
|
+
mail (>= 2.0)
|
|
94
102
|
pry (0.9.12.4)
|
|
95
103
|
coderay (~> 1.0)
|
|
96
104
|
method_source (~> 0.8)
|
|
@@ -137,6 +145,9 @@ GEM
|
|
|
137
145
|
tilt (1.4.1)
|
|
138
146
|
timers (1.1.0)
|
|
139
147
|
tins (0.13.1)
|
|
148
|
+
treetop (1.4.15)
|
|
149
|
+
polyglot
|
|
150
|
+
polyglot (>= 0.3.1)
|
|
140
151
|
tzinfo (0.3.38)
|
|
141
152
|
vcr (2.8.0)
|
|
142
153
|
webmock (1.16.1)
|
data/bin/rbtc
CHANGED
data/lib/rbtc_arbitrage/cli.rb
CHANGED
|
@@ -9,6 +9,7 @@ module RbtcArbitrage
|
|
|
9
9
|
option :buyer, type: :string, default: "bitstamp"
|
|
10
10
|
option :seller, type: :string, default: "mtgox"
|
|
11
11
|
option :repeat, type: :numeric, default: nil
|
|
12
|
+
option :notify, type: :boolean, default: false
|
|
12
13
|
def trade
|
|
13
14
|
RbtcArbitrage::Trader.new(options).trade
|
|
14
15
|
end
|
|
@@ -17,6 +17,7 @@ module RbtcArbitrage
|
|
|
17
17
|
set_key opts, :verbose, true
|
|
18
18
|
set_key opts, :live, false
|
|
19
19
|
set_key opts, :repeat, nil
|
|
20
|
+
set_key opts, :notify, false
|
|
20
21
|
exchange = opts[:buyer] || :bitstamp
|
|
21
22
|
@buy_client = client_for_exchange(exchange)
|
|
22
23
|
exchange = opts[:seller] || :mtgox
|
|
@@ -38,9 +39,12 @@ module RbtcArbitrage
|
|
|
38
39
|
|
|
39
40
|
execute_trade if options[:live]
|
|
40
41
|
|
|
42
|
+
notify
|
|
43
|
+
|
|
41
44
|
if @options[:repeat]
|
|
42
45
|
trade_again
|
|
43
46
|
end
|
|
47
|
+
|
|
44
48
|
self
|
|
45
49
|
end
|
|
46
50
|
|
|
@@ -104,6 +108,15 @@ module RbtcArbitrage
|
|
|
104
108
|
[@sell_client, @buy_client].each do |client|
|
|
105
109
|
client.validate_env
|
|
106
110
|
end
|
|
111
|
+
if options[:notify]
|
|
112
|
+
["PASSWORD","USERNAME","EMAIL"].each do |key|
|
|
113
|
+
key = "SENDGRID_#{key}"
|
|
114
|
+
unless ENV[key]
|
|
115
|
+
raise ArgumentError, "Exiting because missing required ENV variable $#{key}."
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
setup_pony
|
|
119
|
+
end
|
|
107
120
|
end
|
|
108
121
|
|
|
109
122
|
def client_for_exchange market
|
|
@@ -119,5 +132,49 @@ module RbtcArbitrage
|
|
|
119
132
|
raise ArgumentError, "Invalid exchange - '#{market}'"
|
|
120
133
|
end
|
|
121
134
|
end
|
|
135
|
+
|
|
136
|
+
def notify
|
|
137
|
+
return false unless options[:notify]
|
|
138
|
+
return false unless @percent > options[:cutoff]
|
|
139
|
+
setup_pony
|
|
140
|
+
|
|
141
|
+
options[:logger].info "Sending email to #{ENV['SENDGRID_EMAIL']}"
|
|
142
|
+
Pony.mail({
|
|
143
|
+
body: notification,
|
|
144
|
+
to: ENV['SENDGRID_EMAIL'],
|
|
145
|
+
})
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def setup_pony
|
|
149
|
+
Pony.options = {
|
|
150
|
+
from: "info@uludum.org",
|
|
151
|
+
subject: "rbtc_arbitrage notification",
|
|
152
|
+
via: :smtp,
|
|
153
|
+
via_options: {
|
|
154
|
+
address: 'smtp.sendgrid.net',
|
|
155
|
+
port: '587',
|
|
156
|
+
domain: 'heroku.com',
|
|
157
|
+
user_name: ENV['SENDGRID_USERNAME'],
|
|
158
|
+
password: ENV['SENDGRID_PASSWORD'],
|
|
159
|
+
authentication: :plain,
|
|
160
|
+
enable_starttls_auto: true
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def notification
|
|
166
|
+
lower_ex = @buy_client.exchange.to_s.capitalize
|
|
167
|
+
higher_ex = @sell_client.exchange.to_s.capitalize
|
|
168
|
+
<<-eos
|
|
169
|
+
Update from your friendly rbtc_arbitrage trader:
|
|
170
|
+
#{lower_ex}: $#{buyer[:price].round(2)}
|
|
171
|
+
#{higher_ex}: $#{seller[:price].round(2)}
|
|
172
|
+
buying #{@options[:volume]} btc from #{lower_ex} for $#{@paid.round(2)}
|
|
173
|
+
selling #{@options[:volume]} btc on #{higher_ex} for $#{@received.round(2)}
|
|
174
|
+
profit: $#{(@received - @paid).round(2)} (#{@percent.round(2)}%)
|
|
175
|
+
|
|
176
|
+
options
|
|
177
|
+
eos
|
|
178
|
+
end
|
|
122
179
|
end
|
|
123
180
|
end
|
data/lib/rbtc_arbitrage.rb
CHANGED
data/rbtc_arbitrage.gemspec
CHANGED
data/spec/trader_spec.rb
CHANGED
|
@@ -37,6 +37,20 @@ describe RbtcArbitrage::Trader do
|
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
|
+
|
|
41
|
+
["PASSWORD","USERNAME","EMAIL"].each do |key|
|
|
42
|
+
key = "SENDGRID_#{key}"
|
|
43
|
+
it "should raise if --notify and not ENV[#{key}]" do
|
|
44
|
+
trader.sell_client.stub(:validate_env)
|
|
45
|
+
trader.buy_client.stub(:validate_env)
|
|
46
|
+
old_val = ENV[key]
|
|
47
|
+
ENV[key] = nil
|
|
48
|
+
trader.options[:notify] = true
|
|
49
|
+
expect { trader.validate_env }.to raise_error(ArgumentError)
|
|
50
|
+
trader.options[:notify] = false
|
|
51
|
+
expect { trader.validate_env }.not_to raise_error
|
|
52
|
+
end
|
|
53
|
+
end
|
|
40
54
|
end
|
|
41
55
|
|
|
42
56
|
describe "#fetch_prices" do
|
|
@@ -71,6 +85,7 @@ describe RbtcArbitrage::Trader do
|
|
|
71
85
|
live: true,
|
|
72
86
|
seller: :bitstamp,
|
|
73
87
|
buyer: :mtgox,
|
|
88
|
+
notify: true,
|
|
74
89
|
}
|
|
75
90
|
}
|
|
76
91
|
|
|
@@ -142,6 +157,7 @@ describe RbtcArbitrage::Trader do
|
|
|
142
157
|
describe "#trade" do
|
|
143
158
|
it "calls the right methods" do
|
|
144
159
|
trader.should_receive(:fetch_prices)
|
|
160
|
+
trader.should_receive(:notify)
|
|
145
161
|
trader.should_not_receive(:log_info)
|
|
146
162
|
trader.should_not_receive(:execute_trade)
|
|
147
163
|
|
|
@@ -225,4 +241,79 @@ describe RbtcArbitrage::Trader do
|
|
|
225
241
|
end
|
|
226
242
|
end
|
|
227
243
|
|
|
244
|
+
describe "#notify" do
|
|
245
|
+
it "returns false when notify == false" do
|
|
246
|
+
trader.notify.should == false
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
it "returns false unless cutoff < percent" do
|
|
250
|
+
trader.options[:notify] = true
|
|
251
|
+
trader.instance_variable_set :@percent, 1
|
|
252
|
+
trader.notify.should == false
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
it "calls Sendgrid when notify == true" do
|
|
256
|
+
trader.options[:notify] = true
|
|
257
|
+
trader.instance_variable_set :@percent, 3
|
|
258
|
+
trader.instance_variable_set :@paid, 5
|
|
259
|
+
trader.instance_variable_set :@received, 6
|
|
260
|
+
trader.buyer[:price] = 1
|
|
261
|
+
trader.seller[:price] = 1
|
|
262
|
+
|
|
263
|
+
trader.options[:logger].should_receive(:info)
|
|
264
|
+
Pony.should_receive(:mail).with({
|
|
265
|
+
to: ENV['SENDGRID_EMAIL'],
|
|
266
|
+
body: trader.notification,
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
trader.notify
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
describe "#setup_pony" do
|
|
274
|
+
it "gets called on validation when --notify" do
|
|
275
|
+
["PASSWORD","USERNAME","EMAIL"].each do |key|
|
|
276
|
+
key = "SENDGRID_#{key}"
|
|
277
|
+
ENV[key] ||= "something"
|
|
278
|
+
end
|
|
279
|
+
trader.options[:notify] = true
|
|
280
|
+
trader.should_receive(:setup_pony).once
|
|
281
|
+
trader.validate_env
|
|
282
|
+
end
|
|
283
|
+
it "sets up pony correctly" do
|
|
284
|
+
opts = {
|
|
285
|
+
from: "info@uludum.org",
|
|
286
|
+
subject: "rbtc_arbitrage notification",
|
|
287
|
+
:via => :smtp,
|
|
288
|
+
:via_options => {
|
|
289
|
+
:address => 'smtp.sendgrid.net',
|
|
290
|
+
:port => '587',
|
|
291
|
+
:domain => 'heroku.com',
|
|
292
|
+
:user_name => ENV['SENDGRID_USERNAME'],
|
|
293
|
+
:password => ENV['SENDGRID_PASSWORD'],
|
|
294
|
+
:authentication => :plain,
|
|
295
|
+
:enable_starttls_auto => true
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
Pony.should_receive(:options=).with(opts)
|
|
299
|
+
trader.setup_pony
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
describe "#notification" do
|
|
304
|
+
it "includes the right values" do
|
|
305
|
+
trader.instance_variable_set :@percent, 3
|
|
306
|
+
trader.instance_variable_set :@paid, 5
|
|
307
|
+
trader.instance_variable_set :@received, 8
|
|
308
|
+
trader.buyer[:price] = 1.00453
|
|
309
|
+
trader.seller[:price] = 3.50453
|
|
310
|
+
|
|
311
|
+
value = trader.notification
|
|
312
|
+
value.should include("$1.0")
|
|
313
|
+
value.should include("$3.5")
|
|
314
|
+
value.should include("$3.0")
|
|
315
|
+
value.should include("3.0%")
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
228
319
|
end
|
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.
|
|
4
|
+
version: 1.4.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:
|
|
11
|
+
date: 2014-01-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -150,6 +150,20 @@ dependencies:
|
|
|
150
150
|
- - '='
|
|
151
151
|
- !ruby/object:Gem::Version
|
|
152
152
|
version: 1.2.4
|
|
153
|
+
- !ruby/object:Gem::Dependency
|
|
154
|
+
name: pony
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
156
|
+
requirements:
|
|
157
|
+
- - '>='
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
version: '0'
|
|
160
|
+
type: :runtime
|
|
161
|
+
prerelease: false
|
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - '>='
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: '0'
|
|
153
167
|
description: A gem for conducting arbitrage with Bitcoin.
|
|
154
168
|
email:
|
|
155
169
|
- hstove@gmail.com
|