mt_gox 0.7.6 → 0.7.7
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +4 -0
- data/VERSION +1 -1
- data/lib/mtgox/client.rb +14 -4
- data/lib/mtgox/models/depth.rb +7 -3
- data/lib/mtgox/models/multi_ticker.rb +6 -0
- data/lib/mtgox/models/ticker.rb +2 -0
- data/spec/fixtures/multi-ticker.json +1 -0
- data/spec/fixtures/ticker.json +1 -1
- data/spec/mtgox/client_spec.rb +80 -55
- metadata +3 -1
data/HISTORY
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.7
|
data/lib/mtgox/client.rb
CHANGED
@@ -10,6 +10,8 @@ module MtGox
|
|
10
10
|
|
11
11
|
ORDER_TYPES = {:sell => 1, :buy => 2}
|
12
12
|
|
13
|
+
@@ticker = {}
|
14
|
+
|
13
15
|
# Fetch a deposit address
|
14
16
|
# @authenticated true
|
15
17
|
# @return [String]
|
@@ -26,10 +28,18 @@ module MtGox
|
|
26
28
|
# @return [MtGox::Ticker]
|
27
29
|
# @example
|
28
30
|
# MtGox.ticker
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
# MtGox.ticker('EUR')
|
32
|
+
def ticker(currency=nil)
|
33
|
+
if currency
|
34
|
+
ticker = get("/api/1/BTC#{currency}/public/ticker")['return']
|
35
|
+
@@ticker[currency] ||= MultiTicker.new :currency => currency
|
36
|
+
@@ticker[currency].set_attributes ticker
|
37
|
+
@@ticker[currency]
|
38
|
+
else
|
39
|
+
ticker = get('/api/0/data/ticker.php')['ticker']
|
40
|
+
Ticker.instance.set_attributes ticker
|
41
|
+
Ticker.instance
|
42
|
+
end
|
33
43
|
end
|
34
44
|
|
35
45
|
# Fetch both bids and asks in one call, for network efficiency
|
data/lib/mtgox/models/depth.rb
CHANGED
@@ -3,9 +3,7 @@ require 'mtgox/models/model'
|
|
3
3
|
module MtGox
|
4
4
|
module Models
|
5
5
|
class Depth < Model
|
6
|
-
prop :
|
7
|
-
:sell,
|
8
|
-
:currency,
|
6
|
+
prop :currency,
|
9
7
|
:item,
|
10
8
|
[:vol, :volume] => :f,
|
11
9
|
:volume_int => :i,
|
@@ -14,6 +12,12 @@ module MtGox
|
|
14
12
|
:price_int => :i,
|
15
13
|
[:id, :now] => :i,
|
16
14
|
[:type, :type_str] => proc {|val| val == 1 || val == 'bid' ? :bid : :ask}
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"<Depth: vol change #{ vol.round(2) } at #{ price.round(3) }"+
|
18
|
+
"(#{type}) #{currency}/#{item} >"
|
19
|
+
end
|
20
|
+
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
@@ -18,6 +18,12 @@ module MtGox
|
|
18
18
|
:low => proc { |val| val['value'].to_f },
|
19
19
|
:avg => proc { |val| val['value'].to_f },
|
20
20
|
:vwap => proc { |val| val['value'].to_f }
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
"<MultiTicker: #{currency} vol #{ vol.round(2) } last #{ last.round(3) }"+
|
24
|
+
" buy #{ buy.round(3) } sell #{ sell.round(3) } low #{ low.round(3) }"+
|
25
|
+
" high #{ high.round(3) } avg #{ avg.round(3) } vwap #{ vwap.round(3) } >"
|
26
|
+
end
|
21
27
|
end
|
22
28
|
end
|
23
29
|
end
|
data/lib/mtgox/models/ticker.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
{"result":"success", "return":{"high":{"value":"5.50000", "value_int":"550000", "display":"5.50000��", "currency":"EUR"}, "low":{"value":"5.12541", "value_int":"512541", "display":"5.12541��", "currency":"EUR"}, "avg":{"value":"5.31551", "value_int":"531551", "display":"5.31551��", "currency":"EUR"}, "vwap":{"value":"5.29709", "value_int":"529709", "display":"5.29709��", "currency":"EUR"}, "vol":{"value":"1277.68857150", "value_int":"127768857150", "display":"1,277.68857150�BTC", "currency":"BTC"}, "last_local":{"value":"5.34000", "value_int":"534000", "display":"5.34000��", "currency":"EUR"}, "last":{"value":"5.34000", "value_int":"534000", "display":"5.34000��", "currency":"EUR"}, "last_orig":{"value":"6.65001", "value_int":"665001", "display":"$6.65001", "currency":"USD"}, "last_all":{"value":"5.24904", "value_int":"524904", "display":"5.24904��", "currency":"EUR"}, "buy":{"value":"5.34000", "value_int":"534000", "display":"5.34000��", "currency":"EUR"}, "sell":{"value":"5.35000", "value_int":"535000", "display":"5.35000��", "currency":"EUR"}}}
|
data/spec/fixtures/ticker.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"ticker":{"high":
|
1
|
+
{"ticker":{"high":6.95, "low":6.4501, "avg":6.691234882, "vwap":6.668617425, "vol":113312, "last_all":6.69, "last_local":6.69, "last":6.69, "buy":6.6809, "sell":6.69803}}
|
data/spec/mtgox/client_spec.rb
CHANGED
@@ -12,48 +12,73 @@ describe MtGox::Client do
|
|
12
12
|
describe '#address' do
|
13
13
|
before do
|
14
14
|
stub_post('/api/0/btcAddress.php').
|
15
|
-
|
15
|
+
to_return(:status => 200, :body => fixture('address.json'))
|
16
16
|
end
|
17
17
|
|
18
18
|
it "should fetch a deposit address" do
|
19
19
|
address = @client.address
|
20
20
|
a_post('/api/0/btcAddress.php').
|
21
|
-
|
21
|
+
should have_been_made
|
22
22
|
address.should == '171dH9Uum6wWLSwH2g8g2yto6SG7NEGyXG'
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
describe '#ticker' do
|
27
27
|
before do
|
28
|
+
#WebMock.allow_net_connect!
|
28
29
|
stub_get('/api/0/data/ticker.php').
|
29
|
-
|
30
|
+
to_return(:status => 200, :body => fixture('ticker.json'))
|
31
|
+
stub_get('/api/1/BTCEUR/public/ticker').
|
32
|
+
to_return(:status => 200, :body => fixture('multi-ticker.json'))
|
30
33
|
end
|
31
34
|
|
32
35
|
it "should fetch the ticker" do
|
33
36
|
ticker = @client.ticker
|
34
37
|
a_get('/api/0/data/ticker.php').
|
35
|
-
|
36
|
-
ticker.buy.should
|
37
|
-
ticker.sell.should ==
|
38
|
-
ticker.high.should ==
|
39
|
-
ticker.low.should
|
40
|
-
ticker.price.should ==
|
41
|
-
ticker.
|
42
|
-
ticker.
|
38
|
+
should have_been_made
|
39
|
+
ticker.buy.should == 6.6809
|
40
|
+
ticker.sell.should == 6.69803
|
41
|
+
ticker.high.should == 6.95
|
42
|
+
ticker.low.should == 6.4501
|
43
|
+
ticker.price.should == 6.69
|
44
|
+
ticker.last_all.should == 6.69
|
45
|
+
ticker.last_local.should == 6.69
|
46
|
+
ticker.volume.should == 113312
|
47
|
+
ticker.avg.should == 6.691234882
|
48
|
+
ticker.vwap.should == 6.668617425
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should fetch the multi-currency ticker" do
|
52
|
+
ticker = @client.ticker('EUR')
|
53
|
+
a_get('/api/1/BTCEUR/public/ticker').
|
54
|
+
should have_been_made
|
55
|
+
ticker.buy.should == 5.340
|
56
|
+
ticker.sell.should == 5.350
|
57
|
+
ticker.high.should == 5.500
|
58
|
+
ticker.low.should == 5.12541
|
59
|
+
ticker.price.should == 5.340
|
60
|
+
ticker.last.should == 5.340
|
61
|
+
ticker.last_local.should == 5.340
|
62
|
+
ticker.last_orig.should == 6.65001 # "currency":"USD"
|
63
|
+
ticker.last_all.should == 5.24904 # ?
|
64
|
+
ticker.volume.should == 1277.68857150
|
65
|
+
ticker.avg.should == 5.31551
|
66
|
+
ticker.vwap.should == 5.29709
|
67
|
+
ticker.currency.should == 'EUR'
|
43
68
|
end
|
44
69
|
end
|
45
70
|
|
46
71
|
describe 'depth methods' do
|
47
72
|
before :each do
|
48
73
|
stub_get('/api/0/data/getDepth.php').
|
49
|
-
|
74
|
+
to_return(:status => 200, :body => fixture('depth.json'))
|
50
75
|
end
|
51
76
|
|
52
77
|
describe '#asks' do
|
53
78
|
it "should fetch open asks" do
|
54
79
|
asks = @client.asks
|
55
80
|
a_get('/api/0/data/getDepth.php').
|
56
|
-
|
81
|
+
should have_been_made
|
57
82
|
asks.last.price.should == 23.75
|
58
83
|
asks.last.eprice.should == 23.905385002516354
|
59
84
|
asks.last.amount.should == 50
|
@@ -61,7 +86,7 @@ describe MtGox::Client do
|
|
61
86
|
|
62
87
|
it "should be sorted in price-ascending order" do
|
63
88
|
asks = @client.asks
|
64
|
-
asks.sort_by{|ask| ask.price}.should == asks
|
89
|
+
asks.sort_by { |ask| ask.price }.should == asks
|
65
90
|
end
|
66
91
|
|
67
92
|
end
|
@@ -70,7 +95,7 @@ describe MtGox::Client do
|
|
70
95
|
it "should fetch open bids" do
|
71
96
|
bids = @client.bids
|
72
97
|
a_get('/api/0/data/getDepth.php').
|
73
|
-
|
98
|
+
should have_been_made
|
74
99
|
bids.last.price.should == 14.62101
|
75
100
|
bids.last.eprice.should == 14.525973435000001
|
76
101
|
bids.last.amount.should == 5
|
@@ -78,7 +103,7 @@ describe MtGox::Client do
|
|
78
103
|
|
79
104
|
it "should be sorted in price-descending order" do
|
80
105
|
bids = @client.bids
|
81
|
-
bids.sort_by{|bid| bid.price}.reverse.should == bids
|
106
|
+
bids.sort_by { |bid| bid.price }.reverse.should == bids
|
82
107
|
end
|
83
108
|
end
|
84
109
|
|
@@ -86,7 +111,7 @@ describe MtGox::Client do
|
|
86
111
|
it "should fetch both bids and asks, with only one call" do
|
87
112
|
offers = @client.offers
|
88
113
|
a_get('/api/0/data/getDepth.php').
|
89
|
-
|
114
|
+
should have_been_made.once
|
90
115
|
offers[:asks].last.price.should == 23.75
|
91
116
|
offers[:asks].last.eprice.should == 23.905385002516354
|
92
117
|
offers[:asks].last.amount.should == 50
|
@@ -100,7 +125,7 @@ describe MtGox::Client do
|
|
100
125
|
it "should fetch the lowest priced ask" do
|
101
126
|
min_ask = @client.min_ask
|
102
127
|
a_get('/api/0/data/getDepth.php').
|
103
|
-
|
128
|
+
should have_been_made.once
|
104
129
|
min_ask.price.should == 17.00009
|
105
130
|
min_ask.eprice.should == 17.11131353799698
|
106
131
|
min_ask.amount.should == 36.22894353
|
@@ -111,7 +136,7 @@ describe MtGox::Client do
|
|
111
136
|
it "should fetch the highest priced bid" do
|
112
137
|
max_bid = @client.max_bid
|
113
138
|
a_get('/api/0/data/getDepth.php').
|
114
|
-
|
139
|
+
should have_been_made.once
|
115
140
|
max_bid.price.should == 17.0
|
116
141
|
max_bid.eprice.should == 16.8895
|
117
142
|
max_bid.amount.should == 82.53875035
|
@@ -123,13 +148,13 @@ describe MtGox::Client do
|
|
123
148
|
describe '#trades' do
|
124
149
|
before do
|
125
150
|
stub_get('/api/0/data/getTrades.php').
|
126
|
-
|
151
|
+
to_return(:status => 200, :body => fixture('trades.json'))
|
127
152
|
end
|
128
153
|
|
129
154
|
it "should fetch trades" do
|
130
155
|
trades = @client.trades
|
131
156
|
a_get('/api/0/data/getTrades.php').
|
132
|
-
|
157
|
+
should have_been_made
|
133
158
|
trades.last.date.should == Time.utc(2011, 6, 27, 18, 28, 8)
|
134
159
|
trades.last.price.should == 17.00009
|
135
160
|
trades.last.amount.should == 0.5
|
@@ -140,15 +165,15 @@ describe MtGox::Client do
|
|
140
165
|
describe '#balance' do
|
141
166
|
before do
|
142
167
|
stub_post('/api/0/getFunds.php').
|
143
|
-
|
144
|
-
|
168
|
+
with(:body => test_body, :headers => test_headers).
|
169
|
+
to_return(:status => 200, :body => fixture('balance.json'))
|
145
170
|
end
|
146
171
|
|
147
172
|
it "should fetch balance" do
|
148
173
|
balance = @client.balance
|
149
174
|
a_post("/api/0/getFunds.php").
|
150
|
-
|
151
|
-
|
175
|
+
with(:body => test_body, :headers => test_headers).
|
176
|
+
should have_been_made
|
152
177
|
balance.first.currency.should == "BTC"
|
153
178
|
balance.first.amount.should == 22.0
|
154
179
|
balance.last.currency.should == "USD"
|
@@ -159,16 +184,16 @@ describe MtGox::Client do
|
|
159
184
|
describe "order methods" do
|
160
185
|
before :each do
|
161
186
|
stub_post('/api/0/getOrders.php').
|
162
|
-
|
163
|
-
|
187
|
+
with(:body => test_body, :headers => test_headers).
|
188
|
+
to_return(:status => 200, :body => fixture('orders.json'))
|
164
189
|
end
|
165
190
|
|
166
191
|
describe "#buys" do
|
167
192
|
it "should fetch orders" do
|
168
193
|
buys = @client.buys
|
169
194
|
a_post("/api/0/getOrders.php").
|
170
|
-
|
171
|
-
|
195
|
+
with(:body => test_body, :headers => test_headers).
|
196
|
+
should have_been_made
|
172
197
|
buys.last.price.should == 7
|
173
198
|
buys.last.date.should == Time.utc(2011, 6, 27, 18, 20, 38)
|
174
199
|
end
|
@@ -178,8 +203,8 @@ describe MtGox::Client do
|
|
178
203
|
it "should fetch sells" do
|
179
204
|
sells = @client.sells
|
180
205
|
a_post("/api/0/getOrders.php").
|
181
|
-
|
182
|
-
|
206
|
+
with(:body => test_body, :headers => test_headers).
|
207
|
+
should have_been_made
|
183
208
|
sells.last.price.should == 99.0
|
184
209
|
sells.last.date.should == Time.utc(2011, 6, 27, 18, 20, 20)
|
185
210
|
end
|
@@ -189,8 +214,8 @@ describe MtGox::Client do
|
|
189
214
|
it "should fetch both buys and sells, with only one call" do
|
190
215
|
orders = @client.orders
|
191
216
|
a_post("/api/0/getOrders.php").
|
192
|
-
|
193
|
-
|
217
|
+
with(:body => test_body, :headers => test_headers).
|
218
|
+
should have_been_made
|
194
219
|
orders[:buys].last.price.should == 7.0
|
195
220
|
orders[:buys].last.date.should == Time.utc(2011, 6, 27, 18, 20, 38)
|
196
221
|
orders[:sells].last.price.should == 99.0
|
@@ -203,16 +228,16 @@ describe MtGox::Client do
|
|
203
228
|
before do
|
204
229
|
body = test_body({"amount" => "0.88", "price" => "0.89"})
|
205
230
|
stub_post('/api/0/buyBTC.php').
|
206
|
-
|
207
|
-
|
231
|
+
with(:body => body, :headers => test_headers(body)).
|
232
|
+
to_return(:status => 200, :body => fixture('buy.json'))
|
208
233
|
end
|
209
234
|
|
210
235
|
it "should place a bid" do
|
211
236
|
buy = @client.buy!(0.88, 0.89)
|
212
237
|
body = test_body({"amount" => "0.88", "price" => "0.89"})
|
213
238
|
a_post("/api/0/buyBTC.php").
|
214
|
-
|
215
|
-
|
239
|
+
with(:body => body, :headers => test_headers(body)).
|
240
|
+
should have_been_made
|
216
241
|
buy[:buys].last.price.should == 2.0
|
217
242
|
buy[:buys].last.date.should == Time.utc(2011, 6, 27, 18, 26, 21)
|
218
243
|
buy[:sells].last.price.should == 99.0
|
@@ -224,16 +249,16 @@ describe MtGox::Client do
|
|
224
249
|
before do
|
225
250
|
body = test_body({"amount" => "0.88", "price" => "89.0"})
|
226
251
|
stub_post('/api/0/sellBTC.php').
|
227
|
-
|
228
|
-
|
252
|
+
with(:body => body, :headers => test_headers(body)).
|
253
|
+
to_return(:status => 200, :body => fixture('sell.json'))
|
229
254
|
end
|
230
255
|
|
231
256
|
it "should place an ask" do
|
232
257
|
body = test_body({"amount" => "0.88", "price" => "89.0"})
|
233
258
|
sell = @client.sell!(0.88, 89.0)
|
234
259
|
a_post("/api/0/sellBTC.php").
|
235
|
-
|
236
|
-
|
260
|
+
with(:body => body, :headers => test_headers(body)).
|
261
|
+
should have_been_made
|
237
262
|
sell[:buys].last.price.should == 2.0
|
238
263
|
sell[:buys].last.date.should == Time.utc(2011, 6, 27, 18, 26, 21)
|
239
264
|
sell[:sells].last.price.should == 200
|
@@ -245,11 +270,11 @@ describe MtGox::Client do
|
|
245
270
|
before do
|
246
271
|
cancel_body = test_body({"oid" => "bddd042c-e837-4a88-a92e-3b7c05e483df", "type" => "2"})
|
247
272
|
stub_post('/api/0/getOrders.php').
|
248
|
-
|
249
|
-
|
273
|
+
with(:body => test_body, :headers => test_headers).
|
274
|
+
to_return(:status => 200, :body => fixture('orders.json'))
|
250
275
|
stub_post('/api/0/cancelOrder.php').
|
251
|
-
|
252
|
-
|
276
|
+
with(:body => cancel_body, :headers => test_headers(cancel_body)).
|
277
|
+
to_return(:status => 200, :body => fixture('cancel.json'))
|
253
278
|
end
|
254
279
|
|
255
280
|
context "with a valid oid passed" do
|
@@ -257,11 +282,11 @@ describe MtGox::Client do
|
|
257
282
|
cancel = @client.cancel("bddd042c-e837-4a88-a92e-3b7c05e483df")
|
258
283
|
cancel_body = test_body({"oid" => "bddd042c-e837-4a88-a92e-3b7c05e483df", "type" => "2"})
|
259
284
|
a_post("/api/0/getOrders.php").
|
260
|
-
|
261
|
-
|
285
|
+
with(:body => test_body, :headers => test_headers).
|
286
|
+
should have_been_made.once
|
262
287
|
a_post('/api/0/cancelOrder.php').
|
263
|
-
|
264
|
-
|
288
|
+
with(:body => cancel_body, :headers => test_headers(cancel_body)).
|
289
|
+
should have_been_made
|
265
290
|
cancel[:buys].last.price.should == 7.0
|
266
291
|
cancel[:buys].last.date.should == Time.utc(2011, 6, 27, 18, 20, 38)
|
267
292
|
cancel[:sells].last.price.should == 99.0
|
@@ -282,8 +307,8 @@ describe MtGox::Client do
|
|
282
307
|
cancel = @client.cancel({'oid' => "bddd042c-e837-4a88-a92e-3b7c05e483df", 'type' => 2})
|
283
308
|
body = test_body({"oid" => "bddd042c-e837-4a88-a92e-3b7c05e483df", "type" => "2"})
|
284
309
|
a_post('/api/0/cancelOrder.php').
|
285
|
-
|
286
|
-
|
310
|
+
with(:body => body, :headers => test_headers(body)).
|
311
|
+
should have_been_made
|
287
312
|
cancel[:buys].last.price.should == 7.0
|
288
313
|
cancel[:buys].last.date.should == Time.utc(2011, 6, 27, 18, 20, 38)
|
289
314
|
cancel[:sells].last.price.should == 99.0
|
@@ -296,16 +321,16 @@ describe MtGox::Client do
|
|
296
321
|
before do
|
297
322
|
body = test_body({"group1" => "BTC", "amount" => "1.0", "btca" => "1KxSo9bGBfPVFEtWNLpnUK1bfLNNT4q31L"})
|
298
323
|
stub_post('/api/0/withdraw.php').
|
299
|
-
|
300
|
-
|
324
|
+
with(:body => body, :headers => test_headers(body)).
|
325
|
+
to_return(:status => 200, :body => fixture('withdraw.json'))
|
301
326
|
end
|
302
327
|
|
303
328
|
it "should withdraw funds" do
|
304
329
|
withdraw = @client.withdraw!(1.0, "1KxSo9bGBfPVFEtWNLpnUK1bfLNNT4q31L")
|
305
330
|
body = test_body({"group1" => "BTC", "amount" => "1.0", "btca" => "1KxSo9bGBfPVFEtWNLpnUK1bfLNNT4q31L"})
|
306
331
|
a_post("/api/0/withdraw.php").
|
307
|
-
|
308
|
-
|
332
|
+
with(:body => body, :headers => test_headers(body)).
|
333
|
+
should have_been_made
|
309
334
|
withdraw.first.currency.should == "BTC"
|
310
335
|
withdraw.first.amount.should == 9.0
|
311
336
|
withdraw.last.currency.should == "USD"
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: mt_gox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.7.
|
5
|
+
version: 0.7.7
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Erik Michaels-Ober
|
@@ -177,6 +177,7 @@ files:
|
|
177
177
|
- spec/fixtures/error.json
|
178
178
|
- spec/fixtures/io-depth.json
|
179
179
|
- spec/fixtures/io-ticker.json
|
180
|
+
- spec/fixtures/multi-ticker.json
|
180
181
|
- spec/fixtures/mysql_error
|
181
182
|
- spec/fixtures/orders.json
|
182
183
|
- spec/fixtures/sell.json
|
@@ -230,6 +231,7 @@ test_files:
|
|
230
231
|
- spec/fixtures/error.json
|
231
232
|
- spec/fixtures/io-depth.json
|
232
233
|
- spec/fixtures/io-ticker.json
|
234
|
+
- spec/fixtures/multi-ticker.json
|
233
235
|
- spec/fixtures/mysql_error
|
234
236
|
- spec/fixtures/orders.json
|
235
237
|
- spec/fixtures/sell.json
|