@Override public String getSubscribeMessage(String channelName, Object... args) throws IOException { PoloniexWebSocketSubscriptionMessage subscribeMessage = new PoloniexWebSocketSubscriptionMessage("subscribe", channelName); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); return objectMapper.writeValueAsString(subscribeMessage); }
@Override public String getSubscribeMessage(String channelName, Object... args) throws IOException { WebSocketMessage webSocketMessage = new WebSocketMessage("addChannel", channelName); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); return objectMapper.writeValueAsString(webSocketMessage); }
@Override public String getUnsubscribeMessage(String channelName) throws IOException { PoloniexWebSocketSubscriptionMessage subscribeMessage = new PoloniexWebSocketSubscriptionMessage("unsubscribe", channelName); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); return objectMapper.writeValueAsString(subscribeMessage); }
@Override public String getUnsubscribeMessage(String channelName) throws IOException { String channelId = null; for (Map.Entry<String, String> entry : subscribedChannels.entrySet()) { if (entry.getValue().equals(channelName)) { channelId = entry.getKey(); break; } } if (channelId == null) throw new IOException("Can't find channel unique name"); BitfinexWebSocketUnSubscriptionMessage subscribeMessage = new BitfinexWebSocketUnSubscriptionMessage(channelId); ObjectMapper objectMapper = StreamingObjectMapperHelper.getObjectMapper(); return objectMapper.writeValueAsString(subscribeMessage); }
private Map<CurrencyPair, Integer> getCurrencyPairMap() { Map<CurrencyPair, Integer> currencyPairMap = new HashMap<>(); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); try { URL tickerUrl = new URL(TICKER_URL); JsonNode jsonRootTickers = mapper.readTree(tickerUrl); Iterator<String> pairSymbols = jsonRootTickers.fieldNames(); while (pairSymbols.hasNext()) { String pairSymbol = pairSymbols.next(); String id = jsonRootTickers.get(pairSymbol).get("id").toString(); String[] currencies = pairSymbol.split("_"); CurrencyPair currencyPair = new CurrencyPair(new Currency(currencies[1]), new Currency(currencies[0])); currencyPairMap.put(currencyPair, new Integer(id)); } } catch (IOException e) { e.printStackTrace(); } return currencyPairMap; }
@Override public Observable<Ticker> getTicker(CurrencyPair currencyPair, Object... args) { final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); int currencyPairId = currencyPairMap.getOrDefault(currencyPair, 0); Observable<PoloniexWebSocketTickerTransaction> subscribedChannel = service.subscribeChannel("1002") .map(s -> mapper.readValue(s.toString(), PoloniexWebSocketTickerTransaction.class)); return subscribedChannel .filter(s -> s.getPairId() == currencyPairId) .map(s -> adaptPoloniexTicker(s.toPoloniexTicker(currencyPair), currencyPair)); }
@Override public Observable<Ticker> getTicker(CurrencyPair currencyPair, Object... args) { String pair = currencyPair.base.toString() + currencyPair.counter.toString(); String channelName = getChannelName("ticker", pair); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); return service.subscribeChannel(channelName) .map(s -> mapper.readValue(s.toString(), HitbtcWebSocketTickerTransaction.class)) .map(s -> HitbtcAdapters.adaptTicker(s.getParams(), currencyPair)); }
@Override public Observable<Trade> getTrades(CurrencyPair currencyPair, Object... args) { String channelName = "trades"; final String tradeType = args.length > 0 ? args[0].toString() : "te"; String pair = currencyPair.base.toString() + currencyPair.counter.toString(); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); Observable<BitfinexWebSocketTradesTransaction> subscribedChannel = service.subscribeChannel(channelName, new Object[]{pair}) .filter(s -> s.get(1).asText().equals(tradeType)) .map(s -> { if (s.get(1).asText().equals("te") || s.get(1).asText().equals("tu")) { return mapper.treeToValue(s, BitfinexWebsocketUpdateTrade.class); } else return mapper.treeToValue(s, BitfinexWebSocketSnapshotTrades.class); }); return subscribedChannel .flatMapIterable(s -> { Trades adaptedTrades = adaptTrades(s.toBitfinexTrades(), currencyPair); return adaptedTrades.getTrades(); }); }
@Override public Observable<Ticker> getTicker(CurrencyPair currencyPair, Object... args) { String channelName = "ticker"; String pair = currencyPair.base.toString() + currencyPair.counter.toString(); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); Observable<BitfinexWebSocketTickerTransaction> subscribedChannel = service.subscribeChannel(channelName, new Object[]{pair}) .map(s -> mapper.treeToValue(s, BitfinexWebSocketTickerTransaction.class)); return subscribedChannel .map(s -> adaptTicker(s.toBitfinexTicker(), currencyPair)); }
@Override public Observable<OrderBook> getOrderBook(CurrencyPair currencyPair, Object... args) { String channelName = "order_book-" + getChannelPostfix(currencyPair); return service.subscribeChannel(channelName, "order_book") .map(s -> { ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); CoinmateOrderBookData orderBookData = mapper.readValue(s, CoinmateOrderBookData.class); CoinmateOrderBook coinmateOrderBook = new CoinmateOrderBook(false, null, orderBookData); return CoinmateAdapters.adaptOrderBook(coinmateOrderBook, currencyPair); }); }
@Override public Observable<OrderBook> getOrderBook(CurrencyPair currencyPair, Object... args) { String pair = currencyPair.base.toString() + currencyPair.counter.toString(); String channelName = getChannelName("orderbook", pair); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); Observable<JsonNode> jsonNodeObservable = service.subscribeChannel(channelName); return jsonNodeObservable .map(s -> mapper.readValue(s.toString(), HitbtcWebSocketOrderBookTransaction.class)) .map(s -> { HitbtcWebSocketOrderBook hitbtcOrderBook = s.toHitbtcOrderBook(orderbooks.getOrDefault(currencyPair, null)); orderbooks.put(currencyPair, hitbtcOrderBook); return HitbtcAdapters.adaptOrderBook(hitbtcOrderBook.toHitbtcOrderBook(), currencyPair); }); }
@Override public Observable<OrderBook> getOrderBook(CurrencyPair currencyPair, Object... args) { String channelName = "book"; final String depth = args.length > 0 ? args[0].toString() : "100"; String pair = currencyPair.base.toString() + currencyPair.counter.toString(); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); Observable<BitfinexWebSocketOrderbookTransaction> subscribedChannel = service.subscribeChannel(channelName, new Object[]{pair, "P0", depth}) .map(s -> { if (s.get(1).get(0).isArray()) return mapper.treeToValue(s, BitfinexWebSocketSnapshotOrderbook.class); else return mapper.treeToValue(s, BitfinexWebSocketUpdateOrderbook.class); }); return subscribedChannel .map(s -> { BitfinexOrderbook bitfinexOrderbook = s.toBitfinexOrderBook(orderbooks.getOrDefault(currencyPair, null)); orderbooks.put(currencyPair, bitfinexOrderbook); return adaptOrderBook(bitfinexOrderbook.toBitfinexDepth(), currencyPair); }); }
@Override public Observable<Trade> getTrades(CurrencyPair currencyPair, Object... args) { String channelName = "live_trades" + getChannelPostfix(currencyPair); return service.subscribeChannel(channelName, "trade") .map(s -> { ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); BitstampWebSocketTransaction transactions = mapper.readValue(s, BitstampWebSocketTransaction.class); transactions = new BitstampWebSocketTransaction(new Date().getTime() / 1000L, transactions.getTid(), transactions.getPrice(), transactions.getAmount(), transactions.getType()); return BitstampAdapters.adaptTrade(transactions, currencyPair, 1000); }); }
@Override public Observable<Trade> getTrades(CurrencyPair currencyPair, Object... args) { String channelName = "trades-" + getChannelPostfix(currencyPair); return service.subscribeChannel(channelName, "new_trades") .map(s -> { ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); List<CoinmateWebSocketTrade> list = mapper.readValue(s, new TypeReference<List<CoinmateWebSocketTrade>>() { }); return list; }) .flatMapIterable(coinmateWebSocketTrades -> coinmateWebSocketTrades) .map(coinmateWebSocketTrade -> CoinmateAdapters.adaptTrade(coinmateWebSocketTrade.toTransactionEntry(CoinmateUtils.getPair(currencyPair)))); }
@Override public Observable<Trade> getTrades(CurrencyPair currencyPair, Object... args) { String pair = currencyPair.base.toString() + currencyPair.counter.toString(); String channelName = getChannelName("trades", pair); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); return service.subscribeChannel(channelName) .map(s -> mapper.readValue(s.toString(), HitbtcWebSocketTradesTransaction.class)) .map(HitbtcWebSocketTradesTransaction::getParams) .filter(Objects::nonNull) .map(HitbtcWebSocketTradeParams::getData) .filter(Objects::nonNull) .map(Arrays::asList) .flatMapIterable(s -> { Trades adaptedTrades = HitbtcAdapters.adaptTrades(s, currencyPair); return adaptedTrades.getTrades(); }); }
/** * Returns an Observable of {@link CoinbaseProProductTicker}, not converted to {@link Ticker} * * @param currencyPair the currency pair. * @param args optional arguments. * @return an Observable of {@link CoinbaseProProductTicker}. */ public Observable<CoinbaseProProductTicker> getRawTicker(CurrencyPair currencyPair, Object... args) { if (!containsPair(service.getProduct().getTicker(), currencyPair)) throw new UnsupportedOperationException(String.format("The currency pair %s is not subscribed for ticker", currencyPair)); String channelName = currencyPair.base.toString() + "-" + currencyPair.counter.toString(); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); Observable<CoinbaseProWebSocketTransaction> subscribedChannel = service.subscribeChannel(channelName) .map(s -> mapper.readValue(s.toString(), CoinbaseProWebSocketTransaction.class)); return subscribedChannel .filter(message -> !isNullOrEmpty(message.getType()) && message.getType().equals("match") && message.getProductId().equals(channelName)) .map(CoinbaseProWebSocketTransaction::toCoinbaseProProductTicker); }
@Override public Observable<OrderBook> getOrderBook(CurrencyPair currencyPair, Object... args) { if (!containsPair(service.getProduct().getOrderBook(), currencyPair)) throw new UnsupportedOperationException(String.format("The currency pair %s is not subscribed for orderbook", currencyPair)); String channelName = currencyPair.base.toString() + "-" + currencyPair.counter.toString(); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); final int maxDepth = (args.length > 0 && args[0] instanceof Integer) ? (int) args[0] : 100; Observable<CoinbaseProWebSocketTransaction> subscribedChannel = service.subscribeChannel(channelName) .map(s -> mapper.readValue(s.toString(), CoinbaseProWebSocketTransaction.class)); return subscribedChannel .filter(message -> !isNullOrEmpty(message.getType()) && (message.getType().equals("snapshot") || message.getType().equals("l2update")) && message.getProductId().equals(channelName)) .map(s -> { if (s.getType().equals("snapshot")) { bids.put(currencyPair, new TreeMap<>(java.util.Collections.reverseOrder())); asks.put(currencyPair, new TreeMap<>()); } CoinbaseProProductBook productBook = s.toCoinbaseProProductBook(bids.get(currencyPair), asks.get(currencyPair), maxDepth); return adaptOrderBook(productBook, currencyPair); }); }
private Observable<OrderBook> getOrderBook(String channelPrefix, CurrencyPair currencyPair, Object... args) { String channelName = channelPrefix + getChannelPostfix(currencyPair); return service.subscribeChannel(channelName, "data") .map(s -> { ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); BitstampOrderBook orderBook = mapper.readValue(s, BitstampOrderBook.class); org.knowm.xchange.bitstamp.dto.marketdata.BitstampOrderBook bitstampOrderBook = new org.knowm.xchange.bitstamp.dto.marketdata.BitstampOrderBook( orderBook.getTimestamp(), orderBook.getBids(), orderBook.getAsks()); return BitstampAdapters.adaptOrderBook(bitstampOrderBook, currencyPair); }); }
/** * Returns the CoinbasePro ticker converted to the normalized XChange object. * CoinbasePro does not directly provide ticker data via web service. * As stated by: https://docs.coinbasepro.com/#get-product-ticker, we can just listen for 'match' messages. * * @param currencyPair Currency pair of the ticker * @param args optional parameters. * @return an Observable of normalized Ticker objects. */ @Override public Observable<Ticker> getTicker(CurrencyPair currencyPair, Object... args) { if (!containsPair(service.getProduct().getTicker(), currencyPair)) throw new UnsupportedOperationException(String.format("The currency pair %s is not subscribed for ticker", currencyPair)); String channelName = currencyPair.base.toString() + "-" + currencyPair.counter.toString(); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); Observable<CoinbaseProWebSocketTransaction> subscribedChannel = service.subscribeChannel(channelName) .map(s -> mapper.readValue(s.toString(), CoinbaseProWebSocketTransaction.class)); return subscribedChannel .filter(message -> !isNullOrEmpty(message.getType()) && message.getType().equals("ticker") && message.getProductId().equals(channelName)) .map(s -> adaptTicker(s.toCoinbaseProProductTicker(), s.toCoinbaseProProductStats(), currencyPair)); }
@Override public Observable<Trade> getTrades(CurrencyPair currencyPair, Object... args) { if (!containsPair(service.getProduct().getTrades(), currencyPair)) throw new UnsupportedOperationException(String.format("The currency pair %s is not subscribed for trades", currencyPair)); String channelName = currencyPair.base.toString() + "-" + currencyPair.counter.toString(); final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); Observable<CoinbaseProWebSocketTransaction> subscribedChannel = service.subscribeChannel(channelName) .map(s -> mapper.readValue(s.toString(), CoinbaseProWebSocketTransaction.class)); return subscribedChannel .filter(message -> !isNullOrEmpty(message.getType()) && message.getType().equals("match") && message.getProductId().equals(channelName)) .map(s -> { Trades adaptedTrades = null; if ( s.getUserId() != null ) adaptedTrades = adaptTradeHistory(new CoinbaseProFill[]{s.toCoinbaseProFill()}); else adaptedTrades = adaptTrades(new CoinbaseProTrade[]{s.toCoinbaseProTrade()}, currencyPair); return adaptedTrades.getTrades().get(0); } ); } }