cryptoexchange 0.20.0 → 0.21.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.
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