cryptoexchange 0.20.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -1
  3. data/cryptoexchange.gemspec +4 -4
  4. data/lib/cryptoexchange/client.rb +3 -0
  5. data/lib/cryptoexchange/error.rb +6 -0
  6. data/lib/cryptoexchange/exchanges/anx/services/market.rb +4 -7
  7. data/lib/cryptoexchange/exchanges/bancor/market.rb +8 -0
  8. data/lib/cryptoexchange/exchanges/bancor/services/market.rb +36 -0
  9. data/lib/cryptoexchange/exchanges/bancor/services/pair.rb +24 -0
  10. data/lib/cryptoexchange/exchanges/bigone/market.rb +8 -0
  11. data/lib/cryptoexchange/exchanges/bigone/services/market.rb +49 -0
  12. data/lib/cryptoexchange/exchanges/bigone/services/order_book.rb +44 -0
  13. data/lib/cryptoexchange/exchanges/bigone/services/pairs.rb +23 -0
  14. data/lib/cryptoexchange/exchanges/bigone/services/trades.rb +32 -0
  15. data/lib/cryptoexchange/exchanges/bitflyer/services/market.rb +4 -5
  16. data/lib/cryptoexchange/exchanges/bittrex/services/market.rb +7 -0
  17. data/lib/cryptoexchange/exchanges/coinbene/market.rb +8 -0
  18. data/lib/cryptoexchange/exchanges/coinbene/services/market.rb +52 -0
  19. data/lib/cryptoexchange/exchanges/coinbene/services/order_book.rb +43 -0
  20. data/lib/cryptoexchange/exchanges/coinbene/services/pairs.rb +27 -0
  21. data/lib/cryptoexchange/exchanges/coinbene/services/trades.rb +32 -0
  22. data/lib/cryptoexchange/exchanges/cryptopia/services/market.rb +7 -0
  23. data/lib/cryptoexchange/exchanges/ethfinex/market.rb +8 -0
  24. data/lib/cryptoexchange/exchanges/ethfinex/services/market.rb +52 -0
  25. data/lib/cryptoexchange/exchanges/ethfinex/services/order_book.rb +52 -0
  26. data/lib/cryptoexchange/exchanges/ethfinex/services/pairs.rb +26 -0
  27. data/lib/cryptoexchange/exchanges/ethfinex/services/trades.rb +33 -0
  28. data/lib/cryptoexchange/exchanges/koinex/market.rb +8 -0
  29. data/lib/cryptoexchange/exchanges/koinex/services/market.rb +49 -0
  30. data/lib/cryptoexchange/exchanges/koinex/services/pairs.rb +26 -0
  31. data/lib/cryptoexchange/exchanges/liqui/services/market.rb +7 -0
  32. data/lib/cryptoexchange/exchanges/novaexchange/services/market.rb +7 -0
  33. data/lib/cryptoexchange/exchanges/radar_relay/market.rb +8 -0
  34. data/lib/cryptoexchange/exchanges/radar_relay/radar_relay.yml +409 -0
  35. data/lib/cryptoexchange/exchanges/radar_relay/services/market.rb +44 -0
  36. data/lib/cryptoexchange/exchanges/radar_relay/services/pairs.rb +22 -0
  37. data/lib/cryptoexchange/exchanges/trade_ogre/market.rb +8 -0
  38. data/lib/cryptoexchange/exchanges/trade_ogre/services/market.rb +48 -0
  39. data/lib/cryptoexchange/exchanges/trade_ogre/services/order_book.rb +46 -0
  40. data/lib/cryptoexchange/exchanges/trade_ogre/services/pairs.rb +25 -0
  41. data/lib/cryptoexchange/exchanges/trade_ogre/services/trades.rb +31 -0
  42. data/lib/cryptoexchange/exchanges/zb/market.rb +8 -0
  43. data/lib/cryptoexchange/exchanges/zb/services/market.rb +39 -0
  44. data/lib/cryptoexchange/exchanges/zb/services/order_book.rb +44 -0
  45. data/lib/cryptoexchange/exchanges/zb/services/pairs.rb +24 -0
  46. data/lib/cryptoexchange/exchanges/zb/services/trades.rb +32 -0
  47. data/lib/cryptoexchange/helpers/numeric_helper.rb +2 -0
  48. data/lib/cryptoexchange/services/market.rb +2 -0
  49. data/lib/cryptoexchange/services/pairs.rb +7 -1
  50. data/lib/cryptoexchange/version.rb +1 -1
  51. metadata +45 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f54e0fe4ad10dc783fbb17f51b123e1340a26df7
4
- data.tar.gz: db28b4cf0d169f52cede566a47a8ed4546acf62e
3
+ metadata.gz: 1c054b25d99833ec0d63d8ebc81eb3d8b2c2827b
4
+ data.tar.gz: 9221b11da94fd846c3860f169dc741c356298f72
5
5
  SHA512:
6
- metadata.gz: 8bac8dcf7d4e3c69532e02325fd9a1b568cdf73ffd85a031662d2b24bff334acb6be07a36be65684913728c06f0b3ac919ff75e913e7bd018d07d647ffbfd8cb
7
- data.tar.gz: acc44a0b78bd3aa84456602fb35bc0a29de002f3fc04a437522c0d75ef491f67337681df9c7072c46555a5b8ac3b07234ec83878fcb2441a15e7ce93146d4e56
6
+ metadata.gz: f3e4ef7744e1763799bbc363646fbad893c22a314d32d383e727119fc72ad1059264825beee26fbc03ff3c0aebc6f1a7d20166070e145478338d6b0e5098dcee
7
+ data.tar.gz: 72f18cfd2ab6805997dc9be5a2e1cdc2b69cbe8ea1436190334578c49d38e44f24e0160883b5fa8903bb3d61cc8cd796ffe6a28df5d55cb2d598ebfe945d0561
data/README.md CHANGED
@@ -28,7 +28,9 @@ Or install it yourself as:
28
28
  | ACX | Y | Y | Y | | Y |
29
29
  | Allcoin | Y | Y | | | User-Defined|
30
30
  | ANX | Y | | | | User-Defined|
31
+ | Bancor | Y | N | N | | Y |
31
32
  | Bibox | Y | Y | Y | | Y |
33
+ | BigONE | Y | Y | Y | | Y |
32
34
  | Bit-Z | Y | | | | Y |
33
35
  | Binance | Y | Y | | | Y |
34
36
  | Bitbay | Y | | | | User-Defined|
@@ -54,6 +56,7 @@ Or install it yourself as:
54
56
  | Cobinhood | Y | Y | | | Y |
55
57
  | Coincheck | Y | | | | User-Defined|
56
58
  | CoinExchange | Y | | | | Y |
59
+ | Coinbene | Y | Y | Y | | Y |
57
60
  | Coinmate | Y | Y | | | User-Defined|
58
61
  | Coinnest | Y | Y | Y | | User-Defined|
59
62
  | Coinone | Y | | | | Y |
@@ -62,6 +65,7 @@ Or install it yourself as:
62
65
  | CryptoBridge | Y | | | | Y |
63
66
  | Cryptopia | Y | Y | Y | | Y |
64
67
  | EtherDelta | Y | | | | Y |
68
+ | Ethfinex | Y | Y | Y | | Y |
65
69
  | Exmo | Y | Y | Y | | Y |
66
70
  | Gate | Y | Y | Y | | Y |
67
71
  | Gatecoin | Y | | | | Y |
@@ -73,6 +77,7 @@ Or install it yourself as:
73
77
  | Itbit | Y | | | | User-Defined|
74
78
  | KKex | Y | Y | Y | | Y |
75
79
  | Jubi | Y | | | | Y |
80
+ | Koinex | Y | | | | Y |
76
81
  | Korbit | Y | | | | User-Defined|
77
82
  | Kraken | Y | | | | Y |
78
83
  | Kucoin | Y | | | | Y |
@@ -93,19 +98,22 @@ Or install it yourself as:
93
98
  | Qryptos | Y | | | | Y |
94
99
  | QuadrigaCX | Y | | | | User-Defined|
95
100
  | Quoine | Y | | | | Y |
101
+ | RadarRelay | Y | | | | User-Defined|
96
102
  | Stocks Exchange | Y | | | | Y |
97
103
  | SZZC | Y | | | | Y |
98
104
  | The Rock Trading | Y | | | | Y |
99
105
  | Tidex | Y | | | | Y |
106
+ | TradeOgre | Y | Y | Y | | Y |
100
107
  | Trade Satoshi | Y | | | | Y |
101
108
  | TuxExchange | Y | | | | Y |
102
109
  | Unocoin | | | | | |
103
110
  | Viabtc | Y | | | | User-Defined|
104
- | Wex | Y | Y | Y | | Y |
111
+ | Wex | Y | Y | Y | | Y |
105
112
  | Yobit | Y | | | | Y |
106
113
  | Yuanbao | Y | | | | User-Defined|
107
114
  | Yunbi | Y | | | | Y |
108
115
  | Zaif | Y | Y | Y | | Y |
116
+ | ZB | Y | Y | Y | | Y |
109
117
 
110
118
  ## Usage
111
119
 
@@ -26,9 +26,9 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
27
  spec.add_development_dependency "pry"
28
28
  spec.add_development_dependency "rb-readline"
29
- spec.add_development_dependency "vcr", "~> 3.0.3"
30
- spec.add_development_dependency "webmock"
31
-
32
- spec.add_dependency "http", '~> 1.0.0'
29
+ spec.add_development_dependency "vcr", "~> 4.0.0"
30
+ spec.add_development_dependency "webmock", '~> 3.3.0'
31
+
32
+ spec.add_dependency "http", '~> 3.0.0'
33
33
  spec.add_dependency "lru_redux"
34
34
  end
@@ -26,6 +26,9 @@ module Cryptoexchange
26
26
  t.target.casecmp(market_pair.target) == 0
27
27
  end
28
28
  end
29
+
30
+ rescue NoMethodError => e
31
+ raise Cryptoexchange::ResultParseError, { response: "General no method error thrown" }
29
32
  end
30
33
 
31
34
  def available_exchanges
@@ -5,6 +5,9 @@ module Cryptoexchange
5
5
  class HttpResponseError < Error
6
6
  end
7
7
 
8
+ class HttpBadRequestError < Error
9
+ end
10
+
8
11
  class HttpConnectionError < Error
9
12
  end
10
13
 
@@ -16,4 +19,7 @@ module Cryptoexchange
16
19
 
17
20
  class TypeFormatError < Error
18
21
  end
22
+
23
+ class ResultParseError < Error
24
+ end
19
25
  end
@@ -10,20 +10,17 @@ module Cryptoexchange::Exchanges
10
10
 
11
11
  def fetch(market_pair)
12
12
  output = super(ticker_url(market_pair))
13
- adapt(output)
13
+ adapt(output, market_pair)
14
14
  end
15
15
 
16
16
  def ticker_url(market_pair)
17
17
  "#{Cryptoexchange::Exchanges::Anx::Market::API_URL}/#{market_pair.base}#{market_pair.target}/money/ticker"
18
18
  end
19
19
 
20
- def adapt(output)
20
+ def adapt(output, market_pair)
21
21
  ticker = Cryptoexchange::Models::Ticker.new
22
- base = output['data']['vol']['currency']
23
- target = output['data']['high']['currency']
24
-
25
- ticker.base = base
26
- ticker.target = target
22
+ ticker.base = market_pair.base
23
+ ticker.target = market_pair.target
27
24
  ticker.market = Anx::Market::NAME
28
25
  ticker.ask = NumericHelper.to_d(output['data']['sell']['value'])
29
26
  ticker.bid = NumericHelper.to_d(output['data']['buy']['value'])
@@ -0,0 +1,8 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Bancor
3
+ class Market
4
+ NAME = 'bancor'
5
+ API_URL = 'https://api.bancor.network/0.1'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,36 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Bancor
3
+ module Services
4
+ class Market < Cryptoexchange::Services::Market
5
+ class << self
6
+ def supports_individual_ticker_query?
7
+ true
8
+ end
9
+ end
10
+
11
+ def fetch(market_pair)
12
+ output = super(ticker_url(market_pair))
13
+ adapt(output, market_pair)
14
+ end
15
+
16
+ def ticker_url(market_pair)
17
+ "#{Cryptoexchange::Exchanges::Bancor::Market::API_URL}/currencies/#{market_pair.base}/ticker?fromCurrencyCode=#{market_pair.target}"
18
+ end
19
+
20
+ def adapt(output, market_pair)
21
+ ticker = Cryptoexchange::Models::Ticker.new
22
+ ticker.base = market_pair.base
23
+ ticker.target = market_pair.target
24
+ ticker.market = Bancor::Market::NAME
25
+ ticker.last = NumericHelper.to_d(output['data']['price'])
26
+ ticker.high = NumericHelper.to_d(output['data']['price24hLow'])
27
+ ticker.low = NumericHelper.to_d(output['data']['price24hLow'])
28
+ ticker.volume = NumericHelper.divide(NumericHelper.to_d(output['data']['volume24h'].to_f / 10 ** 18), ticker.last)
29
+ ticker.timestamp = Time.now.to_i
30
+ ticker.payload = output
31
+ ticker
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Bancor
3
+ module Services
4
+ class Pairs < Cryptoexchange::Services::Pairs
5
+ PAIRS_URL = "#{Cryptoexchange::Exchanges::Bancor::Market::API_URL}/currencies/convertiblePairs"
6
+
7
+ def fetch
8
+ output = super
9
+ adapt(output)
10
+ end
11
+
12
+ def adapt(output)
13
+ output['data'].map do |base, target|
14
+ Cryptoexchange::Models::MarketPair.new(
15
+ base: base,
16
+ target: target,
17
+ market: Bancor::Market::NAME
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,8 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Bigone
3
+ class Market
4
+ NAME = 'bigone'
5
+ API_URL = 'https://api.big.one'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,49 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Bigone
3
+ module Services
4
+ class Market < Cryptoexchange::Services::Market
5
+ class << self
6
+ def supports_individual_ticker_query?
7
+ false
8
+ end
9
+ end
10
+
11
+ def fetch
12
+ output = super(ticker_url)
13
+ adapt_all(output)
14
+ end
15
+
16
+ def ticker_url
17
+ "#{Cryptoexchange::Exchanges::Bigone::Market::API_URL}/markets"
18
+ end
19
+
20
+ def adapt_all(output)
21
+ output['data'].map do |pair|
22
+ base = pair['quote']
23
+ target = pair['base']
24
+ market_pair = Cryptoexchange::Models::MarketPair.new(
25
+ base: base,
26
+ target: target,
27
+ market: Bigone::Market::NAME
28
+ )
29
+ adapt(market_pair, pair['ticker'])
30
+ end
31
+ end
32
+
33
+ def adapt(market_pair, output)
34
+ ticker = Cryptoexchange::Models::Ticker.new
35
+ ticker.base = market_pair.base
36
+ ticker.target = market_pair.target
37
+ ticker.market = Bigone::Market::NAME
38
+ ticker.last = NumericHelper.to_d(output['price'].to_f)
39
+ ticker.high = NumericHelper.to_d(output['high'].to_f)
40
+ ticker.low = NumericHelper.to_d(output['low'].to_f)
41
+ ticker.volume = NumericHelper.to_d(output['volume'].to_f)
42
+ ticker.timestamp = Time.now.to_i
43
+ ticker.payload = output
44
+ ticker
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,44 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Bigone
3
+ module Services
4
+ class OrderBook < Cryptoexchange::Services::Market
5
+ class << self
6
+ def supports_individual_ticker_query?
7
+ true
8
+ end
9
+ end
10
+
11
+ def fetch(market_pair)
12
+ output = super(ticker_url(market_pair))
13
+ adapt(output, market_pair)
14
+ end
15
+
16
+ def ticker_url(market_pair)
17
+ "#{Cryptoexchange::Exchanges::Bigone::Market::API_URL}/markets/#{market_pair.base}-#{market_pair.target}/book"
18
+ end
19
+
20
+ def adapt(output, market_pair)
21
+ order_book = Cryptoexchange::Models::OrderBook.new
22
+ timestamp = Time.now.to_i
23
+
24
+ order_book.base = market_pair.base
25
+ order_book.target = market_pair.target
26
+ order_book.market = Bigone::Market::NAME
27
+ order_book.asks = adapt_orders(output["data"]["asks"])
28
+ order_book.bids = adapt_orders(output["data"]["bids"])
29
+ order_book.timestamp = timestamp
30
+ order_book.payload = output
31
+ order_book
32
+ end
33
+
34
+ def adapt_orders(orders)
35
+ orders.collect do |order_entry|
36
+ Cryptoexchange::Models::Order.new(price: order_entry["price"],
37
+ amount: order_entry["amount"],
38
+ timestamp: nil)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,23 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Bigone
3
+ module Services
4
+ class Pairs < Cryptoexchange::Services::Pairs
5
+ PAIRS_URL = "#{Cryptoexchange::Exchanges::Bigone::Market::API_URL}/markets"
6
+
7
+ def fetch
8
+ output = super
9
+ market_pairs = []
10
+ output['data'].each do |pair|
11
+ market_pairs << Cryptoexchange::Models::MarketPair.new(
12
+ base: pair['quote'],
13
+ target: pair['base'],
14
+ market: Bigone::Market::NAME
15
+ )
16
+ end
17
+ market_pairs
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,32 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Bigone
3
+ module Services
4
+ class Trades < Cryptoexchange::Services::Market
5
+ def fetch(market_pair)
6
+ output = super(ticker_url(market_pair))
7
+ adapt(output, market_pair)
8
+ end
9
+
10
+ def ticker_url(market_pair)
11
+ "#{Cryptoexchange::Exchanges::Bigone::Market::API_URL}/markets/#{market_pair.base}-#{market_pair.target}/trades"
12
+ end
13
+
14
+ def adapt(output, market_pair)
15
+ output["data"].collect do |trade|
16
+ tr = Cryptoexchange::Models::Trade.new
17
+ tr.trade_id = trade["trade_id"]
18
+ tr.base = market_pair.base
19
+ tr.target = market_pair.target
20
+ tr.market = Bigone::Market::NAME
21
+ tr.type = trade["trade_side"] == "ASK" ? "sell" : "buy"
22
+ tr.price = trade["price"]
23
+ tr.amount = trade["amount"]
24
+ tr.timestamp = trade["created_at"].to_i
25
+ tr.payload = trade
26
+ tr
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -10,18 +10,17 @@ module Cryptoexchange::Exchanges
10
10
 
11
11
  def fetch(market_pair)
12
12
  output = super(ticker_url(market_pair))
13
- adapt(output)
13
+ adapt(output, market_pair)
14
14
  end
15
15
 
16
16
  def ticker_url(market_pair)
17
17
  "#{Cryptoexchange::Exchanges::Bitflyer::Market::API_URL}/ticker?product_code=#{market_pair.base}_#{market_pair.target}"
18
18
  end
19
19
 
20
- def adapt(output)
20
+ def adapt(output, market_pair)
21
21
  ticker = Cryptoexchange::Models::Ticker.new
22
- base, target = output['product_code'].split('_')
23
- ticker.base = base
24
- ticker.target = target
22
+ ticker.base = market_pair.base
23
+ ticker.target = market_pair.target
25
24
  ticker.market = Bitflyer::Market::NAME
26
25
  ticker.ask = NumericHelper.to_d(output['best_ask'])
27
26
  ticker.bid = NumericHelper.to_d(output['best_bid'])
@@ -21,6 +21,7 @@ module Cryptoexchange::Exchanges
21
21
  end
22
22
 
23
23
  def adapt(output, market_pair)
24
+ handle_invalid(output)
24
25
  ticker = Cryptoexchange::Models::Ticker.new
25
26
  market = output['result'][0]
26
27
 
@@ -37,6 +38,12 @@ module Cryptoexchange::Exchanges
37
38
  ticker.payload = market
38
39
  ticker
39
40
  end
41
+
42
+ def handle_invalid(output)
43
+ if output['message'] == 'INVALID_MARKET'
44
+ raise Cryptoexchange::ResultParseError, { response: output }
45
+ end
46
+ end
40
47
  end
41
48
  end
42
49
  end
@@ -0,0 +1,8 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Coinbene
3
+ class Market
4
+ NAME = 'coinbene'
5
+ API_URL = 'http://api.coinbene.com/v1'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,52 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Coinbene
3
+ module Services
4
+ class Market < Cryptoexchange::Services::Market
5
+ class << self
6
+ def supports_individual_ticker_query?
7
+ false
8
+ end
9
+ end
10
+
11
+ def fetch
12
+ output = super(ticker_url)
13
+ adapt_all(output)
14
+ end
15
+
16
+ def ticker_url
17
+ "#{Cryptoexchange::Exchanges::Coinbene::Market::API_URL}/market/ticker?symbol=all"
18
+ end
19
+
20
+ def adapt_all(output)
21
+ output['ticker'].map do |ticker|
22
+ separator = /(USDT|BTC|ETH)\z/ =~ ticker['symbol']
23
+ base = ticker['symbol'][0..separator - 1]
24
+ target = ticker['symbol'][separator..-1]
25
+ market_pair = Cryptoexchange::Models::MarketPair.new(
26
+ base: base,
27
+ target: target,
28
+ market: Coinbene::Market::NAME
29
+ )
30
+ adapt(ticker, market_pair)
31
+ end
32
+ end
33
+
34
+ def adapt(output, market_pair)
35
+ ticker = Cryptoexchange::Models::Ticker.new
36
+ ticker.base = market_pair.base
37
+ ticker.target = market_pair.target
38
+ ticker.market = Coinbene::Market::NAME
39
+ ticker.last = NumericHelper.to_d(output['last'])
40
+ ticker.bid = NumericHelper.to_d(output['bid'])
41
+ ticker.ask = NumericHelper.to_d(output['ask'])
42
+ ticker.high = NumericHelper.to_d(output['24hrHigh'])
43
+ ticker.low = NumericHelper.to_d(output['24hrLow'])
44
+ ticker.volume = NumericHelper.to_d(output['24hrVol'])
45
+ ticker.timestamp = Time.now.to_i
46
+ ticker.payload = output
47
+ ticker
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end