From 2ba28da82048067c9ac8c1909b1a8dff34ee8671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sun, 13 May 2018 14:48:20 +0800 Subject: [PATCH 01/97] add interface support for trade service --- .../xchangestream/core/StreamingExchange.java | 8 ++++++++ .../xchangestream/core/StreamingTradeService.java | 12 ++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java index b97a1332e..f801edbff 100644 --- a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java +++ b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java @@ -2,6 +2,7 @@ import io.reactivex.Completable; import org.knowm.xchange.Exchange; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; public interface StreamingExchange extends Exchange { /** @@ -31,6 +32,13 @@ public interface StreamingExchange extends Exchange { */ StreamingMarketDataService getStreamingMarketDataService(); + /** + * Returns service that can be used to access transaction data. + */ + default StreamingTradeService getStreamingTrasactionDataService() { + throw new NotYetImplementedForExchangeException(); + } + /** * Set whether or not to enable compression handler. * diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java new file mode 100644 index 000000000..09eb79edd --- /dev/null +++ b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java @@ -0,0 +1,12 @@ +package info.bitrich.xchangestream.core; + +import io.reactivex.Observable; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.Order; +import org.knowm.xchange.dto.marketdata.Trade; + +public interface StreamingTradeService { + + Observable getOxrders(CurrencyPair var1, Object... var2); + +} From 9cdcba40d8ef8a46d838ccfddbb8e4eaa3697eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sun, 13 May 2018 16:01:48 +0800 Subject: [PATCH 02/97] Misspell fix --- .../bitrich/xchangestream/core/StreamingTradeService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java index 09eb79edd..adb4d8a2c 100644 --- a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java +++ b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java @@ -5,8 +5,11 @@ import org.knowm.xchange.dto.Order; import org.knowm.xchange.dto.marketdata.Trade; + public interface StreamingTradeService { - Observable getOxrders(CurrencyPair var1, Object... var2); + default Observable getOrders(CurrencyPair var1, Object... var2) { + throw new NotYetImplementedForExchangeException(); + } } From 131d66295826952d89eb12e3dfb6eacfda6b65b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sun, 13 May 2018 16:05:13 +0800 Subject: [PATCH 03/97] bug fix --- .../info/bitrich/xchangestream/core/StreamingTradeService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java index adb4d8a2c..15ea513e8 100644 --- a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java +++ b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java @@ -3,7 +3,7 @@ import io.reactivex.Observable; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.Order; -import org.knowm.xchange.dto.marketdata.Trade; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; public interface StreamingTradeService { From 7269bd812c7c34c7176693656d9e1ab0b824c257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 14 May 2018 18:43:00 +0800 Subject: [PATCH 04/97] add support for okex futrues trading --- .../okcoin/OkExFuturesStreamingExchange.java | 11 ++++++ .../okcoin/OkExStreamingExchange.java | 4 ++ .../okcoin/OkExFuturesManualExample.java | 38 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExFuturesStreamingExchange.java create mode 100644 xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExFuturesStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExFuturesStreamingExchange.java new file mode 100644 index 000000000..103b42b71 --- /dev/null +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExFuturesStreamingExchange.java @@ -0,0 +1,11 @@ +package info.bitrich.xchangestream.okcoin; + +public class OkExFuturesStreamingExchange extends OkExStreamingExchange { + + private static final String API_URI = "wss://real.okex.com:10440/websocket/okexapi"; + + public OkExFuturesStreamingExchange() { + super(API_URI); + } +} + diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java index 7a9071604..aced472e3 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java @@ -9,4 +9,8 @@ public class OkExStreamingExchange extends OkCoinStreamingExchange { public OkExStreamingExchange() { super(new OkCoinStreamingService(API_URI)); } + + public OkExStreamingExchange(String api_url) { + super(new OkCoinStreamingService(api_url)); + } } diff --git a/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java new file mode 100644 index 000000000..529a82c8d --- /dev/null +++ b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java @@ -0,0 +1,38 @@ +package info.bitrich.xchangestream.okcoin; + +import info.bitrich.xchangestream.core.StreamingExchange; +import info.bitrich.xchangestream.core.StreamingExchangeFactory; +import org.knowm.xchange.currency.Currency; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.okcoin.FuturesContract; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OkExFuturesManualExample { + private static final Logger LOG = LoggerFactory.getLogger(OkExManualExample.class); + + public static void main(String[] args) { + StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(OkExFuturesManualExample.class.getName()); + exchange.connect().blockingAwait(); + + exchange.getStreamingMarketDataService().getOrderBook(CurrencyPair.BTC_USD, FuturesContract.Quarter).subscribe(orderBook -> { + LOG.info("First ask: {}", orderBook.getAsks().get(0)); + LOG.info("First bid: {}", orderBook.getBids().get(0)); + }, throwable -> LOG.error("ERROR in getting order book: ", throwable)); + + exchange.getStreamingMarketDataService().getTicker(CurrencyPair.BTC_USD, FuturesContract.Quarter).subscribe(ticker -> { + LOG.info("TICKER: {}", ticker); + }, throwable -> LOG.error("ERROR in getting ticker: ", throwable)); + + exchange.getStreamingMarketDataService().getTrades(CurrencyPair.BTC_USD, FuturesContract.Quarter).subscribe(trade -> { + LOG.info("TRADE: {}", trade); + }, throwable -> LOG.error("ERROR in getting trades: ", throwable)); + + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} + From 0d21b9d38ec0ffbfda84819f05e3084fb474de78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 15 May 2018 05:13:45 +0800 Subject: [PATCH 05/97] code formatting --- .../bitrich/xchangestream/okcoin/OkExStreamingExchange.java | 4 ++-- .../xchangestream/okcoin/OkExFuturesManualExample.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java index aced472e3..e1d8d7391 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java @@ -10,7 +10,7 @@ public OkExStreamingExchange() { super(new OkCoinStreamingService(API_URI)); } - public OkExStreamingExchange(String api_url) { - super(new OkCoinStreamingService(api_url)); + public OkExStreamingExchange(String apiUrl) { + super(new OkCoinStreamingService(apiUrl)); } } diff --git a/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java index 529a82c8d..b6f44078b 100644 --- a/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java +++ b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java @@ -2,7 +2,6 @@ import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingExchangeFactory; -import org.knowm.xchange.currency.Currency; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.okcoin.FuturesContract; import org.slf4j.Logger; From cd7cca8f3d9de124276e092e38e7c9cd2d7588b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 17 May 2018 18:08:18 +0800 Subject: [PATCH 06/97] bitmex authenticate --- .../bitmex/BitmexAuthenticator.java | 38 ++++++++++++++ .../bitmex/BitmexStreamingExchange.java | 1 + .../bitmex/BitmexStreamingService.java | 49 +++++++++++++++++-- 3 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticator.java diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticator.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticator.java new file mode 100644 index 000000000..665c0b3c2 --- /dev/null +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticator.java @@ -0,0 +1,38 @@ +package info.bitrich.xchangestream.bitmex; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.Charset; + +/** + * Created by heath on 2018/3/1. + */ +public class BitmexAuthenticator { + + public static String getSHA256String(String str, String key) { + + try { + Charset asciiCs = Charset.forName("US-ASCII"); + SecretKeySpec signingKey = new SecretKeySpec(asciiCs.encode(key).array(), "HmacSHA256"); + Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); + sha256_HMAC.init(signingKey); + byte[] mac_data = sha256_HMAC.doFinal(asciiCs.encode(str).array()); + StringBuilder result = new StringBuilder(); + for (final byte element : mac_data) { + result.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1)); + } + // System.out.println("SHA256String Result:[" + result + "]"); + return result.toString().toUpperCase(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String generateSignature(String secret, String verb, String url, String nonce, String data) { + String message = verb + url + nonce + data; + // System.out.println(message); + return getSHA256String(message, secret); + } + +} diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java index 750ff4c99..8da9c5765 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java @@ -24,6 +24,7 @@ public BitmexStreamingExchange() { @Override protected void initServices() { streamingMarketDataService = new BitmexStreamingMarketDataService(streamingService); + streamingService.setExchangeSpecification(this.getExchangeSpecification()); } @Override diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java index c1cf862f4..4e1a75e7d 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java @@ -1,9 +1,12 @@ package info.bitrich.xchangestream.bitmex; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import com.fasterxml.jackson.core.JsonProcessingException; +import io.reactivex.Completable; +import io.reactivex.CompletableSource; +import org.knowm.xchange.ExchangeSpecification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,12 +26,52 @@ public class BitmexStreamingService extends JsonNettyStreamingService { private static final Logger LOG = LoggerFactory.getLogger(BitmexStreamingService.class); private final ObjectMapper mapper = new ObjectMapper(); + protected ExchangeSpecification exchangeSpecification; + public BitmexStreamingService(String apiUrl) { super(apiUrl, Integer.MAX_VALUE); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } - @Override + public void setExchangeSpecification(ExchangeSpecification exchangeSpecification) { + this.exchangeSpecification = exchangeSpecification; + } + + private void login() throws JsonProcessingException { + long expires = System.currentTimeMillis() + 30; + String apiKey = this.exchangeSpecification.getApiKey(); + String apiSecret = this.exchangeSpecification.getSecretKey(); + String path = "/realtime"; + String signature = BitmexAuthenticator.generateSignature(apiSecret, + "GET", path, String.valueOf(expires), ""); + + List args = Arrays.asList(apiKey, expires, signature); + + Map cmd = new HashMap<>(); + cmd.put("op", "authKey"); + cmd.put("args", args); + this.sendMessage(mapper.writeValueAsString(cmd)); + } + + @Override + public Completable connect() { + // Note that we must override connect method in streaming service instead of streaming exchange, because of the auto reconnect feature of NettyStreamingService. + // We must ensure the authentication message is also resend when the connection is rebuilt. + Completable conn = super.connect(); + if (this.exchangeSpecification.getApiKey() == null) { + return conn; + } + return conn.andThen((CompletableSource)(completable) -> { + try { + login(); + completable.onComplete(); + } catch (IOException e) { + completable.onError(e); + } + }); + } + + @Override protected void handleMessage(JsonNode message) { if (message.has("info") || message.has("success")) { return; From 4e05dd1a8547107ec3c6ec79133a1d8f199f6d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 17 May 2018 22:46:01 +0800 Subject: [PATCH 07/97] order update subscription bug fix --- .../BitmexStreamingMarketDataService.java | 16 +++ .../bitmex/BitmexStreamingTradeService.java | 41 ++++++ .../xchangestream/bitmex/dto/BitmexOrder.java | 118 ++++++++++++++++++ 3 files changed, 175 insertions(+) create mode 100644 xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java create mode 100644 xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index b89c0cea5..d70023d56 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -85,4 +85,20 @@ public Observable getTrades(CurrencyPair currencyPair, Object... args) { return trades; }); } + + @Override + public Observable getTrades(CurrencyPair currencyPair, Object... args) { + String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + String channelName = String.format("trade:%s", instrument); + + return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { + BitmexTrade[] bitmexTrades = s.toBitmexTrades(); + List trades = new ArrayList<>(bitmexTrades.length); + for (BitmexTrade bitmexTrade : bitmexTrades) { + trades.add(bitmexTrade.toTrade()); + } + return trades; + }); + } + } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java new file mode 100644 index 000000000..64e500a24 --- /dev/null +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java @@ -0,0 +1,41 @@ +package info.bitrich.xchangestream.bitmex; + + +import io.reactivex.Observable; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.Order; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; + +import java.util.Arrays; +import java.util.stream.Collectors; + + +/** + * Created by Declan + */ +public class BitmexStreamingTradeService implements StreamingTradeService { + + private final BitmexStreamingService streamingService; + + public BitmexStreamingTradeService(BitmexStreamingService streamingService) { + this.streamingService = streamingService; + } + + @Override + public Observable getOrders(CurrencyPair currencyPair, Object... args) { + String channelName = "order"; + String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { + BitmexOrder[] bitmexOrders = s.toBitmexOrders(); + return Arrays.stream(bitmexOrders) + .filter(bitmexOrder -> bitmexOrder.symbol() == instrument) + .filter(not(BitmexOrder::workingIndicator)) + .map(BitmexOrder::toOrder).collect(Collectors.toList()); + }); + } + + @Override + public void submitOrder(Order order, CurrencyPair var1, Object... var2) { + throw new NotYetImplementedForExchangeException(); + } +} diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java new file mode 100644 index 000000000..f2629863d --- /dev/null +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java @@ -0,0 +1,118 @@ +package info.bitrich.xchangestream.bitmex.dto; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.knowm.xchange.dto.Order; +import org.knowm.xchange.dto.trade.LimitOrder; + +import java.math.BigDecimal; + + +public class BitmexOrder extends BitmexMarketDataEvent { + + public static final String ASK_SIDE = "Sell"; + public static final String BID_SIDE = "Buy"; + + private String orderID; + + private int account; + + private String side; + + private double price; + + private String ordType; + + private String ordStatus; + + private String clOrdID; + + private long orderQty; + + private long cumQty; + + private boolean workingIndicator; + + public boolean isNotWorking() { + return !workingIndicator; + } + + @JsonCreator + public BitmexOrder(@JsonProperty("symbol") String symbol, + @JsonProperty("timestamp") String timestamp, + @JsonProperty("orderID") String orderID, + @JsonProperty("account") int account, + @JsonProperty("side") String side, + @JsonProperty("price") double price, + @JsonProperty("ordType") String ordType, + @JsonProperty("ordStatus") String ordStatus, + @JsonProperty("clOrdID") String clOrdID, + @JsonProperty("orderQty") long orderQty, + @JsonProperty("cumQty") long cumQty, + @JsonProperty("workingIndicator") boolean workingIndicator) { + super(symbol, timestamp); + this.orderID = orderID; + this.account = account; + this.side = side; + this.price = price; + this.ordType = ordType; + this.ordStatus = ordStatus; + this.clOrdID = clOrdID; + this.orderQty = orderQty; + this.cumQty = cumQty; + this.workingIndicator = workingIndicator; + } + + public Order.OrderType getOrderSide() { + return side.equals(ASK_SIDE) ? Order.OrderType.ASK : Order.OrderType.BID; + } + + public Order toOrder() { + if (ordType.equals("Limit")) { + LimitOrder.Builder builder = new LimitOrder.Builder(); + builder.id(orderID) + .orderType(getOrderSide()) + .limitPrice(new BigDecimal(price)) + .originalAmount(new BigDecimal(orderQty)) + .cumulativeAmount(new BigDecimal(cumQty)) + + if (ordStatus.equals("Rejected") || ordStatus.equals("N/A")) { + return builder.orderStatus(Order.OrderStatus.REJECTED).build(); + } + return builder + } + builder.id(orderID) + .orderType(getOrderSide()) + .limitPrice(price) + . + + return new LimitOrder() + + Order.Status status = Order.Status.fromName(ordStatus); + if (status == FAILED || + status == UNKNOW) { + log.error("Got invalid order: {}", this.toString()); + return Order.builder() + .id(orderID) + .clOrdID(clOrdID) + .account(account) + .status(status) + .committedVol(committedVol) + .build(); + } + Order order = Order.builder() + .id(orderID) + .clOrdID(clOrdID) + .account(account) + .status(status) + .submittedVol(submittedVol) + .committedVol(committedVol) + .build(); + if (status == Order.Status.NEW) { + order.price(price) + .tradeSide(side.equals("Buy") ? Order.TradeSide.OPEN_LONG : Order.TradeSide.OPEN_SHORT) + .type(Order.OrderType.fromName(ordType)); + } + return order; + } +} From 625e3cd8cc9b6081b43422dde1928bd654b011a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 17 May 2018 22:48:30 +0800 Subject: [PATCH 08/97] temp --- .../BitmexStreamingMarketDataService.java | 15 ---- .../bitmex/BitmexStreamingTradeService.java | 34 +++++----- .../xchangestream/bitmex/dto/BitmexOrder.java | 68 +++++++++---------- 3 files changed, 51 insertions(+), 66 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index d70023d56..952acbf5a 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -86,19 +86,4 @@ public Observable getTrades(CurrencyPair currencyPair, Object... args) { }); } - @Override - public Observable getTrades(CurrencyPair currencyPair, Object... args) { - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); - String channelName = String.format("trade:%s", instrument); - - return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { - BitmexTrade[] bitmexTrades = s.toBitmexTrades(); - List trades = new ArrayList<>(bitmexTrades.length); - for (BitmexTrade bitmexTrade : bitmexTrades) { - trades.add(bitmexTrade.toTrade()); - } - return trades; - }); - } - } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java index 64e500a24..681365896 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java @@ -21,21 +21,21 @@ public BitmexStreamingTradeService(BitmexStreamingService streamingService) { this.streamingService = streamingService; } - @Override - public Observable getOrders(CurrencyPair currencyPair, Object... args) { - String channelName = "order"; - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); - return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { - BitmexOrder[] bitmexOrders = s.toBitmexOrders(); - return Arrays.stream(bitmexOrders) - .filter(bitmexOrder -> bitmexOrder.symbol() == instrument) - .filter(not(BitmexOrder::workingIndicator)) - .map(BitmexOrder::toOrder).collect(Collectors.toList()); - }); - } - - @Override - public void submitOrder(Order order, CurrencyPair var1, Object... var2) { - throw new NotYetImplementedForExchangeException(); - } +// @Override +// public Observable getOrders(CurrencyPair currencyPair, Object... args) { +// String channelName = "order"; +// String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); +// return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { +// BitmexOrder[] bitmexOrders = s.toBitmexOrders(); +// return Arrays.stream(bitmexOrders) +// .filter(bitmexOrder -> bitmexOrder.symbol() == instrument) +// .filter(not(BitmexOrder::workingIndicator)) +// .map(BitmexOrder::toOrder).collect(Collectors.toList()); +// }); +// } +// +// @Override +// public void submitOrder(Order order, CurrencyPair var1, Object... var2) { +// throw new NotYetImplementedForExchangeException(); +// } } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java index f2629863d..7e328df58 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java @@ -79,40 +79,40 @@ public Order toOrder() { if (ordStatus.equals("Rejected") || ordStatus.equals("N/A")) { return builder.orderStatus(Order.OrderStatus.REJECTED).build(); } - return builder + return builder.build(); } - builder.id(orderID) - .orderType(getOrderSide()) - .limitPrice(price) - . - - return new LimitOrder() - - Order.Status status = Order.Status.fromName(ordStatus); - if (status == FAILED || - status == UNKNOW) { - log.error("Got invalid order: {}", this.toString()); - return Order.builder() - .id(orderID) - .clOrdID(clOrdID) - .account(account) - .status(status) - .committedVol(committedVol) - .build(); - } - Order order = Order.builder() - .id(orderID) - .clOrdID(clOrdID) - .account(account) - .status(status) - .submittedVol(submittedVol) - .committedVol(committedVol) - .build(); - if (status == Order.Status.NEW) { - order.price(price) - .tradeSide(side.equals("Buy") ? Order.TradeSide.OPEN_LONG : Order.TradeSide.OPEN_SHORT) - .type(Order.OrderType.fromName(ordType)); - } - return order; +// builder.id(orderID) +// .orderType(getOrderSide()) +// .limitPrice(price) +// . +// +// return new LimitOrder() +// +// Order.Status status = Order.Status.fromName(ordStatus); +// if (status == FAILED || +// status == UNKNOW) { +// log.error("Got invalid order: {}", this.toString()); +// return Order.builder() +// .id(orderID) +// .clOrdID(clOrdID) +// .account(account) +// .status(status) +// .committedVol(committedVol) +// .build(); +// } +// Order order = Order.builder() +// .id(orderID) +// .clOrdID(clOrdID) +// .account(account) +// .status(status) +// .submittedVol(submittedVol) +// .committedVol(committedVol) +// .build(); +// if (status == Order.Status.NEW) { +// order.price(price) +// .tradeSide(side.equals("Buy") ? Order.TradeSide.OPEN_LONG : Order.TradeSide.OPEN_SHORT) +// .type(Order.OrderType.fromName(ordType)); +// } +// return order; } } From 18bf3c368eea82cd0c75794df98c6932564a2b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sat, 19 May 2018 10:58:56 +0800 Subject: [PATCH 09/97] support bitmex futures contract --- xchange-bitmex/pom.xml | 5 + .../bitmex/BitmexStreamingExchange.java | 1 + .../BitmexStreamingMarketDataService.java | 26 ++- .../xchangestream/bitmex/BitmexUtils.java | 177 ++++++++++++++++++ .../bitmex/BitmexManualExample.java | 16 +- 5 files changed, 217 insertions(+), 8 deletions(-) create mode 100644 xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index c3434c7de..d9ef1d0cf 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -25,5 +25,10 @@ xchange-bitmex ${xchange.version} + + org.apache.httpcomponents + fluent-hc + 4.5.5 + \ No newline at end of file diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java index c9cf0ab8b..0f5db4a1e 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java @@ -28,6 +28,7 @@ protected BitmexStreamingExchange(BitmexStreamingService streamingService) { @Override protected void initServices() { super.initServices(); + BitmexUtils.initBitmexContracts(); streamingMarketDataService = new BitmexStreamingMarketDataService(streamingService); } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index bf97ac90b..582cfd971 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -6,6 +6,8 @@ import info.bitrich.xchangestream.bitmex.dto.BitmexTrade; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Observable; +import org.knowm.xchange.bitmex.BitmexContract; +import org.knowm.xchange.bitmex.BitmexPrompt; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Ticker; @@ -26,15 +28,25 @@ public class BitmexStreamingMarketDataService implements StreamingMarketDataServ private final BitmexStreamingService streamingService; - private final SortedMap orderbooks = new TreeMap<>(); + private final SortedMap orderbooks = new TreeMap<>(); public BitmexStreamingMarketDataService(BitmexStreamingService streamingService) { this.streamingService = streamingService; } + private String getBitmexSymbol(CurrencyPair currencyPair, Object... args) { + if (args.length > 0) { + BitmexPrompt prompt = (BitmexPrompt) args[0]; + BitmexContract contract = new BitmexContract(currencyPair, prompt); + return BitmexUtils.translateBitmexContract(contract); + } else { + return currencyPair.base.toString() + currencyPair.counter.toString(); + } + } + @Override public Observable getOrderBook(CurrencyPair currencyPair, Object... args) { - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + String instrument = getBitmexSymbol(currencyPair, args); String channelName = String.format("orderBookL2:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).map(s -> { @@ -42,9 +54,9 @@ public Observable getOrderBook(CurrencyPair currencyPair, Object... a String action = s.getAction(); if (action.equals("partial")) { orderbook = s.toBitmexOrderbook(); - orderbooks.put(currencyPair, orderbook); + orderbooks.put(instrument, orderbook); } else { - orderbook = orderbooks.get(currencyPair); + orderbook = orderbooks.get(instrument); //ignore updates until first "partial" if (orderbook == null) { return null; @@ -58,7 +70,7 @@ public Observable getOrderBook(CurrencyPair currencyPair, Object... a } public Observable getRawTicker(CurrencyPair currencyPair, Object... args) { - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + String instrument = getBitmexSymbol(currencyPair, args); String channelName = String.format("quote:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).map(s -> s.toBitmexTicker()); @@ -66,7 +78,7 @@ public Observable getRawTicker(CurrencyPair currencyPair, Object.. @Override public Observable getTicker(CurrencyPair currencyPair, Object... args) { - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + String instrument = getBitmexSymbol(currencyPair, args); String channelName = String.format("quote:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).map(s -> { @@ -77,7 +89,7 @@ public Observable getTicker(CurrencyPair currencyPair, Object... args) { @Override public Observable getTrades(CurrencyPair currencyPair, Object... args) { - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + String instrument = getBitmexSymbol(currencyPair, args); String channelName = String.format("trade:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java new file mode 100644 index 000000000..b2270cbe0 --- /dev/null +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java @@ -0,0 +1,177 @@ +package info.bitrich.xchangestream.bitmex; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.http.client.fluent.Content; +import org.apache.http.client.fluent.Request; +import org.knowm.xchange.bitmex.BitmexContract; +import org.knowm.xchange.bitmex.BitmexPrompt; +import org.knowm.xchange.bitmex.dto.account.BitmexTicker; +import org.knowm.xchange.currency.Currency; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.exceptions.ExchangeException; + + +public class BitmexUtils { + protected static final HashBiMap assetsMap = HashBiMap.create(); + protected static Map assetPairMap = new HashMap(); + protected static BiMap bitmexContracts = HashBiMap.create(); + protected static BiMap bitmexCurrencies = HashBiMap.create(); + + private BitmexUtils() { + + } + + public static void initBitmexContracts() { + Request request = Request.Get("https://www.bitmex.com/api/v1/instrument/activeIntervals"); + try { + Content content = request.execute().returnContent(); + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = mapper.readValue(content.toString(), JsonNode.class); + JsonNode intervals = node.get("intervals"); + JsonNode symbols = node.get("symbols"); + for (int i = 0; i < symbols.size(); i++) { + String symbol = symbols.get(i).textValue(); + String interval = intervals.get(i).textValue(); + String[] parts = interval.split(":"); + bitmexContracts.put(symbol, new BitmexContract(new CurrencyPair(new Currency(parts[0]), Currency.USD), BitmexPrompt.valueOf(parts[1].toUpperCase()))); + } + } catch (IOException e) { + e.printStackTrace(); + } + + } + + public static void setBitmexAssetPairs(List tickers) { + Iterator var1 = tickers.iterator(); + + while(var1.hasNext()) { + BitmexTicker ticker = (BitmexTicker)var1.next(); + String quote = ticker.getQuoteCurrency(); + String base = ticker.getRootSymbol(); + Currency baseCurrencyCode = Currency.getInstance(base); + Currency quoteCurrencyCode = Currency.getInstance(quote); + CurrencyPair pair = new CurrencyPair(base, quote); + if (!assetPairMap.containsKey(ticker.getSymbol()) && !assetPairMap.containsValue(pair)) { + assetPairMap.put(ticker.getSymbol(), pair); + } + + if (!assetsMap.containsKey(quote) && !assetsMap.containsValue(quoteCurrencyCode)) { + assetsMap.put(quote, quoteCurrencyCode); + } + + if (!assetsMap.containsKey(base) && !assetsMap.containsValue(baseCurrencyCode)) { + assetsMap.put(base, baseCurrencyCode); + } + } + + } + + public static String createBitmexContract(BitmexContract contract) { + return (String)bitmexContracts.inverse().get(contract); + } + + public static CurrencyPair translateBitmexCurrencyPair(String currencyPairIn) { + CurrencyPair pair = (CurrencyPair)assetPairMap.get(currencyPairIn); + if (pair == null) { + Currency base; + Currency counter; + if (currencyPairIn.length() == 6) { + base = Currency.getInstance(currencyPairIn.substring(0, 3)); + if (base.getCommonlyUsedCurrency() != null) { + base = base.getCommonlyUsedCurrency(); + } + + counter = Currency.getInstance(currencyPairIn.substring(3, 6)); + if (counter.getCommonlyUsedCurrency() != null) { + counter = counter.getCommonlyUsedCurrency(); + } + + pair = new CurrencyPair(base, counter); + } else if (currencyPairIn.length() == 7) { + base = Currency.getInstance(currencyPairIn.substring(0, 4)); + if (base.getCommonlyUsedCurrency() != null) { + base = base.getCommonlyUsedCurrency(); + } + + counter = Currency.getInstance(currencyPairIn.substring(4, 7)); + if (counter.getCommonlyUsedCurrency() != null) { + counter = counter.getCommonlyUsedCurrency(); + } + + pair = new CurrencyPair(base, counter); + } + } + + return pair; + } + + public static String getBitmexCurrencyCode(Currency currency) { + if (currency.getIso4217Currency() != null) { + currency = currency.getIso4217Currency(); + } + + String bitmexCode = (String)assetsMap.inverse().get(currency); + if (bitmexCode == null) { + throw new ExchangeException("Bitmex does not support the currency code " + currency); + } else { + return bitmexCode; + } + } + + public static String translateCurrency(Currency currencyIn) { + String currencyOut = (String)bitmexCurrencies.get(currencyIn); + if (currencyOut == null) { + throw new ExchangeException("Bitmex does not support the currency code " + currencyIn); + } else { + return currencyOut; + } + } + + public static Currency translateBitmexCurrency(String currencyIn) { + Currency currencyOut = (Currency)bitmexCurrencies.inverse().get(currencyIn); + if (currencyOut == null) { + throw new ExchangeException("Bitmex does not support the currency code " + currencyIn); + } else { + return currencyOut; + } + } + + public static String translateBitmexContract(BitmexContract contractIn) { + String contractOut = (String)bitmexContracts.inverse().get(contractIn); + if (contractOut == null) { + throw new ExchangeException("Bitmex does not support the contact " + contractIn); + } else { + return contractOut; + } + } + + public static Currency translateBitmexCurrencyCode(String currencyIn) { + Currency currencyOut = (Currency)assetsMap.get(currencyIn); + if (currencyOut == null) { + throw new ExchangeException("Bitmex does not support the currency code " + currencyIn); + } else { + return currencyOut.getCommonlyUsedCurrency(); + } + } + + public class CustomBitmexContractSerializer extends JsonSerializer { + public CustomBitmexContractSerializer() { + } + + public void serialize(BitmexContract contract, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeString(contract.toString()); + } + } +} diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java index 68b7fd702..466d5e60a 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java @@ -1,8 +1,8 @@ package info.bitrich.xchangestream.bitmex; -import info.bitrich.xchangestream.core.ProductSubscription; import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingExchangeFactory; +import org.knowm.xchange.bitmex.BitmexPrompt; import org.knowm.xchange.currency.CurrencyPair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,6 +38,20 @@ public static void main(String[] args) { .subscribe(trade -> LOG.info("TRADE: {}", trade), throwable -> LOG.error("ERROR in getting trades: ", throwable)); + // Quarterly Contract + streamingMarketDataService.getOrderBook(xbtUsd, BitmexPrompt.QUARTERLY).subscribe(orderBook -> { + LOG.info("Quarterly Contract First ask: {}", orderBook.getAsks().get(0)); + LOG.info("Quarterly Contract First bid: {}", orderBook.getBids().get(0)); + }, throwable -> LOG.error("ERROR in getting Quarterly Contract order book: ", throwable)); + + streamingMarketDataService.getTicker(xbtUsd, BitmexPrompt.QUARTERLY).subscribe(ticker -> { + LOG.info("Quarterly Contract TICKER: {}", ticker); + }, throwable -> LOG.error("ERROR in getting Quarterly Contract ticker: ", throwable)); + + exchange.getStreamingMarketDataService().getTrades(xbtUsd, BitmexPrompt.QUARTERLY) + .subscribe(trade -> LOG.info("Quarterly Contract TRADE: {}", trade), + throwable -> LOG.error("ERROR in getting Quarterly Contract trades: ", throwable)); + try { Thread.sleep(100000); } catch (InterruptedException e) { From 043c57301ac5cc12fb972fb0e2bb75ab5e661311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sun, 20 May 2018 11:12:21 +0800 Subject: [PATCH 10/97] notification of reconnect failure --- .../service/netty/NettyStreamingService.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index e41bda1eb..6d7597adb 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -5,6 +5,7 @@ import java.net.URISyntaxException; import java.time.Duration; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -67,6 +68,7 @@ public Subscription(ObservableEmitter emitter, String channelName, Object[] a private final NioEventLoopGroup eventLoopGroup; protected Map channels = new ConcurrentHashMap<>(); private boolean compressedMessages = false; + private List> reconnFailEmitters = new LinkedList<>(); public NettyStreamingService(String apiUrl) { this(apiUrl, 65536); @@ -225,6 +227,10 @@ public void sendMessage(String message) { } } + public Observable subscribeReconnectFailure() { + return Observable.create(observableEmitter -> reconnFailEmitters.add(observableEmitter)); + } + public Observable subscribeChannel(String channelName, Object... args) { final String channelId = getSubscriptionUniqueId(channelName, args); LOG.info("Subscribing to channel {}", channelId); @@ -326,7 +332,10 @@ public void channelInactive(ChannelHandlerContext ctx) { super.channelInactive(ctx); LOG.info("Reopening websocket because it was closed by the host"); final Completable c = connect() - .doOnError(t -> LOG.warn("Problem with reconnect", t)) + .doOnError(t -> { + LOG.warn("Problem with reconnect", t); + reconnFailEmitters.stream().forEach(emitter -> emitter.onNext(t)); + }) .retryWhen(new RetryWithDelay(retryDuration.toMillis())) .doOnComplete(() -> { LOG.info("Resubscribing channels"); From 01c7a4a7493124620cb204b21c896f17537c58dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sun, 20 May 2018 11:12:41 +0800 Subject: [PATCH 11/97] to hetang repo --- pom.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2d3587750..97a36eaa5 100644 --- a/pom.xml +++ b/pom.xml @@ -61,9 +61,13 @@ - ossrh - https://oss.sonatype.org/content/repositories/snapshots + hetang_upload + http://45.76.152.47/repository/hetang/ + + + + ossrh https://oss.sonatype.org/service/local/staging/deploy/maven2/ From 6947c3c160193180f0da694c3f73d08afe41039f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sun, 20 May 2018 11:31:29 +0800 Subject: [PATCH 12/97] exchange interface support --- .../bitmex/BitmexStreamingExchange.java | 6 ++++++ .../xchangestream/core/StreamingExchange.java | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java index c9cf0ab8b..64d49fba2 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java @@ -4,6 +4,7 @@ import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.bitmex.BitmexExchange; import si.mazi.rescu.SynchronizedValueFactory; @@ -58,6 +59,11 @@ public StreamingMarketDataService getStreamingMarketDataService() { return streamingMarketDataService; } + @Override + public Observable reconnectFailure() { + return streamingService.subscribeReconnectFailure(); + } + @Override public boolean isAlive() { return streamingService.isSocketOpen(); diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java index b97a1332e..fbedf5d0d 100644 --- a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java +++ b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java @@ -1,7 +1,9 @@ package info.bitrich.xchangestream.core; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.Exchange; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; public interface StreamingExchange extends Exchange { /** @@ -26,6 +28,16 @@ public interface StreamingExchange extends Exchange { */ boolean isAlive(); + /** + * Observable for reconnection failure event. + * When this happens, it usually indicates that the server or the network is down. + * + * @return Observable with the exception during reconnection. + */ + default Observable reconnectFailure() { + throw new NotYetImplementedForExchangeException(); + } + /** * Returns service that can be used to access market data. */ From 6f264d1958c14ab28e939016e9333fb0680431b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sun, 20 May 2018 11:36:30 +0800 Subject: [PATCH 13/97] end --- .../xchangestream/binance/BinanceStreamingExchange.java | 6 ++++++ .../xchangestream/bitfinex/BitfinexStreamingExchange.java | 6 ++++++ .../bitrich/xchangestream/gdax/GDAXStreamingExchange.java | 6 ++++++ .../xchangestream/hitbtc/HitbtcStreamingExchange.java | 6 ++++++ .../xchangestream/okcoin/OkCoinStreamingExchange.java | 6 ++++++ 5 files changed, 30 insertions(+) diff --git a/xchange-binance/src/main/java/info/bitrich/xchangestream/binance/BinanceStreamingExchange.java b/xchange-binance/src/main/java/info/bitrich/xchangestream/binance/BinanceStreamingExchange.java index bc8720f8f..9caff383b 100644 --- a/xchange-binance/src/main/java/info/bitrich/xchangestream/binance/BinanceStreamingExchange.java +++ b/xchange-binance/src/main/java/info/bitrich/xchangestream/binance/BinanceStreamingExchange.java @@ -4,6 +4,7 @@ import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.binance.BinanceExchange; import org.knowm.xchange.currency.CurrencyPair; @@ -56,6 +57,11 @@ public boolean isAlive() { return streamingService!= null && streamingService.isSocketOpen(); } + @Override + public Observable reconnectFailure() { + return streamingService.subscribeReconnectFailure(); + } + @Override public StreamingMarketDataService getStreamingMarketDataService() { return streamingMarketDataService; diff --git a/xchange-bitfinex/src/main/java/info/bitrich/xchangestream/bitfinex/BitfinexStreamingExchange.java b/xchange-bitfinex/src/main/java/info/bitrich/xchangestream/bitfinex/BitfinexStreamingExchange.java index d1699d3d7..0f9a7d858 100644 --- a/xchange-bitfinex/src/main/java/info/bitrich/xchangestream/bitfinex/BitfinexStreamingExchange.java +++ b/xchange-bitfinex/src/main/java/info/bitrich/xchangestream/bitfinex/BitfinexStreamingExchange.java @@ -4,6 +4,7 @@ import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.bitfinex.v1.BitfinexExchange; @@ -41,6 +42,11 @@ public boolean isAlive() { return streamingService.isSocketOpen(); } + @Override + public Observable reconnectFailure() { + return streamingService.subscribeReconnectFailure(); + } + @Override public ExchangeSpecification getDefaultExchangeSpecification() { ExchangeSpecification spec = super.getDefaultExchangeSpecification(); diff --git a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingExchange.java b/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingExchange.java index 80ea24867..6bbb4ed13 100644 --- a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingExchange.java +++ b/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingExchange.java @@ -5,6 +5,7 @@ import info.bitrich.xchangestream.core.StreamingMarketDataService; import info.bitrich.xchangestream.service.netty.WebSocketClientHandler; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.gdax.GDAXExchange; @@ -43,6 +44,11 @@ public Completable disconnect() { return service.disconnect(); } + @Override + public Observable reconnectFailure() { + return streamingService.subscribeReconnectFailure(); + } + @Override public ExchangeSpecification getDefaultExchangeSpecification() { ExchangeSpecification spec = super.getDefaultExchangeSpecification(); diff --git a/xchange-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/HitbtcStreamingExchange.java b/xchange-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/HitbtcStreamingExchange.java index 7524cb36f..75432f3f9 100644 --- a/xchange-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/HitbtcStreamingExchange.java +++ b/xchange-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/HitbtcStreamingExchange.java @@ -4,6 +4,7 @@ import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.hitbtc.v2.HitbtcExchange; @@ -41,6 +42,11 @@ public boolean isAlive() { return streamingService.isSocketOpen(); } + @Override + public Observable reconnectFailure() { + return streamingService.subscribeReconnectFailure(); + } + @Override public ExchangeSpecification getDefaultExchangeSpecification() { ExchangeSpecification spec = super.getDefaultExchangeSpecification(); diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java index 3321f6ae0..769942f21 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java @@ -4,6 +4,7 @@ import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.okcoin.OkCoinExchange; public class OkCoinStreamingExchange extends OkCoinExchange implements StreamingExchange { @@ -41,6 +42,11 @@ public boolean isAlive() { return streamingService.isSocketOpen(); } + @Override + public Observable reconnectFailure() { + return streamingService.subscribeReconnectFailure(); + } + @Override public StreamingMarketDataService getStreamingMarketDataService() { return streamingMarketDataService; From 4910dcbab117062cd4b4c8fd0d39a0fca9f1e26d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 21 May 2018 16:18:05 +0800 Subject: [PATCH 14/97] bitmex trade service support --- .../bitmex/BitmexStreamingTradeService.java | 36 ++--- .../xchangestream/bitmex/dto/BitmexOrder.java | 130 +++++++++--------- .../dto/BitmexWebSocketTransaction.java | 17 +++ .../core/StreamingTradeService.java | 4 + 4 files changed, 108 insertions(+), 79 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java index 681365896..39d1630b3 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java @@ -1,6 +1,8 @@ package info.bitrich.xchangestream.bitmex; +import info.bitrich.xchangestream.bitmex.dto.BitmexOrder; +import info.bitrich.xchangestream.core.StreamingTradeService; import io.reactivex.Observable; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.Order; @@ -21,21 +23,21 @@ public BitmexStreamingTradeService(BitmexStreamingService streamingService) { this.streamingService = streamingService; } -// @Override -// public Observable getOrders(CurrencyPair currencyPair, Object... args) { -// String channelName = "order"; -// String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); -// return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { -// BitmexOrder[] bitmexOrders = s.toBitmexOrders(); -// return Arrays.stream(bitmexOrders) -// .filter(bitmexOrder -> bitmexOrder.symbol() == instrument) -// .filter(not(BitmexOrder::workingIndicator)) -// .map(BitmexOrder::toOrder).collect(Collectors.toList()); -// }); -// } -// -// @Override -// public void submitOrder(Order order, CurrencyPair var1, Object... var2) { -// throw new NotYetImplementedForExchangeException(); -// } + @Override + public Observable getOrders(CurrencyPair currencyPair, Object... args) { + String channelName = "order"; + String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { + BitmexOrder[] bitmexOrders = s.toBitmexOrders(); + return Arrays.stream(bitmexOrders) + .filter(bitmexOrder -> bitmexOrder.getSymbol() == instrument) + .filter(BitmexOrder::isNotWorkingIndicator) + .map(BitmexOrder::toOrder).collect(Collectors.toList()); + }); + } + + @Override + public void submitOrder(Order order, CurrencyPair var1, Object... var2) { + throw new NotYetImplementedForExchangeException(); + } } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java index 7e328df58..aaf6e0a48 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java @@ -2,16 +2,26 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import org.knowm.xchange.bitmex.BitmexUtils; import org.knowm.xchange.dto.Order; import org.knowm.xchange.dto.trade.LimitOrder; +import org.knowm.xchange.dto.trade.MarketOrder; + import java.math.BigDecimal; public class BitmexOrder extends BitmexMarketDataEvent { - public static final String ASK_SIDE = "Sell"; - public static final String BID_SIDE = "Buy"; + public enum OrderStatus { + NEW, + PARTIALLYFILLED, + FILLED, + TBD, + CANCELED, + REJECTED, + UNKNOW + } private String orderID; @@ -19,100 +29,96 @@ public class BitmexOrder extends BitmexMarketDataEvent { private String side; - private double price; + private BigDecimal price; + + private BigDecimal avgPx; private String ordType; - private String ordStatus; + private OrderStatus ordStatus; private String clOrdID; - private long orderQty; + private BigDecimal orderQty; - private long cumQty; + private BigDecimal cumQty; - private boolean workingIndicator; - - public boolean isNotWorking() { + public boolean isNotWorkingIndicator() { return !workingIndicator; } + private boolean workingIndicator; + @JsonCreator public BitmexOrder(@JsonProperty("symbol") String symbol, @JsonProperty("timestamp") String timestamp, @JsonProperty("orderID") String orderID, @JsonProperty("account") int account, @JsonProperty("side") String side, - @JsonProperty("price") double price, + @JsonProperty("price") BigDecimal price, + @JsonProperty("avgPx") BigDecimal avgPx, @JsonProperty("ordType") String ordType, @JsonProperty("ordStatus") String ordStatus, @JsonProperty("clOrdID") String clOrdID, - @JsonProperty("orderQty") long orderQty, - @JsonProperty("cumQty") long cumQty, + @JsonProperty("orderQty") BigDecimal orderQty, + @JsonProperty("cumQty") BigDecimal cumQty, @JsonProperty("workingIndicator") boolean workingIndicator) { super(symbol, timestamp); this.orderID = orderID; this.account = account; this.side = side; this.price = price; + this.avgPx = avgPx; this.ordType = ordType; - this.ordStatus = ordStatus; + try { + this.ordStatus = OrderStatus.valueOf(ordStatus.toUpperCase()); + } catch (Exception e) { + this.ordStatus = OrderStatus.UNKNOW; + } this.clOrdID = clOrdID; this.orderQty = orderQty; this.cumQty = cumQty; this.workingIndicator = workingIndicator; } - public Order.OrderType getOrderSide() { - return side.equals(ASK_SIDE) ? Order.OrderType.ASK : Order.OrderType.BID; - } - public Order toOrder() { - if (ordType.equals("Limit")) { - LimitOrder.Builder builder = new LimitOrder.Builder(); - builder.id(orderID) - .orderType(getOrderSide()) - .limitPrice(new BigDecimal(price)) - .originalAmount(new BigDecimal(orderQty)) - .cumulativeAmount(new BigDecimal(cumQty)) - - if (ordStatus.equals("Rejected") || ordStatus.equals("N/A")) { - return builder.orderStatus(Order.OrderStatus.REJECTED).build(); - } - return builder.build(); + Order.Builder order; + if (ordType.equals("Market")) { + order = new MarketOrder.Builder(side.equals("Buy") ? Order.OrderType.BID : Order.OrderType.ASK, BitmexUtils.translateBitmexCurrencyPair(symbol)); + } else { + order = new LimitOrder.Builder(side.equals("Buy") ? Order.OrderType.BID : Order.OrderType.ASK, BitmexUtils.translateBitmexCurrencyPair(symbol)); + } + order.id(orderID) + .averagePrice(avgPx) + .originalAmount(orderQty) + .cumulativeAmount(cumQty); + + switch (ordStatus) { + case NEW: + order.orderStatus(Order.OrderStatus.NEW); + break; + case PARTIALLYFILLED: + order.orderStatus(Order.OrderStatus.PARTIALLY_FILLED); + break; + case FILLED: + order.orderStatus(Order.OrderStatus.FILLED); + break; + case TBD: + order.orderStatus(Order.OrderStatus.PENDING_CANCEL); + break; + case CANCELED: + order.orderStatus(Order.OrderStatus.CANCELED); + break; + case REJECTED: + order.orderStatus(Order.OrderStatus.REJECTED); + default: + order.orderStatus(Order.OrderStatus.UNKNOWN); + break; + } + if (ordType.equals("Market")) { + return ((MarketOrder.Builder) order).build(); + } else { + return ((LimitOrder.Builder) order).build(); } -// builder.id(orderID) -// .orderType(getOrderSide()) -// .limitPrice(price) -// . -// -// return new LimitOrder() -// -// Order.Status status = Order.Status.fromName(ordStatus); -// if (status == FAILED || -// status == UNKNOW) { -// log.error("Got invalid order: {}", this.toString()); -// return Order.builder() -// .id(orderID) -// .clOrdID(clOrdID) -// .account(account) -// .status(status) -// .committedVol(committedVol) -// .build(); -// } -// Order order = Order.builder() -// .id(orderID) -// .clOrdID(clOrdID) -// .account(account) -// .status(status) -// .submittedVol(submittedVol) -// .committedVol(committedVol) -// .build(); -// if (status == Order.Status.NEW) { -// order.price(price) -// .tradeSide(side.equals("Buy") ? Order.TradeSide.OPEN_LONG : Order.TradeSide.OPEN_SHORT) -// .type(Order.OrderType.fromName(ordType)); -// } -// return order; } } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java index 210789609..d0a4b0a4c 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java @@ -68,6 +68,21 @@ public BitmexTrade[] toBitmexTrades() { return trades; } + public BitmexOrder[] toBitmexOrders() { + BitmexOrder[] orders = new BitmexOrder[this.data.size()]; + for(int i = 0; i < this.data.size(); ++i) { + JsonNode jsonOrder = this.data.get(i); + + try { + orders[i] = (BitmexOrder) this.mapper.readValue(jsonOrder.toString(), BitmexOrder.class); + } catch (IOException var5) { + var5.printStackTrace(); + } + } + + return orders; + } + public String getTable() { return table; } @@ -79,4 +94,6 @@ public String getAction() { public JsonNode getData() { return data; } + + } diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java index 15ea513e8..26ef91955 100644 --- a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java +++ b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java @@ -6,10 +6,14 @@ import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; + public interface StreamingTradeService { default Observable getOrders(CurrencyPair var1, Object... var2) { throw new NotYetImplementedForExchangeException(); } + default void submitOrder(Order order, CurrencyPair var1, Object...var2) { + throw new NotYetImplementedForExchangeException(); + } } From d93eb22e82b3d684f75b139a6f8e2f64ebaf0026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 24 May 2018 13:56:49 +0800 Subject: [PATCH 15/97] send ping message to server every 15 sec --- .../okcoin/OkCoinStreamingService.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index 097d1e538..b5e9ae278 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -4,16 +4,44 @@ import com.fasterxml.jackson.databind.ObjectMapper; import info.bitrich.xchangestream.okcoin.dto.WebSocketMessage; import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; +import io.reactivex.Completable; +import io.reactivex.CompletableSource; import org.knowm.xchange.exceptions.ExchangeException; import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; public class OkCoinStreamingService extends JsonNettyStreamingService { + private Timer pingPongTimer = null; + public OkCoinStreamingService(String apiUrl) { super(apiUrl); } + @Override + public Completable connect() { + Completable conn = super.connect(); + return conn.andThen((CompletableSource)(completable) -> { + try { + if (pingPongTimer != null) { + pingPongTimer.cancel(); + } + pingPongTimer = new Timer("OkexPingPong", false); + pingPongTimer.schedule(new TimerTask() { + @Override + public void run() { + OkCoinStreamingService.this.sendMessage("{\"event\":\"ping\"}"); + } + }, 15*1000, 15*1000); + completable.onComplete(); + } catch (Exception e) { + completable.onError(e); + } + }); + } + @Override protected String getChannelNameFromMessage(JsonNode message) throws IOException { return message.get("channel").asText(); @@ -37,6 +65,10 @@ public String getUnsubscribeMessage(String channelName) throws IOException { @Override protected void handleMessage(JsonNode message) { + if (message.get("event") != null && "pong".equals(message.get("event").asText()) ) { + // ignore pong message + return; + } if (message.get("data") != null) { if (message.get("data").has("result")) { boolean success = message.get("data").get("result").asBoolean(); From c561404103ed765da4de496752c617b4fd3188d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 24 May 2018 14:39:12 +0800 Subject: [PATCH 16/97] handle unexpected channel error --- .../xchangestream/service/netty/NettyStreamingService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index e41bda1eb..ede7fda8b 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -295,6 +295,10 @@ protected void handleChannelMessage(String channel, T message) { } protected void handleChannelError(String channel, Throwable t) { + if (!channel.contains(channel)) { + LOG.error("Unexpected channel's error: {}, {}.", channel, t); + return; + } ObservableEmitter emitter = channels.get(channel).emitter; if (emitter == null) { LOG.debug("No subscriber for channel {}.", channel); From 05a540e4a2e8fc261f6cd5291cdbf4c88782b419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 25 May 2018 19:00:15 +0800 Subject: [PATCH 17/97] try to fix kill bug --- .../service/netty/NettyStreamingService.java | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index 4a5493711..411c4e18a 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import io.reactivex.CompletableEmitter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -65,7 +66,7 @@ public Subscription(ObservableEmitter emitter, String channelName, Object[] a private Channel webSocketChannel; private Duration retryDuration; private Duration connectionTimeout; - private final NioEventLoopGroup eventLoopGroup; + private volatile NioEventLoopGroup eventLoopGroup; protected Map channels = new ConcurrentHashMap<>(); private boolean compressedMessages = false; private List> reconnFailEmitters = new LinkedList<>(); @@ -84,7 +85,6 @@ public NettyStreamingService(String apiUrl, int maxFramePayloadLength, Duration this.retryDuration = retryDuration; this.connectionTimeout = connectionTimeout; this.uri = new URI(apiUrl); - this.eventLoopGroup = new NioEventLoopGroup(); } catch (URISyntaxException e) { throw new IllegalArgumentException("Error parsing URI " + apiUrl, e); } @@ -131,6 +131,7 @@ uri, WebSocketVersion.V13, null, true, new DefaultHttpHeaders(), maxFramePayload this::messageHandler); Bootstrap b = new Bootstrap(); + eventLoopGroup = new NioEventLoopGroup(); b.group(eventLoopGroup) .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, java.lang.Math.toIntExact(connectionTimeout.toMillis())) .channel(NioSocketChannel.class) @@ -147,11 +148,11 @@ protected void initChannel(SocketChannel ch) { handlers.add(new HttpClientCodec()); if (compressedMessages) handlers.add(WebSocketClientCompressionHandler.INSTANCE); handlers.add(new HttpObjectAggregator(8192)); - + if (clientExtensionHandler != null) { - handlers.add(clientExtensionHandler); + handlers.add(clientExtensionHandler); } - + handlers.add(handler); p.addLast(handlers.toArray(new ChannelHandler[handlers.size()])); } @@ -164,18 +165,29 @@ protected void initChannel(SocketChannel ch) { if (f.isSuccess()) { completable.onComplete(); } else { - completable.onError(f.cause()); + handleError(completable, f.cause()); } }); } else { - completable.onError(future.cause()); + handleError(completable, future.cause()); } }); } catch (Exception throwable) { - completable.onError(throwable); + handleError(completable, throwable); + } + }); + } + + protected void handleError(CompletableEmitter completable, Throwable t) { + isManualDisconnect = true; + ChannelFuture disconnect = webSocketChannel.disconnect(); + disconnect.addListener(f -> { + if (f.isSuccess()) { + isManualDisconnect = false; } }); + completable.onError(t); } public Completable disconnect() { @@ -185,8 +197,10 @@ public Completable disconnect() { CloseWebSocketFrame closeFrame = new CloseWebSocketFrame(); webSocketChannel.writeAndFlush(closeFrame).addListener(future -> { channels = new ConcurrentHashMap<>(); - completable.onComplete(); + eventLoopGroup.shutdownGracefully().addListener(f -> completable.onComplete()); }); + } else { + completable.onComplete(); } }); } @@ -291,7 +305,12 @@ protected void handleError(T message, Throwable t) { protected void handleChannelMessage(String channel, T message) { - ObservableEmitter emitter = channels.get(channel).emitter; + NettyStreamingService.Subscription subscription = channels.get(channel); + if (subscription == null) { + LOG.debug("Channel has been closed {}.", channel); + return; + } + ObservableEmitter emitter = subscription.emitter; if (emitter == null) { LOG.debug("No subscriber for channel {}.", channel); return; @@ -301,11 +320,12 @@ protected void handleChannelMessage(String channel, T message) { } protected void handleChannelError(String channel, Throwable t) { - if (!channel.contains(channel)) { - LOG.error("Unexpected channel's error: {}, {}.", channel, t); + NettyStreamingService.Subscription subscription = channels.get(channel); + if (subscription == null) { + LOG.debug("Channel has been closed {}.", channel); return; } - ObservableEmitter emitter = channels.get(channel).emitter; + ObservableEmitter emitter = subscription.emitter; if (emitter == null) { LOG.debug("No subscriber for channel {}.", channel); return; @@ -354,5 +374,7 @@ public boolean isSocketOpen() { return webSocketChannel.isOpen(); } - public void useCompressedMessages(boolean compressedMessages) { this.compressedMessages = compressedMessages; } + public void useCompressedMessages(boolean compressedMessages) { + this.compressedMessages = compressedMessages; + } } From 1493d0f9ccb3b42021060f68eb2af6b848e60a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sun, 27 May 2018 07:20:53 +0800 Subject: [PATCH 18/97] okcoin handle result message --- .../bitrich/xchangestream/okcoin/OkCoinStreamingService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index 097d1e538..d103d3e43 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -42,6 +42,8 @@ protected void handleMessage(JsonNode message) { boolean success = message.get("data").get("result").asBoolean(); if (!success) { super.handleError(message, new ExchangeException("Error code: " + message.get("errorcode").asText())); + } else { + super.handleMessage(message); } return; } From afc2ff10fd5939ead381d8ee5c0cc91fa5ac40ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 28 May 2018 17:52:44 +0800 Subject: [PATCH 19/97] Nomsg support --- pom.xml | 2 +- .../service/netty/NettyStreamingService.java | 16 +++++++++++++++- .../okcoin/OkCoinStreamingService.java | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 97a36eaa5..44789d3ee 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ hetang_upload - http://45.76.152.47/repository/hetang/ + http://13.250.18.54/repository/hetang/ diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index 411c4e18a..8d6a32756 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -258,7 +258,9 @@ public Observable subscribeChannel(String channelName, Object... args) { Subscription newSubscription = new Subscription(e, channelName, args); channels.put(channelId, newSubscription); try { - sendMessage(getSubscribeMessage(channelName, args)); + if (args.length < 1 || !(args[0] instanceof String) || !(args[0].equals("NoMsg"))) { + sendMessage(getSubscribeMessage(channelName, args)); + } } catch (IOException throwable) { e.onError(throwable); } @@ -271,6 +273,18 @@ public Observable subscribeChannel(String channelName, Object... args) { }).share(); } + public void unsubscribeChannel(String channelName, Object... args) { + final String channelId = getSubscriptionUniqueId(channelName, args); + LOG.info("Unsubscribing to channel {}", channelId); + if (channels.containsKey(channelId)) { + try { + sendMessage(getUnsubscribeMessage(channelId)); + } catch (IOException e) { + } + channels.remove(channelId); + } + } + public void resubscribeChannels() { for (String channelId : channels.keySet()) { try { diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index ac663be9e..cac03a785 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -73,7 +73,7 @@ protected void handleMessage(JsonNode message) { if (message.get("data").has("result")) { boolean success = message.get("data").get("result").asBoolean(); if (!success) { - super.handleError(message, new ExchangeException("Error code: " + message.get("errorcode").asText())); + super.handleError(message, new ExchangeException("Error code: " + message.get("data").get("error_code").asText())); } else { super.handleMessage(message); } From 3adddf410dc1ce8fa9dc64fd6adc11935b57a9cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 28 May 2018 18:31:38 +0800 Subject: [PATCH 20/97] add observable for message delay --- .../bitmex/BitmexStreamingExchange.java | 10 ++++++ .../bitmex/BitmexStreamingService.java | 35 +++++++++++++++++-- .../bitmex/BitmexManualExample.java | 2 ++ .../okcoin/OkCoinStreamingExchange.java | 8 +++++ .../okcoin/OkCoinStreamingService.java | 24 ++++++++++--- .../okcoin/OkExManualExample.java | 1 + .../xchangestream/core/StreamingExchange.java | 12 +++++++ 7 files changed, 86 insertions(+), 6 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java index c9cf0ab8b..b75efb790 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java @@ -4,6 +4,9 @@ import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Completable; +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.bitmex.BitmexExchange; import si.mazi.rescu.SynchronizedValueFactory; @@ -65,4 +68,11 @@ public boolean isAlive() { @Override public void useCompressedMessages(boolean compressedMessages) { streamingService.useCompressedMessages(compressedMessages); } + + @Override + public Observable messageDelay() { + return Observable.create(delayEmitter -> { + streamingService.addDelayEmitter(delayEmitter); + }); + } } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java index e5dbc67f4..533dcb0bc 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java @@ -1,11 +1,14 @@ package info.bitrich.xchangestream.bitmex; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import com.fasterxml.jackson.databind.node.JsonNodeType; import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtensionHandler; import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler; +import io.reactivex.ObservableEmitter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +27,7 @@ public class BitmexStreamingService extends JsonNettyStreamingService { private static final Logger LOG = LoggerFactory.getLogger(BitmexStreamingService.class); private final ObjectMapper mapper = new ObjectMapper(); + private List> delayEmitters = new LinkedList<>(); public BitmexStreamingService(String apiUrl) { super(apiUrl, Integer.MAX_VALUE); @@ -32,6 +36,28 @@ public BitmexStreamingService(String apiUrl) { @Override protected void handleMessage(JsonNode message) { + if (!delayEmitters.isEmpty() && message.has("data")) { + JsonNode data = message.get("data"); + if (data.getNodeType().equals(JsonNodeType.ARRAY)) { + Long current = System.currentTimeMillis(); + SimpleDateFormat formatter; + formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + formatter.setTimeZone(TimeZone.getTimeZone("UTC")); + for (JsonNode d : data) { + if (d.has("timestamp")) { + try { + String timestamp = d.get("timestamp").asText(); + Date date = formatter.parse(timestamp); + for (ObservableEmitter emitter : delayEmitters) { + emitter.onNext(current - date.getTime()); + } + } catch (ParseException e) { + LOG.error("Parsing timestamp error: ", e); + } + } + } + } + } if (message.has("info") || message.has("success")) { return; } @@ -77,4 +103,9 @@ public String getUnsubscribeMessage(String channelName) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.writeValueAsString(subscribeMessage); } + + public void addDelayEmitter(ObservableEmitter delayEmitter) { + delayEmitters.add(delayEmitter); + } + } diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java index 68b7fd702..b9dfb2984 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java @@ -18,6 +18,8 @@ public static void main(String[] args) { StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); exchange.connect().blockingAwait(); + exchange.messageDelay().subscribe(delay -> LOG.info("Message delay: " + delay)); + final BitmexStreamingMarketDataService streamingMarketDataService = (BitmexStreamingMarketDataService) exchange.getStreamingMarketDataService(); CurrencyPair xbtUsd = CurrencyPair.XBT_USD; diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java index 3321f6ae0..333bc5167 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java @@ -4,6 +4,7 @@ import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.okcoin.OkCoinExchange; public class OkCoinStreamingExchange extends OkCoinExchange implements StreamingExchange { @@ -48,4 +49,11 @@ public StreamingMarketDataService getStreamingMarketDataService() { @Override public void useCompressedMessages(boolean compressedMessages) { streamingService.useCompressedMessages(compressedMessages); } + + @Override + public Observable messageDelay() { + return Observable.create(delayEmitter -> { + streamingService.addDelayEmitter(delayEmitter); + }); + } } diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index 097d1e538..0105e861b 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -4,12 +4,18 @@ import com.fasterxml.jackson.databind.ObjectMapper; import info.bitrich.xchangestream.okcoin.dto.WebSocketMessage; import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; +import io.reactivex.Emitter; +import io.reactivex.ObservableEmitter; import org.knowm.xchange.exceptions.ExchangeException; import java.io.IOException; +import java.util.LinkedList; +import java.util.List; public class OkCoinStreamingService extends JsonNettyStreamingService { + private List> delayEmitters = new LinkedList<>(); + public OkCoinStreamingService(String apiUrl) { super(apiUrl); } @@ -37,15 +43,25 @@ public String getUnsubscribeMessage(String channelName) throws IOException { @Override protected void handleMessage(JsonNode message) { - if (message.get("data") != null) { - if (message.get("data").has("result")) { - boolean success = message.get("data").get("result").asBoolean(); + JsonNode data = message.get("data"); + if (data != null) { + if (data.has("result")) { + boolean success = data.get("result").asBoolean(); if (!success) { - super.handleError(message, new ExchangeException("Error code: " + message.get("errorcode").asText())); + super.handleError(message, new ExchangeException("Error code: " + data.get("error_code").asText())); } return; } + if (data.has("timestamp")) { + for (ObservableEmitter emitter : delayEmitters) { + emitter.onNext(System.currentTimeMillis() - data.get("timestamp").asLong()); + } + } } super.handleMessage(message); } + + public void addDelayEmitter(ObservableEmitter delayEmitter) { + delayEmitters.add(delayEmitter); + } } diff --git a/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExManualExample.java b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExManualExample.java index d84f457c2..c16a61fca 100644 --- a/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExManualExample.java +++ b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExManualExample.java @@ -17,6 +17,7 @@ public static void main(String[] args) { StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(OkExStreamingExchange.class.getName()); exchange.connect().blockingAwait(); + exchange.messageDelay().subscribe(delay -> LOG.info("Delay time: " + delay)); CurrencyPair btcUsdt = new CurrencyPair(new Currency("BTC"), new Currency("USDT")); exchange.getStreamingMarketDataService().getOrderBook(btcUsdt).subscribe(orderBook -> { LOG.info("First ask: {}", orderBook.getAsks().get(0)); diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java index b97a1332e..300089c28 100644 --- a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java +++ b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java @@ -1,7 +1,9 @@ package info.bitrich.xchangestream.core; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.Exchange; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; public interface StreamingExchange extends Exchange { /** @@ -26,6 +28,16 @@ public interface StreamingExchange extends Exchange { */ boolean isAlive(); + /** + * Observable for message delay measure. + * Every time when the client received a message with a timestamp, the delay time is calculated and pushed to subscribers. + * + * @return Observable with the message delay measure. + */ + default Observable messageDelay() { + throw new NotYetImplementedForExchangeException(); + } + /** * Returns service that can be used to access market data. */ From 60b2e0a6fdea920815c3f99db018e5072264cabb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 28 May 2018 19:07:34 +0800 Subject: [PATCH 21/97] bitmex okex streamingservice protected --- .../bitrich/xchangestream/bitmex/BitmexStreamingExchange.java | 2 +- .../bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java index bf98d0f2b..6d31540e6 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java @@ -15,7 +15,7 @@ public class BitmexStreamingExchange extends BitmexExchange implements StreamingExchange { private static final String API_URI = "wss://www.bitmex.com/realtime"; - private final BitmexStreamingService streamingService; + protected final BitmexStreamingService streamingService; private BitmexStreamingMarketDataService streamingMarketDataService; public BitmexStreamingExchange() { diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java index fdd00d897..639fa934e 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java @@ -10,7 +10,7 @@ public class OkCoinStreamingExchange extends OkCoinExchange implements StreamingExchange { private static final String API_URI = "wss://real.okcoin.com:10440/websocket"; - private final OkCoinStreamingService streamingService; + protected final OkCoinStreamingService streamingService; private OkCoinStreamingMarketDataService streamingMarketDataService; public OkCoinStreamingExchange() { From 44d36ad8a9f02c30a2221482da78878b56d99d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 28 May 2018 19:13:46 +0800 Subject: [PATCH 22/97] marketstreamingservice protected streaming service --- .../xchangestream/bitmex/BitmexStreamingMarketDataService.java | 2 +- .../xchangestream/okcoin/OkCoinStreamingMarketDataService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index 098eb9f5e..f76e363df 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -26,7 +26,7 @@ public class BitmexStreamingMarketDataService implements StreamingMarketDataService { private static final Logger LOG = LoggerFactory.getLogger(BitmexStreamingMarketDataService.class); - private final BitmexStreamingService streamingService; + protected final BitmexStreamingService streamingService; private final SortedMap orderbooks = new TreeMap<>(); diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingMarketDataService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingMarketDataService.java index 10f8567a0..2661ebb4b 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingMarketDataService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingMarketDataService.java @@ -31,7 +31,7 @@ * https://github.com/okcoin-okex/API-docs-OKEx.com/blob/master/API-For-Futures-EN/WebSocket%20API%20for%20FUTURES.md */ public class OkCoinStreamingMarketDataService implements StreamingMarketDataService { - private final OkCoinStreamingService service; + protected final OkCoinStreamingService service; private final ObjectMapper mapper = new ObjectMapper(); private final Map orderbooks = new HashMap<>(); From 8a533f03a444ed180c50520ed3e7d926ca0e7ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 06:01:16 +0800 Subject: [PATCH 23/97] resubscribe channels --- .../xchangestream/bitmex/BitmexStreamingExchange.java | 5 +++++ .../bitrich/xchangestream/bitmex/BitmexStreamingService.java | 2 +- .../xchangestream/okcoin/OkCoinStreamingExchange.java | 5 +++++ .../info/bitrich/xchangestream/core/StreamingExchange.java | 4 ++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java index 6d31540e6..2e64d52db 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java @@ -80,4 +80,9 @@ public Observable messageDelay() { streamingService.addDelayEmitter(delayEmitter); }); } + + @Override + public void resubscribeChannels() { + streamingService.resubscribeChannels(); + } } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java index 05d53fe71..b0857c30a 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java @@ -27,7 +27,7 @@ */ public class BitmexStreamingService extends JsonNettyStreamingService { private static final Logger LOG = LoggerFactory.getLogger(BitmexStreamingService.class); - private final ObjectMapper mapper = new ObjectMapper(); + protected final ObjectMapper mapper = new ObjectMapper(); private List> delayEmitters = new LinkedList<>(); protected ExchangeSpecification exchangeSpecification; diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java index 639fa934e..62d2a73bb 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java @@ -61,4 +61,9 @@ public Observable messageDelay() { streamingService.addDelayEmitter(delayEmitter); }); } + + @Override + public void resubscribeChannels() { + streamingService.resubscribeChannels(); + } } diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java index 819493988..28368fcb1 100644 --- a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java +++ b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java @@ -48,6 +48,10 @@ default Observable messageDelay() { throw new NotYetImplementedForExchangeException(); } + default void resubscribeChannels() { + throw new NotYetImplementedForExchangeException(); + } + /** * Returns service that can be used to access market data. */ From b2aba30efc90b52426f4002d0245cddd6b75c036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 06:26:39 +0800 Subject: [PATCH 24/97] eventloop leap fix --- .../xchangestream/service/netty/NettyStreamingService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index 8d6a32756..a7fbc76f7 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -93,6 +93,9 @@ public NettyStreamingService(String apiUrl, int maxFramePayloadLength, Duration public Completable connect() { return Completable.create(completable -> { try { + if (eventLoopGroup != null) { + eventLoopGroup.shutdownGracefully(); + } LOG.info("Connecting to {}://{}:{}{}", uri.getScheme(), uri.getHost(), uri.getPort(), uri.getPath()); String scheme = uri.getScheme() == null ? "ws" : uri.getScheme(); From d1b29d84aed00c7276c846ce82d15f7d624229e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 06:56:04 +0800 Subject: [PATCH 25/97] sleep before reconnect --- .../xchangestream/service/netty/NettyStreamingService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index a7fbc76f7..585c8a3ad 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -371,7 +371,11 @@ public void channelInactive(ChannelHandlerContext ctx) { isManualDisconnect = false; } else { super.channelInactive(ctx); - LOG.info("Reopening websocket because it was closed by the host"); + LOG.info("Sleep for " + retryDuration.toMillis() + "ms before reopening websocket because it was closed by the host"); + try { + Thread.sleep(retryDuration.toMillis()); + } catch (InterruptedException e) { + } final Completable c = connect() .doOnError(t -> { LOG.warn("Problem with reconnect", t); From 33d8a1ff6560d5447236373b1f6bafb02322d6ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 07:08:08 +0800 Subject: [PATCH 26/97] observable of disconnect --- .../service/netty/NettyStreamingService.java | 8 +++++++- .../xchangestream/bitmex/BitmexStreamingExchange.java | 6 ++++++ .../xchangestream/okcoin/OkCoinStreamingExchange.java | 6 ++++++ .../bitrich/xchangestream/core/StreamingExchange.java | 10 ++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index 585c8a3ad..3602bebc2 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -70,6 +70,7 @@ public Subscription(ObservableEmitter emitter, String channelName, Object[] a protected Map channels = new ConcurrentHashMap<>(); private boolean compressedMessages = false; private List> reconnFailEmitters = new LinkedList<>(); + private List> disconnectEimitters = new LinkedList<>(); public NettyStreamingService(String apiUrl) { this(apiUrl, 65536); @@ -245,7 +246,11 @@ public void sendMessage(String message) { } public Observable subscribeReconnectFailure() { - return Observable.create(observableEmitter -> reconnFailEmitters.add(observableEmitter)); + return Observable.create(observableEmitter -> reconnFailEmitters.add(observableEmitter)); + } + + public Observable subscribeDisconnect() { + return Observable.create(observableEmitter -> disconnectEimitters.add(observableEmitter)); } public Observable subscribeChannel(String channelName, Object... args) { @@ -371,6 +376,7 @@ public void channelInactive(ChannelHandlerContext ctx) { isManualDisconnect = false; } else { super.channelInactive(ctx); + disconnectEimitters.stream().forEach(emitter -> emitter.onNext(ctx)); LOG.info("Sleep for " + retryDuration.toMillis() + "ms before reopening websocket because it was closed by the host"); try { Thread.sleep(retryDuration.toMillis()); diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java index 2e64d52db..90cbf05ae 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java @@ -3,6 +3,7 @@ import info.bitrich.xchangestream.core.ProductSubscription; import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; +import io.netty.channel.ChannelHandlerContext; import io.reactivex.Completable; import io.reactivex.Observable; import org.knowm.xchange.ExchangeSpecification; @@ -66,6 +67,11 @@ public Observable reconnectFailure() { return streamingService.subscribeReconnectFailure(); } + @Override + public Observable disconnectObservable() { + return streamingService.subscribeDisconnect(); + } + @Override public boolean isAlive() { return streamingService.isSocketOpen(); diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java index 62d2a73bb..dcc68f0d1 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingExchange.java @@ -3,6 +3,7 @@ import info.bitrich.xchangestream.core.ProductSubscription; import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; +import io.netty.channel.ChannelHandlerContext; import io.reactivex.Completable; import io.reactivex.Observable; import org.knowm.xchange.okcoin.OkCoinExchange; @@ -47,6 +48,11 @@ public Observable reconnectFailure() { return streamingService.subscribeReconnectFailure(); } + @Override + public Observable disconnectObservable() { + return streamingService.subscribeDisconnect(); + } + @Override public StreamingMarketDataService getStreamingMarketDataService() { return streamingMarketDataService; diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java index 28368fcb1..b8617c3f4 100644 --- a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java +++ b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingExchange.java @@ -1,5 +1,6 @@ package info.bitrich.xchangestream.core; +import io.netty.channel.ChannelHandlerContext; import io.reactivex.Completable; import io.reactivex.Observable; import org.knowm.xchange.Exchange; @@ -28,6 +29,15 @@ public interface StreamingExchange extends Exchange { */ boolean isAlive(); + /** + * Observable for disconnection event. + * + * @return Observable with the exception during reconnection. + */ + default Observable disconnectObservable() { + throw new NotYetImplementedForExchangeException(); + } + /** * Observable for reconnection failure event. * When this happens, it usually indicates that the server or the network is down. From 4e9ffa48e445cb30aac3efdf038acd774fbbfd7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 07:18:20 +0800 Subject: [PATCH 27/97] not reconnect if observe disconnect --- .../service/netty/NettyStreamingService.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index 3602bebc2..8b41afea7 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -94,7 +94,7 @@ public NettyStreamingService(String apiUrl, int maxFramePayloadLength, Duration public Completable connect() { return Completable.create(completable -> { try { - if (eventLoopGroup != null) { + if (eventLoopGroup != null && !eventLoopGroup.isShutdown() && !eventLoopGroup.isShuttingDown()) { eventLoopGroup.shutdownGracefully(); } LOG.info("Connecting to {}://{}:{}{}", uri.getScheme(), uri.getHost(), uri.getPort(), uri.getPath()); @@ -376,7 +376,13 @@ public void channelInactive(ChannelHandlerContext ctx) { isManualDisconnect = false; } else { super.channelInactive(ctx); - disconnectEimitters.stream().forEach(emitter -> emitter.onNext(ctx)); + if (!disconnectEimitters.isEmpty()) { + disconnectEimitters.stream().forEach(emitter -> emitter.onNext(ctx)); + if (eventLoopGroup != null && !eventLoopGroup.isShutdown() && !eventLoopGroup.isShuttingDown()) { + eventLoopGroup.shutdownGracefully(); + } + return; + } LOG.info("Sleep for " + retryDuration.toMillis() + "ms before reopening websocket because it was closed by the host"); try { Thread.sleep(retryDuration.toMillis()); From 497538ea460fcd7b54873499b15b5d7f4b3db522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 08:55:50 +0800 Subject: [PATCH 28/97] bug fix --- .../xchangestream/service/netty/NettyStreamingService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index 8b41afea7..d07c042c9 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -376,11 +376,11 @@ public void channelInactive(ChannelHandlerContext ctx) { isManualDisconnect = false; } else { super.channelInactive(ctx); + if (eventLoopGroup != null && !eventLoopGroup.isShutdown() && !eventLoopGroup.isShuttingDown()) { + eventLoopGroup.shutdownGracefully(); + } if (!disconnectEimitters.isEmpty()) { disconnectEimitters.stream().forEach(emitter -> emitter.onNext(ctx)); - if (eventLoopGroup != null && !eventLoopGroup.isShutdown() && !eventLoopGroup.isShuttingDown()) { - eventLoopGroup.shutdownGracefully(); - } return; } LOG.info("Sleep for " + retryDuration.toMillis() + "ms before reopening websocket because it was closed by the host"); From a61aa85c13d33ffce53a3ba6614d6f3238f82bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 09:35:18 +0800 Subject: [PATCH 29/97] bug fix --- .../xchangestream/service/netty/NettyStreamingService.java | 3 --- .../bitrich/xchangestream/okcoin/OkCoinStreamingService.java | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index d07c042c9..910ade063 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -376,9 +376,6 @@ public void channelInactive(ChannelHandlerContext ctx) { isManualDisconnect = false; } else { super.channelInactive(ctx); - if (eventLoopGroup != null && !eventLoopGroup.isShutdown() && !eventLoopGroup.isShuttingDown()) { - eventLoopGroup.shutdownGracefully(); - } if (!disconnectEimitters.isEmpty()) { disconnectEimitters.stream().forEach(emitter -> emitter.onNext(ctx)); return; diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index ba182267e..3105b86bb 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -71,6 +71,9 @@ public String getUnsubscribeMessage(String channelName) throws IOException { @Override protected void handleMessage(JsonNode message) { + if (message.has("event") && message.get("event").equals("pong")) { + return; + } JsonNode data = message.get("data"); if (data != null) { if (data.has("result")) { From 89c627643d3d27efe68d9309e33722ffd88f9bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 09:36:39 +0800 Subject: [PATCH 30/97] bug fix --- .../bitrich/xchangestream/okcoin/OkCoinStreamingService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index 3105b86bb..4761f7ecc 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -71,7 +71,8 @@ public String getUnsubscribeMessage(String channelName) throws IOException { @Override protected void handleMessage(JsonNode message) { - if (message.has("event") && message.get("event").equals("pong")) { + if (message.get("event") != null && "pong".equals(message.get("event").asText()) ) { + // ignore pong message return; } JsonNode data = message.get("data"); From c972bf4b070884aa19b75be97112534a62f0574d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 10:13:36 +0800 Subject: [PATCH 31/97] bug fix --- .../bitrich/xchangestream/okcoin/OkCoinStreamingService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index 4761f7ecc..5cc8c1e71 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -82,6 +82,7 @@ protected void handleMessage(JsonNode message) { if (!success) { super.handleError(message, new ExchangeException("Error code: " + data.get("error_code").asText())); } + super.handleMessage(message); return; } if (data.has("timestamp")) { From d87f4a00025013b08b6e935f5102785f69ef30a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 29 May 2018 17:02:08 +0800 Subject: [PATCH 32/97] try catch --- .../netty/JsonNettyStreamingService.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java index b6bf7d487..cf8deda5d 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java @@ -21,25 +21,29 @@ public JsonNettyStreamingService(String apiUrl, int maxFramePayloadLength) { @Override public void messageHandler(String message) { - LOG.debug("Received message: {}", message); - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode jsonNode; - - // Parse incoming message to JSON try { - jsonNode = objectMapper.readTree(message); - } catch (IOException e) { - LOG.error("Error parsing incoming message to JSON: {}", message); - return; - } + LOG.debug("Received message: {}", message); + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode; + + // Parse incoming message to JSON + try { + jsonNode = objectMapper.readTree(message); + } catch (IOException e) { + LOG.error("Error parsing incoming message to JSON: {}", message); + return; + } - // In case of array - handle every message separately. - if (jsonNode.getNodeType().equals(JsonNodeType.ARRAY)) { - for (JsonNode node : jsonNode) { - handleMessage(node); + // In case of array - handle every message separately. + if (jsonNode.getNodeType().equals(JsonNodeType.ARRAY)) { + for (JsonNode node : jsonNode) { + handleMessage(node); + } + } else { + handleMessage(jsonNode); } - } else { - handleMessage(jsonNode); + } catch (Exception exception) { + LOG.error("Error while handling message '{}': {}", message, exception); } } } From 8009a86498deaff6413dc4d04751eb00b0a76a5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Wed, 30 May 2018 13:58:05 +0800 Subject: [PATCH 33/97] add maven release plugin --- pom.xml | 15 +++++++++-- .../bitmex/BitmexStreamingService.java | 25 +++++++++++-------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 44789d3ee..5853f328f 100644 --- a/pom.xml +++ b/pom.xml @@ -69,9 +69,13 @@ - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + hetang_upload + http://13.250.18.54/repository/hetang_release/ + + + + @@ -153,6 +157,13 @@ release + + + org.apache.maven.plugins + maven-release-plugin + 2.5.3 + + org.sonatype.plugins nexus-staging-maven-plugin diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java index b0857c30a..a63d442ba 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java @@ -78,23 +78,28 @@ public Completable connect() { @Override protected void handleMessage(JsonNode message) { if (!delayEmitters.isEmpty() && message.has("data")) { + String table = ""; + if (message.has("table")) { + table = message.get("table").asText(); + } JsonNode data = message.get("data"); if (data.getNodeType().equals(JsonNodeType.ARRAY)) { Long current = System.currentTimeMillis(); SimpleDateFormat formatter; formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); - for (JsonNode d : data) { - if (d.has("timestamp")) { - try { - String timestamp = d.get("timestamp").asText(); - Date date = formatter.parse(timestamp); - for (ObservableEmitter emitter : delayEmitters) { - emitter.onNext(current - date.getTime()); - } - } catch (ParseException e) { - LOG.error("Parsing timestamp error: ", e); + JsonNode d = data.get(0); + if (d != null && d.has("timestamp") && + (!"order".equals(table) || d.has("ordStatus") && "NEW".equals(d.get("ordStatus").asText()))) { + try { + String timestamp = d.get("timestamp").asText(); + Date date = formatter.parse(timestamp); + long delay = current - date.getTime(); + for (ObservableEmitter emitter : delayEmitters) { + emitter.onNext(delay); } + } catch (ParseException e) { + LOG.error("Parsing timestamp error: ", e); } } } From a6f3dd19481a830dcc974627f61da2cc0369973b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Wed, 30 May 2018 14:07:58 +0800 Subject: [PATCH 34/97] change scm --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 5853f328f..1027edcf2 100644 --- a/pom.xml +++ b/pom.xml @@ -53,9 +53,9 @@ - scm:git:git@github.com:bitrich-info/xchange-stream.git - scm:git:git@github.com:bitrich-info/xchange-stream.git - git@github.com:bitrich-info/xchange-stream.git + scm:git:git@github.com:declan94/xchange-stream.git + scm:git:git@github.com:declan94/xchange-stream.git + git@https://github.com/declan94/xchange-stream HEAD From 6180c93c63d0a8b0ecf345a3146a9d9e89241001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Wed, 30 May 2018 14:09:03 +0800 Subject: [PATCH 35/97] [maven-release-plugin] rollback the release of xchange-stream-parent-ht1.0.0 --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 1027edcf2..5853f328f 100644 --- a/pom.xml +++ b/pom.xml @@ -53,9 +53,9 @@ - scm:git:git@github.com:declan94/xchange-stream.git - scm:git:git@github.com:declan94/xchange-stream.git - git@https://github.com/declan94/xchange-stream + scm:git:git@github.com:bitrich-info/xchange-stream.git + scm:git:git@github.com:bitrich-info/xchange-stream.git + git@github.com:bitrich-info/xchange-stream.git HEAD From 2276b4f11174de69518d2f2b696baaa25a6255f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Wed, 30 May 2018 14:15:24 +0800 Subject: [PATCH 36/97] scm --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 5853f328f..295c1a1c7 100644 --- a/pom.xml +++ b/pom.xml @@ -53,9 +53,9 @@ - scm:git:git@github.com:bitrich-info/xchange-stream.git - scm:git:git@github.com:bitrich-info/xchange-stream.git - git@github.com:bitrich-info/xchange-stream.git + scm:git:git@github.com:declan94/xchange-stream.git + scm:git:git@github.com:declan94/xchange-stream.git + https://github.com/declan94/xchange-stream HEAD From 50740255a3a2c2731fe6802fb7c82c85302a908a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Wed, 30 May 2018 14:16:05 +0800 Subject: [PATCH 37/97] [maven-release-plugin] prepare release xchange-stream-parent-4.3.2.1 --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 5 ++--- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 23 insertions(+), 24 deletions(-) diff --git a/pom.xml b/pom.xml index 295c1a1c7..3243e08c0 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.3-SNAPSHOT + 4.3.2.1 xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - HEAD + xchange-stream-parent-4.3.2.1 diff --git a/service-core/pom.xml b/service-core/pom.xml index 452483868..597e756d6 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index bcb0a6d48..b3f3330e3 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 59bdaff6a..158f16b17 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index fc0cb4201..6d0e9b03f 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 46709df16..8045af8ed 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 7971d21f3..8d15ef54a 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index d531f9541..d0485ea3e 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 004adda53..1ab61323a 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index d9ef1d0cf..01a39561a 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 6c53bc117..c2ea7e1db 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 9aa98e733..e855ea233 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index a47e65ae3..ec652515b 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index 77386fd8e..f0ee9371a 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index b6565675f..c92c74dd0 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index f5ce04424..d4531c385 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -1,10 +1,9 @@ - + xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index b8d99f529..c045008f7 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 42b324168..553c3ecef 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 6cba8957b..0948dc3ac 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index f3cdd77c1..90612dd1d 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 436f3f214..b49df523c 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.1 4.0.0 From fc827a4dfd25915145f5acb230c72a6f0f0d7834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Wed, 30 May 2018 14:16:17 +0800 Subject: [PATCH 38/97] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 3243e08c0..295c1a1c7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.1 + 4.3.3-SNAPSHOT xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.1 + HEAD diff --git a/service-core/pom.xml b/service-core/pom.xml index 597e756d6..452483868 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index b3f3330e3..bcb0a6d48 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 158f16b17..59bdaff6a 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 6d0e9b03f..fc0cb4201 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 8045af8ed..46709df16 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 8d15ef54a..7971d21f3 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index d0485ea3e..d531f9541 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 1ab61323a..004adda53 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 01a39561a..d9ef1d0cf 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index c2ea7e1db..6c53bc117 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index e855ea233..9aa98e733 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index ec652515b..a47e65ae3 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index f0ee9371a..77386fd8e 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index c92c74dd0..b6565675f 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index d4531c385..37e657a32 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index c045008f7..b8d99f529 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 553c3ecef..42b324168 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 0948dc3ac..6cba8957b 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 90612dd1d..f3cdd77c1 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index b49df523c..436f3f214 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.1 + 4.3.3-SNAPSHOT 4.0.0 From 5e87fb2a7df89dbe6a2a78735de8e38a5b7e9d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 1 Jun 2018 12:19:12 +0800 Subject: [PATCH 39/97] do not send pingpong when disconnected --- .../bitrich/xchangestream/okcoin/OkCoinStreamingService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index 5cc8c1e71..8b361f258 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -38,7 +38,9 @@ public Completable connect() { pingPongTimer.schedule(new TimerTask() { @Override public void run() { - OkCoinStreamingService.this.sendMessage("{\"event\":\"ping\"}"); + if (OkCoinStreamingService.this.isSocketOpen()) { + OkCoinStreamingService.this.sendMessage("{\"event\":\"ping\"}"); + } } }, 15 * 1000, 15 * 1000); completable.onComplete(); From dd03c80def39965ef677bbe7817767d73f2d10c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 1 Jun 2018 18:23:41 +0800 Subject: [PATCH 40/97] translate bitmex contract --- .../xchangestream/bitmex/BitmexUtils.java | 16 ++++++++++++---- .../okcoin/OkExFuturesManualExample.java | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java index b2270cbe0..76ad8485f 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java @@ -149,12 +149,20 @@ public static Currency translateBitmexCurrency(String currencyIn) { } public static String translateBitmexContract(BitmexContract contractIn) { - String contractOut = (String)bitmexContracts.inverse().get(contractIn); + String contractOut = bitmexContracts.inverse().get(contractIn); if (contractOut == null) { - throw new ExchangeException("Bitmex does not support the contact " + contractIn); - } else { - return contractOut; + if (contractIn.prompt == BitmexPrompt.QUARTERLY) { + contractOut = bitmexContracts.inverse().get(new BitmexContract(contractIn.pair, BitmexPrompt.MONTHLY)); + if (contractOut == null) { + contractOut = bitmexContracts.inverse().get(new BitmexContract(contractIn.pair, BitmexPrompt.WEEKLY)); + } + } + if (contractOut == null) { + throw new ExchangeException("Bitmex does not support the contact " + contractIn); + } + } + return contractOut; } public static Currency translateBitmexCurrencyCode(String currencyIn) { diff --git a/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java index b6f44078b..35092a139 100644 --- a/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java +++ b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java @@ -11,7 +11,7 @@ public class OkExFuturesManualExample { private static final Logger LOG = LoggerFactory.getLogger(OkExManualExample.class); public static void main(String[] args) { - StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(OkExFuturesManualExample.class.getName()); + StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(OkExStreamingExchange.class.getName()); exchange.connect().blockingAwait(); exchange.getStreamingMarketDataService().getOrderBook(CurrencyPair.BTC_USD, FuturesContract.Quarter).subscribe(orderBook -> { From f3d29d687f918571a92f93d496ba8db609f56bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sat, 2 Jun 2018 18:27:00 +0800 Subject: [PATCH 41/97] okcoin orderbook bug fix --- .../BitmexStreamingMarketDataService.java | 7 +-- .../OkCoinStreamingMarketDataService.java | 58 ++++++++++--------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index f76e363df..77fefb69f 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -15,10 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.List; -import java.util.SortedMap; -import java.util.TreeMap; +import java.util.*; /** * Created by Lukas Zaoralek on 13.11.17. @@ -59,7 +56,7 @@ public Observable getOrderBook(CurrencyPair currencyPair, Object... a orderbook = orderbooks.get(instrument); //ignore updates until first "partial" if (orderbook == null) { - return null; + return new OrderBook(new Date(), Collections.emptyList(), Collections.emptyList()); } BitmexLimitOrder[] levels = s.toBitmexOrderbookLevels(); orderbook.updateLevels(levels, action); diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingMarketDataService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingMarketDataService.java index 2661ebb4b..549d990e5 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingMarketDataService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingMarketDataService.java @@ -34,7 +34,7 @@ public class OkCoinStreamingMarketDataService implements StreamingMarketDataServ protected final OkCoinStreamingService service; private final ObjectMapper mapper = new ObjectMapper(); - private final Map orderbooks = new HashMap<>(); + private final Map orderbooks = new HashMap<>(); OkCoinStreamingMarketDataService(OkCoinStreamingService service) { this.service = service; @@ -58,45 +58,49 @@ public class OkCoinStreamingMarketDataService implements StreamingMarketDataServ @Override public Observable getOrderBook(CurrencyPair currencyPair, Object... args) { String channel = String.format("ok_sub_spot_%s_%s_depth", currencyPair.base.toString().toLowerCase(), currencyPair.counter.toString().toLowerCase()); - + boolean fullData = false; if (args.length > 0) { if (args[0] instanceof FuturesContract) { FuturesContract contract = (FuturesContract) args[0]; channel = String.format("ok_sub_future%s_%s_depth_%s", currencyPair.counter.toString().toLowerCase(), currencyPair.base.toString().toLowerCase(), contract.getName()); if (args.length > 1) { channel = channel + "_" + args[1]; + fullData = true; } } else { channel = channel + "_" + args[1]; + fullData = true; } } + if (fullData) { + return this.service.subscribeChannel(channel).map((s) -> { + OkCoinDepth okCoinDepth = this.mapper.treeToValue(s.get("data"), OkCoinDepth.class); + return OkCoinAdapters.adaptOrderBook(okCoinDepth, currencyPair); + }); + } + final String key = channel; + return this.service.subscribeChannel(channel).map((s) -> { + OkCoinOrderbook okCoinOrderbook; + if (!this.orderbooks.containsKey(key)) { + OkCoinDepth okCoinDepth = this.mapper.treeToValue(s.get("data"), OkCoinDepth.class); + okCoinOrderbook = new OkCoinOrderbook(okCoinDepth); + this.orderbooks.put(key, okCoinOrderbook); + } else { + okCoinOrderbook = this.orderbooks.get(key); + BigDecimal[][] bidLevels; + if (s.get("data").has("asks") && s.get("data").get("asks").size() > 0) { + bidLevels = this.mapper.treeToValue(s.get("data").get("asks"), BigDecimal[][].class); + okCoinOrderbook.updateLevels(bidLevels, Order.OrderType.ASK); + } - return service.subscribeChannel(channel) - .map(s -> { - OkCoinOrderbook okCoinOrderbook; - if (!orderbooks.containsKey(currencyPair)) { - OkCoinDepth okCoinDepth = mapper.treeToValue(s.get("data"), OkCoinDepth.class); - okCoinOrderbook = new OkCoinOrderbook(okCoinDepth); - orderbooks.put(currencyPair, okCoinOrderbook); - } else { - okCoinOrderbook = orderbooks.get(currencyPair); - if (s.get("data").has("asks")) { - if (s.get("data").get("asks").size() > 0) { - BigDecimal[][] askLevels = mapper.treeToValue(s.get("data").get("asks"), BigDecimal[][].class); - okCoinOrderbook.updateLevels(askLevels, Order.OrderType.ASK); - } - } - - if (s.get("data").has("bids")) { - if (s.get("data").get("bids").size() > 0) { - BigDecimal[][] bidLevels = mapper.treeToValue(s.get("data").get("bids"), BigDecimal[][].class); - okCoinOrderbook.updateLevels(bidLevels, Order.OrderType.BID); - } - } - } + if (s.get("data").has("bids") && s.get("data").get("bids").size() > 0) { + bidLevels = this.mapper.treeToValue(s.get("data").get("bids"), BigDecimal[][].class); + okCoinOrderbook.updateLevels(bidLevels, Order.OrderType.BID); + } + } - return OkCoinAdapters.adaptOrderBook(okCoinOrderbook.toOkCoinDepth(s.get("data").get("timestamp").asLong()), currencyPair); - }); + return OkCoinAdapters.adaptOrderBook(okCoinOrderbook.toOkCoinDepth(s.get("data").get("timestamp").asLong()), currencyPair); + }); } /** From dbd34868ec61c108138e7ef5a6a3433f1133b8a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 4 Jun 2018 14:29:10 +0800 Subject: [PATCH 42/97] maven repo address using domain name --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 295c1a1c7..c2d8c0c48 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ hetang_upload - http://13.250.18.54/repository/hetang/ + http://repo.maven.fqt.fund/repository/hetang/ @@ -70,7 +70,7 @@ hetang_upload - http://13.250.18.54/repository/hetang_release/ + http://repo.maven.fqt.fund/repository/hetang_release/ From f4aa587ede78db03d4171318ff19ba9571173485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Tue, 5 Jun 2018 14:53:08 +0800 Subject: [PATCH 43/97] maven-release auto version submodules --- pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pom.xml b/pom.xml index c2d8c0c48..e443e9930 100644 --- a/pom.xml +++ b/pom.xml @@ -162,6 +162,9 @@ org.apache.maven.plugins maven-release-plugin 2.5.3 + + true + From 01529dfeb8a90b0d08f9d7b7bed62094e87ed4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sat, 9 Jun 2018 10:11:52 +0800 Subject: [PATCH 44/97] pom snapshot version --- pom.xml | 2 +- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/pom.xml b/pom.xml index e443e9930..3f72d2c8a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT xchange-stream-core diff --git a/service-core/pom.xml b/service-core/pom.xml index 452483868..8eb7a7dce 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index bcb0a6d48..b133bef58 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 59bdaff6a..45d09795f 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index fc0cb4201..f740c88bc 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 46709df16..303a3ffc7 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 7971d21f3..4445dcf5d 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index d531f9541..7b203d1b3 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 004adda53..adaf7512e 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index d9ef1d0cf..215347f8c 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 6c53bc117..8778ae419 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 9aa98e733..74ccd7da3 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index a47e65ae3..71dc84b4d 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index 77386fd8e..f7afffc2c 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index b6565675f..d8d596c91 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 37e657a32..4caddad52 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index b8d99f529..4d0aef73c 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 42b324168..44d198057 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 6cba8957b..11476365b 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index f3cdd77c1..bf7b4af63 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 436f3f214..c459688bc 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.3-SNAPSHOT + 4.3.2.2-SNAPSHOT 4.0.0 From 19c0f7259d0db056c5048c1014d972a46d4fcee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sat, 9 Jun 2018 10:25:44 +0800 Subject: [PATCH 45/97] okcoin pingpong using reactiveX --- .../okcoin/OkCoinStreamingService.java | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index b5e9ae278..feb9ce489 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -4,17 +4,23 @@ import com.fasterxml.jackson.databind.ObjectMapper; import info.bitrich.xchangestream.okcoin.dto.WebSocketMessage; import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; +import info.bitrich.xchangestream.service.netty.WebSocketClientHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; import io.reactivex.Completable; import io.reactivex.CompletableSource; +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; import org.knowm.xchange.exceptions.ExchangeException; import java.io.IOException; -import java.util.Timer; -import java.util.TimerTask; +import java.util.concurrent.TimeUnit; public class OkCoinStreamingService extends JsonNettyStreamingService { - private Timer pingPongTimer = null; + private Observable pingPongSrc = Observable.interval(15, 15, TimeUnit.SECONDS); + + private Disposable pingPongSubscription; public OkCoinStreamingService(String apiUrl) { super(apiUrl); @@ -25,16 +31,12 @@ public Completable connect() { Completable conn = super.connect(); return conn.andThen((CompletableSource)(completable) -> { try { - if (pingPongTimer != null) { - pingPongTimer.cancel(); + if (pingPongSubscription != null && !pingPongSubscription.isDisposed()) { + pingPongSubscription.dispose(); } - pingPongTimer = new Timer("OkexPingPong", false); - pingPongTimer.schedule(new TimerTask() { - @Override - public void run() { - OkCoinStreamingService.this.sendMessage("{\"event\":\"ping\"}"); - } - }, 15*1000, 15*1000); + pingPongSubscription = pingPongSrc.subscribe(o -> { + this.sendMessage("{\"event\":\"ping\"}"); + }); completable.onComplete(); } catch (Exception e) { completable.onError(e); @@ -80,4 +82,24 @@ protected void handleMessage(JsonNode message) { } super.handleMessage(message); } + + @Override + protected WebSocketClientHandler getWebSocketClientHandler(WebSocketClientHandshaker handshaker, WebSocketClientHandler.WebSocketMessageHandler handler) { + return new OkCoinNettyWebSocketClientHandler(handshaker, handler); + } + + protected class OkCoinNettyWebSocketClientHandler extends NettyWebSocketClientHandler { + + protected OkCoinNettyWebSocketClientHandler(WebSocketClientHandshaker handshaker, WebSocketMessageHandler handler) { + super(handshaker, handler); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) { + if (pingPongSubscription != null && !pingPongSubscription.isDisposed()) { + pingPongSubscription.dispose(); + } + super.channelInactive(ctx); + } + } } From 40b3fdb269a211f9c07a8c6b95e0ca1c33d61a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 15 Jun 2018 04:47:22 +0800 Subject: [PATCH 46/97] log unsubscribed error --- .../xchangestream/service/netty/NettyStreamingService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index 910ade063..2a172c189 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -335,6 +335,7 @@ protected void handleChannelMessage(String channel, T message) { ObservableEmitter emitter = subscription.emitter; if (emitter == null) { LOG.debug("No subscriber for channel {}.", channel); + LOG.warn("Received unsubscribed message: {}", message); return; } @@ -350,6 +351,7 @@ protected void handleChannelError(String channel, Throwable t) { ObservableEmitter emitter = subscription.emitter; if (emitter == null) { LOG.debug("No subscriber for channel {}.", channel); + LOG.error("Received unsubscribed error: {}", t); return; } From 223aadfff83fac8b435a1a71df242abe5657a839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 15 Jun 2018 16:56:08 +0800 Subject: [PATCH 47/97] [maven-release-plugin] prepare release xchange-stream-parent-4.3.2.2 --- pom.xml | 20 ++++++++++---------- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 30 insertions(+), 30 deletions(-) diff --git a/pom.xml b/pom.xml index 3f72d2c8a..705d58232 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.2-SNAPSHOT + 4.3.2.2 xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - HEAD + xchange-stream-parent-4.3.2.2 @@ -78,14 +78,14 @@ - - - - sonatype-oss-snapshot - - https://oss.sonatype.org/content/repositories/snapshots - - + + + + + + + + 4.3.5 diff --git a/service-core/pom.xml b/service-core/pom.xml index 8eb7a7dce..55075c179 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index b133bef58..8577d05e1 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 45d09795f..e29082cbc 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index f740c88bc..3d1203534 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 303a3ffc7..093208168 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 4445dcf5d..affecc7d4 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index 7b203d1b3..e2393e559 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index adaf7512e..43c6575b3 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 215347f8c..746747854 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 8778ae419..d30be65c3 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 74ccd7da3..7f9366d4e 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index 71dc84b4d..285161d55 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index f7afffc2c..fa7d3d487 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index d8d596c91..51d4f85a6 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 4caddad52..0e1b1cb57 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index 4d0aef73c..c036ae0bb 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 44d198057..ab509cdbf 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 11476365b..636899e7a 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index bf7b4af63..98c090265 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index c459688bc..321d573c7 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2-SNAPSHOT + 4.3.2.2 4.0.0 From 7a63920f3449bd391065ff6b880f4fc7987bf59b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 15 Jun 2018 16:56:27 +0800 Subject: [PATCH 48/97] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 705d58232..24aebd77c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.2 + 4.3.2.3-SNAPSHOT xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.2 + HEAD diff --git a/service-core/pom.xml b/service-core/pom.xml index 55075c179..7c0224d15 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 8577d05e1..9e6b549c6 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index e29082cbc..b8c67ac5e 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 3d1203534..9616533b0 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 093208168..ac356fe33 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index affecc7d4..2d38cacea 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index e2393e559..2721860b4 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 43c6575b3..bee458893 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 746747854..336449f18 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index d30be65c3..a10590169 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 7f9366d4e..96185d145 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index 285161d55..9db4afd10 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index fa7d3d487..6d5dcdedc 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index 51d4f85a6..ceceb79fb 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 0e1b1cb57..26df34ac6 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index c036ae0bb..34f9c49ac 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index ab509cdbf..d9df5d35c 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 636899e7a..ea9478be0 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 98c090265..fd4a6db2a 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 321d573c7..0e39e66b7 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.2 + 4.3.2.3-SNAPSHOT 4.0.0 From 464e9ffbc9fecb2f5adce158e03864c379ee2a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 15 Jun 2018 20:01:19 +0800 Subject: [PATCH 49/97] log --- .../xchangestream/service/netty/NettyStreamingService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index 2a172c189..a359d280f 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -330,6 +330,7 @@ protected void handleChannelMessage(String channel, T message) { NettyStreamingService.Subscription subscription = channels.get(channel); if (subscription == null) { LOG.debug("Channel has been closed {}.", channel); + LOG.warn("Received unsubscribed message: {}", message); return; } ObservableEmitter emitter = subscription.emitter; @@ -346,6 +347,7 @@ protected void handleChannelError(String channel, Throwable t) { NettyStreamingService.Subscription subscription = channels.get(channel); if (subscription == null) { LOG.debug("Channel has been closed {}.", channel); + LOG.error("Received unsubscribed error: {}", t); return; } ObservableEmitter emitter = subscription.emitter; From 5b7bc4b1da2b622974671209a84495e2cd93f0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 15 Jun 2018 20:03:39 +0800 Subject: [PATCH 50/97] [maven-release-plugin] prepare release xchange-stream-parent-4.3.2.3 --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 24aebd77c..77536b3b2 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.3-SNAPSHOT + 4.3.2.3 xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - HEAD + xchange-stream-parent-4.3.2.3 diff --git a/service-core/pom.xml b/service-core/pom.xml index 7c0224d15..13a3cfab9 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 9e6b549c6..7923bc492 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index b8c67ac5e..5cdbb6fc9 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 9616533b0..beeb345ff 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index ac356fe33..ced2f5a70 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 2d38cacea..776814294 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index 2721860b4..0c80d6eb6 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index bee458893..d71bf3cf8 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 336449f18..1ee24ae53 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index a10590169..7051768d1 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 96185d145..1d35a87e2 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index 9db4afd10..a268e7012 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index 6d5dcdedc..709156433 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index ceceb79fb..afc6662f6 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 26df34ac6..613d92862 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index 34f9c49ac..c340e48c3 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index d9df5d35c..fb7a2989c 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index ea9478be0..612605015 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index fd4a6db2a..47f6127b5 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 0e39e66b7..2f1c43b70 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3-SNAPSHOT + 4.3.2.3 4.0.0 From cc497ab18c9d3157d1b5725af7249309661a3f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 15 Jun 2018 20:03:54 +0800 Subject: [PATCH 51/97] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 77536b3b2..a845ed864 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.3 + 4.3.2.4-SNAPSHOT xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.3 + HEAD diff --git a/service-core/pom.xml b/service-core/pom.xml index 13a3cfab9..b46402e8e 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 7923bc492..043c718f4 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 5cdbb6fc9..db5a2e49a 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index beeb345ff..9cd5f3cc3 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index ced2f5a70..fd25ad677 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 776814294..cd4375f56 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index 0c80d6eb6..6c697cdf0 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index d71bf3cf8..f0e60ad71 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 1ee24ae53..43a98e0d2 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 7051768d1..0c869c503 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 1d35a87e2..c76b08f4c 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index a268e7012..c94c3267e 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index 709156433..bde5372d4 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index afc6662f6..903a84576 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 613d92862..c6b40e179 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index c340e48c3..daae148d9 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index fb7a2989c..cacaf35c5 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 612605015..96d7b5517 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 47f6127b5..70128757d 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 2f1c43b70..d49482f33 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.3 + 4.3.2.4-SNAPSHOT 4.0.0 From a54bce4d599f0ae8129a69d0c9286909e5ea2593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Fri, 22 Jun 2018 15:00:17 +0800 Subject: [PATCH 52/97] fcoin get orderbook --- pom.xml | 3 +- .../FCoinStreamingMarketDataService.java | 44 +++++++++++++ .../fcoin/FCoinStreamingService.java | 62 +++++++++++++++++++ .../xchangestream/fcoin/dto/FCoinMessage.java | 30 +++++++++ xchange-fcoin/src/main/resources/log4j2.xml | 14 +++++ .../fcoin/FCoinManualExample.java | 28 +++++++++ 6 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingMarketDataService.java create mode 100644 xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingService.java create mode 100644 xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/dto/FCoinMessage.java create mode 100644 xchange-fcoin/src/main/resources/log4j2.xml create mode 100644 xchange-fcoin/src/test/java/info/bitrich/xchangestream/fcoin/FCoinManualExample.java diff --git a/pom.xml b/pom.xml index a845ed864..66239bf77 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,7 @@ xchange-wex xchange-binance xchange-hitbtc + xchange-fcoin xchange-stream @@ -88,7 +89,7 @@ - 4.3.5 + 4.3.7-SNAPSHOT UTF-8 UTF-8 1.8 diff --git a/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingMarketDataService.java b/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingMarketDataService.java new file mode 100644 index 000000000..0e211983d --- /dev/null +++ b/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingMarketDataService.java @@ -0,0 +1,44 @@ +package info.bitrich.xchangestream.fcoin; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import info.bitrich.xchangestream.core.StreamingMarketDataService; +import io.reactivex.Observable; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.marketdata.OrderBook; +import org.knowm.xchange.dto.marketdata.Ticker; +import org.knowm.xchange.dto.marketdata.Trade; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; +import org.knowm.xchange.fcoin.FCoinAdapters; +import org.knowm.xchange.fcoin.dto.marketdata.FCoinDepth; + +public class FCoinStreamingMarketDataService implements StreamingMarketDataService { + protected final FCoinStreamingService service; + + private final ObjectMapper mapper = new ObjectMapper(); + + FCoinStreamingMarketDataService(FCoinStreamingService service) { + this.service = service; + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + @Override + public Observable getOrderBook(CurrencyPair currencyPair, Object... args) { + String channel = String.format("depth.L20.%s%s", currencyPair.base.toString().toLowerCase(), currencyPair.counter.toString().toLowerCase()); + return this.service.subscribeChannel(channel).map((s) -> { + FCoinDepth fCoinDepth = this.mapper.treeToValue(s, FCoinDepth.class); + return FCoinAdapters.adaptOrderBook(fCoinDepth, currencyPair); + }); + } + + @Override + public Observable getTicker(CurrencyPair currencyPair, Object... args) { + throw new NotYetImplementedForExchangeException(); + } + + @Override + public Observable getTrades(CurrencyPair currencyPair, Object... args) { + throw new NotYetImplementedForExchangeException(); + } + +} diff --git a/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingService.java b/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingService.java new file mode 100644 index 000000000..f149770cc --- /dev/null +++ b/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingService.java @@ -0,0 +1,62 @@ +package info.bitrich.xchangestream.fcoin; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import info.bitrich.xchangestream.fcoin.dto.FCoinMessage; +import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; +import io.reactivex.ObservableEmitter; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +public class FCoinStreamingService extends JsonNettyStreamingService { + + private List> delayEmitters = new LinkedList<>(); + + public FCoinStreamingService(String apiUrl) { + super(apiUrl); + } + + @Override + protected String getChannelNameFromMessage(JsonNode message) throws IOException { + if (!message.has("type")) { + throw new IOException("No channel"); + } + return message.get("type").asText(); + } + + @Override + public String getSubscribeMessage(String channelName, Object... args) throws IOException { + FCoinMessage FCoinMessage = new FCoinMessage(null, "sub", channelName); + + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.writeValueAsString(FCoinMessage); + } + + @Override + public String getUnsubscribeMessage(String channelName) throws IOException { + FCoinMessage FCoinMessage = new FCoinMessage(null, "unsub", channelName); + + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.writeValueAsString(FCoinMessage); + } + + @Override + protected void handleMessage(JsonNode message) { + if (message != null) { + if (message.has("ts")) { + for (ObservableEmitter emitter : delayEmitters) { + emitter.onNext(System.currentTimeMillis() - message.get("timestamp").asLong()); + } + } + } + super.handleMessage(message); + } + + public void addDelayEmitter(ObservableEmitter delayEmitter) { + delayEmitters.add(delayEmitter); + } + + } + diff --git a/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/dto/FCoinMessage.java b/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/dto/FCoinMessage.java new file mode 100644 index 000000000..b22621bf8 --- /dev/null +++ b/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/dto/FCoinMessage.java @@ -0,0 +1,30 @@ +package info.bitrich.xchangestream.fcoin.dto; + +import java.util.Arrays; +import java.util.List; + +public class FCoinMessage { + + private final String id; + private final String cmd; + private final List args; + + public FCoinMessage(String id, String cmd, String ... args) { + this.id = id; + this.cmd = cmd; + this.args = Arrays.asList(args); + } + + public String getId() { + return id; + } + + public String getCmd() { + return cmd; + } + + public List getArgs() { + return args; + } + +} diff --git a/xchange-fcoin/src/main/resources/log4j2.xml b/xchange-fcoin/src/main/resources/log4j2.xml new file mode 100644 index 000000000..e9aee3965 --- /dev/null +++ b/xchange-fcoin/src/main/resources/log4j2.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xchange-fcoin/src/test/java/info/bitrich/xchangestream/fcoin/FCoinManualExample.java b/xchange-fcoin/src/test/java/info/bitrich/xchangestream/fcoin/FCoinManualExample.java new file mode 100644 index 000000000..0e52c46a0 --- /dev/null +++ b/xchange-fcoin/src/test/java/info/bitrich/xchangestream/fcoin/FCoinManualExample.java @@ -0,0 +1,28 @@ +package info.bitrich.xchangestream.fcoin; + +import info.bitrich.xchangestream.core.StreamingExchange; +import info.bitrich.xchangestream.core.StreamingExchangeFactory; +import org.knowm.xchange.currency.CurrencyPair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FCoinManualExample { + private static final Logger LOG = LoggerFactory.getLogger(FCoinManualExample.class); + + public static void main(String[] args) { + StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(FCoinStreamingExchange.class.getName()); + exchange.connect().blockingAwait(); + + exchange.getStreamingMarketDataService().getOrderBook(CurrencyPair.BTC_USDT).subscribe(orderBook -> { + LOG.info("First ask: {}", orderBook.getAsks().get(0).getLimitPrice()); + LOG.info("First bid: {}", orderBook.getBids().get(0).getLimitPrice()); + }, throwable -> LOG.error("ERROR in getting order book: ", throwable)); + + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} + From 96d7ddea5d98b2458156b639eb41bd38087b1f19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 5 Jul 2018 15:34:10 +0800 Subject: [PATCH 53/97] resubscribe with no message problem --- .../service/netty/NettyStreamingService.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index a359d280f..aa7cc6d7d 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -297,7 +297,10 @@ public void resubscribeChannels() { for (String channelId : channels.keySet()) { try { Subscription subscription = channels.get(channelId); - sendMessage(getSubscribeMessage(subscription.channelName, subscription.args)); + Object[] args = subscription.args; + if (args.length < 1 || !(args[0] instanceof String) || !(args[0].equals("NoMsg"))) { + sendMessage(getSubscribeMessage(subscription.channelName, args)); + } } catch (IOException e) { LOG.error("Failed to reconnect channel: {}", channelId); } @@ -347,13 +350,13 @@ protected void handleChannelError(String channel, Throwable t) { NettyStreamingService.Subscription subscription = channels.get(channel); if (subscription == null) { LOG.debug("Channel has been closed {}.", channel); - LOG.error("Received unsubscribed error: {}", t); + LOG.error("Received unsubscribed error: ", t); return; } ObservableEmitter emitter = subscription.emitter; if (emitter == null) { LOG.debug("No subscriber for channel {}.", channel); - LOG.error("Received unsubscribed error: {}", t); + LOG.error("Received unsubscribed error: ", t); return; } From 41d56cb92e06b412ca9eb1258e2a9d2027fedb34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 5 Jul 2018 18:26:11 +0800 Subject: [PATCH 54/97] [maven-release-plugin] prepare release xchange-stream-parent-4.3.2.4 --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 66239bf77..32267aac2 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,6 @@ xchange-wex xchange-binance xchange-hitbtc - xchange-fcoin xchange-stream @@ -89,7 +88,7 @@ - 4.3.7-SNAPSHOT + 4.3.6 UTF-8 UTF-8 1.8 From 21cb997a142b1ad5f22ba448cea97737e57b96be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 5 Jul 2018 18:26:27 +0800 Subject: [PATCH 55/97] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/pom.xml b/pom.xml index 32267aac2..1248feab8 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT xchange-stream-core diff --git a/service-core/pom.xml b/service-core/pom.xml index b46402e8e..5c047fe54 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 043c718f4..23b8e343d 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index db5a2e49a..3a695ec5f 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 9cd5f3cc3..2328a8643 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index fd25ad677..d410a88c4 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index cd4375f56..a47f02569 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index 6c697cdf0..bd8ea2d8e 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index f0e60ad71..187d4f3c6 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 43a98e0d2..488db748d 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 0c869c503..4a6657157 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index c76b08f4c..00e38e2dd 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index c94c3267e..2b3bc8a85 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index bde5372d4..c8f1a8093 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index 903a84576..fe892138b 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index c6b40e179..e541c8b77 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index daae148d9..aea2b5788 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index cacaf35c5..5eec25ef1 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 96d7b5517..747d963a5 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 70128757d..10bd6d6aa 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index d49482f33..e02b0cf7a 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.5-SNAPSHOT 4.0.0 From 4e3395e3fd0a0955fadf005fe2b81633b6e4310b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 5 Jul 2018 18:35:14 +0800 Subject: [PATCH 56/97] [maven-release-plugin] prepare release xchange-stream-parent-4.3.2.4 --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 1248feab8..c2f158eab 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.5-SNAPSHOT + 4.3.2.4 xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - HEAD + xchange-stream-parent-4.3.2.4 diff --git a/service-core/pom.xml b/service-core/pom.xml index 5c047fe54..71be59b3f 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 23b8e343d..9de721a84 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 3a695ec5f..23770724d 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 2328a8643..7275d670b 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index d410a88c4..9ee45ae35 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index a47f02569..b909cd3dc 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index bd8ea2d8e..27072f3f7 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 187d4f3c6..1063a96f3 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 488db748d..b097cdd5b 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 4a6657157..1f456d336 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 00e38e2dd..eac891a2d 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index 2b3bc8a85..38897b9ee 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index c8f1a8093..005dc5313 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index fe892138b..0da60881a 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index e541c8b77..76e845445 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index aea2b5788..9a342d3b1 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 5eec25ef1..273b75cb7 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 747d963a5..5ba318932 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 10bd6d6aa..c08b60446 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index e02b0cf7a..01834d89c 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.4 4.0.0 From 8e30939a4221eb92f79f8c31cc1d6cfe5690da2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 5 Jul 2018 18:39:30 +0800 Subject: [PATCH 57/97] Revert "resubscribe with no message problem" This reverts commit 96d7ddea5d98b2458156b639eb41bd38087b1f19. --- .../service/netty/NettyStreamingService.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index aa7cc6d7d..a359d280f 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -297,10 +297,7 @@ public void resubscribeChannels() { for (String channelId : channels.keySet()) { try { Subscription subscription = channels.get(channelId); - Object[] args = subscription.args; - if (args.length < 1 || !(args[0] instanceof String) || !(args[0].equals("NoMsg"))) { - sendMessage(getSubscribeMessage(subscription.channelName, args)); - } + sendMessage(getSubscribeMessage(subscription.channelName, subscription.args)); } catch (IOException e) { LOG.error("Failed to reconnect channel: {}", channelId); } @@ -350,13 +347,13 @@ protected void handleChannelError(String channel, Throwable t) { NettyStreamingService.Subscription subscription = channels.get(channel); if (subscription == null) { LOG.debug("Channel has been closed {}.", channel); - LOG.error("Received unsubscribed error: ", t); + LOG.error("Received unsubscribed error: {}", t); return; } ObservableEmitter emitter = subscription.emitter; if (emitter == null) { LOG.debug("No subscriber for channel {}.", channel); - LOG.error("Received unsubscribed error: ", t); + LOG.error("Received unsubscribed error: {}", t); return; } From bb7397e2b5e8b869f541b313715ddb49b1d547eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 5 Jul 2018 18:45:04 +0800 Subject: [PATCH 58/97] to snapshot --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index c2f158eab..8316112e8 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.4 + 4.3.2.4-SNAPSHOT xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.4 + xchange-stream-parent-4.3.2.4-SNAPSHOT diff --git a/service-core/pom.xml b/service-core/pom.xml index 71be59b3f..b46402e8e 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 9de721a84..043c718f4 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 23770724d..db5a2e49a 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 7275d670b..9cd5f3cc3 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 9ee45ae35..fd25ad677 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index b909cd3dc..cd4375f56 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index 27072f3f7..6c697cdf0 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 1063a96f3..f0e60ad71 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index b097cdd5b..43a98e0d2 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 1f456d336..0c869c503 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index eac891a2d..c76b08f4c 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index 38897b9ee..c94c3267e 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index 005dc5313..bde5372d4 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index 0da60881a..903a84576 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 76e845445..c6b40e179 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index 9a342d3b1..daae148d9 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 273b75cb7..cacaf35c5 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 5ba318932..96d7b5517 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index c08b60446..70128757d 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 01834d89c..d49482f33 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.4-SNAPSHOT 4.0.0 From e9b6706bb52e3b67beac787cc316b3ba61efeccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 5 Jul 2018 18:45:40 +0800 Subject: [PATCH 59/97] [maven-release-plugin] prepare release xchange-stream-parent-4.3.2.4 --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 8316112e8..c2f158eab 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.4-SNAPSHOT + 4.3.2.4 xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.4-SNAPSHOT + xchange-stream-parent-4.3.2.4 diff --git a/service-core/pom.xml b/service-core/pom.xml index b46402e8e..71be59b3f 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 043c718f4..9de721a84 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index db5a2e49a..23770724d 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 9cd5f3cc3..7275d670b 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index fd25ad677..9ee45ae35 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index cd4375f56..b909cd3dc 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index 6c697cdf0..27072f3f7 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index f0e60ad71..1063a96f3 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 43a98e0d2..b097cdd5b 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 0c869c503..1f456d336 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index c76b08f4c..eac891a2d 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index c94c3267e..38897b9ee 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index bde5372d4..005dc5313 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index 903a84576..0da60881a 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index c6b40e179..76e845445 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index daae148d9..9a342d3b1 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index cacaf35c5..273b75cb7 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 96d7b5517..5ba318932 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 70128757d..c08b60446 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index d49482f33..01834d89c 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4-SNAPSHOT + 4.3.2.4 4.0.0 From 16270a4feef4e2d02f648f4ddf0d83557572bf8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Thu, 5 Jul 2018 18:46:41 +0800 Subject: [PATCH 60/97] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index c2f158eab..7c7f2cd8e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.4 + 4.3.2.5-SNAPSHOT xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.4 + xchange-stream-parent-4.3.2.4-SNAPSHOT diff --git a/service-core/pom.xml b/service-core/pom.xml index 71be59b3f..5c047fe54 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 9de721a84..23b8e343d 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 23770724d..3a695ec5f 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 7275d670b..2328a8643 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 9ee45ae35..d410a88c4 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index b909cd3dc..a47f02569 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index 27072f3f7..bd8ea2d8e 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 1063a96f3..187d4f3c6 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index b097cdd5b..488db748d 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 1f456d336..4a6657157 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index eac891a2d..00e38e2dd 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index 38897b9ee..2b3bc8a85 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index 005dc5313..c8f1a8093 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index 0da60881a..fe892138b 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 76e845445..e541c8b77 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index 9a342d3b1..aea2b5788 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 273b75cb7..5eec25ef1 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 5ba318932..747d963a5 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index c08b60446..10bd6d6aa 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 01834d89c..e02b0cf7a 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.4 + 4.3.2.5-SNAPSHOT 4.0.0 From f89c35b808b0f8611036a7e342ab808d95f31ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sat, 21 Jul 2018 15:26:21 +0800 Subject: [PATCH 61/97] resubscribe with no message problem fix --- .../xchangestream/service/netty/NettyStreamingService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index a359d280f..b66c9fad4 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -297,7 +297,10 @@ public void resubscribeChannels() { for (String channelId : channels.keySet()) { try { Subscription subscription = channels.get(channelId); - sendMessage(getSubscribeMessage(subscription.channelName, subscription.args)); + Object[] args = subscription.args; + if (args.length < 1 || !(args[0] instanceof String) || !(args[0].equals("NoMsg"))) { + sendMessage(getSubscribeMessage(subscription.channelName, args)); + } } catch (IOException e) { LOG.error("Failed to reconnect channel: {}", channelId); } From 4bdb55bb7dd39e9cd487e9445164490a8394c1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sat, 21 Jul 2018 15:28:15 +0800 Subject: [PATCH 62/97] [maven-release-plugin] prepare release xchange-stream-parent-4.3.2.5 --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 7c7f2cd8e..0bd2914b6 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.5-SNAPSHOT + 4.3.2.5 xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.4-SNAPSHOT + xchange-stream-parent-4.3.2.5 diff --git a/service-core/pom.xml b/service-core/pom.xml index 5c047fe54..71f7d95cf 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 23b8e343d..9a4ce1d73 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 3a695ec5f..f987fa8de 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 2328a8643..78d864ad9 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index d410a88c4..7a8e9b7d8 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index a47f02569..4e425480a 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index bd8ea2d8e..eb58eec30 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 187d4f3c6..5783e3dd8 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 488db748d..b1488e74c 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 4a6657157..6ebceeddf 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 00e38e2dd..cf2167eb5 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index 2b3bc8a85..d0bb66a37 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index c8f1a8093..c7199a14f 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index fe892138b..b1092c5e8 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index e541c8b77..6599042ab 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index aea2b5788..49fc8c688 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 5eec25ef1..560cb3f09 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 747d963a5..d3907c368 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 10bd6d6aa..6710dd14c 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index e02b0cf7a..26960e6bc 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5-SNAPSHOT + 4.3.2.5 4.0.0 From 6410cd5e318a8c286d3f9dc10888a1fcbc420772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sat, 21 Jul 2018 15:28:36 +0800 Subject: [PATCH 63/97] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 0bd2914b6..997e2b6b8 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.5 + 4.3.2.6-SNAPSHOT xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.5 + xchange-stream-parent-4.3.2.4-SNAPSHOT diff --git a/service-core/pom.xml b/service-core/pom.xml index 71f7d95cf..38db28be1 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 9a4ce1d73..ae15c58ba 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index f987fa8de..20afdc8c7 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 78d864ad9..416f7920c 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 7a8e9b7d8..f066c834c 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 4e425480a..c5c2a5262 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index eb58eec30..b5753d5c5 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 5783e3dd8..81cb19978 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index b1488e74c..8e9d37330 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 6ebceeddf..9c77ea1f4 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index cf2167eb5..8964620a7 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index d0bb66a37..39925e756 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index c7199a14f..26523629b 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index b1092c5e8..0affbda73 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 6599042ab..6d4aa920f 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index 49fc8c688..fed65826d 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 560cb3f09..ffc5abf91 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index d3907c368..6007570b8 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 6710dd14c..65bf7cda3 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 26960e6bc..1252ee987 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.5 + 4.3.2.6-SNAPSHOT 4.0.0 From b3121d6be8a5f43b4b7006ffb81570af58cb8cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 30 Jul 2018 17:19:08 +0800 Subject: [PATCH 64/97] okex error handle bug --- .../bitrich/xchangestream/okcoin/OkCoinStreamingService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index 9a720f599..936a9dd0f 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -82,7 +82,9 @@ protected void handleMessage(JsonNode message) { if (data.has("result")) { boolean success = data.get("result").asBoolean(); if (!success) { - super.handleError(message, new ExchangeException("Error code: " + data.get("error_code").asText())); + if (!"ok_futureusd_trade".equals(getChannel(message))) { + super.handleError(message, new ExchangeException("Error code: " + data.get("error_code").asText())); + } } super.handleMessage(message); return; From e631d4d23e55122495c454f95b651c0007890f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 30 Jul 2018 17:31:02 +0800 Subject: [PATCH 65/97] [maven-release-plugin] prepare release xchange-stream-parent-4.3.2.6 --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 997e2b6b8..6b690d676 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.6-SNAPSHOT + 4.3.2.6 xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.4-SNAPSHOT + xchange-stream-parent-4.3.2.6 diff --git a/service-core/pom.xml b/service-core/pom.xml index 38db28be1..6dbf49ab7 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index ae15c58ba..f659d78da 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 20afdc8c7..2b2abec29 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 416f7920c..1976c51b8 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index f066c834c..4736aadc2 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index c5c2a5262..83a84fd55 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index b5753d5c5..26ad1b55b 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 81cb19978..db03a7842 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 8e9d37330..6896d4dca 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 9c77ea1f4..824b22ffd 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 8964620a7..7e41571d2 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index 39925e756..35f6eea4a 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index 26523629b..f38db7d9b 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index 0affbda73..6a9f9b282 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 6d4aa920f..22944814f 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index fed65826d..ca86555fb 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index ffc5abf91..c9637b332 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 6007570b8..c853674bf 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 65bf7cda3..22109c26b 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 1252ee987..585d7f397 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6-SNAPSHOT + 4.3.2.6 4.0.0 From 1caa9e8b3a94507bf4b7c1a28af7190b6ed693db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Mon, 30 Jul 2018 17:31:18 +0800 Subject: [PATCH 66/97] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 6b690d676..ee5673178 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.6 + 4.3.2.7-SNAPSHOT xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.6 + xchange-stream-parent-4.3.2.4-SNAPSHOT diff --git a/service-core/pom.xml b/service-core/pom.xml index 6dbf49ab7..f49283a6f 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index f659d78da..cc8f96adc 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 2b2abec29..e53d6d81b 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 1976c51b8..0c03d0d51 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 4736aadc2..0f5a38271 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 83a84fd55..02228bb81 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index 26ad1b55b..ec0d78e32 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index db03a7842..c4b532f3a 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index 6896d4dca..d43f1a080 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index 824b22ffd..bab686376 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 7e41571d2..1341e2306 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index 35f6eea4a..a71572c7d 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index f38db7d9b..3236a4193 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index 6a9f9b282..0feecce34 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index 22944814f..e848ebcca 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index ca86555fb..46b6c5f6b 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index c9637b332..8458a2481 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index c853674bf..551cff965 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 22109c26b..dee14c174 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 585d7f397..d57f31ef1 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.6 + 4.3.2.7-SNAPSHOT 4.0.0 From 5e963c1b85bd6c87925e9c8b3a0fbe504e853c84 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Mon, 3 Sep 2018 11:33:38 +0800 Subject: [PATCH 67/97] bitmex ticker to ticker --- .../info/bitrich/xchangestream/bitmex/dto/BitmexTicker.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexTicker.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexTicker.java index f1074c0b2..1aff817bb 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexTicker.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexTicker.java @@ -56,7 +56,10 @@ public BigDecimal getAskSize() { } public Ticker toTicker() { - return new Ticker.Builder().ask(askPrice).bid(bidPrice).timestamp(getDate()).currencyPair(getCurrencyPair()) + return new Ticker.Builder() + .ask(askPrice).bidSize(bidSize) + .bid(bidPrice).askSize(askSize) + .timestamp(getDate()).currencyPair(getCurrencyPair()) .build(); } } From f6337cd78ed65afb961559e8580446960f03a191 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Wed, 17 Oct 2018 12:41:39 +0800 Subject: [PATCH 68/97] okex compressed message --- .../service/netty/WebSocketClientHandler.java | 4 +- .../okcoin/OkCoinStreamingService.java | 48 ++++++++++++++++++- .../okcoin/OkExFuturesStreamingExchange.java | 2 +- .../okcoin/OkExStreamingExchange.java | 2 +- .../okcoin/OkExFuturesManualExample.java | 2 +- 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/WebSocketClientHandler.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/WebSocketClientHandler.java index 39d58cea7..5a904d2b7 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/WebSocketClientHandler.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/WebSocketClientHandler.java @@ -24,8 +24,8 @@ public interface WebSocketMessageHandler { public void onMessage(String message); } - private final WebSocketClientHandshaker handshaker; - private final WebSocketMessageHandler handler; + protected final WebSocketClientHandshaker handshaker; + protected final WebSocketMessageHandler handler; private ChannelPromise handshakeFuture; public WebSocketClientHandler(WebSocketClientHandshaker handshaker, WebSocketMessageHandler handler) { diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java index 936a9dd0f..a86424d19 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkCoinStreamingService.java @@ -5,19 +5,27 @@ import info.bitrich.xchangestream.okcoin.dto.WebSocketMessage; import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; import info.bitrich.xchangestream.service.netty.WebSocketClientHandler; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufInputStream; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.websocketx.*; +import io.netty.util.CharsetUtil; import io.reactivex.Completable; import io.reactivex.CompletableSource; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.disposables.Disposable; import org.knowm.xchange.exceptions.ExchangeException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.zip.Inflater; public class OkCoinStreamingService extends JsonNettyStreamingService { @@ -109,6 +117,8 @@ protected WebSocketClientHandler getWebSocketClientHandler(WebSocketClientHandsh protected class OkCoinNettyWebSocketClientHandler extends NettyWebSocketClientHandler { + private final Logger LOG = LoggerFactory.getLogger(OkCoinNettyWebSocketClientHandler.class); + protected OkCoinNettyWebSocketClientHandler(WebSocketClientHandshaker handshaker, WebSocketMessageHandler handler) { super(handshaker, handler); } @@ -120,5 +130,41 @@ public void channelInactive(ChannelHandlerContext ctx) { } super.channelInactive(ctx); } + + @Override + public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { + + if (!handshaker.isHandshakeComplete()) { + super.channelRead0(ctx, msg); + return; + } + + super.channelRead0(ctx, msg); + + WebSocketFrame frame = (WebSocketFrame) msg; + if (frame instanceof BinaryWebSocketFrame) { + BinaryWebSocketFrame binaryFrame = (BinaryWebSocketFrame) frame; + ByteBuf byteBuf = binaryFrame.content(); + byte[] temp = new byte[byteBuf.readableBytes()]; + ByteBufInputStream bis = new ByteBufInputStream(byteBuf); + StringBuilder appender = new StringBuilder(); + try { + bis.read(temp); + bis.close(); + Inflater infl = new Inflater(true); + infl.setInput(temp, 0, temp.length); + byte[] result = new byte[1024]; + while (!infl.finished()) { + int length = infl.inflate(result); + appender.append(new String(result, 0, length, "UTF-8")); + } + infl.end(); + } catch (Exception e) { + LOG.trace("Error when inflate websocket binary message"); + } + handler.onMessage(appender.toString()); + } + } + } } diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExFuturesStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExFuturesStreamingExchange.java index 103b42b71..e3a898438 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExFuturesStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExFuturesStreamingExchange.java @@ -2,7 +2,7 @@ public class OkExFuturesStreamingExchange extends OkExStreamingExchange { - private static final String API_URI = "wss://real.okex.com:10440/websocket/okexapi"; + private static final String API_URI = "wss://real.okex.com:10440/websocket/okexapi?compress=true"; public OkExFuturesStreamingExchange() { super(API_URI); diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java index e1d8d7391..4df8e4cf8 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java @@ -4,7 +4,7 @@ * Created by Lukas Zaoralek on 17.11.17. */ public class OkExStreamingExchange extends OkCoinStreamingExchange { - private static final String API_URI = "wss://real.okex.com:10441/websocket"; + private static final String API_URI = "wss://real.okex.com:10441/websocket?compress=true"; public OkExStreamingExchange() { super(new OkCoinStreamingService(API_URI)); diff --git a/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java index 01d4ac5bc..584876753 100644 --- a/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java +++ b/xchange-okcoin/src/test/java/info/bitrich/xchangestream/okcoin/OkExFuturesManualExample.java @@ -12,7 +12,7 @@ public class OkExFuturesManualExample { public static void main(String[] args) { - StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(OkExStreamingExchange.class.getName()); + StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(OkExFuturesStreamingExchange.class.getName()); exchange.connect().blockingAwait(); exchange.getStreamingMarketDataService().getOrderBook(CurrencyPair.BTC_USD, FuturesContract.Quarter).subscribe(orderBook -> { From 5673b49878b8d9ad443fcc28babf041e9d1f3d6c Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Wed, 17 Oct 2018 12:57:33 +0800 Subject: [PATCH 69/97] log more precise --- .../xchangestream/service/netty/NettyStreamingService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java index b66c9fad4..528afed92 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/NettyStreamingService.java @@ -97,7 +97,7 @@ public Completable connect() { if (eventLoopGroup != null && !eventLoopGroup.isShutdown() && !eventLoopGroup.isShuttingDown()) { eventLoopGroup.shutdownGracefully(); } - LOG.info("Connecting to {}://{}:{}{}", uri.getScheme(), uri.getHost(), uri.getPort(), uri.getPath()); + LOG.info("Connecting to {}", uri.toString()); String scheme = uri.getScheme() == null ? "ws" : uri.getScheme(); String host = uri.getHost(); From 78dc4b755a7f45f2289e1a56b344a54e6d839fbd Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Thu, 18 Oct 2018 16:28:30 +0800 Subject: [PATCH 70/97] [maven-release-plugin] prepare release xchange-stream-parent-4.3.2.7 --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index ee5673178..feb6befee 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.7-SNAPSHOT + 4.3.2.7 xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.4-SNAPSHOT + xchange-stream-parent-4.3.2.7 diff --git a/service-core/pom.xml b/service-core/pom.xml index f49283a6f..2f503a4ff 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index cc8f96adc..68f501ed2 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index e53d6d81b..849c638a0 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 0c03d0d51..4ed72de7e 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index 0f5a38271..a4797fc9d 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 02228bb81..886386b2d 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index ec0d78e32..c56270fc4 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index c4b532f3a..1c727c918 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index d43f1a080..e5f1e2c53 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index bab686376..a2fc965e4 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index 1341e2306..d2994f2d3 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index a71572c7d..c80db3ba5 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index 3236a4193..f90611e76 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index 0feecce34..83b49a21b 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index e848ebcca..d794b7f81 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index 46b6c5f6b..d40e088d1 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 8458a2481..33ed39c57 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 551cff965..4830bea3d 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index dee14c174..9d8763add 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index d57f31ef1..52f5b7426 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7-SNAPSHOT + 4.3.2.7 4.0.0 From c05a25bd3232555de3bc1f27fc1f5d39f81db1ef Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Thu, 18 Oct 2018 16:28:45 +0800 Subject: [PATCH 71/97] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- service-core/pom.xml | 2 +- service-netty/pom.xml | 2 +- service-pubnub/pom.xml | 2 +- service-pusher/pom.xml | 2 +- service-wamp/pom.xml | 2 +- xchange-binance/pom.xml | 2 +- xchange-bitfinex/pom.xml | 2 +- xchange-bitflyer/pom.xml | 2 +- xchange-bitmex/pom.xml | 2 +- xchange-bitstamp/pom.xml | 2 +- xchange-cexio/pom.xml | 2 +- xchange-coinmate/pom.xml | 2 +- xchange-gdax/pom.xml | 2 +- xchange-gemini/pom.xml | 2 +- xchange-hitbtc/pom.xml | 2 +- xchange-okcoin/pom.xml | 2 +- xchange-poloniex/pom.xml | 2 +- xchange-poloniex2/pom.xml | 2 +- xchange-stream-core/pom.xml | 2 +- xchange-wex/pom.xml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index feb6befee..0620fbd9b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.bitrich.xchange-stream xchange-stream-parent pom - 4.3.2.7 + 4.3.2.8-SNAPSHOT xchange-stream-core @@ -56,7 +56,7 @@ scm:git:git@github.com:declan94/xchange-stream.git scm:git:git@github.com:declan94/xchange-stream.git https://github.com/declan94/xchange-stream - xchange-stream-parent-4.3.2.7 + xchange-stream-parent-4.3.2.4-SNAPSHOT diff --git a/service-core/pom.xml b/service-core/pom.xml index 2f503a4ff..062aae629 100644 --- a/service-core/pom.xml +++ b/service-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/service-netty/pom.xml b/service-netty/pom.xml index 68f501ed2..023e0e943 100644 --- a/service-netty/pom.xml +++ b/service-netty/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/service-pubnub/pom.xml b/service-pubnub/pom.xml index 849c638a0..c93ee209a 100644 --- a/service-pubnub/pom.xml +++ b/service-pubnub/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/service-pusher/pom.xml b/service-pusher/pom.xml index 4ed72de7e..48bb689d0 100644 --- a/service-pusher/pom.xml +++ b/service-pusher/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/service-wamp/pom.xml b/service-wamp/pom.xml index a4797fc9d..41e96ecee 100644 --- a/service-wamp/pom.xml +++ b/service-wamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-binance/pom.xml b/xchange-binance/pom.xml index 886386b2d..23839ec31 100644 --- a/xchange-binance/pom.xml +++ b/xchange-binance/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-bitfinex/pom.xml b/xchange-bitfinex/pom.xml index c56270fc4..bf53f0ff7 100644 --- a/xchange-bitfinex/pom.xml +++ b/xchange-bitfinex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-bitflyer/pom.xml b/xchange-bitflyer/pom.xml index 1c727c918..a3941b9b3 100644 --- a/xchange-bitflyer/pom.xml +++ b/xchange-bitflyer/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index e5f1e2c53..83e490678 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-bitstamp/pom.xml b/xchange-bitstamp/pom.xml index a2fc965e4..160a4a961 100644 --- a/xchange-bitstamp/pom.xml +++ b/xchange-bitstamp/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-cexio/pom.xml b/xchange-cexio/pom.xml index d2994f2d3..a50ee604a 100644 --- a/xchange-cexio/pom.xml +++ b/xchange-cexio/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-coinmate/pom.xml b/xchange-coinmate/pom.xml index c80db3ba5..753760199 100644 --- a/xchange-coinmate/pom.xml +++ b/xchange-coinmate/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-gdax/pom.xml b/xchange-gdax/pom.xml index f90611e76..d539bb0a6 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-gdax/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-gemini/pom.xml b/xchange-gemini/pom.xml index 83b49a21b..17ca6cadf 100644 --- a/xchange-gemini/pom.xml +++ b/xchange-gemini/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-hitbtc/pom.xml b/xchange-hitbtc/pom.xml index d794b7f81..d3aee7c65 100644 --- a/xchange-hitbtc/pom.xml +++ b/xchange-hitbtc/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-okcoin/pom.xml b/xchange-okcoin/pom.xml index d40e088d1..d98920e0c 100644 --- a/xchange-okcoin/pom.xml +++ b/xchange-okcoin/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex/pom.xml b/xchange-poloniex/pom.xml index 33ed39c57..d0c77c21f 100644 --- a/xchange-poloniex/pom.xml +++ b/xchange-poloniex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-poloniex2/pom.xml b/xchange-poloniex2/pom.xml index 4830bea3d..ac70fb441 100644 --- a/xchange-poloniex2/pom.xml +++ b/xchange-poloniex2/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-stream-core/pom.xml b/xchange-stream-core/pom.xml index 9d8763add..4266bc9b4 100644 --- a/xchange-stream-core/pom.xml +++ b/xchange-stream-core/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 diff --git a/xchange-wex/pom.xml b/xchange-wex/pom.xml index 52f5b7426..ae02eb855 100644 --- a/xchange-wex/pom.xml +++ b/xchange-wex/pom.xml @@ -3,7 +3,7 @@ xchange-stream-parent info.bitrich.xchange-stream - 4.3.2.7 + 4.3.2.8-SNAPSHOT 4.0.0 From 04b3d105345e2727ce22f93c6376924ca0b4bf6c Mon Sep 17 00:00:00 2001 From: Foat Akhmadeev Date: Thu, 25 Oct 2018 21:40:32 +0100 Subject: [PATCH 72/97] Restore the Bitmex Execution reports code which was cut out of #191. This is has some issues with the latest codeset (in particular, it doesn't compile against XChange 4.3.11). It needs the attention of someone who actually uses BitMex. --- xchange-bitmex/bitmex.secret.keys.origin | 2 + xchange-bitmex/pom.xml | 46 ++- .../bitmex/BitmexStreamingExchange.java | 36 +- .../BitmexStreamingMarketDataService.java | 82 +++- .../bitmex/BitmexStreamingService.java | 134 ++++-- .../bitmex/BitmexTestStreamingExchange.java | 10 - .../bitmex/dto/BitmexExecution.java | 381 ++++++++++++++++++ .../BitmexWebSocketSubscriptionMessage.java | 4 +- .../dto/BitmexWebSocketTransaction.java | 10 +- .../bitmex/BitmexAuthenticatedExample.java | 67 +++ .../bitmex/BitmexDeadManSwitchTest.java | 91 +++++ .../bitmex/BitmexManualExample.java | 22 +- .../xchangestream/bitmex/BitmexOrderIT.java | 221 ++++++++++ .../bitmex/BitmexOrderReplaceTest.java | 115 ++++++ .../bitmex/BitmexStreamingTest.java | 30 ++ .../xchangestream/bitmex/BitmexTest.java | 102 +++++ .../bitmex/BitmexTestsCommons.java | 24 ++ .../bitmex/BitmexWithProxyIT.java | 67 +++ .../bitmex/dto/BitmexExecutionTest.java | 77 ++++ .../bitmex/dto/execution-spec.json | 72 ++++ .../xchangestream/bitmex/dto/execution.json | 50 +++ .../xchangestream/bitmex/dto/position.json | 20 + 22 files changed, 1591 insertions(+), 72 deletions(-) create mode 100644 xchange-bitmex/bitmex.secret.keys.origin delete mode 100644 xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexTestStreamingExchange.java create mode 100644 xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexExecution.java create mode 100644 xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java create mode 100644 xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java create mode 100644 xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java create mode 100644 xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java create mode 100644 xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTest.java create mode 100644 xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTest.java create mode 100644 xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTestsCommons.java create mode 100644 xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexWithProxyIT.java create mode 100644 xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/dto/BitmexExecutionTest.java create mode 100644 xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/execution-spec.json create mode 100644 xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/execution.json create mode 100644 xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/position.json diff --git a/xchange-bitmex/bitmex.secret.keys.origin b/xchange-bitmex/bitmex.secret.keys.origin new file mode 100644 index 000000000..87cee1347 --- /dev/null +++ b/xchange-bitmex/bitmex.secret.keys.origin @@ -0,0 +1,2 @@ +bitmex.api.key= +bitmex.secret.key= \ No newline at end of file diff --git a/xchange-bitmex/pom.xml b/xchange-bitmex/pom.xml index c3434c7de..fd4518545 100644 --- a/xchange-bitmex/pom.xml +++ b/xchange-bitmex/pom.xml @@ -1,5 +1,6 @@ - + xchange-stream-parent info.bitrich.xchange-stream @@ -9,6 +10,44 @@ xchange-bitmex + + + default + + true + + + + + maven-surefire-plugin + 2.18.1 + + + **/*IT.java + + + + + + + + integration-tests + + + + maven-surefire-plugin + 2.18.1 + + + **/*IT.java + + + + + + + + info.bitrich.xchange-stream @@ -25,5 +64,10 @@ xchange-bitmex ${xchange.version} + + org.apache.httpcomponents + fluent-hc + 4.5.5 + \ No newline at end of file diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java index c9cf0ab8b..d1abae223 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java @@ -4,30 +4,28 @@ import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Completable; +import io.reactivex.Observable; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.bitmex.BitmexExchange; -import si.mazi.rescu.SynchronizedValueFactory; /** * Created by Lukas Zaoralek on 12.11.17. */ public class BitmexStreamingExchange extends BitmexExchange implements StreamingExchange { private static final String API_URI = "wss://www.bitmex.com/realtime"; + private static final String TESTNET_API_URI = "wss://testnet.bitmex.com/realtime"; - private final BitmexStreamingService streamingService; + private BitmexStreamingService streamingService; private BitmexStreamingMarketDataService streamingMarketDataService; public BitmexStreamingExchange() { - this.streamingService = new BitmexStreamingService(API_URI); - } - - protected BitmexStreamingExchange(BitmexStreamingService streamingService) { - this.streamingService = streamingService; } @Override protected void initServices() { super.initServices(); + streamingService = createStreamingService(); + ExchangeSpecification exchangeSpecification = getExchangeSpecification(); streamingMarketDataService = new BitmexStreamingMarketDataService(streamingService); } @@ -36,14 +34,18 @@ public Completable connect(ProductSubscription... args) { return streamingService.connect(); } - @Override - public Completable disconnect() { - return streamingService.disconnect(); + private BitmexStreamingService createStreamingService() { + ExchangeSpecification exchangeSpec = getExchangeSpecification(); + Boolean useSandbox = (Boolean) exchangeSpec.getExchangeSpecificParametersItem(USE_SANDBOX); + String uri = useSandbox == null || !useSandbox ? API_URI : TESTNET_API_URI; + BitmexStreamingService streamingService = new BitmexStreamingService(uri, exchangeSpec.getApiKey(), exchangeSpec.getSecretKey()); + applyStreamingSpecification(exchangeSpec, streamingService); + return streamingService; } @Override - public SynchronizedValueFactory getNonceFactory() { - return null; + public Completable disconnect() { + return streamingService.disconnect(); } @Override @@ -58,6 +60,16 @@ public StreamingMarketDataService getStreamingMarketDataService() { return streamingMarketDataService; } + @Override + public Observable reconnectFailure() { + return streamingService.subscribeReconnectFailure(); + } + + @Override + public Observable connectionSuccess() { + return streamingService.subscribeConnectionSuccess(); + } + @Override public boolean isAlive() { return streamingService.isSocketOpen(); diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index bf97ac90b..e4318fd9b 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -1,11 +1,14 @@ package info.bitrich.xchangestream.bitmex; -import info.bitrich.xchangestream.bitmex.dto.BitmexLimitOrder; -import info.bitrich.xchangestream.bitmex.dto.BitmexOrderbook; -import info.bitrich.xchangestream.bitmex.dto.BitmexTicker; -import info.bitrich.xchangestream.bitmex.dto.BitmexTrade; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import info.bitrich.xchangestream.bitmex.dto.*; import info.bitrich.xchangestream.core.StreamingMarketDataService; +import info.bitrich.xchangestream.service.netty.StreamingObjectMapperHelper; import io.reactivex.Observable; +import org.knowm.xchange.bitmex.BitmexContract; +import org.knowm.xchange.bitmex.BitmexPrompt; +import org.knowm.xchange.bitmex.BitmexUtils; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Ticker; @@ -13,10 +16,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.List; -import java.util.SortedMap; -import java.util.TreeMap; +import java.io.IOException; +import java.util.*; /** * Created by Lukas Zaoralek on 13.11.17. @@ -24,17 +25,34 @@ public class BitmexStreamingMarketDataService implements StreamingMarketDataService { private static final Logger LOG = LoggerFactory.getLogger(BitmexStreamingMarketDataService.class); + private final ObjectMapper objectMapper = StreamingObjectMapperHelper.getObjectMapper(); + private final BitmexStreamingService streamingService; - private final SortedMap orderbooks = new TreeMap<>(); + private final SortedMap orderbooks = new TreeMap<>(); + public BitmexStreamingMarketDataService(BitmexStreamingService streamingService) { this.streamingService = streamingService; + this.streamingService.subscribeConnectionSuccess().subscribe(o -> { + LOG.info("Bitmex connection succeeded. Clearing orderbooks."); + orderbooks.clear(); + }); + } + + private String getBitmexSymbol(CurrencyPair currencyPair, Object... args) { + if (args.length > 0) { + BitmexPrompt prompt = (BitmexPrompt) args[0]; + BitmexContract contract = new BitmexContract(currencyPair, prompt); + return BitmexUtils.translateBitmexContract(contract); + } else { + return currencyPair.base.toString() + currencyPair.counter.toString(); + } } @Override public Observable getOrderBook(CurrencyPair currencyPair, Object... args) { - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + String instrument = getBitmexSymbol(currencyPair, args); String channelName = String.format("orderBookL2:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).map(s -> { @@ -42,12 +60,12 @@ public Observable getOrderBook(CurrencyPair currencyPair, Object... a String action = s.getAction(); if (action.equals("partial")) { orderbook = s.toBitmexOrderbook(); - orderbooks.put(currencyPair, orderbook); + orderbooks.put(instrument, orderbook); } else { - orderbook = orderbooks.get(currencyPair); + orderbook = orderbooks.get(instrument); //ignore updates until first "partial" if (orderbook == null) { - return null; + return new OrderBook(null, Collections.emptyList(), Collections.emptyList()); } BitmexLimitOrder[] levels = s.toBitmexOrderbookLevels(); orderbook.updateLevels(levels, action); @@ -58,7 +76,7 @@ public Observable getOrderBook(CurrencyPair currencyPair, Object... a } public Observable getRawTicker(CurrencyPair currencyPair, Object... args) { - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + String instrument = getBitmexSymbol(currencyPair, args); String channelName = String.format("quote:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).map(s -> s.toBitmexTicker()); @@ -66,7 +84,7 @@ public Observable getRawTicker(CurrencyPair currencyPair, Object.. @Override public Observable getTicker(CurrencyPair currencyPair, Object... args) { - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + String instrument = getBitmexSymbol(currencyPair, args); String channelName = String.format("quote:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).map(s -> { @@ -77,7 +95,7 @@ public Observable getTicker(CurrencyPair currencyPair, Object... args) { @Override public Observable getTrades(CurrencyPair currencyPair, Object... args) { - String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); + String instrument = getBitmexSymbol(currencyPair, args); String channelName = String.format("trade:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { @@ -89,4 +107,36 @@ public Observable getTrades(CurrencyPair currencyPair, Object... args) { return trades; }); } + + + public Observable getExecutions(String symbol) { + return streamingService.subscribeBitmexChannel("execution:" + symbol).flatMapIterable(s -> { + JsonNode executions = s.getData(); + List bitmexExecutions = new ArrayList<>(executions.size()); + for (JsonNode execution : executions) { + bitmexExecutions.add(objectMapper.treeToValue(execution, BitmexExecution.class)); + } + return bitmexExecutions; + }); + } + + public void enableDeadManSwitch() throws IOException { + enableDeadManSwitch(BitmexStreamingService.DMS_RESUBSCRIBE, BitmexStreamingService.DMS_CANCEL_ALL_IN); + } + + /** + * @param rate in milliseconds to send updated + * @param timeout milliseconds from now after which orders will be cancelled + */ + public void enableDeadManSwitch(long rate, long timeout) throws IOException { + streamingService.enableDeadMansSwitch(rate, timeout); + } + + public boolean isDeadManSwitchEnabled() throws IOException { + return streamingService.isDeadMansSwitchEnabled(); + } + + public void disableDeadMansSwitch() throws IOException { + streamingService.disableDeadMansSwitch(); + } } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java index cafc16efa..7c7fcd388 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java @@ -1,22 +1,25 @@ package info.bitrich.xchangestream.bitmex; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtensionHandler; -import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - +import info.bitrich.xchangestream.bitmex.dto.BitmexMarketDataEvent; import info.bitrich.xchangestream.bitmex.dto.BitmexWebSocketSubscriptionMessage; import info.bitrich.xchangestream.bitmex.dto.BitmexWebSocketTransaction; import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; +import io.netty.handler.codec.http.DefaultHttpHeaders; +import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtensionHandler; import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import org.knowm.xchange.bitmex.service.BitmexDigest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.ZoneOffset; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; /** * Created by Lukas Zaoralek on 13.11.17. @@ -24,24 +27,63 @@ public class BitmexStreamingService extends JsonNettyStreamingService { private static final Logger LOG = LoggerFactory.getLogger(BitmexStreamingService.class); - public BitmexStreamingService(String apiUrl) { + + private final String apiKey; + private final String secretKey; + + public static final int DMS_CANCEL_ALL_IN = 60000; + public static final int DMS_RESUBSCRIBE = 15000; + /** + * deadman's cancel time + */ + private long dmsCancelTime; + private Disposable dmsDisposable; + + public BitmexStreamingService(String apiUrl, String apiKey, String secretKey) { super(apiUrl, Integer.MAX_VALUE); + this.apiKey = apiKey; + this.secretKey = secretKey; } @Override protected void handleMessage(JsonNode message) { - if (message.has("info") || message.has("success")) { - return; - } - if (message.has("error")) { - String error = message.get("error").asText(); - LOG.error("Error with message: " + error); - return; - } + if (message.has("info") || message.has("success")) { + return; + } + if (message.has("error")) { + String error = message.get("error").asText(); + LOG.error("Error with message: " + error); + return; + } + if (message.has("now") && message.has("cancelTime")) { + handleDeadMansSwitchMessage(message); + return; + } super.handleMessage(message); } + private void handleDeadMansSwitchMessage(JsonNode message) { + //handle dead man's switch confirmation + try { + String cancelTime = message.get("cancelTime").asText(); + if (cancelTime.equals("0")) { + LOG.info("Dead man's switch disabled"); + dmsDisposable.dispose(); + dmsDisposable = null; + dmsCancelTime=0; + } else { + SimpleDateFormat sdf = new SimpleDateFormat(BitmexMarketDataEvent.BITMEX_TIMESTAMP_FORMAT); + sdf.setTimeZone(TimeZone.getTimeZone(ZoneOffset.UTC)); + long now = sdf.parse(message.get("now").asText()).getTime(); + dmsCancelTime = sdf.parse(cancelTime).getTime(); + } + } catch (ParseException e) { + LOG.error("Error parsing deadman's confirmation "); + } + return; + } + @Override protected WebSocketClientExtensionHandler getWebSocketClientExtensionHandler() { return null; @@ -55,9 +97,28 @@ public Observable subscribeBitmexChannel(String chan .share(); } + @Override + protected DefaultHttpHeaders getCustomHeaders() { + DefaultHttpHeaders customHeaders = super.getCustomHeaders(); + if (secretKey == null || apiKey == null) { + return customHeaders; + } + long expires = System.currentTimeMillis() / 1000 + 5; + + BitmexDigest bitmexDigester = BitmexDigest.createInstance(secretKey, apiKey); + String stringToDigest = "GET/realtime" + expires; + String signature = bitmexDigester.digestString(stringToDigest); + + customHeaders.add("api-nonce", expires); + customHeaders.add("api-key", apiKey); + customHeaders.add("api-signature", signature); + return customHeaders; + } + @Override protected String getChannelNameFromMessage(JsonNode message) throws IOException { - String instrument = message.get("data").get(0).get("symbol").asText(); + JsonNode data = message.get("data"); + String instrument = data.size() > 0 ? data.get(0).get("symbol").asText() : message.get("filter").get("symbol").asText(); String table = message.get("table").asText(); return String.format("%s:%s", table, instrument); } @@ -70,7 +131,34 @@ public String getSubscribeMessage(String channelName, Object... args) throws IOE @Override public String getUnsubscribeMessage(String channelName) throws IOException { - BitmexWebSocketSubscriptionMessage subscribeMessage = new BitmexWebSocketSubscriptionMessage("unsubscribe", new String[]{}); + BitmexWebSocketSubscriptionMessage subscribeMessage = new BitmexWebSocketSubscriptionMessage("unsubscribe", new String[]{channelName}); return objectMapper.writeValueAsString(subscribeMessage); } + + public void enableDeadMansSwitch(long rate, long timeout) throws IOException { + if (dmsDisposable != null) { + LOG.warn("You already have Dead Man's switch enabled. Doing nothing"); + return; + } + final BitmexWebSocketSubscriptionMessage subscriptionMessage = new BitmexWebSocketSubscriptionMessage("cancelAllAfter", new Object[]{DMS_CANCEL_ALL_IN}); + String message = objectMapper.writeValueAsString(subscriptionMessage); + dmsDisposable = Schedulers.single().schedulePeriodicallyDirect(new Runnable() { + @Override + public void run() { + sendMessage(message); + } + }, 0, DMS_RESUBSCRIBE, TimeUnit.MILLISECONDS); + Schedulers.single().start(); + } + + public void disableDeadMansSwitch() throws IOException { + final BitmexWebSocketSubscriptionMessage subscriptionMessage = new BitmexWebSocketSubscriptionMessage("cancelAllAfter", new Object[]{0}); + String message = objectMapper.writeValueAsString(subscriptionMessage); + sendMessage(message); + } + + public boolean isDeadMansSwitchEnabled() { + return dmsCancelTime > 0 && System.currentTimeMillis() < dmsCancelTime; + } + } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexTestStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexTestStreamingExchange.java deleted file mode 100644 index dca595756..000000000 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexTestStreamingExchange.java +++ /dev/null @@ -1,10 +0,0 @@ -package info.bitrich.xchangestream.bitmex; - -public class BitmexTestStreamingExchange extends BitmexStreamingExchange { - - private static final String API_URI = "wss://testnet.bitmex.com/realtime"; - - public BitmexTestStreamingExchange() { - super(new BitmexStreamingService(API_URI)); - } -} diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexExecution.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexExecution.java new file mode 100644 index 000000000..79ff0c182 --- /dev/null +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexExecution.java @@ -0,0 +1,381 @@ +package info.bitrich.xchangestream.bitmex.dto; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.knowm.xchange.bitmex.dto.marketdata.BitmexPrivateOrder; +import org.knowm.xchange.bitmex.dto.trade.BitmexSide; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author Nikita Belenkiy on 05/06/2018. + */ +public class BitmexExecution { + + protected String execID; + protected String orderID; + protected String clOrdID; + protected String clOrdLinkID; + protected long account; + protected String symbol; + protected BitmexSide side; + protected Long lastQty; + protected BigDecimal lastPx; + protected BigDecimal underlyingLastPx; + protected String lastMkt; + protected String lastLiquidityInd; + protected BigDecimal simpleOrderQty; + protected Long orderQty; + protected BigDecimal price; + protected Long displayQty; + protected BigDecimal stopPx; + protected BigDecimal pegOffsetValue; + protected String pegPriceType; + protected String currency; + protected String settlCurrency; + protected String execType; + protected String ordType; + protected String timeInForce; + protected String execInst; + protected String contingencyType; + protected String exDestination; + protected BitmexPrivateOrder.OrderStatus ordStatus; + protected String triggered; + protected Boolean workingIndicator; + protected String ordRejReason; + protected BigDecimal simpleLeavesQty; + protected Long leavesQty; + protected BigDecimal simpleCumQty; + protected BigDecimal cumQty; + protected BigDecimal avgPx; + protected BigDecimal commission; + protected String tradePublishIndicator; + protected String multiLegReportingType; + protected String text; + protected String trdMatchID; + protected Long execCost; + protected Long execComm; + protected BigDecimal homeNotional; + protected BigDecimal foreignNotional; + protected Date transactTime; + protected Date timestamp; + + @JsonCreator + public BitmexExecution(@JsonProperty("execID") String execID, @JsonProperty("orderID") String orderID, + @JsonProperty("clOrdID") String clOrdID, @JsonProperty("clOrdLinkID") String clOrdLinkID, + @JsonProperty("account") int account, @JsonProperty("symbol") String symbol, + @JsonProperty("side") BitmexSide side, + @JsonProperty("lastQty") Long lastQty, + @JsonProperty("lastPx") BigDecimal lastPx, @JsonProperty("underlyingLastPx") BigDecimal underlyingLastPx, + @JsonProperty("lastMkt") String lastMkt, @JsonProperty("lastLiquidityInd") String lastLiquidityInd, + @JsonProperty("simpleOrderQty") BigDecimal simpleOrderQty, @JsonProperty("orderQty") long orderQty, + @JsonProperty("price") BigDecimal price, @JsonProperty("displayQty") Long displayQty, @JsonProperty("stopPx") BigDecimal stopPx, + @JsonProperty("pegOffsetValue") BigDecimal pegOffsetValue, @JsonProperty("pegPriceType") String pegPriceType, + @JsonProperty("currency") String currency, @JsonProperty("settlCurrency") String settlCurrency, + @JsonProperty("execType") String execType, + @JsonProperty("ordType") String ordType, @JsonProperty("timeInForce") String timeInForce, + @JsonProperty("execInst") String execInst, @JsonProperty("contingencyType") String contingencyType, + @JsonProperty("exDestination") String exDestination, + @JsonProperty("ordStatus") BitmexPrivateOrder.OrderStatus ordStatus, @JsonProperty("triggered") String triggered, + @JsonProperty("workingIndicator") boolean workingIndicator, @JsonProperty("ordRejReason") String ordRejReason, + @JsonProperty("simpleLeavesQty") BigDecimal simpleLeavesQty, @JsonProperty("leavesQty") Long leavesQty, + @JsonProperty("simpleCumQty") BigDecimal simpleCumQty, @JsonProperty("cumQty") BigDecimal cumQty, + @JsonProperty("avgPx") BigDecimal avgPx, @JsonProperty("commission") BigDecimal commission, + @JsonProperty("tradePublishIndicator") String tradePublishIndicator, @JsonProperty("multiLegReportingType") String multiLegReportingType, + @JsonProperty("text") String text, @JsonProperty("trdMatchID") String trdMatchID, + @JsonProperty("execCost") Long execCost, @JsonProperty("execComm") Long execComm, + @JsonProperty("homeNotional") BigDecimal homeNotional, + @JsonProperty("foreignNotional") BigDecimal foreignNotional, @JsonProperty("transactTime") Date transactTime, + @JsonProperty("timestamp") Date timestamp) { + this.execID = execID; + this.orderID = orderID; + this.clOrdID = clOrdID; + this.clOrdLinkID = clOrdLinkID; + this.account = account; + this.symbol = symbol; + this.side = side; + this.lastQty = lastQty; + this.lastPx = lastPx; + this.underlyingLastPx = underlyingLastPx; + this.lastMkt = lastMkt; + this.lastLiquidityInd = lastLiquidityInd; + this.simpleOrderQty = simpleOrderQty; + this.orderQty = orderQty; + this.price = price; + this.displayQty = displayQty; + this.stopPx = stopPx; + this.pegOffsetValue = pegOffsetValue; + this.pegPriceType = pegPriceType; + this.currency = currency; + this.settlCurrency = settlCurrency; + this.execType = execType; + this.ordType = ordType; + this.timeInForce = timeInForce; + this.execInst = execInst; + this.contingencyType = contingencyType; + this.exDestination = exDestination; + this.ordStatus = ordStatus; + this.triggered = triggered; + this.workingIndicator = workingIndicator; + this.ordRejReason = ordRejReason; + this.simpleLeavesQty = simpleLeavesQty; + this.leavesQty = leavesQty; + this.simpleCumQty = simpleCumQty; + this.cumQty = cumQty; + this.avgPx = avgPx; + this.commission = commission; + this.tradePublishIndicator = tradePublishIndicator; + this.multiLegReportingType = multiLegReportingType; + this.text = text; + this.trdMatchID = trdMatchID; + this.execCost = execCost; + this.execComm = execComm; + this.homeNotional = homeNotional; + this.foreignNotional = foreignNotional; + this.transactTime = transactTime; + this.timestamp = timestamp; + } + + + public String getExecID() { + return execID; + } + + public String getOrderID() { + return orderID; + } + + public String getClOrdID() { + return clOrdID; + } + + public String getClOrdLinkID() { + return clOrdLinkID; + } + + public long getAccount() { + return account; + } + + public String getSymbol() { + return symbol; + } + + public BitmexSide getSide() { + return side; + } + + public Long getLastQty() { + return lastQty; + } + + public BigDecimal getLastPx() { + return lastPx; + } + + public BigDecimal getUnderlyingLastPx() { + return underlyingLastPx; + } + + public String getLastMkt() { + return lastMkt; + } + + public String getLastLiquidityInd() { + return lastLiquidityInd; + } + + public BigDecimal getSimpleOrderQty() { + return simpleOrderQty; + } + + public Long getOrderQty() { + return orderQty; + } + + public BigDecimal getPrice() { + return price; + } + + public Long getDisplayQty() { + return displayQty; + } + + public BigDecimal getStopPx() { + return stopPx; + } + + public BigDecimal getPegOffsetValue() { + return pegOffsetValue; + } + + public String getPegPriceType() { + return pegPriceType; + } + + public String getCurrency() { + return currency; + } + + public String getSettlCurrency() { + return settlCurrency; + } + + public String getExecType() { + return execType; + } + + public String getOrdType() { + return ordType; + } + + public String getTimeInForce() { + return timeInForce; + } + + public String getExecInst() { + return execInst; + } + + public String getContingencyType() { + return contingencyType; + } + + public String getExDestination() { + return exDestination; + } + + public BitmexPrivateOrder.OrderStatus getOrdStatus() { + return ordStatus; + } + + public String getTriggered() { + return triggered; + } + + public Boolean isWorkingIndicator() { + return workingIndicator; + } + + public String getOrdRejReason() { + return ordRejReason; + } + + public BigDecimal getSimpleLeavesQty() { + return simpleLeavesQty; + } + + public Long getLeavesQty() { + return leavesQty; + } + + public BigDecimal getSimpleCumQty() { + return simpleCumQty; + } + + public BigDecimal getCumQty() { + return cumQty; + } + + public BigDecimal getAvgPx() { + return avgPx; + } + + public BigDecimal getCommission() { + return commission; + } + + public String getTradePublishIndicator() { + return tradePublishIndicator; + } + + public String getMultiLegReportingType() { + return multiLegReportingType; + } + + public String getText() { + return text; + } + + public String getTrdMatchID() { + return trdMatchID; + } + + public Long getExecCost() { + return execCost; + } + + public Long getExecComm() { + return execComm; + } + + public BigDecimal getHomeNotional() { + return homeNotional; + } + + public BigDecimal getForeignNotional() { + return foreignNotional; + } + + public Date getTransactTime() { + return transactTime; + } + + public Date getTimestamp() { + return timestamp; + } + + @Override + public String toString() { + return "BitmexExecution{" + + "execID='" + execID + '\'' + + ", orderID='" + orderID + '\'' + + ", clOrdID='" + clOrdID + '\'' + + ", clOrdLinkID='" + clOrdLinkID + '\'' + + ", account=" + account + + ", symbol='" + symbol + '\'' + + ", side=" + side + + ", lastQty=" + lastQty + + ", lastPx=" + lastPx + + ", underlyingLastPx=" + underlyingLastPx + + ", lastMkt='" + lastMkt + '\'' + + ", lastLiquidityInd='" + lastLiquidityInd + '\'' + + ", simpleOrderQty=" + simpleOrderQty + + ", orderQty=" + orderQty + + ", price=" + price + + ", displayQty=" + displayQty + + ", stopPx=" + stopPx + + ", pegOffsetValue=" + pegOffsetValue + + ", pegPriceType='" + pegPriceType + '\'' + + ", currency='" + currency + '\'' + + ", settlCurrency='" + settlCurrency + '\'' + + ", execType='" + execType + '\'' + + ", ordType='" + ordType + '\'' + + ", timeInForce='" + timeInForce + '\'' + + ", execInst='" + execInst + '\'' + + ", contingencyType='" + contingencyType + '\'' + + ", exDestination='" + exDestination + '\'' + + ", ordStatus='" + ordStatus + '\'' + + ", triggered='" + triggered + '\'' + + ", workingIndicator=" + workingIndicator + + ", ordRejReason='" + ordRejReason + '\'' + + ", simpleLeavesQty=" + simpleLeavesQty + + ", leavesQty=" + leavesQty + + ", simpleCumQty=" + simpleCumQty + + ", cumQty=" + cumQty + + ", avgPx=" + avgPx + + ", commission=" + commission + + ", tradePublishIndicator='" + tradePublishIndicator + '\'' + + ", multiLegReportingType='" + multiLegReportingType + '\'' + + ", text='" + text + '\'' + + ", trdMatchID='" + trdMatchID + '\'' + + ", execCost=" + execCost + + ", execComm=" + execComm + + ", homeNotional=" + homeNotional + + ", foreignNotional=" + foreignNotional + + ", transactTime=" + transactTime + + ", timestamp=" + timestamp + + '}'; + } +} diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketSubscriptionMessage.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketSubscriptionMessage.java index e19c5da60..6d82b4486 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketSubscriptionMessage.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketSubscriptionMessage.java @@ -13,9 +13,9 @@ public class BitmexWebSocketSubscriptionMessage { private String op; @JsonProperty(ARGS) - private String[] args; + private Object[] args; - public BitmexWebSocketSubscriptionMessage(String op, String[] args) { + public BitmexWebSocketSubscriptionMessage(String op, Object[] args) { this.op = op; this.args = args; } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java index 210789609..20fbe0cca 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import info.bitrich.xchangestream.service.netty.StreamingObjectMapperHelper; import java.io.IOException; @@ -11,10 +12,10 @@ * Created by Lukas Zaoralek on 13.11.17. */ public class BitmexWebSocketTransaction { + private static final ObjectMapper mapper = StreamingObjectMapperHelper.getObjectMapper(); private final String table; private final String action; private final JsonNode data; - private final ObjectMapper mapper = new ObjectMapper(); public BitmexWebSocketTransaction(@JsonProperty("table") String table, @JsonProperty("action") String action, @@ -22,7 +23,6 @@ public BitmexWebSocketTransaction(@JsonProperty("table") String table, this.table = table; this.action = action; this.data = data; - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } public BitmexLimitOrder[] toBitmexOrderbookLevels() { @@ -30,7 +30,7 @@ public BitmexLimitOrder[] toBitmexOrderbookLevels() { for (int i = 0; i < data.size(); i++) { JsonNode jsonLevel = data.get(i); try { - levels[i] = mapper.readValue(jsonLevel.toString(), BitmexLimitOrder.class); + levels[i] = mapper.treeToValue(jsonLevel, BitmexLimitOrder.class); } catch (IOException e) { e.printStackTrace(); } @@ -47,7 +47,7 @@ public BitmexOrderbook toBitmexOrderbook() { public BitmexTicker toBitmexTicker() { BitmexTicker bitmexTicker = null; try { - bitmexTicker = mapper.readValue(data.get(0).toString(), BitmexTicker.class); + bitmexTicker = mapper.treeToValue(data.get(0), BitmexTicker.class); } catch (IOException e) { e.printStackTrace(); } @@ -59,7 +59,7 @@ public BitmexTrade[] toBitmexTrades() { for (int i = 0; i < data.size(); i++) { JsonNode jsonTrade = data.get(i); try { - trades[i] = mapper.readValue(jsonTrade.toString(), BitmexTrade.class); + trades[i] = mapper.treeToValue(jsonTrade, BitmexTrade.class); } catch (IOException e) { e.printStackTrace(); } diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java new file mode 100644 index 000000000..608923ac4 --- /dev/null +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java @@ -0,0 +1,67 @@ +package info.bitrich.xchangestream.bitmex; + +import info.bitrich.xchangestream.bitmex.dto.BitmexExecution; +import info.bitrich.xchangestream.core.StreamingExchange; +import info.bitrich.xchangestream.core.StreamingExchangeFactory; +import io.reactivex.Observable; +import org.knowm.xchange.ExchangeSpecification; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.utils.CertHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Created by Lukas Zaoralek on 13.11.17. + */ +public class BitmexAuthenticatedExample { + + private static final Logger LOG = LoggerFactory.getLogger(BitmexAuthenticatedExample.class); + + public static void main(String[] args) throws Exception { + CertHelper.trustAllCerts(); + StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); + ExchangeSpecification defaultExchangeSpecification = exchange.getDefaultExchangeSpecification(); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); + + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.USE_SANDBOX, true); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ACCEPT_ALL_CERITICATES, true); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ENABLE_LOGGING_HANDLER, true); + + defaultExchangeSpecification.setApiKey("API-KEY"); + defaultExchangeSpecification.setSecretKey("SECRET-KEY"); + + + exchange.applySpecification(defaultExchangeSpecification); + exchange.connect().blockingAwait(); + final BitmexStreamingMarketDataService streamingMarketDataService = (BitmexStreamingMarketDataService) exchange.getStreamingMarketDataService(); +// streamingMarketDataService.authenticate(); + CurrencyPair xbtUsd = CurrencyPair.XBT_USD; + /* streamingMarketDataService.getOrderBook(xbtUsd).subscribe(orderBook -> { + if(!orderBook.getAsks().isEmpty()) + LOG.info("First ask: {}", orderBook.getAsks()); + if(!orderBook.getBids().isEmpty()) + LOG.info("First bid: {}", orderBook.getBids()); + }, throwable -> LOG.error("ERROR in getting order book: ", throwable)); + + streamingMarketDataService.getRawTicker(xbtUsd).subscribe(ticker -> { + LOG.info("TICKER: {}", ticker); + }, throwable -> LOG.error("ERROR in getting ticker: ", throwable)); + + streamingMarketDataService.getTicker(xbtUsd).subscribe(ticker -> { + LOG.info("TICKER: {}", ticker); + }, throwable -> LOG.error("ERROR in getting ticker: ", throwable)); +*/ + /* streamingMarketDataService.getTrades(xbtUsd) + .subscribe(trade -> LOG.info("TRADE: {}", trade), + throwable -> LOG.error("ERROR in getting trades: ", throwable));*/ + streamingMarketDataService.getExecutions("XBTUSD").subscribe(bitmexExecution -> { + LOG.info("bitmexExecution = {}", bitmexExecution); + }); + try { + Thread.sleep(100_000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java new file mode 100644 index 000000000..74b5816b9 --- /dev/null +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java @@ -0,0 +1,91 @@ +package info.bitrich.xchangestream.bitmex; + +import info.bitrich.xchangestream.core.StreamingExchange; +import org.junit.Ignore; +import org.junit.Test; +import org.knowm.xchange.ExchangeFactory; +import org.knowm.xchange.ExchangeSpecification; +import org.knowm.xchange.bitmex.dto.marketdata.BitmexPrivateOrder; +import org.knowm.xchange.bitmex.dto.trade.BitmexSide; +import org.knowm.xchange.bitmex.service.BitmexMarketDataService; +import org.knowm.xchange.bitmex.service.BitmexTradeService; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.marketdata.OrderBook; +import org.knowm.xchange.utils.CertHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.util.List; + +import static org.knowm.xchange.bitmex.BitmexPrompt.PERPETUAL; + +/** + * @author Nikita Belenkiy on 18/05/2018. + */ +public class BitmexDeadManSwitchTest { + private static final Logger logger = LoggerFactory.getLogger(BitmexDeadManSwitchTest.class); + + @Test + @Ignore + public void testDeadmanSwitch() throws Exception { + CertHelper.trustAllCerts(); + BitmexStreamingExchange exchange = + (BitmexStreamingExchange) ExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class); + ExchangeSpecification defaultExchangeSpecification = exchange.getDefaultExchangeSpecification(); + + defaultExchangeSpecification.setExchangeSpecificParametersItem("Use_Sandbox", true); + + defaultExchangeSpecification.setApiKey("QW8Ao_gx38e-8KFvDkFn-Ym4"); + defaultExchangeSpecification.setSecretKey("tn7rpzvOXSKThZD0f-xXehtydt4OTHZVf42gCCyxPixiiVOb"); + + defaultExchangeSpecification.setShouldLoadRemoteMetaData(true); + defaultExchangeSpecification.setProxyHost("localhost"); + defaultExchangeSpecification.setProxyPort(9999); + + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); + + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.USE_SANDBOX, true); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ACCEPT_ALL_CERITICATES, true); +// defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ENABLE_LOGGING_HANDLER, true); + + exchange.applySpecification(defaultExchangeSpecification); + exchange.connect().blockingAwait(); + BitmexMarketDataService marketDataService = + (BitmexMarketDataService) exchange.getMarketDataService(); + + BitmexTradeService tradeService = (BitmexTradeService)exchange.getTradeService(); + + final BitmexStreamingMarketDataService streamingMarketDataService = (BitmexStreamingMarketDataService) exchange.getStreamingMarketDataService(); +// streamingMarketDataService.authenticate(); + CurrencyPair xbtUsd = CurrencyPair.XBT_USD; + + streamingMarketDataService.getExecutions("XBTUSD").subscribe(bitmexExecution -> { + logger.info("!!!!EXECUTION!!!! = {}", bitmexExecution); + }); + + OrderBook orderBook = marketDataService.getOrderBook(CurrencyPair.XBT_USD, PERPETUAL); + // OrderBook orderBook = marketDataService.getOrderBook(new CurrencyPair(Currency.ADA, + // Currency.BTC), BitmexPrompt.QUARTERLY); + // OrderBook orderBook = marketDataService.getOrderBook(new CurrencyPair(Currency.BTC, + // Currency.USD), BitmexPrompt.BIQUARTERLY); + + System.out.println("orderBook = " + orderBook); + + streamingMarketDataService.enableDeadManSwitch(10000,30000); + + String nosOrdId = System.currentTimeMillis() + ""; + BigDecimal originalOrderSize = new BigDecimal("300"); + // BigDecimal price = new BigDecimal("10000"); + BigDecimal price = orderBook.getBids().get(0).getLimitPrice().add(new BigDecimal("100")); + BitmexPrivateOrder xbtusd = tradeService.placeLimitOrder("XBTUSD", originalOrderSize, price, BitmexSide.SELL, nosOrdId, null); + logger.info("!!!!!PRIVATE_ORDER!!!! {}",xbtusd); + Thread.sleep(100000); + System.out.println(); + System.out.println(); + + + exchange.disconnect(); + } +} diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java index 68b7fd702..530dd68f3 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java @@ -1,8 +1,8 @@ package info.bitrich.xchangestream.bitmex; -import info.bitrich.xchangestream.core.ProductSubscription; import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingExchangeFactory; +import org.knowm.xchange.bitmex.BitmexPrompt; import org.knowm.xchange.currency.CurrencyPair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,8 +22,10 @@ public static void main(String[] args) { CurrencyPair xbtUsd = CurrencyPair.XBT_USD; streamingMarketDataService.getOrderBook(xbtUsd).subscribe(orderBook -> { - LOG.info("First ask: {}", orderBook.getAsks().get(0)); - LOG.info("First bid: {}", orderBook.getBids().get(0)); + if(!orderBook.getAsks().isEmpty()) + LOG.info("First ask: {}", orderBook.getAsks()); + if(!orderBook.getBids().isEmpty()) + LOG.info("First bid: {}", orderBook.getBids()); }, throwable -> LOG.error("ERROR in getting order book: ", throwable)); streamingMarketDataService.getRawTicker(xbtUsd).subscribe(ticker -> { @@ -38,6 +40,20 @@ public static void main(String[] args) { .subscribe(trade -> LOG.info("TRADE: {}", trade), throwable -> LOG.error("ERROR in getting trades: ", throwable)); + // Quarterly Contract + streamingMarketDataService.getOrderBook(xbtUsd, BitmexPrompt.QUARTERLY).subscribe(orderBook -> { + LOG.info("Quarterly Contract First ask: {}", orderBook.getAsks().get(0)); + LOG.info("Quarterly Contract First bid: {}", orderBook.getBids().get(0)); + }, throwable -> LOG.error("ERROR in getting Quarterly Contract order book: ", throwable)); + + streamingMarketDataService.getTicker(xbtUsd, BitmexPrompt.QUARTERLY).subscribe(ticker -> { + LOG.info("Quarterly Contract TICKER: {}", ticker); + }, throwable -> LOG.error("ERROR in getting Quarterly Contract ticker: ", throwable)); + + exchange.getStreamingMarketDataService().getTrades(xbtUsd, BitmexPrompt.QUARTERLY) + .subscribe(trade -> LOG.info("Quarterly Contract TRADE: {}", trade), + throwable -> LOG.error("ERROR in getting Quarterly Contract trades: ", throwable)); + try { Thread.sleep(100000); } catch (InterruptedException e) { diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java new file mode 100644 index 000000000..b76b6a73f --- /dev/null +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java @@ -0,0 +1,221 @@ +package info.bitrich.xchangestream.bitmex; + +import info.bitrich.xchangestream.bitmex.dto.BitmexExecution; +import info.bitrich.xchangestream.core.StreamingExchange; +import info.bitrich.xchangestream.core.StreamingExchangeFactory; +import info.bitrich.xchangestream.util.LocalExchangeConfig; +import info.bitrich.xchangestream.util.PropsLoader; +import io.reactivex.Observable; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.knowm.xchange.bitmex.dto.marketdata.BitmexPrivateOrder; +import org.knowm.xchange.bitmex.dto.trade.BitmexSide; +import org.knowm.xchange.bitmex.service.BitmexMarketDataService; +import org.knowm.xchange.bitmex.service.BitmexTradeService; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.Order; +import org.knowm.xchange.dto.marketdata.OrderBook; +import org.knowm.xchange.dto.trade.LimitOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import static org.knowm.xchange.bitmex.BitmexPrompt.PERPETUAL; + +/** + * @author Nikita Belenkiy on 18/05/2018. + */ +public class BitmexOrderIT { + private static final CurrencyPair xbtUsd = CurrencyPair.XBT_USD; + private static final Logger LOG = LoggerFactory.getLogger(BitmexTest.class); + + private static final BigDecimal priceShift = new BigDecimal("50"); + + private BigDecimal testAskPrice; + private BigDecimal testBidPrice; + + private BitmexTradeService tradeService; + private StreamingExchange exchange; + + @Before + public void setup() throws IOException { + LocalExchangeConfig localConfig = PropsLoader.loadKeys( + "bitmex.secret.keys", "bitmex.secret.keys.origin", "bitmex"); + exchange = StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); + + exchange.applySpecification(BitmexTestsCommons.getExchangeSpecification(localConfig, + exchange.getDefaultExchangeSpecification())); + exchange.connect().blockingAwait(); + + BitmexMarketDataService marketDataService = + (BitmexMarketDataService) exchange.getMarketDataService(); + + OrderBook orderBook = marketDataService.getOrderBook(xbtUsd, PERPETUAL); + List asks = orderBook.getAsks(); + // todo : for the streaming service best ask is at 0 pos + BigDecimal topPriceAsk = getPrice(asks, asks.size() - 1); + BigDecimal topPriceBid = getPrice(orderBook.getBids(), 0); + + LOG.info("Got best ask = {}, best bid = {}", topPriceAsk, topPriceBid); + Assert.assertTrue("Got empty order book", topPriceAsk != null || topPriceBid != null); + + if (topPriceAsk != null) { + testAskPrice = topPriceAsk.add(priceShift); + testBidPrice = topPriceAsk.subtract(priceShift); + } else { + testAskPrice = topPriceBid.add(priceShift); + testBidPrice = topPriceBid.subtract(priceShift); + } + + tradeService = (BitmexTradeService) exchange.getTradeService(); + } + + @After + public void tearDown() { + exchange.disconnect().blockingAwait(); + } + + private BigDecimal getPrice(List side, int pos) { + if (!side.isEmpty()) { + return side.get(pos).getLimitPrice(); + } + return null; + } + + private String generateOrderId() { + return System.currentTimeMillis() + ""; + } + + private String placeLimitOrder(String clOrdId, BigDecimal price, String size, Order.OrderType type) throws Exception { + LimitOrder limitOrder = + new LimitOrder( + type, + new BigDecimal(size), + xbtUsd, + clOrdId, + new Date(), + price); + String orderId = tradeService.placeLimitOrder(limitOrder); + LOG.info("Order was placed with id = {}", orderId); + return orderId; + } + + private BitmexPrivateOrder cancelLimitOrder(String clOrdId) { + List bitmexPrivateOrders = + tradeService.cancelBitmexOrder(null, clOrdId); + Assert.assertEquals(1, bitmexPrivateOrders.size()); + BitmexPrivateOrder order = bitmexPrivateOrders.get(0); + Assert.assertEquals(BitmexPrivateOrder.OrderStatus.Canceled, order.getOrderStatus()); + LOG.info("Order was cancelled = {}", order); + return order; + } + + private void checkPrivateOrder(String orderId, BigDecimal price, String size, BitmexSide side, + BitmexPrivateOrder bitmexPrivateOrder) { + Assert.assertEquals(orderId, bitmexPrivateOrder.getId()); + Assert.assertEquals(price, bitmexPrivateOrder.getPrice()); + Assert.assertEquals(size, bitmexPrivateOrder.getVolume().toString()); + Assert.assertEquals(side, bitmexPrivateOrder.getSide()); + } + + @Test + public void shouldPlaceLimitOrder() throws Exception { + final String clOrdId = generateOrderId(); + String orderId = placeLimitOrder(clOrdId, testAskPrice, "10", Order.OrderType.ASK); + Assert.assertNotNull(orderId); + cancelLimitOrder(clOrdId); + } + + @Test + public void shouldCancelOrder() throws Exception { + final String clOrdId = generateOrderId(); + String orderId = placeLimitOrder(clOrdId, testAskPrice, "10", Order.OrderType.ASK); + BitmexPrivateOrder bitmexPrivateOrder = cancelLimitOrder(clOrdId); + + checkPrivateOrder(orderId, testAskPrice, "10", BitmexSide.SELL, bitmexPrivateOrder); + } + + @Test + public void shouldReplaceOrder() throws Exception { + final String clOrdId = generateOrderId(); + String orderId = placeLimitOrder(clOrdId, testAskPrice, "10", Order.OrderType.ASK); + + final String replaceId = clOrdId + "replace"; + BitmexPrivateOrder bitmexPrivateOrder = + tradeService.replaceLimitOrder( + "XBTUSD", + new BigDecimal("5"), + null, + orderId, + replaceId, + clOrdId); + LOG.info("Order was replaced = {}", bitmexPrivateOrder); + + checkPrivateOrder(orderId, testAskPrice, "5", BitmexSide.SELL, bitmexPrivateOrder); + cancelLimitOrder(replaceId); + } + + @Test + public void shouldCancelAllOrders() throws Exception { + final String clOrdId = generateOrderId(); + String orderId = placeLimitOrder(clOrdId, testAskPrice, "10", Order.OrderType.ASK); + final String clOrdId2 = generateOrderId(); + String orderId2 = placeLimitOrder(clOrdId2, testBidPrice, "5", Order.OrderType.BID); + + List bitmexPrivateOrders = tradeService.cancelAllOrders(); + Assert.assertEquals(2, bitmexPrivateOrders.size()); + + checkPrivateOrder(orderId, testAskPrice, "10", BitmexSide.SELL, bitmexPrivateOrders.get(0)); + checkPrivateOrder(orderId2, testBidPrice, "5", BitmexSide.BUY, bitmexPrivateOrders.get(1)); + } + + @Test + public void shouldFillPlacedOrder() throws Exception { + final String clOrdId = generateOrderId(); + String orderId = placeLimitOrder(clOrdId, + testBidPrice.add(priceShift.multiply(new BigDecimal("2"))), + "10", Order.OrderType.BID); + Assert.assertNotNull(orderId); + + List bitmexPrivateOrders = + tradeService.cancelBitmexOrder(null, clOrdId); + Assert.assertEquals(1, bitmexPrivateOrders.size()); + + BitmexPrivateOrder order = bitmexPrivateOrders.get(0); + Assert.assertEquals(BitmexPrivateOrder.OrderStatus.Filled, order.getOrderStatus()); + } + + @Test(expected = AssertionError.class) + public void shouldGetExecutionOnFill() { + final String clOrdId = generateOrderId(); + ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + scheduler.schedule(() -> { + try { + placeLimitOrder(clOrdId, + testBidPrice.add(priceShift.multiply(new BigDecimal("2"))), + "10", Order.OrderType.BID); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + } + }, 1, TimeUnit.SECONDS); + + Observable executionObservable = ((BitmexStreamingMarketDataService) + exchange.getStreamingMarketDataService()).getExecutions("XBTUSD"); + executionObservable.test() + .awaitCount(5) + .assertNever(execution -> Objects.equals(execution.getClOrdID(), clOrdId)) + .dispose(); + + scheduler.shutdown(); + } +} \ No newline at end of file diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java new file mode 100644 index 000000000..8d0e8367b --- /dev/null +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java @@ -0,0 +1,115 @@ +package info.bitrich.xchangestream.bitmex; + +import info.bitrich.xchangestream.core.StreamingExchange; +import org.junit.Ignore; +import org.junit.Test; +import org.knowm.xchange.ExchangeFactory; +import org.knowm.xchange.ExchangeSpecification; +import org.knowm.xchange.bitmex.dto.marketdata.BitmexPrivateOrder; +import org.knowm.xchange.bitmex.dto.trade.BitmexSide; +import org.knowm.xchange.bitmex.service.BitmexMarketDataService; +import org.knowm.xchange.bitmex.service.BitmexTradeService; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.marketdata.OrderBook; +import org.knowm.xchange.utils.CertHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.util.List; + +import static org.knowm.xchange.bitmex.BitmexPrompt.PERPETUAL; + +/** + * @author Nikita Belenkiy on 18/05/2018. + */ +public class BitmexOrderReplaceTest { + private static final Logger logger = LoggerFactory.getLogger(BitmexOrderReplaceTest.class); + + @Test + @Ignore + public void testOrderReplace() throws Exception { + CertHelper.trustAllCerts(); + BitmexStreamingExchange exchange = + (BitmexStreamingExchange) ExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class); + ExchangeSpecification defaultExchangeSpecification = exchange.getDefaultExchangeSpecification(); + + defaultExchangeSpecification.setExchangeSpecificParametersItem("Use_Sandbox", true); + + defaultExchangeSpecification.setApiKey("QW8Ao_gx38e-8KFvDkFn-Ym4"); + defaultExchangeSpecification.setSecretKey("tn7rpzvOXSKThZD0f-xXehtydt4OTHZVf42gCCyxPixiiVOb"); + + defaultExchangeSpecification.setShouldLoadRemoteMetaData(true); + defaultExchangeSpecification.setProxyHost("localhost"); + defaultExchangeSpecification.setProxyPort(9999); + + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); + + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.USE_SANDBOX, true); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ACCEPT_ALL_CERITICATES, true); +// defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ENABLE_LOGGING_HANDLER, true); + + exchange.applySpecification(defaultExchangeSpecification); + exchange.connect().blockingAwait(); + BitmexMarketDataService marketDataService = + (BitmexMarketDataService) exchange.getMarketDataService(); + + BitmexTradeService tradeService = (BitmexTradeService)exchange.getTradeService(); + + final BitmexStreamingMarketDataService streamingMarketDataService = (BitmexStreamingMarketDataService) exchange.getStreamingMarketDataService(); +// streamingMarketDataService.authenticate(); + CurrencyPair xbtUsd = CurrencyPair.XBT_USD; + + streamingMarketDataService.getExecutions("XBTUSD").subscribe(bitmexExecution -> { + logger.info("!!!!EXECUTION!!!! = {}", bitmexExecution); + }); + OrderBook orderBook = marketDataService.getOrderBook(CurrencyPair.XBT_USD, PERPETUAL); + // OrderBook orderBook = marketDataService.getOrderBook(new CurrencyPair(Currency.ADA, + // Currency.BTC), BitmexPrompt.QUARTERLY); + // OrderBook orderBook = marketDataService.getOrderBook(new CurrencyPair(Currency.BTC, + // Currency.USD), BitmexPrompt.BIQUARTERLY); + + System.out.println("orderBook = " + orderBook); + + String nosOrdId = System.currentTimeMillis() + ""; + BigDecimal originalOrderSize = new BigDecimal("300"); + // BigDecimal price = new BigDecimal("10000"); + BigDecimal price = orderBook.getBids().get(0).getLimitPrice().add(new BigDecimal("100")); + BitmexPrivateOrder xbtusd = tradeService.placeLimitOrder("XBTUSD", originalOrderSize, price, BitmexSide.SELL, nosOrdId, null); + logger.info("!!!!!PRIVATE_ORDER!!!! {}",xbtusd); + Thread.sleep(5000); + System.out.println(); + System.out.println(); + System.out.println(); + + + logger.info("Replacing"); + String replacedOrderId = nosOrdId + "replace"; + BitmexPrivateOrder replaceBPO = tradeService.replaceLimitOrder("XBTUSD", originalOrderSize.divide(BigDecimal.valueOf(2)), price, null, replacedOrderId, nosOrdId); + logger.info("!!!!!PRIVATE_ORDER_REPLACE!!!! {}",xbtusd); + Thread.sleep(10000); + System.out.println(); + System.out.println(); + System.out.println(); + List bitmexPrivateOrders = tradeService.cancelBitmexOrder(null, replacedOrderId); + for (BitmexPrivateOrder bitmexPrivateOrder : bitmexPrivateOrders) { + logger.info("!!!!!PRIVATE_ORDER_CANCEL!!!! {}",bitmexPrivateOrder); + + } + Thread.sleep(10000); + + // BitmexPrivateOrder bitmexPrivateOrder = + // tradeService.replaceLimitOrder( + // "XBTUSD", + // originalOrderSize.divide(new BigDecimal("2")), + // null, + // orderId, + // // null, null, + // nosOrdId + "replace", + // nosOrdId); + // System.out.println("bitmexPrivateOrder = " + bitmexPrivateOrder); + tradeService.cancelAllOrders(); + exchange.disconnect(); + } +} diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTest.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTest.java new file mode 100644 index 000000000..e8ac86e8f --- /dev/null +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTest.java @@ -0,0 +1,30 @@ +package info.bitrich.xchangestream.bitmex; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; + +/** + * @author Foat Akhmadeev + * 13/06/2018 + */ +public class BitmexStreamingTest { + @Test + public void shouldGetCorrectSubscribeMessage() throws IOException { + BitmexStreamingService service = + new BitmexStreamingService("url", "api", "secret"); + + Assert.assertEquals("{\"op\":\"subscribe\",\"args\":[\"name\"]}", + service.getSubscribeMessage("name")); + } + + @Test + public void shouldGetCorrectUnsubscribeMessage() throws IOException { + BitmexStreamingService service = + new BitmexStreamingService("url", "api", "secret"); + + Assert.assertEquals("{\"op\":\"unsubscribe\",\"args\":[\"name\"]}", + service.getUnsubscribeMessage("name")); + } +} diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTest.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTest.java new file mode 100644 index 000000000..ef8274ee5 --- /dev/null +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTest.java @@ -0,0 +1,102 @@ +package info.bitrich.xchangestream.bitmex; + +import info.bitrich.xchangestream.bitmex.dto.BitmexTicker; +import info.bitrich.xchangestream.core.StreamingExchange; +import info.bitrich.xchangestream.core.StreamingExchangeFactory; +import info.bitrich.xchangestream.util.BookSanityChecker; +import io.reactivex.Completable; +import io.reactivex.Observable; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.marketdata.OrderBook; +import org.knowm.xchange.dto.marketdata.Ticker; +import org.knowm.xchange.dto.marketdata.Trade; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.TimeUnit; + +/** + * @author Foat Akhmadeev + * 31/05/2018 + */ +public class BitmexTest { + private static final Logger LOG = LoggerFactory.getLogger(BitmexTest.class); + + private static final CurrencyPair xbtUsd = CurrencyPair.XBT_USD; + private static final int MIN_DATA_COUNT = 2; + + private StreamingExchange exchange; + private BitmexStreamingMarketDataService streamingMarketDataService; + + @Before + public void setup() { + exchange = StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); + awaitCompletable(exchange.connect()); + streamingMarketDataService = (BitmexStreamingMarketDataService) + exchange.getStreamingMarketDataService(); + } + + @After + public void tearDown() { + awaitCompletable(exchange.disconnect()); + } + + private void awaitCompletable(Completable completable) { + completable.test() + .awaitDone(1, TimeUnit.MINUTES) + .assertComplete() + .assertNoErrors(); + } + + private void awaitDataCount(Observable observable) { + observable.test() + .assertSubscribed() + .assertNoErrors() + .awaitCount(BitmexTest.MIN_DATA_COUNT) + .assertNoTimeout() + .dispose(); + } + + @Test + public void shouldReceiveBooks() { + Observable orderBookObservable = streamingMarketDataService.getOrderBook(xbtUsd); + awaitDataCount(orderBookObservable); + } + + @Test + public void shouldReceiveRawTickers() { + Observable rawTickerObservable = streamingMarketDataService.getRawTicker(xbtUsd); + awaitDataCount(rawTickerObservable); + } + + @Test + public void shouldReceiveTickers() { + Observable tickerObservable = streamingMarketDataService.getTicker(xbtUsd); + awaitDataCount(tickerObservable); + } + + @Test + public void shouldReceiveTrades() { + Observable orderBookObservable = streamingMarketDataService.getTrades(xbtUsd); + awaitDataCount(orderBookObservable); + } + + @Test + public void shouldHaveNoBookErrors() { + streamingMarketDataService.getOrderBook(xbtUsd) + .test() + .assertSubscribed() + .assertNoErrors() + .awaitCount(10) + .assertNever(book -> { + String err = BookSanityChecker.hasErrors(book); + LOG.info("err {}", err); + return err != null; + }) + .assertNoTimeout() + .dispose(); + } +} diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTestsCommons.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTestsCommons.java new file mode 100644 index 000000000..3bd1f0fd0 --- /dev/null +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTestsCommons.java @@ -0,0 +1,24 @@ +package info.bitrich.xchangestream.bitmex; + +import info.bitrich.xchangestream.core.StreamingExchange; +import info.bitrich.xchangestream.util.LocalExchangeConfig; +import org.knowm.xchange.ExchangeSpecification; + +/** + * @author Foat Akhmadeev + * 19/06/2018 + */ +public class BitmexTestsCommons { + public static ExchangeSpecification getExchangeSpecification(LocalExchangeConfig localConfig, + ExchangeSpecification defaultExchangeSpecification) { + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.USE_SANDBOX, true); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ACCEPT_ALL_CERITICATES, true); + defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ENABLE_LOGGING_HANDLER, true); + + defaultExchangeSpecification.setApiKey(localConfig.getApiKey()); + defaultExchangeSpecification.setSecretKey(localConfig.getSecretKey()); + defaultExchangeSpecification.setShouldLoadRemoteMetaData(true); + return defaultExchangeSpecification; + } + +} diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexWithProxyIT.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexWithProxyIT.java new file mode 100644 index 000000000..c0b75f727 --- /dev/null +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexWithProxyIT.java @@ -0,0 +1,67 @@ +package info.bitrich.xchangestream.bitmex; + +import info.bitrich.xchangestream.core.StreamingExchange; +import info.bitrich.xchangestream.core.StreamingExchangeFactory; +import info.bitrich.xchangestream.util.LocalExchangeConfig; +import info.bitrich.xchangestream.util.PropsLoader; +import info.bitrich.xchangestream.util.ProxyUtil; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.knowm.xchange.ExchangeSpecification; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Foat Akhmadeev + * 18/06/2018 + */ +public class BitmexWithProxyIT { + private static final Logger LOG = LoggerFactory.getLogger(BitmexWithProxyIT.class); + + private StreamingExchange exchange; + private ProxyUtil proxyUtil; + + @Before + public void setup() throws Exception { + String execLine = PropsLoader.proxyExecLine(); + LOG.info("Running proxy with \"{}\" command", execLine); + proxyUtil = new ProxyUtil(execLine, 5000); + proxyUtil.startProxy(); + LocalExchangeConfig localConfig = PropsLoader.loadKeys( + "bitmex.secret.keys", "bitmex.secret.keys.origin", "bitmex"); + exchange = StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); + + ExchangeSpecification exchangeSpecification = BitmexTestsCommons.getExchangeSpecification(localConfig, + exchange.getDefaultExchangeSpecification()); + exchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); + exchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); + + exchange.applySpecification(exchangeSpecification); + exchange.connect().blockingAwait(); + } + + @After + public void tearDown() { + exchange.disconnect().blockingAwait(); + proxyUtil.shutdown(); + } + + @Test + public void shouldReconnectOnFailure() throws Exception { + Assert.assertTrue(exchange.isAlive()); + exchange.reconnectFailure().subscribe(e -> { + LOG.info("reconnection issue", e); + }); + + proxyUtil.stopProxy(); + + Thread.sleep(5000); + Assert.assertFalse(exchange.isAlive()); + proxyUtil.startProxy(); + + Thread.sleep(15000); + Assert.assertTrue(exchange.isAlive()); + } +} diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/dto/BitmexExecutionTest.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/dto/BitmexExecutionTest.java new file mode 100644 index 000000000..248d7da27 --- /dev/null +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/dto/BitmexExecutionTest.java @@ -0,0 +1,77 @@ +package info.bitrich.xchangestream.bitmex.dto; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; +import org.knowm.xchange.bitmex.dto.marketdata.BitmexPrivateOrder; +import org.knowm.xchange.bitmex.dto.trade.BitmexSide; + +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.TimeZone; + +import static org.junit.Assert.assertEquals; + +/** + * @author Nikita Belenkiy on 05/06/2018. + */ +public class BitmexExecutionTest { + + @Test + public void testDesialization() throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("info/bitrich/xchangestream/bitmex/dto/execution.json"); + BitmexExecution bitmexExecution = objectMapper.readValue(resourceAsStream, BitmexExecution.class); + + assertEquals( "b47dfbd1-3b88-5678-f6d6-b9314a96c3b8", bitmexExecution.execID); + assertEquals( "5f6c16df-4706-4548-f47d-25f2f915f149", bitmexExecution.orderID); + assertEquals( "1528259635504", bitmexExecution.clOrdID); + assertEquals( "clOrdLinkIDclOrdLinkID", bitmexExecution.clOrdLinkID); + assertEquals( 75430, bitmexExecution.account); + assertEquals( "XBTUSD", bitmexExecution.symbol); + assertEquals( BitmexSide.SELL, bitmexExecution.side); + assertEquals( new Long(30), bitmexExecution.lastQty); + assertEquals( BigDecimal.valueOf(7622.5), bitmexExecution.lastPx); + assertEquals( null, bitmexExecution.underlyingLastPx); + assertEquals( "XBME", bitmexExecution.lastMkt); + assertEquals( "AddedLiquidity", bitmexExecution.lastLiquidityInd); + assertEquals( BigDecimal.valueOf(3030), bitmexExecution.simpleOrderQty); + assertEquals( new Long(30), bitmexExecution.orderQty); + assertEquals( BigDecimal.valueOf(7622.5), bitmexExecution.price); + assertEquals( new Long(2), bitmexExecution.displayQty); + assertEquals( new BigDecimal("7622.1"), bitmexExecution.stopPx); + assertEquals( null, bitmexExecution.pegOffsetValue); + assertEquals( "", bitmexExecution.pegPriceType); + assertEquals( "USD", bitmexExecution.currency); + assertEquals( "XBt", bitmexExecution.settlCurrency); + assertEquals( "Trade", bitmexExecution.execType); + assertEquals( "Limit", bitmexExecution.ordType); + assertEquals( "GoodTillCancel", bitmexExecution.timeInForce); + assertEquals( "", bitmexExecution.execInst); + assertEquals( "", bitmexExecution.contingencyType); + assertEquals( "XBME", bitmexExecution.exDestination); + assertEquals( BitmexPrivateOrder.OrderStatus.Filled, bitmexExecution.ordStatus); + assertEquals( "", bitmexExecution.triggered); + assertEquals( false, bitmexExecution.workingIndicator); + assertEquals( "", bitmexExecution.ordRejReason); + assertEquals( BigDecimal.valueOf(10), bitmexExecution.simpleLeavesQty); + assertEquals( new Long(11), bitmexExecution.leavesQty); + assertEquals( BigDecimal.valueOf(0.0039357), bitmexExecution.simpleCumQty); + assertEquals( BigDecimal.valueOf(30), bitmexExecution.cumQty); + assertEquals( BigDecimal.valueOf(7622.5), bitmexExecution.avgPx); + assertEquals( BigDecimal.valueOf(-0.00025), bitmexExecution.commission); + assertEquals( "PublishTrade", bitmexExecution.tradePublishIndicator); + assertEquals( "SingleSecurity", bitmexExecution.multiLegReportingType); + assertEquals( "Submitted via API.", bitmexExecution.text); + assertEquals( "11bae57a-3a11-83bc-3b71-0e472b89156f", bitmexExecution.trdMatchID); + assertEquals( new Long(393570), bitmexExecution.execCost); + assertEquals( new Long(-98), bitmexExecution.execComm); + assertEquals( BigDecimal.valueOf(-0.0039357), bitmexExecution.homeNotional); + assertEquals( BigDecimal.valueOf(30), bitmexExecution.foreignNotional); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + format.setTimeZone(TimeZone.getTimeZone("UTC")); + assertEquals("2018-06-06T04:35:04.763Z", format.format(bitmexExecution.transactTime)); + assertEquals("2018-06-06T04:35:04.763Z", format.format(bitmexExecution.timestamp)); + } +} diff --git a/xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/execution-spec.json b/xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/execution-spec.json new file mode 100644 index 000000000..ec893d431 --- /dev/null +++ b/xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/execution-spec.json @@ -0,0 +1,72 @@ +{ + "table": "execution", + "action": "partial", + "keys": [ + "execID" + ], + "types": { + "execID": "guid", + "orderID": "guid", + "clOrdID": "symbol", + "clOrdLinkID": "symbol", + "account": "long", + "symbol": "symbol", + "side": "symbol", + "lastQty": "long", + "lastPx": "float", + "underlyingLastPx": "float", + "lastMkt": "symbol", + "lastLiquidityInd": "symbol", + "simpleOrderQty": "float", + "orderQty": "long", + "price": "float", + "displayQty": "long", + "stopPx": "float", + "pegOffsetValue": "float", + "pegPriceType": "symbol", + "currency": "symbol", + "settlCurrency": "symbol", + "execType": "symbol", + "ordType": "symbol", + "timeInForce": "symbol", + "execInst": "symbol", + "contingencyType": "symbol", + "exDestination": "symbol", + "ordStatus": "symbol", + "triggered": "symbol", + "workingIndicator": "boolean", + "ordRejReason": "symbol", + "simpleLeavesQty": "float", + "leavesQty": "long", + "simpleCumQty": "float", + "cumQty": "long", + "avgPx": "float", + "commission": "float", + "tradePublishIndicator": "symbol", + "multiLegReportingType": "symbol", + "text": "symbol", + "trdMatchID": "guid", + "execCost": "long", + "execComm": "long", + "homeNotional": "float", + "foreignNotional": "float", + "transactTime": "timestamp", + "timestamp": "timestamp" + }, + "foreignKeys": { + "symbol": "instrument", + "side": "side", + "ordStatus": "ordStatus" + }, + "attributes": { + "execID": "grouped", + "account": "grouped", + "execType": "grouped", + "transactTime": "sorted" + }, + "filter": { + "account": 75430, + "symbol": "XBTUSD" + }, + "data": [] +} diff --git a/xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/execution.json b/xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/execution.json new file mode 100644 index 000000000..c9c571cdd --- /dev/null +++ b/xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/execution.json @@ -0,0 +1,50 @@ +{ + "execID": "b47dfbd1-3b88-5678-f6d6-b9314a96c3b8", + "orderID": "5f6c16df-4706-4548-f47d-25f2f915f149", + "clOrdID": "1528259635504", + "clOrdLinkID": "clOrdLinkIDclOrdLinkID", + "account": 75430, + "symbol": "XBTUSD", + "side": "Sell", + "lastQty": 30, + "lastPx": 7622.5, + "underlyingLastPx": null, + "lastMkt": "XBME", + "lastLiquidityInd": "AddedLiquidity", + "simpleOrderQty": "3030", + "orderQty": 30, + "price": 7622.5, + "displayQty": 2, + "stopPx": 7622.1, + "pegOffsetValue": null, + "pegPriceType": "", + "currency": "USD", + "settlCurrency": "XBt", + "execType": "Trade", + "ordType": "Limit", + "timeInForce": "GoodTillCancel", + "execInst": "", + "contingencyType": "", + "exDestination": "XBME", + "ordStatus": "Filled", + "triggered": "", + "workingIndicator": false, + "ordRejReason": "", + "simpleLeavesQty": 10, + "leavesQty": 11, + "simpleCumQty": 0.0039357, + "cumQty": 30, + "avgPx": 7622.5, + "commission": -0.00025, + "tradePublishIndicator": "PublishTrade", + "multiLegReportingType": "SingleSecurity", + "text": "Submitted via API.", + "trdMatchID": "11bae57a-3a11-83bc-3b71-0e472b89156f", + "execCost": 393570, + "execComm": -98, + "homeNotional": -0.0039357, + "foreignNotional": 30, + "transactTime": "2018-06-06T04:35:04.763Z", + "timestamp": "2018-06-06T04:35:04.763Z" +} + diff --git a/xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/position.json b/xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/position.json new file mode 100644 index 000000000..428d3ed8f --- /dev/null +++ b/xchange-bitmex/src/test/resources/info/bitrich/xchangestream/bitmex/dto/position.json @@ -0,0 +1,20 @@ +{ + "account": 2, + "symbol": "XBTUSD", + "currency": "XBt", + "currentTimestamp": "2017-04-04T22:07:42.442Z", + "currentQty": 1, + "markPrice": 1136.88, + "markValue": -87960, + "riskValue": 87960, + "homeNotional": 0.0008796, + "posState": "Liquidation", + "maintMargin": 263, + "unrealisedGrossPnl": -677, + "unrealisedPnl": -677, + "unrealisedPnlPcnt": -0.0078, + "unrealisedRoePcnt": -0.7756, + "simpleQty": 0.001, + "liquidationPrice": 1140.1, + "timestamp": "2017-04-04T22:07:45.442Z" +} From 72828ca78aa0200a1697cbe5b34a1bd12826c250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sat, 10 Nov 2018 07:24:20 +0800 Subject: [PATCH 73/97] bitmex add index subscription --- .../BitmexStreamingMarketDataService.java | 27 +++++++++++++++---- .../bitmex/BitmexManualExample.java | 4 +++ .../okcoin/OkExStreamingExchange.java | 5 ++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index 77fefb69f..7c66df8cb 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -12,6 +12,7 @@ import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Ticker; import org.knowm.xchange.dto.marketdata.Trade; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -84,11 +85,7 @@ public Observable getTicker(CurrencyPair currencyPair, Object... args) { }); } - @Override - public Observable getTrades(CurrencyPair currencyPair, Object... args) { - String instrument = getBitmexSymbol(currencyPair, args); - String channelName = String.format("trade:%s", instrument); - + public Observable _getTrades(String channelName) { return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { BitmexTrade[] bitmexTrades = s.toBitmexTrades(); List trades = new ArrayList<>(bitmexTrades.length); @@ -99,4 +96,24 @@ public Observable getTrades(CurrencyPair currencyPair, Object... args) { }); } + @Override + public Observable getTrades(CurrencyPair currencyPair, Object... args) { + String instrument = getBitmexSymbol(currencyPair, args); + String channelName = String.format("trade:%s", instrument); + + return _getTrades(channelName); + } + + public Observable getIndex(CurrencyPair currencyPair, Object... args) { + String instrument; + if (currencyPair == CurrencyPair.XBT_USD) { + instrument = ".BXBT"; + } else { + throw new NotYetImplementedForExchangeException("Not implemented"); + } + String channelName = String.format("trade:%s", instrument); + + return _getTrades(channelName); + } + } diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java index b73fcbb46..f1481b6c2 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java @@ -22,6 +22,10 @@ public static void main(String[] args) { final BitmexStreamingMarketDataService streamingMarketDataService = (BitmexStreamingMarketDataService) exchange.getStreamingMarketDataService(); + streamingMarketDataService.getIndex(CurrencyPair.XBT_USD).subscribe(order -> { + LOG.info("XBT Index: {}", order); + }); + CurrencyPair xbtUsd = CurrencyPair.XBT_USD; streamingMarketDataService.getOrderBook(xbtUsd).subscribe(orderBook -> { LOG.info("First ask: {}", orderBook.getAsks().get(0)); diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java index 4df8e4cf8..154e1e852 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java @@ -13,4 +13,9 @@ public OkExStreamingExchange() { public OkExStreamingExchange(String apiUrl) { super(new OkCoinStreamingService(apiUrl)); } + + @Override + protected void initServices() { + super.initServices(); + } } From 0d5bf75be310b055d38bcebbd46863d9438280d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Sat, 10 Nov 2018 07:26:57 +0800 Subject: [PATCH 74/97] Revert "bitmex add index subscription" This reverts commit 72828ca78aa0200a1697cbe5b34a1bd12826c250. --- .../BitmexStreamingMarketDataService.java | 27 ++++--------------- .../bitmex/BitmexManualExample.java | 4 --- .../okcoin/OkExStreamingExchange.java | 5 ---- 3 files changed, 5 insertions(+), 31 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index 7c66df8cb..77fefb69f 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -12,7 +12,6 @@ import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Ticker; import org.knowm.xchange.dto.marketdata.Trade; -import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,7 +84,11 @@ public Observable getTicker(CurrencyPair currencyPair, Object... args) { }); } - public Observable _getTrades(String channelName) { + @Override + public Observable getTrades(CurrencyPair currencyPair, Object... args) { + String instrument = getBitmexSymbol(currencyPair, args); + String channelName = String.format("trade:%s", instrument); + return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { BitmexTrade[] bitmexTrades = s.toBitmexTrades(); List trades = new ArrayList<>(bitmexTrades.length); @@ -96,24 +99,4 @@ public Observable _getTrades(String channelName) { }); } - @Override - public Observable getTrades(CurrencyPair currencyPair, Object... args) { - String instrument = getBitmexSymbol(currencyPair, args); - String channelName = String.format("trade:%s", instrument); - - return _getTrades(channelName); - } - - public Observable getIndex(CurrencyPair currencyPair, Object... args) { - String instrument; - if (currencyPair == CurrencyPair.XBT_USD) { - instrument = ".BXBT"; - } else { - throw new NotYetImplementedForExchangeException("Not implemented"); - } - String channelName = String.format("trade:%s", instrument); - - return _getTrades(channelName); - } - } diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java index f1481b6c2..b73fcbb46 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java @@ -22,10 +22,6 @@ public static void main(String[] args) { final BitmexStreamingMarketDataService streamingMarketDataService = (BitmexStreamingMarketDataService) exchange.getStreamingMarketDataService(); - streamingMarketDataService.getIndex(CurrencyPair.XBT_USD).subscribe(order -> { - LOG.info("XBT Index: {}", order); - }); - CurrencyPair xbtUsd = CurrencyPair.XBT_USD; streamingMarketDataService.getOrderBook(xbtUsd).subscribe(orderBook -> { LOG.info("First ask: {}", orderBook.getAsks().get(0)); diff --git a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java index 154e1e852..4df8e4cf8 100644 --- a/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java +++ b/xchange-okcoin/src/main/java/info/bitrich/xchangestream/okcoin/OkExStreamingExchange.java @@ -13,9 +13,4 @@ public OkExStreamingExchange() { public OkExStreamingExchange(String apiUrl) { super(new OkCoinStreamingService(apiUrl)); } - - @Override - protected void initServices() { - super.initServices(); - } } From bec0866e07fc4a9bb4ba8be0519324cb29c0b718 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Tue, 21 May 2019 10:51:21 +0800 Subject: [PATCH 75/97] okex v3 get orderbook, bitmex adapt to new version XChange --- pom.xml | 4 +- .../bitmex/BitmexStreamingExchange.java | 3 +- .../BitmexStreamingMarketDataService.java | 13 +- .../bitmex/BitmexStreamingTradeService.java | 2 +- .../xchangestream/bitmex/BitmexUtils.java | 185 ------------ .../xchangestream/bitmex/dto/BitmexOrder.java | 6 +- .../dto/BitstampWebSocketTransaction.java | 2 +- .../FCoinStreamingMarketDataService.java | 44 --- .../fcoin/FCoinStreamingService.java | 62 ---- .../xchangestream/fcoin/dto/FCoinMessage.java | 30 -- .../fcoin/FCoinManualExample.java | 28 -- .../gdax/GDAXStreamingExchange.java | 81 ------ .../gdax/GDAXStreamingMarketDataService.java | 150 ---------- .../gdax/GDAXStreamingService.java | 130 --------- .../dto/GDAXWebSocketSubscriptionMessage.java | 110 -------- .../gdax/dto/GDAXWebSocketTransaction.java | 265 ------------------ ...ompressionAllowClientNoContextHandler.java | 25 -- .../xchangestream/gdax/GDAXManualExample.java | 40 --- .../GDAXWebSocketSubscriptionMessageTest.java | 30 -- xchange-gdax/src/test/resources/log4j2.xml | 14 - {xchange-gdax => xchange-okex-v3}/pom.xml | 11 +- .../okex/OkexStreamingExchange.java | 73 +++++ .../okex/OkexStreamingMarketDataService.java | 151 ++++++++++ .../okex/OkexStreamingService.java | 157 +++++++++++ .../okex/dto/OkCoinOrderbook.java | 80 ++++++ .../okex/dto/OkCoinWebSocketTrade.java | 28 ++ .../okex/dto/RequestMessage.java | 25 ++ .../okex/dto/marketdata/FutureTicker.java | 92 ++++++ .../okex/OkExFuturesManualExample.java | 38 +++ .../src/test}/resources/log4j2.xml | 0 .../src/test/resources/order-book.json | 30 ++ .../src/test/resources/subscribe.json | 1 + .../src/test/resources/unsubscribe.json | 1 + 33 files changed, 699 insertions(+), 1212 deletions(-) delete mode 100644 xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java delete mode 100644 xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingMarketDataService.java delete mode 100644 xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingService.java delete mode 100644 xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/dto/FCoinMessage.java delete mode 100644 xchange-fcoin/src/test/java/info/bitrich/xchangestream/fcoin/FCoinManualExample.java delete mode 100644 xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingExchange.java delete mode 100644 xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingMarketDataService.java delete mode 100644 xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingService.java delete mode 100644 xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketSubscriptionMessage.java delete mode 100644 xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketTransaction.java delete mode 100644 xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/netty/WebSocketClientCompressionAllowClientNoContextHandler.java delete mode 100644 xchange-gdax/src/test/java/info/bitrich/xchangestream/gdax/GDAXManualExample.java delete mode 100644 xchange-gdax/src/test/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketSubscriptionMessageTest.java delete mode 100644 xchange-gdax/src/test/resources/log4j2.xml rename {xchange-gdax => xchange-okex-v3}/pom.xml (78%) create mode 100644 xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java create mode 100644 xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java create mode 100644 xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java create mode 100644 xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/OkCoinOrderbook.java create mode 100644 xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/OkCoinWebSocketTrade.java create mode 100644 xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java create mode 100644 xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/marketdata/FutureTicker.java create mode 100644 xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/OkExFuturesManualExample.java rename {xchange-fcoin/src/main => xchange-okex-v3/src/test}/resources/log4j2.xml (100%) create mode 100644 xchange-okex-v3/src/test/resources/order-book.json create mode 100644 xchange-okex-v3/src/test/resources/subscribe.json create mode 100644 xchange-okex-v3/src/test/resources/unsubscribe.json diff --git a/pom.xml b/pom.xml index 0620fbd9b..5cb5ef7da 100644 --- a/pom.xml +++ b/pom.xml @@ -17,9 +17,9 @@ xchange-bitstamp xchange-cexio xchange-okcoin + xchange-okex-v3 xchange-poloniex xchange-coinmate - xchange-gdax xchange-bitfinex xchange-bitmex xchange-poloniex2 @@ -88,7 +88,7 @@ - 4.3.6 + 4.3.19-SNAPSHOT UTF-8 UTF-8 1.8 diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java index 90cbf05ae..730952418 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingExchange.java @@ -30,8 +30,7 @@ protected BitmexStreamingExchange(BitmexStreamingService streamingService) { @Override protected void initServices() { super.initServices(); - BitmexUtils.initBitmexContracts(); - streamingMarketDataService = new BitmexStreamingMarketDataService(streamingService); + streamingMarketDataService = new BitmexStreamingMarketDataService(streamingService, this); streamingService.setExchangeSpecification(this.getExchangeSpecification()); } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index 77fefb69f..5dab9b67d 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -6,7 +6,7 @@ import info.bitrich.xchangestream.bitmex.dto.BitmexTrade; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Observable; -import org.knowm.xchange.bitmex.BitmexContract; +import org.knowm.xchange.bitmex.BitmexExchange; import org.knowm.xchange.bitmex.BitmexPrompt; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.marketdata.OrderBook; @@ -25,20 +25,21 @@ public class BitmexStreamingMarketDataService implements StreamingMarketDataServ protected final BitmexStreamingService streamingService; + protected final BitmexExchange bitmexExchange; + private final SortedMap orderbooks = new TreeMap<>(); - public BitmexStreamingMarketDataService(BitmexStreamingService streamingService) { + public BitmexStreamingMarketDataService(BitmexStreamingService streamingService, BitmexExchange bitmexExchange) { this.streamingService = streamingService; + this.bitmexExchange = bitmexExchange; } private String getBitmexSymbol(CurrencyPair currencyPair, Object... args) { if (args.length > 0) { BitmexPrompt prompt = (BitmexPrompt) args[0]; - BitmexContract contract = new BitmexContract(currencyPair, prompt); - return BitmexUtils.translateBitmexContract(contract); - } else { - return currencyPair.base.toString() + currencyPair.counter.toString(); + currencyPair = bitmexExchange.determineActiveContract(currencyPair.base.toString(), currencyPair.counter.toString(), prompt); } + return currencyPair.base.toString() + currencyPair.counter.toString(); } @Override diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java index 39d1630b3..de6466241 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java @@ -30,7 +30,7 @@ public Observable getOrders(CurrencyPair currencyPair, Object... args) { return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { BitmexOrder[] bitmexOrders = s.toBitmexOrders(); return Arrays.stream(bitmexOrders) - .filter(bitmexOrder -> bitmexOrder.getSymbol() == instrument) + .filter(bitmexOrder -> bitmexOrder.getSymbol().equals(instrument)) .filter(BitmexOrder::isNotWorkingIndicator) .map(BitmexOrder::toOrder).collect(Collectors.toList()); }); diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java deleted file mode 100644 index 76ad8485f..000000000 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexUtils.java +++ /dev/null @@ -1,185 +0,0 @@ -package info.bitrich.xchangestream.bitmex; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import java.io.IOException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.http.client.fluent.Content; -import org.apache.http.client.fluent.Request; -import org.knowm.xchange.bitmex.BitmexContract; -import org.knowm.xchange.bitmex.BitmexPrompt; -import org.knowm.xchange.bitmex.dto.account.BitmexTicker; -import org.knowm.xchange.currency.Currency; -import org.knowm.xchange.currency.CurrencyPair; -import org.knowm.xchange.exceptions.ExchangeException; - - -public class BitmexUtils { - protected static final HashBiMap assetsMap = HashBiMap.create(); - protected static Map assetPairMap = new HashMap(); - protected static BiMap bitmexContracts = HashBiMap.create(); - protected static BiMap bitmexCurrencies = HashBiMap.create(); - - private BitmexUtils() { - - } - - public static void initBitmexContracts() { - Request request = Request.Get("https://www.bitmex.com/api/v1/instrument/activeIntervals"); - try { - Content content = request.execute().returnContent(); - ObjectMapper mapper = new ObjectMapper(); - JsonNode node = mapper.readValue(content.toString(), JsonNode.class); - JsonNode intervals = node.get("intervals"); - JsonNode symbols = node.get("symbols"); - for (int i = 0; i < symbols.size(); i++) { - String symbol = symbols.get(i).textValue(); - String interval = intervals.get(i).textValue(); - String[] parts = interval.split(":"); - bitmexContracts.put(symbol, new BitmexContract(new CurrencyPair(new Currency(parts[0]), Currency.USD), BitmexPrompt.valueOf(parts[1].toUpperCase()))); - } - } catch (IOException e) { - e.printStackTrace(); - } - - } - - public static void setBitmexAssetPairs(List tickers) { - Iterator var1 = tickers.iterator(); - - while(var1.hasNext()) { - BitmexTicker ticker = (BitmexTicker)var1.next(); - String quote = ticker.getQuoteCurrency(); - String base = ticker.getRootSymbol(); - Currency baseCurrencyCode = Currency.getInstance(base); - Currency quoteCurrencyCode = Currency.getInstance(quote); - CurrencyPair pair = new CurrencyPair(base, quote); - if (!assetPairMap.containsKey(ticker.getSymbol()) && !assetPairMap.containsValue(pair)) { - assetPairMap.put(ticker.getSymbol(), pair); - } - - if (!assetsMap.containsKey(quote) && !assetsMap.containsValue(quoteCurrencyCode)) { - assetsMap.put(quote, quoteCurrencyCode); - } - - if (!assetsMap.containsKey(base) && !assetsMap.containsValue(baseCurrencyCode)) { - assetsMap.put(base, baseCurrencyCode); - } - } - - } - - public static String createBitmexContract(BitmexContract contract) { - return (String)bitmexContracts.inverse().get(contract); - } - - public static CurrencyPair translateBitmexCurrencyPair(String currencyPairIn) { - CurrencyPair pair = (CurrencyPair)assetPairMap.get(currencyPairIn); - if (pair == null) { - Currency base; - Currency counter; - if (currencyPairIn.length() == 6) { - base = Currency.getInstance(currencyPairIn.substring(0, 3)); - if (base.getCommonlyUsedCurrency() != null) { - base = base.getCommonlyUsedCurrency(); - } - - counter = Currency.getInstance(currencyPairIn.substring(3, 6)); - if (counter.getCommonlyUsedCurrency() != null) { - counter = counter.getCommonlyUsedCurrency(); - } - - pair = new CurrencyPair(base, counter); - } else if (currencyPairIn.length() == 7) { - base = Currency.getInstance(currencyPairIn.substring(0, 4)); - if (base.getCommonlyUsedCurrency() != null) { - base = base.getCommonlyUsedCurrency(); - } - - counter = Currency.getInstance(currencyPairIn.substring(4, 7)); - if (counter.getCommonlyUsedCurrency() != null) { - counter = counter.getCommonlyUsedCurrency(); - } - - pair = new CurrencyPair(base, counter); - } - } - - return pair; - } - - public static String getBitmexCurrencyCode(Currency currency) { - if (currency.getIso4217Currency() != null) { - currency = currency.getIso4217Currency(); - } - - String bitmexCode = (String)assetsMap.inverse().get(currency); - if (bitmexCode == null) { - throw new ExchangeException("Bitmex does not support the currency code " + currency); - } else { - return bitmexCode; - } - } - - public static String translateCurrency(Currency currencyIn) { - String currencyOut = (String)bitmexCurrencies.get(currencyIn); - if (currencyOut == null) { - throw new ExchangeException("Bitmex does not support the currency code " + currencyIn); - } else { - return currencyOut; - } - } - - public static Currency translateBitmexCurrency(String currencyIn) { - Currency currencyOut = (Currency)bitmexCurrencies.inverse().get(currencyIn); - if (currencyOut == null) { - throw new ExchangeException("Bitmex does not support the currency code " + currencyIn); - } else { - return currencyOut; - } - } - - public static String translateBitmexContract(BitmexContract contractIn) { - String contractOut = bitmexContracts.inverse().get(contractIn); - if (contractOut == null) { - if (contractIn.prompt == BitmexPrompt.QUARTERLY) { - contractOut = bitmexContracts.inverse().get(new BitmexContract(contractIn.pair, BitmexPrompt.MONTHLY)); - if (contractOut == null) { - contractOut = bitmexContracts.inverse().get(new BitmexContract(contractIn.pair, BitmexPrompt.WEEKLY)); - } - } - if (contractOut == null) { - throw new ExchangeException("Bitmex does not support the contact " + contractIn); - } - - } - return contractOut; - } - - public static Currency translateBitmexCurrencyCode(String currencyIn) { - Currency currencyOut = (Currency)assetsMap.get(currencyIn); - if (currencyOut == null) { - throw new ExchangeException("Bitmex does not support the currency code " + currencyIn); - } else { - return currencyOut.getCommonlyUsedCurrency(); - } - } - - public class CustomBitmexContractSerializer extends JsonSerializer { - public CustomBitmexContractSerializer() { - } - - public void serialize(BitmexContract contract, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { - jsonGenerator.writeString(contract.toString()); - } - } -} diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java index aaf6e0a48..e4d27b47f 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.knowm.xchange.bitmex.BitmexUtils; +import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.Order; import org.knowm.xchange.dto.trade.LimitOrder; import org.knowm.xchange.dto.trade.MarketOrder; @@ -84,9 +84,9 @@ public BitmexOrder(@JsonProperty("symbol") String symbol, public Order toOrder() { Order.Builder order; if (ordType.equals("Market")) { - order = new MarketOrder.Builder(side.equals("Buy") ? Order.OrderType.BID : Order.OrderType.ASK, BitmexUtils.translateBitmexCurrencyPair(symbol)); + order = new MarketOrder.Builder(side.equals("Buy") ? Order.OrderType.BID : Order.OrderType.ASK, new CurrencyPair(symbol.substring(0, 3), symbol.substring(3, symbol.length()))); } else { - order = new LimitOrder.Builder(side.equals("Buy") ? Order.OrderType.BID : Order.OrderType.ASK, BitmexUtils.translateBitmexCurrencyPair(symbol)); + order = new LimitOrder.Builder(side.equals("Buy") ? Order.OrderType.BID : Order.OrderType.ASK, new CurrencyPair(symbol.substring(0, 3), symbol.substring(3, symbol.length()))); } order.id(orderID) .averagePrice(avgPx) diff --git a/xchange-bitstamp/src/main/java/info/bitrich/xchangestream/bitstamp/dto/BitstampWebSocketTransaction.java b/xchange-bitstamp/src/main/java/info/bitrich/xchangestream/bitstamp/dto/BitstampWebSocketTransaction.java index 2a1d126ca..71f096784 100644 --- a/xchange-bitstamp/src/main/java/info/bitrich/xchangestream/bitstamp/dto/BitstampWebSocketTransaction.java +++ b/xchange-bitstamp/src/main/java/info/bitrich/xchangestream/bitstamp/dto/BitstampWebSocketTransaction.java @@ -6,7 +6,7 @@ import java.math.BigDecimal; public class BitstampWebSocketTransaction extends BitstampTransaction { - public BitstampWebSocketTransaction(@JsonProperty("datetime") long date, @JsonProperty("id") int tid, @JsonProperty("price") BigDecimal price, @JsonProperty("amount") BigDecimal amount, @JsonProperty("order_type") int type) { + public BitstampWebSocketTransaction(@JsonProperty("datetime") long date, @JsonProperty("id") long tid, @JsonProperty("price") BigDecimal price, @JsonProperty("amount") BigDecimal amount, @JsonProperty("order_type") int type) { super(date, tid, price, amount, type); } } diff --git a/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingMarketDataService.java b/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingMarketDataService.java deleted file mode 100644 index 0e211983d..000000000 --- a/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingMarketDataService.java +++ /dev/null @@ -1,44 +0,0 @@ -package info.bitrich.xchangestream.fcoin; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import info.bitrich.xchangestream.core.StreamingMarketDataService; -import io.reactivex.Observable; -import org.knowm.xchange.currency.CurrencyPair; -import org.knowm.xchange.dto.marketdata.OrderBook; -import org.knowm.xchange.dto.marketdata.Ticker; -import org.knowm.xchange.dto.marketdata.Trade; -import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; -import org.knowm.xchange.fcoin.FCoinAdapters; -import org.knowm.xchange.fcoin.dto.marketdata.FCoinDepth; - -public class FCoinStreamingMarketDataService implements StreamingMarketDataService { - protected final FCoinStreamingService service; - - private final ObjectMapper mapper = new ObjectMapper(); - - FCoinStreamingMarketDataService(FCoinStreamingService service) { - this.service = service; - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - } - - @Override - public Observable getOrderBook(CurrencyPair currencyPair, Object... args) { - String channel = String.format("depth.L20.%s%s", currencyPair.base.toString().toLowerCase(), currencyPair.counter.toString().toLowerCase()); - return this.service.subscribeChannel(channel).map((s) -> { - FCoinDepth fCoinDepth = this.mapper.treeToValue(s, FCoinDepth.class); - return FCoinAdapters.adaptOrderBook(fCoinDepth, currencyPair); - }); - } - - @Override - public Observable getTicker(CurrencyPair currencyPair, Object... args) { - throw new NotYetImplementedForExchangeException(); - } - - @Override - public Observable getTrades(CurrencyPair currencyPair, Object... args) { - throw new NotYetImplementedForExchangeException(); - } - -} diff --git a/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingService.java b/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingService.java deleted file mode 100644 index f149770cc..000000000 --- a/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/FCoinStreamingService.java +++ /dev/null @@ -1,62 +0,0 @@ -package info.bitrich.xchangestream.fcoin; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import info.bitrich.xchangestream.fcoin.dto.FCoinMessage; -import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; -import io.reactivex.ObservableEmitter; - -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; - -public class FCoinStreamingService extends JsonNettyStreamingService { - - private List> delayEmitters = new LinkedList<>(); - - public FCoinStreamingService(String apiUrl) { - super(apiUrl); - } - - @Override - protected String getChannelNameFromMessage(JsonNode message) throws IOException { - if (!message.has("type")) { - throw new IOException("No channel"); - } - return message.get("type").asText(); - } - - @Override - public String getSubscribeMessage(String channelName, Object... args) throws IOException { - FCoinMessage FCoinMessage = new FCoinMessage(null, "sub", channelName); - - ObjectMapper objectMapper = new ObjectMapper(); - return objectMapper.writeValueAsString(FCoinMessage); - } - - @Override - public String getUnsubscribeMessage(String channelName) throws IOException { - FCoinMessage FCoinMessage = new FCoinMessage(null, "unsub", channelName); - - ObjectMapper objectMapper = new ObjectMapper(); - return objectMapper.writeValueAsString(FCoinMessage); - } - - @Override - protected void handleMessage(JsonNode message) { - if (message != null) { - if (message.has("ts")) { - for (ObservableEmitter emitter : delayEmitters) { - emitter.onNext(System.currentTimeMillis() - message.get("timestamp").asLong()); - } - } - } - super.handleMessage(message); - } - - public void addDelayEmitter(ObservableEmitter delayEmitter) { - delayEmitters.add(delayEmitter); - } - - } - diff --git a/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/dto/FCoinMessage.java b/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/dto/FCoinMessage.java deleted file mode 100644 index b22621bf8..000000000 --- a/xchange-fcoin/src/main/java/info/bitrich/xchangestream/fcoin/dto/FCoinMessage.java +++ /dev/null @@ -1,30 +0,0 @@ -package info.bitrich.xchangestream.fcoin.dto; - -import java.util.Arrays; -import java.util.List; - -public class FCoinMessage { - - private final String id; - private final String cmd; - private final List args; - - public FCoinMessage(String id, String cmd, String ... args) { - this.id = id; - this.cmd = cmd; - this.args = Arrays.asList(args); - } - - public String getId() { - return id; - } - - public String getCmd() { - return cmd; - } - - public List getArgs() { - return args; - } - -} diff --git a/xchange-fcoin/src/test/java/info/bitrich/xchangestream/fcoin/FCoinManualExample.java b/xchange-fcoin/src/test/java/info/bitrich/xchangestream/fcoin/FCoinManualExample.java deleted file mode 100644 index 0e52c46a0..000000000 --- a/xchange-fcoin/src/test/java/info/bitrich/xchangestream/fcoin/FCoinManualExample.java +++ /dev/null @@ -1,28 +0,0 @@ -package info.bitrich.xchangestream.fcoin; - -import info.bitrich.xchangestream.core.StreamingExchange; -import info.bitrich.xchangestream.core.StreamingExchangeFactory; -import org.knowm.xchange.currency.CurrencyPair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class FCoinManualExample { - private static final Logger LOG = LoggerFactory.getLogger(FCoinManualExample.class); - - public static void main(String[] args) { - StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(FCoinStreamingExchange.class.getName()); - exchange.connect().blockingAwait(); - - exchange.getStreamingMarketDataService().getOrderBook(CurrencyPair.BTC_USDT).subscribe(orderBook -> { - LOG.info("First ask: {}", orderBook.getAsks().get(0).getLimitPrice()); - LOG.info("First bid: {}", orderBook.getBids().get(0).getLimitPrice()); - }, throwable -> LOG.error("ERROR in getting order book: ", throwable)); - - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} - diff --git a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingExchange.java b/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingExchange.java deleted file mode 100644 index 6bbb4ed13..000000000 --- a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingExchange.java +++ /dev/null @@ -1,81 +0,0 @@ -package info.bitrich.xchangestream.gdax; - -import info.bitrich.xchangestream.core.ProductSubscription; -import info.bitrich.xchangestream.core.StreamingExchange; -import info.bitrich.xchangestream.core.StreamingMarketDataService; -import info.bitrich.xchangestream.service.netty.WebSocketClientHandler; -import io.reactivex.Completable; -import io.reactivex.Observable; -import org.knowm.xchange.ExchangeSpecification; -import org.knowm.xchange.gdax.GDAXExchange; - -/** - * GDAX Streaming Exchange. Connects to live WebSocket feed. - */ -public class GDAXStreamingExchange extends GDAXExchange implements StreamingExchange { - private static final String API_URI = "wss://ws-feed.gdax.com"; - - private GDAXStreamingService streamingService; - private GDAXStreamingMarketDataService streamingMarketDataService; - - public GDAXStreamingExchange() { } - - @Override - protected void initServices() { - super.initServices(); - } - - @Override - public Completable connect(ProductSubscription... args) { - if (args == null || args.length == 0) - throw new UnsupportedOperationException("The ProductSubscription must be defined!"); - this.streamingService = new GDAXStreamingService(API_URI); - this.streamingMarketDataService = new GDAXStreamingMarketDataService(this.streamingService); - streamingService.subscribeMultipleCurrencyPairs(args); - - return streamingService.connect(); - } - - @Override - public Completable disconnect() { - GDAXStreamingService service = this.streamingService; - streamingService = null; - streamingMarketDataService = null; - return service.disconnect(); - } - - @Override - public Observable reconnectFailure() { - return streamingService.subscribeReconnectFailure(); - } - - @Override - public ExchangeSpecification getDefaultExchangeSpecification() { - ExchangeSpecification spec = super.getDefaultExchangeSpecification(); - spec.setShouldLoadRemoteMetaData(false); - - return spec; - } - - @Override - public StreamingMarketDataService getStreamingMarketDataService() { - return streamingMarketDataService; - } - - /** - * Enables the user to listen on channel inactive events and react appropriately. - * - * @param channelInactiveHandler a WebSocketMessageHandler instance. - */ - public void setChannelInactiveHandler(WebSocketClientHandler.WebSocketMessageHandler channelInactiveHandler) { - streamingService.setChannelInactiveHandler(channelInactiveHandler); - } - - @Override - public boolean isAlive() { - return streamingService != null && streamingService.isSocketOpen(); - } - - @Override - public void useCompressedMessages(boolean compressedMessages) { streamingService.useCompressedMessages(compressedMessages); } -} diff --git a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingMarketDataService.java b/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingMarketDataService.java deleted file mode 100644 index 7410f51d3..000000000 --- a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingMarketDataService.java +++ /dev/null @@ -1,150 +0,0 @@ -package info.bitrich.xchangestream.gdax; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import info.bitrich.xchangestream.core.StreamingMarketDataService; -import info.bitrich.xchangestream.gdax.dto.GDAXWebSocketTransaction; -import io.reactivex.Observable; -import org.knowm.xchange.currency.CurrencyPair; -import org.knowm.xchange.dto.marketdata.OrderBook; -import org.knowm.xchange.dto.marketdata.Ticker; -import org.knowm.xchange.dto.marketdata.Trade; -import org.knowm.xchange.dto.marketdata.Trades; -import org.knowm.xchange.gdax.dto.marketdata.GDAXProductBook; -import org.knowm.xchange.gdax.dto.marketdata.GDAXProductTicker; -import org.knowm.xchange.gdax.dto.marketdata.GDAXTrade; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.math.BigDecimal; -import java.util.*; - -import static io.netty.util.internal.StringUtil.isNullOrEmpty; -import static org.knowm.xchange.gdax.GDAXAdapters.*; - -/** - * Created by luca on 4/3/17. - */ -public class GDAXStreamingMarketDataService implements StreamingMarketDataService { - private static final Logger LOG = LoggerFactory.getLogger(GDAXStreamingMarketDataService.class); - - private final GDAXStreamingService service; - private Map> bids = new HashMap<>(); - private Map> asks = new HashMap<>(); - - GDAXStreamingMarketDataService(GDAXStreamingService service) { - this.service = service; - } - - private boolean containsPair(List pairs, CurrencyPair pair) { - for (CurrencyPair item : pairs) { - if (item.compareTo(pair) == 0) { - return true; - } - } - - return false; - } - - @Override - public Observable 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 = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - final int maxDepth = (args.length > 0 && args[0] instanceof Integer) ? (int) args[0] : 0; - - Observable subscribedChannel = service.subscribeChannel(channelName) - .map(s -> mapper.readValue(s.toString(), GDAXWebSocketTransaction.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<>()); - } - - GDAXProductBook productBook = s.toGDAXProductBook(bids.get(currencyPair), asks.get(currencyPair), maxDepth); - return adaptOrderBook(productBook, currencyPair); - }); - } - - /** - * Returns an Observable of {@link GDAXProductTicker}, not converted to {@link Ticker} - * - * @param currencyPair the currency pair. - * @param args optional arguments. - * @return an Observable of {@link GDAXProductTicker}. - */ - public Observable 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 = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - Observable subscribedChannel = service.subscribeChannel(channelName) - .map(s -> mapper.readValue(s.toString(), GDAXWebSocketTransaction.class)); - - return subscribedChannel - .filter(message -> !isNullOrEmpty(message.getType()) && message.getType().equals("match") && - message.getProductId().equals(channelName)) - .map(GDAXWebSocketTransaction::toGDAXProductTicker); - } - - /** - * Returns the GDAX ticker converted to the normalized XChange object. - * GDAX does not directly provide ticker data via web service. - * As stated by: https://docs.gdax.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 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 = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - Observable subscribedChannel = service.subscribeChannel(channelName) - .map(s -> mapper.readValue(s.toString(), GDAXWebSocketTransaction.class)); - - return subscribedChannel - .filter(message -> !isNullOrEmpty(message.getType()) && message.getType().equals("ticker") && - message.getProductId().equals(channelName)) - .map(s -> adaptTicker(s.toGDAXProductTicker(), s.toGDAXProductStats(), currencyPair)); - } - - @Override - public Observable 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 = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - Observable subscribedChannel = service.subscribeChannel(channelName) - .map(s -> mapper.readValue(s.toString(), GDAXWebSocketTransaction.class)); - - return subscribedChannel - .filter(message -> !isNullOrEmpty(message.getType()) && message.getType().equals("match") && - message.getProductId().equals(channelName)) - .map(s -> { - Trades adaptedTrades = adaptTrades(new GDAXTrade[]{s.toGDAXTrade()}, currencyPair); - return adaptedTrades.getTrades().get(0); - } - ); - } -} diff --git a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingService.java b/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingService.java deleted file mode 100644 index 20bc346b5..000000000 --- a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/GDAXStreamingService.java +++ /dev/null @@ -1,130 +0,0 @@ -package info.bitrich.xchangestream.gdax; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import info.bitrich.xchangestream.core.ProductSubscription; -import info.bitrich.xchangestream.gdax.dto.GDAXWebSocketSubscriptionMessage; -import info.bitrich.xchangestream.gdax.netty.WebSocketClientCompressionAllowClientNoContextHandler; -import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; -import info.bitrich.xchangestream.service.netty.WebSocketClientHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; -import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtensionHandler; -import io.reactivex.Observable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -public class GDAXStreamingService extends JsonNettyStreamingService { - private static final Logger LOG = LoggerFactory.getLogger(GDAXStreamingService.class); - private static final String SUBSCRIBE = "subscribe"; - private static final String UNSUBSCRIBE = "unsubscribe"; - private static final String SHARE_CHANNEL_NAME = "ALL"; - private final Map> subscriptions = new HashMap<>(); - private ProductSubscription product = null; - - private WebSocketClientHandler.WebSocketMessageHandler channelInactiveHandler = null; - - public GDAXStreamingService(String apiUrl) { - super(apiUrl, Integer.MAX_VALUE); - } - - public ProductSubscription getProduct() { - return product; - } - - @Override - public String getSubscriptionUniqueId(String channelName, Object... args) { - return SHARE_CHANNEL_NAME; - } - - /** - * Subscribes to the provided channel name, maintains a cache of subscriptions, in order not to - * subscribe more than once to the same channel. - * - * @param channelName the name of the requested channel. - * @return an Observable of json objects coming from the exchange. - */ - @Override - public Observable subscribeChannel(String channelName, Object... args) { - channelName = SHARE_CHANNEL_NAME; - - if (!channels.containsKey(channelName) && !subscriptions.containsKey(channelName)) { - subscriptions.put(channelName, super.subscribeChannel(channelName, args)); - } - - return subscriptions.get(channelName); - } - - @Override - protected String getChannelNameFromMessage(JsonNode message) { - return SHARE_CHANNEL_NAME; - } - - @Override - public String getSubscribeMessage(String channelName, Object... args) throws IOException { - GDAXWebSocketSubscriptionMessage subscribeMessage = new GDAXWebSocketSubscriptionMessage(SUBSCRIBE, product); - ObjectMapper objectMapper = new ObjectMapper(); - return objectMapper.writeValueAsString(subscribeMessage); - } - - @Override - public String getUnsubscribeMessage(String channelName) throws IOException { - GDAXWebSocketSubscriptionMessage subscribeMessage = - new GDAXWebSocketSubscriptionMessage(UNSUBSCRIBE, new String[]{"level2", "matches", "ticker"}); - ObjectMapper objectMapper = new ObjectMapper(); - return objectMapper.writeValueAsString(subscribeMessage); - } - - @Override - protected void handleMessage(JsonNode message) { - super.handleMessage(message); - } - - @Override - protected WebSocketClientExtensionHandler getWebSocketClientExtensionHandler() { - return WebSocketClientCompressionAllowClientNoContextHandler.INSTANCE; - } - - @Override - protected WebSocketClientHandler getWebSocketClientHandler(WebSocketClientHandshaker handshaker, - WebSocketClientHandler.WebSocketMessageHandler handler) { - LOG.info("Registering GDAXWebSocketClientHandler"); - return new GDAXWebSocketClientHandler(handshaker, handler); - } - - public void setChannelInactiveHandler(WebSocketClientHandler.WebSocketMessageHandler channelInactiveHandler) { - this.channelInactiveHandler = channelInactiveHandler; - } - - public void subscribeMultipleCurrencyPairs(ProductSubscription... products) { - this.product = products[0]; - } - - /** - * Custom client handler in order to execute an external, user-provided handler on channel events. - * This is useful because it seems GDAX unexpectedly closes the web socket connection. - */ - class GDAXWebSocketClientHandler extends NettyWebSocketClientHandler { - - public GDAXWebSocketClientHandler(WebSocketClientHandshaker handshaker, WebSocketMessageHandler handler) { - super(handshaker, handler); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) { - super.channelActive(ctx); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) { - super.channelInactive(ctx); - if (channelInactiveHandler != null) { - channelInactiveHandler.onMessage("WebSocket Client disconnected!"); - } - } - } -} diff --git a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketSubscriptionMessage.java b/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketSubscriptionMessage.java deleted file mode 100644 index f40aed31b..000000000 --- a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketSubscriptionMessage.java +++ /dev/null @@ -1,110 +0,0 @@ -package info.bitrich.xchangestream.gdax.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import info.bitrich.xchangestream.core.ProductSubscription; -import org.knowm.xchange.currency.CurrencyPair; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * GDAX subscription message. - */ -public class GDAXWebSocketSubscriptionMessage { - - public static final String TYPE = "type"; - public static final String CHANNELS = "channels"; - public static final String PRODUCT_IDS = "product_ids"; - public static final String NAME = "name"; - - class GDAXProductSubsctiption { - @JsonProperty(NAME) - private String name; - - @JsonProperty(PRODUCT_IDS) - private String[] productIds; - - public GDAXProductSubsctiption(String name, String[] productIds) { - this.name = name; - this.productIds = productIds; - } - - public String getName() { - return name; - } - - public String[] getProductIds() { - return productIds; - } - } - - @JsonProperty(TYPE) - private String type; - - @JsonProperty(CHANNELS) - private GDAXProductSubsctiption[] channels; - - public GDAXWebSocketSubscriptionMessage(String type, ProductSubscription product) { - this.type = type; - generateSubscriptionMessage(product); - } - - public GDAXWebSocketSubscriptionMessage(String type, String[] channelNames) { - this.type = type; - generateSubscriptionMessage(channelNames); - } - - private String[] generateProductIds(CurrencyPair[] pairs) { - List productIds = new ArrayList<>(pairs.length); - for (CurrencyPair pair : pairs) { - productIds.add(pair.base.toString() + "-" + pair.counter.toString()); - } - - return productIds.toArray(new String[productIds.size()]); - } - - private GDAXProductSubsctiption generateGDAXProduct(String name, CurrencyPair[] pairs) { - String[] productsIds; - productsIds = generateProductIds(pairs); - return new GDAXProductSubsctiption(name, productsIds); - } - - private void generateSubscriptionMessage(String[] channelNames) { - List channels = new ArrayList<>(3); - for (String name : channelNames) { - channels.add(new GDAXProductSubsctiption(name, null)); - } - - this.channels = channels.toArray(new GDAXProductSubsctiption[channels.size()]); - } - - private void generateSubscriptionMessage(ProductSubscription productSubscription) { - List channels = new ArrayList<>(3); - Map> pairs = new HashMap<>(3); - - pairs.put("level2", productSubscription.getOrderBook()); - pairs.put("ticker", productSubscription.getTicker()); - pairs.put("matches", productSubscription.getTrades()); - - for (Map.Entry> product : pairs.entrySet()) { - List currencyPairs = product.getValue(); - if (currencyPairs == null || currencyPairs.size() == 0) { - continue; - } - GDAXProductSubsctiption gdaxProduct = generateGDAXProduct(product.getKey(), product.getValue().toArray(new CurrencyPair[product.getValue().size()])); - channels.add(gdaxProduct); - } - - this.channels = channels.toArray(new GDAXProductSubsctiption[channels.size()]); - } - - public String getType() { - return type; - } - - public GDAXProductSubsctiption[] getChannels() { - return channels; - } -} diff --git a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketTransaction.java b/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketTransaction.java deleted file mode 100644 index 295032991..000000000 --- a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketTransaction.java +++ /dev/null @@ -1,265 +0,0 @@ -package info.bitrich.xchangestream.gdax.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import org.knowm.xchange.gdax.dto.marketdata.GDAXProductBook; -import org.knowm.xchange.gdax.dto.marketdata.GDAXProductStats; -import org.knowm.xchange.gdax.dto.marketdata.GDAXProductTicker; -import org.knowm.xchange.gdax.dto.marketdata.GDAXTrade; - -import java.math.BigDecimal; -import java.text.SimpleDateFormat; -import java.util.*; - -/** - * Domain object mapping a GDAX web socket message. - */ -public class GDAXWebSocketTransaction { - private final String type; - private final String orderId; - private final String orderType; - private final BigDecimal size; - private final BigDecimal remainingSize; - private final BigDecimal price; - private final BigDecimal bestBid; - private final BigDecimal bestAsk; - private final BigDecimal lastSize; - private final BigDecimal volume24h; - private final BigDecimal open24h; - private final BigDecimal low24h; - private final BigDecimal high24h; - private final String side; - private final String[][] bids; - private final String[][] asks; - private final String[][] changes; - private final String clientOid; - private final String productId; - private final long sequence; - private final String time; - private final String reason; - private final long tradeId; - private final String makerOrderId; - private final String takenOrderId; - - public GDAXWebSocketTransaction( - @JsonProperty("type") String type, - @JsonProperty("order_id") String orderId, - @JsonProperty("order_type") String orderType, - @JsonProperty("size") BigDecimal size, - @JsonProperty("remaining_size") BigDecimal remainingSize, - @JsonProperty("price") BigDecimal price, - @JsonProperty("best_bid") BigDecimal bestBid, - @JsonProperty("best_ask") BigDecimal bestAsk, - @JsonProperty("last_size") BigDecimal lastSize, - @JsonProperty("volume_24h") BigDecimal volume24h, - @JsonProperty("open_24h") BigDecimal open24h, - @JsonProperty("low_24h") BigDecimal low24h, - @JsonProperty("high_24h") BigDecimal high24h, - @JsonProperty("side") String side, - @JsonProperty("bids") String[][] bids, - @JsonProperty("asks") String[][] asks, - @JsonProperty("changes") String[][] changes, - @JsonProperty("client_oid") String clientOid, - @JsonProperty("product_id") String productId, - @JsonProperty("sequence") long sequence, - @JsonProperty("time") String time, - @JsonProperty("reason") String reason, - @JsonProperty("trade_id") long tradeId, - @JsonProperty("maker_order_id") String makerOrderId, - @JsonProperty("taken_order_id") String takenOrderId) { - - this.remainingSize = remainingSize; - this.reason = reason; - this.tradeId = tradeId; - this.makerOrderId = makerOrderId; - this.takenOrderId = takenOrderId; - this.type = type; - this.orderId = orderId; - this.orderType = orderType; - this.size = size; - this.price = price; - this.bestBid = bestBid; - this.bestAsk = bestAsk; - this.lastSize = lastSize; - this.volume24h = volume24h; - this.high24h = high24h; - this.low24h = low24h; - this.open24h = open24h; - this.side = side; - this.bids = bids; - this.asks = asks; - this.changes = changes; - this.clientOid = clientOid; - this.productId = productId; - this.sequence = sequence; - this.time = time; - } - - private String[][] GDAXOrderBookChanges(String side, String[][] changes, SortedMap sideEntries, - int maxDepth) { - if (changes.length == 0) { - return null; - } - - for (String[] level : changes) { - if (level.length == 3 && !level[0].equals(side)) { - continue; - } - - BigDecimal price = new BigDecimal(level[level.length - 2]); - String volume = level[level.length - 1]; - sideEntries.put(price, volume); - } - - List levels = new ArrayList<>(); - int currentDepth = 0; - for (Map.Entry level : sideEntries.entrySet()) { - if (maxDepth > 0 && currentDepth > maxDepth) continue; - String volume = level.getValue(); - if (!volume.equals("0")) { - levels.add(new String[]{level.getKey().toString(), volume, "1"}); - currentDepth++; - } - } - - return levels.toArray(new String[levels.size()][]); - } - - public GDAXProductBook toGDAXProductBook(SortedMap bids, SortedMap asks, - int maxDepth) { - String[][] gdaxOrderBookBids = GDAXOrderBookChanges("buy", this.changes != null ? this.changes : this.bids, - bids, maxDepth); - String[][] gdaxOrderBookAsks = GDAXOrderBookChanges("sell", this.changes != null ? this.changes : this.asks, - asks, maxDepth); - return new GDAXProductBook((long) 0, gdaxOrderBookBids, gdaxOrderBookAsks); - } - - public GDAXProductTicker toGDAXProductTicker() { - String tickerTime = time; - if (tickerTime == null) { - SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); - dateFormatGmt.setTimeZone(TimeZone.getTimeZone("UTC")); - tickerTime = dateFormatGmt.format(new Date()); //First ticker event doesn't have time! - } - return new GDAXProductTicker(String.valueOf(tradeId), price, lastSize, bestBid, bestAsk, volume24h, tickerTime); - } - - public GDAXProductStats toGDAXProductStats() { - return new GDAXProductStats(open24h, high24h, low24h, volume24h); - } - - public GDAXTrade toGDAXTrade() { - return new GDAXTrade(time, tradeId, price, size, side); - } - - public String getType() { - return type; - } - - public String getOrderId() { - return orderId; - } - - public String getOrderType() { - return orderType; - } - - public BigDecimal getSize() { - return size; - } - - public BigDecimal getPrice() { - return price; - } - - public BigDecimal getBestBid() { - return bestBid; - } - - public BigDecimal getBestAsk() { - return bestAsk; - } - - public BigDecimal getLastSize() { - return lastSize; - } - - public BigDecimal getVolume24h() { - return volume24h; - } - - public BigDecimal getOpen24h() { - return open24h; - } - - public BigDecimal getLow24h() { - return low24h; - } - - public BigDecimal getHigh24h() { - return high24h; - } - - public String getSide() { - return side; - } - - public String getClientOid() { - return clientOid; - } - - public String getProductId() { - return productId; - } - - public Long getSequence() { - return sequence; - } - - public String getTime() { - return time; - } - - public BigDecimal getRemainingSize() { - return remainingSize; - } - - public String getReason() { - return reason; - } - - public long getTradeId() { - return tradeId; - } - - public String getMakerOrderId() { - return makerOrderId; - } - - public String getTakenOrderId() { - return takenOrderId; - } - - @Override - public String toString() { - final StringBuffer sb = new StringBuffer("GDAXWebSocketTransaction{"); - sb.append("type='").append(type).append('\''); - sb.append(", orderId='").append(orderId).append('\''); - sb.append(", orderType='").append(orderType).append('\''); - sb.append(", size=").append(size); - sb.append(", price=").append(price); - sb.append(", bestBid=").append(bestBid); - sb.append(", bestAsk=").append(bestAsk); - sb.append(", lastSize=").append(lastSize); - sb.append(", volume24h=").append(volume24h); - sb.append(", open24h=").append(open24h); - sb.append(", low24h=").append(low24h); - sb.append(", high24h=").append(high24h); - sb.append(", side='").append(side).append('\''); - sb.append(", clientOid='").append(clientOid).append('\''); - sb.append(", productId='").append(productId).append('\''); - sb.append(", sequence=").append(sequence); - sb.append(", time='").append(time).append('\''); - sb.append('}'); - return sb.toString(); - } -} diff --git a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/netty/WebSocketClientCompressionAllowClientNoContextHandler.java b/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/netty/WebSocketClientCompressionAllowClientNoContextHandler.java deleted file mode 100644 index 141e09e02..000000000 --- a/xchange-gdax/src/main/java/info/bitrich/xchangestream/gdax/netty/WebSocketClientCompressionAllowClientNoContextHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -package info.bitrich.xchangestream.gdax.netty; - -import io.netty.channel.ChannelHandler; -import io.netty.handler.codec.compression.ZlibCodecFactory; -import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtensionHandler; -import io.netty.handler.codec.http.websocketx.extensions.compression.DeflateFrameClientExtensionHandshaker; -import io.netty.handler.codec.http.websocketx.extensions.compression.PerMessageDeflateClientExtensionHandshaker; - -import static io.netty.handler.codec.http.websocketx.extensions.compression.PerMessageDeflateServerExtensionHandshaker.MAX_WINDOW_SIZE; - -/** - * Custom WebSocket client extension handler. GDAX needs very specific WebSocket extensions enabled. - */ -@ChannelHandler.Sharable -public final class WebSocketClientCompressionAllowClientNoContextHandler extends WebSocketClientExtensionHandler { - - public static final WebSocketClientCompressionAllowClientNoContextHandler INSTANCE = - new WebSocketClientCompressionAllowClientNoContextHandler(); - - private WebSocketClientCompressionAllowClientNoContextHandler() { - super(new PerMessageDeflateClientExtensionHandshaker(6, ZlibCodecFactory.isSupportingWindowSizeAndMemLevel(), MAX_WINDOW_SIZE, true, false), - new DeflateFrameClientExtensionHandshaker(false), - new DeflateFrameClientExtensionHandshaker(true)); - } -} diff --git a/xchange-gdax/src/test/java/info/bitrich/xchangestream/gdax/GDAXManualExample.java b/xchange-gdax/src/test/java/info/bitrich/xchangestream/gdax/GDAXManualExample.java deleted file mode 100644 index b05031b80..000000000 --- a/xchange-gdax/src/test/java/info/bitrich/xchangestream/gdax/GDAXManualExample.java +++ /dev/null @@ -1,40 +0,0 @@ -package info.bitrich.xchangestream.gdax; - -import info.bitrich.xchangestream.core.ProductSubscription; -import info.bitrich.xchangestream.core.StreamingExchange; -import info.bitrich.xchangestream.core.StreamingExchangeFactory; -import org.knowm.xchange.currency.CurrencyPair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GDAXManualExample { - private static final Logger LOG = LoggerFactory.getLogger(GDAXManualExample.class); - - public static void main(String[] args) { - ProductSubscription productSubscription = ProductSubscription.create().addAll(CurrencyPair.BTC_USD) - .addAll(CurrencyPair.BTC_EUR).addTicker(CurrencyPair.ETH_USD).build(); - - StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(GDAXStreamingExchange.class.getName()); - exchange.connect(productSubscription).blockingAwait(); - - exchange.getStreamingMarketDataService().getOrderBook(CurrencyPair.BTC_USD).subscribe(orderBook -> { - LOG.info("First ask: {}", orderBook.getAsks().get(0)); - LOG.info("First bid: {}", orderBook.getBids().get(0)); - }, throwable -> LOG.error("ERROR in getting order book: ", throwable)); - - exchange.getStreamingMarketDataService().getTicker(CurrencyPair.ETH_USD).subscribe(ticker -> { - LOG.info("TICKER: {}", ticker); - }, throwable -> LOG.error("ERROR in getting ticker: ", throwable)); - - exchange.getStreamingMarketDataService().getTrades(CurrencyPair.BTC_USD) - .subscribe(trade -> { - LOG.info("TRADE: {}", trade); - }, throwable -> LOG.error("ERROR in getting trades: ", throwable)); - - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/xchange-gdax/src/test/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketSubscriptionMessageTest.java b/xchange-gdax/src/test/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketSubscriptionMessageTest.java deleted file mode 100644 index 279ac81df..000000000 --- a/xchange-gdax/src/test/java/info/bitrich/xchangestream/gdax/dto/GDAXWebSocketSubscriptionMessageTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package info.bitrich.xchangestream.gdax.dto; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import info.bitrich.xchangestream.core.ProductSubscription; -import org.junit.Assert; -import org.junit.Test; -import org.knowm.xchange.currency.CurrencyPair; - -/** - * Created by luca on 5/3/17. - */ -public class GDAXWebSocketSubscriptionMessageTest { - - @Test - public void testWebSocketMessageSerialization() throws JsonProcessingException { - - ProductSubscription productSubscription = ProductSubscription.create().addOrderbook(CurrencyPair.BTC_USD) - .addTrades(CurrencyPair.BTC_USD).addTicker(CurrencyPair.BTC_USD).build(); - GDAXWebSocketSubscriptionMessage message = new GDAXWebSocketSubscriptionMessage("subscribe", productSubscription); - - final ObjectMapper mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true); - - String serialized = mapper.writeValueAsString(message); - - Assert.assertEquals("{\"type\":\"subscribe\",\"channels\":[{\"name\":\"matches\",\"product_ids\":[\"BTC-USD\"]},{\"name\":\"ticker\",\"product_ids\":[\"BTC-USD\"]},{\"name\":\"level2\",\"product_ids\":[\"BTC-USD\"]}]}", serialized); - } -} diff --git a/xchange-gdax/src/test/resources/log4j2.xml b/xchange-gdax/src/test/resources/log4j2.xml deleted file mode 100644 index e9aee3965..000000000 --- a/xchange-gdax/src/test/resources/log4j2.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/xchange-gdax/pom.xml b/xchange-okex-v3/pom.xml similarity index 78% rename from xchange-gdax/pom.xml rename to xchange-okex-v3/pom.xml index d539bb0a6..dc8de2ee5 100644 --- a/xchange-gdax/pom.xml +++ b/xchange-okex-v3/pom.xml @@ -7,7 +7,7 @@ 4.0.0 - xchange-gdax + xchange-okex-v3 @@ -22,8 +22,13 @@ org.knowm.xchange - xchange-gdax + xchange-okcoin + ${xchange.version} + + + org.knowm.xchange + xchange-okex-v3 ${xchange.version} - \ No newline at end of file + \ No newline at end of file diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java new file mode 100644 index 000000000..ce6928bd7 --- /dev/null +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java @@ -0,0 +1,73 @@ +package info.bitrich.xchangestream.okex; + +import info.bitrich.xchangestream.core.ProductSubscription; +import info.bitrich.xchangestream.core.StreamingExchange; +import info.bitrich.xchangestream.core.StreamingMarketDataService; +import io.netty.channel.ChannelHandlerContext; +import io.reactivex.Completable; +import io.reactivex.Observable; +import org.knowm.xchange.okcoin.OkCoinExchange; + +public class OkexStreamingExchange extends OkCoinExchange implements StreamingExchange { + private static final String API_URI = "wss://real.okex.com:10442/ws/v3"; + + protected final OkexStreamingService streamingService; + private OkexStreamingMarketDataService streamingMarketDataService; + + public OkexStreamingExchange() { + streamingService = new OkexStreamingService(API_URI); + } + + protected OkexStreamingExchange(OkexStreamingService streamingService) { + this.streamingService = streamingService; + } + + @Override + protected void initServices() { + super.initServices(); + streamingMarketDataService = new OkexStreamingMarketDataService(streamingService); + } + + @Override + public Completable connect(ProductSubscription... args) { + return streamingService.connect(); + } + + @Override + public Completable disconnect() { + return streamingService.disconnect(); + } + + @Override + public boolean isAlive() { + return streamingService.isSocketOpen(); + } + + @Override + public Observable reconnectFailure() { + return streamingService.subscribeReconnectFailure(); + } + + @Override + public Observable disconnectObservable() { + return streamingService.subscribeDisconnect(); + } + + @Override + public StreamingMarketDataService getStreamingMarketDataService() { + return streamingMarketDataService; + } + + @Override + public void useCompressedMessages(boolean compressedMessages) { streamingService.useCompressedMessages(compressedMessages); } + + @Override + public Observable messageDelay() { + return Observable.create(streamingService::addDelayEmitter); + } + + @Override + public void resubscribeChannels() { + streamingService.resubscribeChannels(); + } +} diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java new file mode 100644 index 000000000..1255bf7d9 --- /dev/null +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java @@ -0,0 +1,151 @@ +package info.bitrich.xchangestream.okex; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import info.bitrich.xchangestream.core.StreamingMarketDataService; +import info.bitrich.xchangestream.okex.dto.OkCoinOrderbook; +import io.reactivex.Observable; +import org.knowm.xchange.Exchange; +import org.knowm.xchange.ExchangeFactory; +import org.knowm.xchange.ExchangeSpecification; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.Order; +import org.knowm.xchange.dto.marketdata.OrderBook; +import org.knowm.xchange.dto.marketdata.Ticker; +import org.knowm.xchange.dto.marketdata.Trade; +import org.knowm.xchange.exceptions.ExchangeException; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; +import org.knowm.xchange.okcoin.FuturesContract; +import org.knowm.xchange.okcoin.OkCoinAdapters; +import org.knowm.xchange.okcoin.dto.marketdata.OkCoinDepth; +import org.knowm.xchange.okex.v3.OkexExchange; +import org.knowm.xchange.okex.v3.dto.marketdata.FuturesInstrument; +import org.knowm.xchange.okex.v3.service.OkexFuturesMarketDataServiceRaw; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Map; +import java.util.TimeZone; + +public class OkexStreamingMarketDataService implements StreamingMarketDataService { + + private final Logger LOG = LoggerFactory.getLogger(OkexStreamingMarketDataService.class); + + private final OkexStreamingService service; + private final Exchange okexFuturesExchange; + private final FuturesInstrument[] futuresInstruments; + + private final ObjectMapper mapper = new ObjectMapper(); + private final Map orderbooks = new HashMap<>(); + + OkexStreamingMarketDataService(OkexStreamingService service) { + this.service = service; + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + ExchangeSpecification specification = new ExchangeSpecification(OkexExchange.class); + specification.setExchangeSpecificParametersItem("Use_Futures", true); + okexFuturesExchange = ExchangeFactory.INSTANCE.createExchange(specification); + futuresInstruments = ((OkexFuturesMarketDataServiceRaw) okexFuturesExchange.getMarketDataService()).getInstruments(); + } + + @Override + public Observable getOrderBook(CurrencyPair currencyPair, Object... args) { + if (args.length > 0 && args[0] instanceof FuturesContract) { + FuturesContract contract = (FuturesContract) args[0]; + String instId = null; + for (FuturesInstrument instrument : futuresInstruments) { + if (instrument.getUnderlyingIndex().toUpperCase().equals(currencyPair.base.toString().toUpperCase()) + && instrument.getQuoteCurrency().toUpperCase().equals(currencyPair.counter.toString().toUpperCase()) + && instrument.getAlias().equals(contract.getName())) { + instId = instrument.getInstrumentId(); + break; + } + } + if (instId == null) { + throw new ExchangeException("No such futures contract"); + } + final String instrumentId = instId; + String channel = "futures/depth:" + instId; + return this.service.subscribeChannel(channel).map((s) -> { + OkCoinOrderbook okCoinOrderbook; + for (JsonNode data : s.get("data")) { + if (instrumentId.equals(data.get("instrument_id").asText())) { + if ("partial".equals(s.get("action").asText()) || !this.orderbooks.containsKey(instrumentId)) { + if (!"partial".equals(s.get("action").asText())) { + LOG.warn("Received Orderbook Update Before Partial"); + } + OkCoinDepth okCoinDepth = this.mapper.treeToValue(data, OkCoinDepth.class); + okCoinOrderbook = new OkCoinOrderbook(okCoinDepth); + this.orderbooks.put(instrumentId, okCoinOrderbook); + } else { + okCoinOrderbook = this.orderbooks.get(instrumentId); + BigDecimal[][] bidLevels; + if (data.has("asks") && data.get("asks").size() > 0) { + bidLevels = this.mapper.treeToValue(data.get("asks"), BigDecimal[][].class); + okCoinOrderbook.updateLevels(bidLevels, Order.OrderType.ASK); + } + + if (data.has("bids") && data.get("bids").size() > 0) { + bidLevels = this.mapper.treeToValue(data.get("bids"), BigDecimal[][].class); + okCoinOrderbook.updateLevels(bidLevels, Order.OrderType.BID); + } + } + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + format.setTimeZone(TimeZone.getTimeZone("UTC")); + long epoch = format.parse(data.get("timestamp").asText()).getTime(); + return OkCoinAdapters.adaptOrderBook(okCoinOrderbook.toOkCoinDepth(epoch), currencyPair); + } + } + return null; + }); + } else { + throw new NotYetImplementedForExchangeException(); + } + } + + @Override + public Observable getTicker(CurrencyPair currencyPair, Object... args) { + throw new NotYetImplementedForExchangeException(); + } + + + /** + * #### spot #### + * 4. ok_sub_spot_X_deals 订阅成交记录 + *

+ * #### future #### + * 5. ok_sub_futureusd_X_trade_Y 订阅合约交易信息 + * 5. ok_sub_futureusd_X_trade_Y Subscribe Contract Trade Record + * + * @param currencyPair Currency pair of the trades + * @param args the first arg {@link FuturesContract} + * @return + */ + @Override + public Observable getTrades(CurrencyPair currencyPair, Object... args) { + throw new NotYetImplementedForExchangeException(); +// String channel = String.format("ok_sub_spot_%s_%s_deals", currencyPair.base.toString().toLowerCase(), currencyPair.counter.toString().toLowerCase()); +// +// if (args.length > 0) { +// FuturesContract contract = (FuturesContract) args[0]; +// channel = String.format("ok_sub_future%s_%s_trade_%s", currencyPair.counter.toString().toLowerCase(), currencyPair.base.toString().toLowerCase(), contract.getName()); +// } +// +// return service.subscribeChannel(channel) +// .map(s -> { +// String[][] trades = mapper.treeToValue(s.get("data"), String[][].class); +// +// // I don't know how to parse this array of arrays in Jacson. +// OkCoinWebSocketTrade[] okCoinTrades = new OkCoinWebSocketTrade[trades.length]; +// for (int i = 0; i < trades.length; ++i) { +// OkCoinWebSocketTrade okCoinWebSocketTrade = new OkCoinWebSocketTrade(trades[i]); +// okCoinTrades[i] = okCoinWebSocketTrade; +// } +// +// return OkCoinAdapters.adaptTrades(okCoinTrades, currencyPair); +// }).flatMapIterable(Trades::getTrades); + } +} diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java new file mode 100644 index 000000000..40435ed4c --- /dev/null +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -0,0 +1,157 @@ +package info.bitrich.xchangestream.okex; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import info.bitrich.xchangestream.okex.dto.RequestMessage; +import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; +import info.bitrich.xchangestream.service.netty.WebSocketClientHandler; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufInputStream; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame; +import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; +import io.netty.handler.codec.http.websocketx.WebSocketFrame; +import io.reactivex.Completable; +import io.reactivex.CompletableSource; +import io.reactivex.ObservableEmitter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.zip.Inflater; + +public class OkexStreamingService extends JsonNettyStreamingService { + + private final Logger LOG = LoggerFactory.getLogger(OkexStreamingService.class); + + private final ObjectMapper objectMapper = new ObjectMapper(); + private List> delayEmitters = new LinkedList<>(); + + public OkexStreamingService(String apiUrl) { + super(apiUrl); + } + + @Override + public Completable connect() { + Completable conn = super.connect(); + return conn.andThen((CompletableSource) (completable) -> { + try { + completable.onComplete(); + } catch (Exception e) { + completable.onError(e); + } + }); + } + + @Override + protected String getChannelNameFromMessage(JsonNode message) throws IOException { + return message.get("channel").asText(); + } + + @Override + public String getSubscribeMessage(String channelName, Object... args) throws IOException { + RequestMessage requestMessage = new RequestMessage(RequestMessage.Operation.SUBSCRIBE, Collections.singletonList(channelName)); + return objectMapper.writeValueAsString(requestMessage); + } + + @Override + public String getUnsubscribeMessage(String channelName) throws IOException { + RequestMessage requestMessage = new RequestMessage(RequestMessage.Operation.UNSUBSCRIBE, Collections.singletonList(channelName)); + return objectMapper.writeValueAsString(requestMessage); + } + + @Override + protected void handleMessage(JsonNode message) { + if ("error".equals(message.get("event").asText())) { + LOG.error("Error Message Received: {}", message); + return; + } + if (message.get("table") != null && message.get("data") != null) { + String table = message.get("table").asText(); + Set instrumentIds = new HashSet<>(); + boolean delayEmitted = false; + for (JsonNode data : message.get("data")) { + if (data.get("instrument_id") != null) { + instrumentIds.add(data.get("instrument_id").asText()); + } + if (data.get("timestamp") != null && !delayEmitted) { + delayEmitted = true; + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + format.setTimeZone(TimeZone.getTimeZone("UTC")); + for (ObservableEmitter emitter : delayEmitters) { + try { + emitter.onNext(System.currentTimeMillis() - format.parse(data.get("timestamp").asText()).getTime()); + } catch (ParseException e) { + LOG.error("Parse timestamp error", e); + } + } + } + } + for (String instrumentId : instrumentIds) { + handleChannelMessage(String.format("%s:%s", table, instrumentId), message); + } + } + } + + public void addDelayEmitter(ObservableEmitter delayEmitter) { + delayEmitters.add(delayEmitter); + } + + @Override + protected WebSocketClientHandler getWebSocketClientHandler(WebSocketClientHandshaker handshaker, WebSocketClientHandler.WebSocketMessageHandler handler) { + return new OkCoinNettyWebSocketClientHandler(handshaker, handler); + } + + protected class OkCoinNettyWebSocketClientHandler extends NettyWebSocketClientHandler { + + private final Logger LOG = LoggerFactory.getLogger(OkCoinNettyWebSocketClientHandler.class); + + protected OkCoinNettyWebSocketClientHandler(WebSocketClientHandshaker handshaker, WebSocketMessageHandler handler) { + super(handshaker, handler); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) { + super.channelInactive(ctx); + } + + @Override + public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { + + if (!handshaker.isHandshakeComplete()) { + super.channelRead0(ctx, msg); + return; + } + + super.channelRead0(ctx, msg); + + WebSocketFrame frame = (WebSocketFrame) msg; + if (frame instanceof BinaryWebSocketFrame) { + BinaryWebSocketFrame binaryFrame = (BinaryWebSocketFrame) frame; + ByteBuf byteBuf = binaryFrame.content(); + byte[] temp = new byte[byteBuf.readableBytes()]; + ByteBufInputStream bis = new ByteBufInputStream(byteBuf); + StringBuilder appender = new StringBuilder(); + try { + bis.read(temp); + bis.close(); + Inflater infl = new Inflater(true); + infl.setInput(temp, 0, temp.length); + byte[] result = new byte[1024]; + while (!infl.finished()) { + int length = infl.inflate(result); + appender.append(new String(result, 0, length, "UTF-8")); + } + infl.end(); + } catch (Exception e) { + LOG.trace("Error when inflate websocket binary message"); + } + handler.onMessage(appender.toString()); + } + } + + } +} diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/OkCoinOrderbook.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/OkCoinOrderbook.java new file mode 100644 index 000000000..16cf05f9e --- /dev/null +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/OkCoinOrderbook.java @@ -0,0 +1,80 @@ +package info.bitrich.xchangestream.okex.dto; + +import org.knowm.xchange.dto.Order; +import org.knowm.xchange.okcoin.dto.marketdata.OkCoinDepth; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.Date; +import java.util.SortedMap; +import java.util.TreeMap; + +/** + * Created by Lukas Zaoralek on 16.11.17. + */ +public class OkCoinOrderbook { + private final BigDecimal zero = new BigDecimal(0); + + private final SortedMap asks; + private final SortedMap bids; + + public OkCoinOrderbook() { + asks = new TreeMap<>(java.util.Collections.reverseOrder()); //Because okcoin adapter uses reverse sort for asks!!! + bids = new TreeMap<>(); + } + + public OkCoinOrderbook(OkCoinDepth depth) { + this(); + createFromDepth(depth); + } + + public void createFromDepth(OkCoinDepth depth) { + BigDecimal[][] depthAsks = depth.getAsks(); + BigDecimal[][] depthBids = depth.getBids(); + + createFromDepthLevels(depthAsks, Order.OrderType.ASK); + createFromDepthLevels(depthBids, Order.OrderType.BID); + } + + public void createFromDepthLevels(BigDecimal[][] depthLevels, Order.OrderType side) { + SortedMap orderbookLevels = side == Order.OrderType.ASK ? asks : bids; + for (BigDecimal[] level : depthLevels) { + orderbookLevels.put(level[0], level); + } + } + + public void updateLevels(BigDecimal[][] depthLevels, Order.OrderType side) { + for (BigDecimal[] level : depthLevels) { + updateLevel(level, side); + } + } + + public void updateLevel(BigDecimal[] level, Order.OrderType side) { + SortedMap orderBookSide = side == Order.OrderType.ASK ? asks : bids; + boolean shouldDelete = level[1].compareTo(zero) == 0; + BigDecimal price = level[0]; + orderBookSide.remove(price); + if (!shouldDelete) { + orderBookSide.put(price, level); + } + } + + public BigDecimal[][] getSide(Order.OrderType side) { + SortedMap orderbookLevels = side == Order.OrderType.ASK ? asks : bids; + Collection levels = orderbookLevels.values(); + return levels.toArray(new BigDecimal[orderbookLevels.size()][]); + } + + public BigDecimal[][] getAsks() { + return getSide(Order.OrderType.ASK); + } + + public BigDecimal[][] getBids() { + return getSide(Order.OrderType.BID); + } + + public OkCoinDepth toOkCoinDepth(long epoch) { + Date timestamp = new java.util.Date(epoch); + return new OkCoinDepth(getAsks(), getBids(), timestamp); + } +} diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/OkCoinWebSocketTrade.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/OkCoinWebSocketTrade.java new file mode 100644 index 000000000..3e5f89a76 --- /dev/null +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/OkCoinWebSocketTrade.java @@ -0,0 +1,28 @@ +package info.bitrich.xchangestream.okex.dto; + +import org.knowm.xchange.okcoin.dto.marketdata.OkCoinTrade; + +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +public class OkCoinWebSocketTrade extends OkCoinTrade { + public OkCoinWebSocketTrade(String[] items) throws ParseException { + super(getDate(items[3]).getTime() / 1000, new BigDecimal(items[1]), new BigDecimal(items[2]), Long.valueOf(items[0]), items[4]); + } + + private static Date getDate(String exchangeTime) throws ParseException { + DateFormat tdf = new SimpleDateFormat("yyyy-MM-dd"); + tdf.setTimeZone(TimeZone.getTimeZone("Hongkong")); + Date today = Calendar.getInstance(TimeZone.getDefault()).getTime(); + String exchangeToday = tdf.format(today); + + SimpleDateFormat fdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss X"); + fdf.setTimeZone(TimeZone.getDefault()); + return fdf.parse(exchangeToday + " " + exchangeTime + " +0800"); + } +} diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java new file mode 100644 index 000000000..afbf05400 --- /dev/null +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java @@ -0,0 +1,25 @@ +package info.bitrich.xchangestream.okex.dto; + +import java.util.List; + +public class RequestMessage { + + public enum Operation { + SUBSCRIBE, UNSUBSCRIBE, LOGIN; + + @Override + public String toString() { + return super.toString().toLowerCase(); + } + } + + private Operation op; + + private List args; + + public RequestMessage(Operation op, List args) { + this.op = op; + this.args = args; + } + +} diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/marketdata/FutureTicker.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/marketdata/FutureTicker.java new file mode 100644 index 000000000..291aabe5c --- /dev/null +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/marketdata/FutureTicker.java @@ -0,0 +1,92 @@ +package info.bitrich.xchangestream.okex.dto.marketdata; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.math.BigDecimal; + +public class FutureTicker { + private Long contractId; // 合约ID + private Integer unitAmount; // 合约价值 + private BigDecimal holdAmount; // 当前持仓量 + + private BigDecimal limitHigh; // 最高买入限制价格 + private BigDecimal limitLow; // 最低卖出限制价格 + + private BigDecimal buy; // 买一价格 + private BigDecimal sell; // 卖一价格 + private BigDecimal last; // 最新成交价 + + private BigDecimal high; // 24小时最高价格 + private BigDecimal low; // 24小时最低价格 + private BigDecimal vol; // 24小时成交量 + + public FutureTicker( + @JsonProperty("contractId") final Long contractId, + @JsonProperty("unitAmount") final Integer unitAmount, + @JsonProperty("hold_amount") final BigDecimal holdAmount, + @JsonProperty("limitHigh") final BigDecimal limitHigh, + @JsonProperty("limitLow") final BigDecimal limitLow, + @JsonProperty("buy") final BigDecimal buy, + @JsonProperty("sell") final BigDecimal sell, + @JsonProperty("last") final BigDecimal last, + @JsonProperty("high") final BigDecimal high, + @JsonProperty("low") final BigDecimal low, + @JsonProperty("vol") final BigDecimal vol) { + + this.contractId = contractId; + this.unitAmount = unitAmount; + this.holdAmount = holdAmount; + this.limitHigh = limitHigh; + this.limitLow = limitLow; + this.buy = buy; + this.sell = sell; + this.last = last; + this.high = high; + this.low = low; + this.vol = vol; + } + + public Long getContractId() { + return contractId; + } + + public Integer getUnitAmount() { + return unitAmount; + } + + public BigDecimal getHoldAmount() { + return holdAmount; + } + + public BigDecimal getLimitHigh() { + return limitHigh; + } + + public BigDecimal getLimitLow() { + return limitLow; + } + + public BigDecimal getBuy() { + return buy; + } + + public BigDecimal getSell() { + return sell; + } + + public BigDecimal getLast() { + return last; + } + + public BigDecimal getHigh() { + return high; + } + + public BigDecimal getLow() { + return low; + } + + public BigDecimal getVol() { + return vol; + } +} diff --git a/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/OkExFuturesManualExample.java b/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/OkExFuturesManualExample.java new file mode 100644 index 000000000..58b427e5b --- /dev/null +++ b/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/OkExFuturesManualExample.java @@ -0,0 +1,38 @@ +package info.bitrich.xchangestream.okex; + +import info.bitrich.xchangestream.core.StreamingExchange; +import info.bitrich.xchangestream.core.StreamingExchangeFactory; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.okcoin.FuturesContract; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OkExFuturesManualExample { + private static final Logger LOG = LoggerFactory.getLogger(OkExFuturesManualExample.class); + + public static void main(String[] args) { + + StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(OkexStreamingExchange.class.getName()); + exchange.connect().blockingAwait(); + + exchange.getStreamingMarketDataService().getOrderBook(CurrencyPair.BTC_USD, FuturesContract.Quarter).subscribe(orderBook -> { + LOG.info("First ask: {}", orderBook.getAsks().get(0)); + LOG.info("First bid: {}", orderBook.getBids().get(0)); + }, throwable -> LOG.error("ERROR in getting order book: ", throwable)); + +// exchange.getStreamingMarketDataService().getTicker(CurrencyPair.BTC_USD, FuturesContract.Quarter).subscribe(ticker -> { +// LOG.info("TICKER: {}", ticker); +// }, throwable -> LOG.error("ERROR in getting ticker: ", throwable)); + +// exchange.getStreamingMarketDataService().getTrades(CurrencyPair.BTC_USD, FuturesContract.Quarter).subscribe(trade -> { +// LOG.info("TRADE: {}", trade); +// }, throwable -> LOG.error("ERROR in getting trades: ", throwable)); + + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} + diff --git a/xchange-fcoin/src/main/resources/log4j2.xml b/xchange-okex-v3/src/test/resources/log4j2.xml similarity index 100% rename from xchange-fcoin/src/main/resources/log4j2.xml rename to xchange-okex-v3/src/test/resources/log4j2.xml diff --git a/xchange-okex-v3/src/test/resources/order-book.json b/xchange-okex-v3/src/test/resources/order-book.json new file mode 100644 index 000000000..264e8121a --- /dev/null +++ b/xchange-okex-v3/src/test/resources/order-book.json @@ -0,0 +1,30 @@ +{ + "channel": "ok_sub_spot_btc_usd_depth", + "data": { + "bids": [ + [ + 819.9, + 0.922 + ], + [ + 818.63, + 0.085 + ] + ], + "asks": [ + [ + 821.7, + 2.89 + ], + [ + 821.65, + 5.18 + ], + [ + 821.6, + 0.035 + ] + ], + "timestamp": "1484602135246" + } +} \ No newline at end of file diff --git a/xchange-okex-v3/src/test/resources/subscribe.json b/xchange-okex-v3/src/test/resources/subscribe.json new file mode 100644 index 000000000..2bf6b2e72 --- /dev/null +++ b/xchange-okex-v3/src/test/resources/subscribe.json @@ -0,0 +1 @@ +{"event":"addChannel","channel":"ok_sub_spot_btc_usd_depth"} \ No newline at end of file diff --git a/xchange-okex-v3/src/test/resources/unsubscribe.json b/xchange-okex-v3/src/test/resources/unsubscribe.json new file mode 100644 index 000000000..c49f4190d --- /dev/null +++ b/xchange-okex-v3/src/test/resources/unsubscribe.json @@ -0,0 +1 @@ +{"event":"removeChannel","channel":"orderbook"} \ No newline at end of file From 2ce7f93b16dfaa02a1f54a137b4122843cc1e587 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Tue, 21 May 2019 11:01:32 +0800 Subject: [PATCH 76/97] pom repo --- pom.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 5cb5ef7da..814f577e9 100644 --- a/pom.xml +++ b/pom.xml @@ -78,14 +78,18 @@ - - + + + hetang + http://repo.maven.fqt.fund/repository/hetang/ + + - + 4.3.19-SNAPSHOT From 72e210286734da6a316c0597ae6c67b346f6cd3c Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Tue, 21 May 2019 11:28:05 +0800 Subject: [PATCH 77/97] okex bug fix --- .../service/netty/JsonNettyStreamingService.java | 2 +- .../xchangestream/okex/dto/RequestMessage.java | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java index cf8deda5d..901f8331c 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java @@ -43,7 +43,7 @@ public void messageHandler(String message) { handleMessage(jsonNode); } } catch (Exception exception) { - LOG.error("Error while handling message '{}': {}", message, exception); + LOG.trace("Error while handling message '{}': {}", message, exception); } } } diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java index afbf05400..971269fa4 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java @@ -1,5 +1,8 @@ package info.bitrich.xchangestream.okex.dto; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; + import java.util.List; public class RequestMessage { @@ -7,6 +10,7 @@ public class RequestMessage { public enum Operation { SUBSCRIBE, UNSUBSCRIBE, LOGIN; + @JsonValue @Override public String toString() { return super.toString().toLowerCase(); @@ -17,9 +21,16 @@ public String toString() { private List args; - public RequestMessage(Operation op, List args) { + public RequestMessage(@JsonProperty("op") Operation op, @JsonProperty("args") List args) { this.op = op; this.args = args; } + public Operation getOp() { + return op; + } + + public List getArgs() { + return args; + } } From 2bb4a992cbe614de50f05358cf747c5733754bd4 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Tue, 21 May 2019 11:33:36 +0800 Subject: [PATCH 78/97] okex bug fix --- .../netty/JsonNettyStreamingService.java | 3 +- .../xchangestream/okex/TestOrderbook.java | 4 + .../src/test/resources/order-book.json | 691 +++++++++++++++++- 3 files changed, 671 insertions(+), 27 deletions(-) create mode 100644 xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/TestOrderbook.java diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java index 901f8331c..d21d489bb 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java @@ -43,7 +43,8 @@ public void messageHandler(String message) { handleMessage(jsonNode); } } catch (Exception exception) { - LOG.trace("Error while handling message '{}': {}", message, exception); + LOG.error("Error while handling message: {}", message); + LOG.trace("Traceback", message); } } } diff --git a/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/TestOrderbook.java b/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/TestOrderbook.java new file mode 100644 index 000000000..6db5d0d7d --- /dev/null +++ b/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/TestOrderbook.java @@ -0,0 +1,4 @@ +package info.bitrich.xchangestream.okex; + +public class TestOrderbook { +} diff --git a/xchange-okex-v3/src/test/resources/order-book.json b/xchange-okex-v3/src/test/resources/order-book.json index 264e8121a..f81d97b82 100644 --- a/xchange-okex-v3/src/test/resources/order-book.json +++ b/xchange-okex-v3/src/test/resources/order-book.json @@ -1,30 +1,669 @@ { - "channel": "ok_sub_spot_btc_usd_depth", - "data": { - "bids": [ - [ - 819.9, - 0.922 + "table":"futures/depth", + "action":"update", + "data":[ + { + "instrument_id":"BTC-USD-190628", + "asks":[ + [ + "8002.49", + "25", + "0", + "1" + ], + [ + "8003.6", + "0", + "0", + "0" + ], + [ + "8003.68", + "0", + "0", + "0" + ], + [ + "8003.75", + "0", + "0", + "0" + ], + [ + "8003.79", + "50", + "0", + "1" + ], + [ + "8003.84", + "0", + "0", + "0" + ], + [ + "8003.85", + "0", + "0", + "0" + ], + [ + "8003.89", + "1", + "0", + "1" + ], + [ + "8003.9", + "22", + "0", + "6" + ], + [ + "8003.91", + "2", + "0", + "2" + ], + [ + "8003.97", + "1", + "0", + "1" + ], + [ + "8003.98", + "19", + "0", + "5" + ], + [ + "8003.99", + "1", + "0", + "1" + ], + [ + "8004", + "2", + "0", + "2" + ], + [ + "8004.05", + "0", + "0", + "0" + ], + [ + "8004.11", + "0", + "0", + "0" + ], + [ + "8004.13", + "0", + "0", + "0" + ], + [ + "8004.17", + "0", + "0", + "0" + ], + [ + "8004.44", + "81", + "0", + "2" + ], + [ + "8004.69", + "1", + "0", + "1" + ], + [ + "8004.74", + "1", + "0", + "1" + ], + [ + "8004.78", + "0", + "0", + "0" + ], + [ + "8004.83", + "1", + "0", + "1" + ], + [ + "8004.86", + "0", + "0", + "0" + ], + [ + "8004.93", + "1", + "0", + "1" + ], + [ + "8005.03", + "1", + "0", + "1" + ], + [ + "8005.11", + "1", + "0", + "1" + ], + [ + "8005.12", + "1", + "0", + "1" + ], + [ + "8005.28", + "1", + "0", + "1" + ], + [ + "8005.37", + "1", + "0", + "1" + ], + [ + "8005.55", + "0", + "0", + "0" + ], + [ + "8005.57", + "0", + "0", + "0" + ], + [ + "8005.72", + "0", + "0", + "0" + ], + [ + "8006.04", + "25", + "0", + "1" + ], + [ + "8006.17", + "0", + "0", + "0" + ], + [ + "8006.3", + "0", + "0", + "0" + ], + [ + "8006.33", + "0", + "0", + "0" + ], + [ + "8006.99", + "10", + "0", + "1" + ], + [ + "8007.32", + "100", + "0", + "1" + ], + [ + "8007.64", + "0", + "0", + "0" + ], + [ + "8008.04", + "25", + "0", + "1" + ], + [ + "8008.28", + "10", + "0", + "2" + ], + [ + "8008.3", + "1", + "0", + "1" + ], + [ + "8008.51", + "0", + "0", + "0" + ], + [ + "8008.53", + "1", + "0", + "1" + ], + [ + "8008.64", + "0", + "0", + "0" + ], + [ + "8009.17", + "11", + "0", + "2" + ], + [ + "8009.23", + "16", + "0", + "1" + ], + [ + "8009.26", + "0", + "0", + "0" + ], + [ + "8009.44", + "1", + "0", + "1" + ], + [ + "8009.74", + "27", + "0", + "1" + ], + [ + "8010.28", + "46", + "0", + "1" + ], + [ + "8010.32", + "20", + "0", + "1" + ], + [ + "8010.89", + "19", + "0", + "1" + ], + [ + "8011.14", + "0", + "0", + "0" + ], + [ + "8011.31", + "1", + "0", + "1" + ], + [ + "8012", + "38", + "0", + "3" + ], + [ + "8013.74", + "0", + "0", + "0" + ], + [ + "8013.78", + "0", + "0", + "0" + ], + [ + "8013.95", + "60", + "0", + "1" + ], + [ + "8013.96", + "2", + "0", + "2" + ], + [ + "8013.99", + "1", + "0", + "1" + ], + [ + "8014.06", + "2", + "0", + "2" + ] ], - [ - 818.63, - 0.085 - ] - ], - "asks": [ - [ - 821.7, - 2.89 + "bids":[ + [ + "8000.5", + "20", + "0", + "2" + ], + [ + "8000", + "335", + "0", + "2" + ], + [ + "7999.99", + "100", + "0", + "1" + ], + [ + "7999.98", + "15", + "0", + "1" + ], + [ + "7998.71", + "1", + "0", + "1" + ], + [ + "7997.91", + "0", + "0", + "0" + ], + [ + "7997.39", + "50", + "0", + "1" + ], + [ + "7997.09", + "0", + "0", + "0" + ], + [ + "7995.7", + "41", + "0", + "2" + ], + [ + "7995.69", + "1", + "0", + "1" + ], + [ + "7995.62", + "1", + "0", + "1" + ], + [ + "7995.12", + "25", + "0", + "1" + ], + [ + "7995.04", + "0", + "0", + "0" + ], + [ + "7994.65", + "0", + "0", + "0" + ], + [ + "7994.43", + "0", + "0", + "0" + ], + [ + "7994.37", + "1", + "0", + "1" + ], + [ + "7994.33", + "0", + "0", + "0" + ], + [ + "7993.95", + "37", + "0", + "2" + ], + [ + "7993.36", + "0", + "0", + "0" + ], + [ + "7993.01", + "5", + "0", + "1" + ], + [ + "7992.81", + "0", + "0", + "0" + ], + [ + "7992.66", + "12", + "0", + "1" + ], + [ + "7992.64", + "23", + "0", + "2" + ], + [ + "7992.41", + "10", + "0", + "1" + ], + [ + "7992.08", + "13", + "0", + "1" + ], + [ + "7991.39", + "8", + "0", + "1" + ], + [ + "7990.73", + "0", + "0", + "0" + ], + [ + "7990.46", + "0", + "0", + "0" + ], + [ + "7989.75", + "10", + "0", + "1" + ], + [ + "7989.68", + "45", + "0", + "2" + ], + [ + "7989.52", + "1", + "0", + "1" + ], + [ + "7989.49", + "1", + "0", + "1" + ], + [ + "7989.13", + "10", + "0", + "1" + ], + [ + "7988.6", + "0", + "0", + "0" + ], + [ + "7988.26", + "0", + "0", + "0" + ], + [ + "7988.23", + "0", + "0", + "0" + ], + [ + "7987.84", + "10", + "0", + "1" + ], + [ + "7987.15", + "0", + "0", + "0" + ], + [ + "7986.46", + "60", + "0", + "2" + ], + [ + "7984.75", + "0", + "0", + "0" + ], + [ + "7983.26", + "20", + "0", + "1" + ], + [ + "7981.17", + "0", + "0", + "0" + ], + [ + "7981.08", + "0", + "0", + "0" + ], + [ + "7981", + "0", + "0", + "0" + ], + [ + "7980", + "0", + "0", + "0" + ], + [ + "7979.98", + "0", + "0", + "0" + ] ], - [ - 821.65, - 5.18 - ], - [ - 821.6, - 0.035 - ] - ], - "timestamp": "1484602135246" - } + "timestamp":"2019-05-21T03:25:43.764Z", + "checksum":982847349 + } + ] } \ No newline at end of file From 491f3e57788114e1f22238db949a6c316393bc1d Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Tue, 21 May 2019 12:01:28 +0800 Subject: [PATCH 79/97] okex bug fix --- .../okex/OkexStreamingMarketDataService.java | 2 +- .../okex/OkexStreamingService.java | 2 +- .../xchangestream/okex/TestOrderbook.java | 63 + .../test/resources/order-book-partial.json | 2415 +++++++++++++++++ .../src/test/resources/order-book.json | 669 ----- 5 files changed, 2480 insertions(+), 671 deletions(-) create mode 100644 xchange-okex-v3/src/test/resources/order-book-partial.json delete mode 100644 xchange-okex-v3/src/test/resources/order-book.json diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java index 1255bf7d9..3f7368099 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java @@ -93,7 +93,7 @@ public Observable getOrderBook(CurrencyPair currencyPair, Object... a okCoinOrderbook.updateLevels(bidLevels, Order.OrderType.BID); } } - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); format.setTimeZone(TimeZone.getTimeZone("UTC")); long epoch = format.parse(data.get("timestamp").asText()).getTime(); return OkCoinAdapters.adaptOrderBook(okCoinOrderbook.toOkCoinDepth(epoch), currencyPair); diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index 40435ed4c..bb2d171f4 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -79,7 +79,7 @@ protected void handleMessage(JsonNode message) { } if (data.get("timestamp") != null && !delayEmitted) { delayEmitted = true; - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); format.setTimeZone(TimeZone.getTimeZone("UTC")); for (ObservableEmitter emitter : delayEmitters) { try { diff --git a/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/TestOrderbook.java b/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/TestOrderbook.java index 6db5d0d7d..1c04f2b30 100644 --- a/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/TestOrderbook.java +++ b/xchange-okex-v3/src/test/java/info/bitrich/xchangestream/okex/TestOrderbook.java @@ -1,4 +1,67 @@ package info.bitrich.xchangestream.okex; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import info.bitrich.xchangestream.okex.dto.OkCoinOrderbook; +import org.junit.Test; +import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.Order; +import org.knowm.xchange.okcoin.OkCoinAdapters; +import org.knowm.xchange.okcoin.dto.marketdata.OkCoinDepth; + +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Map; +import java.util.TimeZone; + public class TestOrderbook { + + private final ObjectMapper mapper = new ObjectMapper(); + private final Map orderbooks = new HashMap<>(); + + @Test + public void testParse() throws IOException, ParseException { + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + // Read in the JSON from the example resources + InputStream is = + TestOrderbook.class.getResourceAsStream( + "/order-book-partial.json"); + JsonNode s = mapper.readTree(is); + String instrumentId = "BTC-USD-190628"; + OkCoinOrderbook okCoinOrderbook; + for (JsonNode data : s.get("data")) { + if (instrumentId.equals(data.get("instrument_id").asText())) { + if ("partial".equals(s.get("action").asText())) { + if (!"partial".equals(s.get("action").asText())) { + + } + OkCoinDepth okCoinDepth = this.mapper.treeToValue(data, OkCoinDepth.class); + okCoinOrderbook = new OkCoinOrderbook(okCoinDepth); + this.orderbooks.put(instrumentId, okCoinOrderbook); + } else { + okCoinOrderbook = this.orderbooks.get(instrumentId); + BigDecimal[][] bidLevels; + if (data.has("asks") && data.get("asks").size() > 0) { + bidLevels = this.mapper.treeToValue(data.get("asks"), BigDecimal[][].class); + okCoinOrderbook.updateLevels(bidLevels, Order.OrderType.ASK); + } + + if (data.has("bids") && data.get("bids").size() > 0) { + bidLevels = this.mapper.treeToValue(data.get("bids"), BigDecimal[][].class); + okCoinOrderbook.updateLevels(bidLevels, Order.OrderType.BID); + } + } + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + format.setTimeZone(TimeZone.getTimeZone("UTC")); + long epoch = format.parse(data.get("timestamp").asText()).getTime(); + OkCoinAdapters.adaptOrderBook(okCoinOrderbook.toOkCoinDepth(epoch), CurrencyPair.XBT_USD); + } + } + } + } diff --git a/xchange-okex-v3/src/test/resources/order-book-partial.json b/xchange-okex-v3/src/test/resources/order-book-partial.json new file mode 100644 index 000000000..0aa557243 --- /dev/null +++ b/xchange-okex-v3/src/test/resources/order-book-partial.json @@ -0,0 +1,2415 @@ +{ + "table":"futures/depth", + "action":"partial", + "data":[ + { + "instrument_id":"BTC-USD-190628", + "asks":[ + [ + "7997.59", + "55", + "0", + "3" + ], + [ + "7998.94", + "187", + "0", + "1" + ], + [ + "7998.95", + "3", + "0", + "3" + ], + [ + "7999.48", + "3", + "0", + "3" + ], + [ + "7999.97", + "50", + "0", + "1" + ], + [ + "8000", + "80", + "0", + "1" + ], + [ + "8000.39", + "3", + "0", + "3" + ], + [ + "8000.79", + "1", + "0", + "1" + ], + [ + "8001.11", + "13", + "0", + "1" + ], + [ + "8001.24", + "8", + "0", + "1" + ], + [ + "8001.26", + "1", + "0", + "1" + ], + [ + "8001.33", + "1", + "0", + "1" + ], + [ + "8001.45", + "20", + "0", + "1" + ], + [ + "8001.5", + "1", + "0", + "1" + ], + [ + "8001.59", + "51", + "0", + "2" + ], + [ + "8001.61", + "20", + "0", + "1" + ], + [ + "8001.65", + "1", + "0", + "1" + ], + [ + "8001.74", + "1", + "0", + "1" + ], + [ + "8001.8", + "1", + "0", + "1" + ], + [ + "8001.82", + "80", + "0", + "1" + ], + [ + "8001.83", + "100", + "0", + "1" + ], + [ + "8001.85", + "28", + "0", + "1" + ], + [ + "8001.88", + "1", + "0", + "1" + ], + [ + "8001.94", + "20", + "0", + "5" + ], + [ + "8001.95", + "2", + "0", + "2" + ], + [ + "8001.98", + "7", + "0", + "1" + ], + [ + "8002.02", + "17", + "0", + "3" + ], + [ + "8002.03", + "5", + "0", + "5" + ], + [ + "8002.16", + "1", + "0", + "1" + ], + [ + "8002.32", + "2", + "0", + "1" + ], + [ + "8002.37", + "1", + "0", + "1" + ], + [ + "8002.43", + "6", + "0", + "1" + ], + [ + "8002.46", + "41", + "0", + "2" + ], + [ + "8002.51", + "1", + "0", + "1" + ], + [ + "8002.53", + "1", + "0", + "1" + ], + [ + "8002.6", + "1", + "0", + "1" + ], + [ + "8002.62", + "5", + "0", + "3" + ], + [ + "8002.71", + "2", + "0", + "2" + ], + [ + "8002.72", + "1", + "0", + "1" + ], + [ + "8002.8", + "3", + "0", + "3" + ], + [ + "8002.88", + "1", + "0", + "1" + ], + [ + "8002.89", + "2", + "0", + "2" + ], + [ + "8002.99", + "20", + "0", + "1" + ], + [ + "8003.12", + "7", + "0", + "1" + ], + [ + "8003.14", + "1", + "0", + "1" + ], + [ + "8003.21", + "9", + "0", + "1" + ], + [ + "8003.23", + "1", + "0", + "1" + ], + [ + "8003.39", + "4", + "0", + "1" + ], + [ + "8003.49", + "16", + "0", + "2" + ], + [ + "8003.52", + "1", + "0", + "1" + ], + [ + "8003.57", + "1", + "0", + "1" + ], + [ + "8003.61", + "1", + "0", + "1" + ], + [ + "8003.68", + "149", + "0", + "4" + ], + [ + "8003.69", + "4", + "0", + "1" + ], + [ + "8003.79", + "25", + "0", + "1" + ], + [ + "8003.95", + "10", + "0", + "1" + ], + [ + "8003.97", + "100", + "0", + "1" + ], + [ + "8003.99", + "27", + "0", + "1" + ], + [ + "8004.1", + "1", + "0", + "1" + ], + [ + "8004.18", + "19", + "0", + "1" + ], + [ + "8004.24", + "1", + "0", + "1" + ], + [ + "8004.29", + "11", + "0", + "2" + ], + [ + "8004.31", + "1", + "0", + "1" + ], + [ + "8004.32", + "1", + "0", + "1" + ], + [ + "8004.68", + "92", + "0", + "1" + ], + [ + "8004.78", + "100", + "0", + "1" + ], + [ + "8004.8", + "9", + "0", + "1" + ], + [ + "8004.93", + "3", + "0", + "3" + ], + [ + "8004.94", + "4", + "0", + "4" + ], + [ + "8004.95", + "5", + "0", + "5" + ], + [ + "8004.96", + "2", + "0", + "2" + ], + [ + "8005.01", + "80", + "0", + "1" + ], + [ + "8005.14", + "97", + "0", + "1" + ], + [ + "8005.16", + "12", + "0", + "1" + ], + [ + "8005.25", + "2", + "0", + "2" + ], + [ + "8005.27", + "2", + "0", + "2" + ], + [ + "8005.29", + "1", + "0", + "1" + ], + [ + "8005.37", + "41", + "0", + "2" + ], + [ + "8005.38", + "1", + "0", + "1" + ], + [ + "8005.39", + "14", + "0", + "1" + ], + [ + "8005.4", + "1", + "0", + "1" + ], + [ + "8005.45", + "1", + "0", + "1" + ], + [ + "8005.53", + "1", + "0", + "1" + ], + [ + "8005.72", + "62", + "0", + "1" + ], + [ + "8005.92", + "9", + "0", + "1" + ], + [ + "8005.94", + "9", + "0", + "1" + ], + [ + "8005.96", + "1", + "0", + "1" + ], + [ + "8005.97", + "5", + "0", + "5" + ], + [ + "8005.99", + "7", + "0", + "7" + ], + [ + "8006.01", + "4", + "0", + "4" + ], + [ + "8006.02", + "1", + "0", + "1" + ], + [ + "8006.22", + "92", + "0", + "1" + ], + [ + "8006.39", + "80", + "0", + "1" + ], + [ + "8006.4", + "1", + "0", + "1" + ], + [ + "8006.42", + "1", + "0", + "1" + ], + [ + "8006.58", + "1", + "0", + "1" + ], + [ + "8006.61", + "1", + "0", + "1" + ], + [ + "8006.63", + "1", + "0", + "1" + ], + [ + "8006.68", + "2", + "0", + "2" + ], + [ + "8006.69", + "1", + "0", + "1" + ], + [ + "8006.7", + "2", + "0", + "2" + ], + [ + "8006.71", + "2", + "0", + "2" + ], + [ + "8006.72", + "1", + "0", + "1" + ], + [ + "8006.73", + "26", + "0", + "1" + ], + [ + "8006.77", + "1", + "0", + "1" + ], + [ + "8006.79", + "1", + "0", + "1" + ], + [ + "8006.87", + "10", + "0", + "1" + ], + [ + "8006.88", + "1", + "0", + "1" + ], + [ + "8006.89", + "1", + "0", + "1" + ], + [ + "8006.91", + "1", + "0", + "1" + ], + [ + "8006.93", + "1", + "0", + "1" + ], + [ + "8007.01", + "17", + "0", + "1" + ], + [ + "8007.05", + "20", + "0", + "2" + ], + [ + "8007.06", + "1", + "0", + "1" + ], + [ + "8007.08", + "1", + "0", + "1" + ], + [ + "8007.09", + "1", + "0", + "1" + ], + [ + "8007.14", + "1", + "0", + "1" + ], + [ + "8007.15", + "1", + "0", + "1" + ], + [ + "8007.29", + "9", + "0", + "1" + ], + [ + "8007.36", + "2", + "0", + "2" + ], + [ + "8007.37", + "1", + "0", + "1" + ], + [ + "8007.38", + "1", + "0", + "1" + ], + [ + "8007.39", + "5", + "0", + "2" + ], + [ + "8007.42", + "5", + "0", + "2" + ], + [ + "8007.51", + "1", + "0", + "1" + ], + [ + "8007.52", + "1", + "0", + "1" + ], + [ + "8007.62", + "1", + "0", + "1" + ], + [ + "8007.64", + "1", + "0", + "1" + ], + [ + "8007.83", + "1", + "0", + "1" + ], + [ + "8007.84", + "2", + "0", + "2" + ], + [ + "8007.85", + "1", + "0", + "1" + ], + [ + "8007.9", + "1", + "0", + "1" + ], + [ + "8007.92", + "1", + "0", + "1" + ], + [ + "8007.93", + "1", + "0", + "1" + ], + [ + "8007.94", + "302", + "0", + "4" + ], + [ + "8007.95", + "108", + "0", + "4" + ], + [ + "8007.96", + "1", + "0", + "1" + ], + [ + "8007.97", + "1", + "0", + "1" + ], + [ + "8008", + "73", + "0", + "1" + ], + [ + "8008.08", + "1", + "0", + "1" + ], + [ + "8008.09", + "1", + "0", + "1" + ], + [ + "8008.11", + "1", + "0", + "1" + ], + [ + "8008.21", + "1", + "0", + "1" + ], + [ + "8008.22", + "3", + "0", + "1" + ], + [ + "8008.23", + "1", + "0", + "1" + ], + [ + "8008.26", + "23", + "0", + "2" + ], + [ + "8008.35", + "1", + "0", + "1" + ], + [ + "8008.36", + "1", + "0", + "1" + ], + [ + "8008.37", + "47", + "0", + "1" + ], + [ + "8008.4", + "1", + "0", + "1" + ], + [ + "8008.41", + "2", + "0", + "2" + ], + [ + "8008.42", + "1", + "0", + "1" + ], + [ + "8008.43", + "3", + "0", + "3" + ], + [ + "8008.44", + "1", + "0", + "1" + ], + [ + "8008.5", + "1", + "0", + "1" + ], + [ + "8008.53", + "1", + "0", + "1" + ], + [ + "8008.57", + "1", + "0", + "1" + ], + [ + "8008.58", + "3", + "0", + "3" + ], + [ + "8008.59", + "1", + "0", + "1" + ], + [ + "8008.6", + "2", + "0", + "2" + ], + [ + "8008.67", + "1", + "0", + "1" + ], + [ + "8008.69", + "1", + "0", + "1" + ], + [ + "8008.76", + "11", + "0", + "2" + ], + [ + "8008.77", + "1", + "0", + "1" + ], + [ + "8008.79", + "2", + "0", + "2" + ], + [ + "8008.82", + "1", + "0", + "1" + ], + [ + "8008.84", + "1", + "0", + "1" + ], + [ + "8009", + "97", + "0", + "1" + ], + [ + "8009.05", + "1", + "0", + "1" + ], + [ + "8009.06", + "1", + "0", + "1" + ], + [ + "8009.07", + "1", + "0", + "1" + ], + [ + "8009.08", + "1", + "0", + "1" + ], + [ + "8009.45", + "60", + "0", + "1" + ], + [ + "8009.75", + "1", + "0", + "1" + ], + [ + "8009.77", + "1", + "0", + "1" + ], + [ + "8010", + "1445", + "0", + "1" + ], + [ + "8010.01", + "10", + "0", + "1" + ], + [ + "8010.04", + "22", + "0", + "1" + ], + [ + "8010.27", + "22", + "0", + "1" + ], + [ + "8010.33", + "60", + "0", + "1" + ], + [ + "8010.55", + "1", + "0", + "1" + ], + [ + "8010.58", + "1", + "0", + "1" + ], + [ + "8010.67", + "120", + "0", + "1" + ], + [ + "8011.03", + "66", + "0", + "1" + ], + [ + "8011.07", + "60", + "0", + "1" + ], + [ + "8011.14", + "1", + "0", + "1" + ], + [ + "8011.17", + "1", + "0", + "1" + ], + [ + "8011.34", + "1", + "0", + "1" + ], + [ + "8011.37", + "1", + "0", + "1" + ], + [ + "8011.39", + "12", + "0", + "1" + ], + [ + "8011.5", + "24", + "0", + "1" + ], + [ + "8011.61", + "47", + "0", + "1" + ], + [ + "8011.92", + "1", + "0", + "1" + ], + [ + "8011.95", + "1", + "0", + "1" + ], + [ + "8012.01", + "1", + "0", + "1" + ], + [ + "8012.04", + "1", + "0", + "1" + ], + [ + "8012.09", + "3", + "0", + "1" + ], + [ + "8012.14", + "22", + "0", + "1" + ], + [ + "8012.2", + "1", + "0", + "1" + ], + [ + "8012.23", + "1", + "0", + "1" + ] + ], + "bids":[ + [ + "7997.36", + "20", + "0", + "1" + ], + [ + "7997.13", + "171", + "0", + "2" + ], + [ + "7997.11", + "10", + "0", + "10" + ], + [ + "7996.7", + "3", + "0", + "2" + ], + [ + "7996.01", + "107", + "0", + "1" + ], + [ + "7995.93", + "1", + "0", + "1" + ], + [ + "7995.61", + "1", + "0", + "1" + ], + [ + "7994.65", + "107", + "0", + "1" + ], + [ + "7994.64", + "12", + "0", + "1" + ], + [ + "7994.63", + "103", + "0", + "2" + ], + [ + "7994.56", + "2", + "0", + "2" + ], + [ + "7994.55", + "319", + "0", + "1" + ], + [ + "7994.5", + "3", + "0", + "3" + ], + [ + "7994.41", + "1", + "0", + "1" + ], + [ + "7994.24", + "12", + "0", + "1" + ], + [ + "7994.1", + "24", + "0", + "2" + ], + [ + "7993.74", + "11", + "0", + "2" + ], + [ + "7993.73", + "1", + "0", + "1" + ], + [ + "7993.72", + "1", + "0", + "1" + ], + [ + "7993.71", + "1", + "0", + "1" + ], + [ + "7993.68", + "3", + "0", + "1" + ], + [ + "7993.67", + "40", + "0", + "1" + ], + [ + "7993.57", + "47", + "0", + "1" + ], + [ + "7993.55", + "1", + "0", + "1" + ], + [ + "7993.53", + "1", + "0", + "1" + ], + [ + "7993.44", + "107", + "0", + "1" + ], + [ + "7993.42", + "2", + "0", + "1" + ], + [ + "7993.34", + "11", + "0", + "1" + ], + [ + "7993.32", + "12", + "0", + "1" + ], + [ + "7993.29", + "1", + "0", + "1" + ], + [ + "7993.28", + "1", + "0", + "1" + ], + [ + "7993.27", + "1", + "0", + "1" + ], + [ + "7993.26", + "20", + "0", + "1" + ], + [ + "7993.17", + "1", + "0", + "1" + ], + [ + "7993.15", + "1", + "0", + "1" + ], + [ + "7993.13", + "1", + "0", + "1" + ], + [ + "7993.01", + "4", + "0", + "4" + ], + [ + "7992.97", + "1", + "0", + "1" + ], + [ + "7992.94", + "27", + "0", + "1" + ], + [ + "7992.9", + "4", + "0", + "4" + ], + [ + "7992.89", + "1", + "0", + "1" + ], + [ + "7992.86", + "2", + "0", + "2" + ], + [ + "7992.84", + "1", + "0", + "1" + ], + [ + "7992.76", + "13", + "0", + "2" + ], + [ + "7992.75", + "26", + "0", + "2" + ], + [ + "7992.74", + "1", + "0", + "1" + ], + [ + "7992.7", + "2", + "0", + "2" + ], + [ + "7992.68", + "2", + "0", + "2" + ], + [ + "7992.6", + "48", + "0", + "48" + ], + [ + "7992.48", + "1", + "0", + "1" + ], + [ + "7992.46", + "3", + "0", + "2" + ], + [ + "7992.44", + "4", + "0", + "2" + ], + [ + "7992.42", + "1", + "0", + "1" + ], + [ + "7992.37", + "1", + "0", + "1" + ], + [ + "7992.32", + "20", + "0", + "1" + ], + [ + "7992.1", + "1", + "0", + "1" + ], + [ + "7992.09", + "1", + "0", + "1" + ], + [ + "7992.06", + "1", + "0", + "1" + ], + [ + "7992.04", + "1", + "0", + "1" + ], + [ + "7992.03", + "1", + "0", + "1" + ], + [ + "7992.01", + "3", + "0", + "3" + ], + [ + "7992", + "272", + "0", + "1" + ], + [ + "7991.99", + "2", + "0", + "2" + ], + [ + "7991.97", + "1", + "0", + "1" + ], + [ + "7991.95", + "1", + "0", + "1" + ], + [ + "7991.91", + "5", + "0", + "1" + ], + [ + "7991.89", + "5", + "0", + "1" + ], + [ + "7991.87", + "1", + "0", + "1" + ], + [ + "7991.85", + "1", + "0", + "1" + ], + [ + "7991.79", + "1", + "0", + "1" + ], + [ + "7991.78", + "8", + "0", + "2" + ], + [ + "7991.65", + "11", + "0", + "1" + ], + [ + "7991.64", + "20", + "0", + "2" + ], + [ + "7991.63", + "12", + "0", + "1" + ], + [ + "7991.58", + "60", + "0", + "2" + ], + [ + "7991.51", + "2", + "0", + "2" + ], + [ + "7991.49", + "1", + "0", + "1" + ], + [ + "7991.48", + "1", + "0", + "1" + ], + [ + "7991.46", + "1", + "0", + "1" + ], + [ + "7991.39", + "1", + "0", + "1" + ], + [ + "7991.38", + "8", + "0", + "1" + ], + [ + "7991.31", + "5", + "0", + "1" + ], + [ + "7991.28", + "13", + "0", + "1" + ], + [ + "7991.12", + "1", + "0", + "1" + ], + [ + "7991.05", + "1", + "0", + "1" + ], + [ + "7991", + "3", + "0", + "2" + ], + [ + "7990.98", + "1", + "0", + "1" + ], + [ + "7990.96", + "4", + "0", + "1" + ], + [ + "7990.84", + "2", + "0", + "1" + ], + [ + "7990.82", + "2", + "0", + "1" + ], + [ + "7990.81", + "1", + "0", + "1" + ], + [ + "7990.75", + "40", + "0", + "1" + ], + [ + "7990.64", + "1", + "0", + "1" + ], + [ + "7990.63", + "1", + "0", + "1" + ], + [ + "7990.62", + "1", + "0", + "1" + ], + [ + "7990.32", + "1", + "0", + "1" + ], + [ + "7990.31", + "1", + "0", + "1" + ], + [ + "7990.3", + "1", + "0", + "1" + ], + [ + "7990.29", + "2", + "0", + "2" + ], + [ + "7990.27", + "1", + "0", + "1" + ], + [ + "7990.26", + "116", + "0", + "1" + ], + [ + "7990.25", + "1", + "0", + "1" + ], + [ + "7990.24", + "80", + "0", + "1" + ], + [ + "7990.15", + "1", + "0", + "1" + ], + [ + "7990.11", + "3", + "0", + "1" + ], + [ + "7990.07", + "20", + "0", + "1" + ], + [ + "7990", + "35", + "0", + "2" + ], + [ + "7989.92", + "9", + "0", + "1" + ], + [ + "7989.9", + "10", + "0", + "1" + ], + [ + "7989.79", + "1", + "0", + "1" + ], + [ + "7989.53", + "1", + "0", + "1" + ], + [ + "7989.51", + "1", + "0", + "1" + ], + [ + "7989.4", + "2", + "0", + "2" + ], + [ + "7989.38", + "2", + "0", + "2" + ], + [ + "7989.32", + "22", + "0", + "1" + ], + [ + "7989.12", + "10", + "0", + "1" + ], + [ + "7989.11", + "9", + "0", + "1" + ], + [ + "7989.08", + "1", + "0", + "1" + ], + [ + "7989.06", + "2", + "0", + "2" + ], + [ + "7989.04", + "1", + "0", + "1" + ], + [ + "7989.02", + "1", + "0", + "1" + ], + [ + "7989", + "1", + "0", + "1" + ], + [ + "7988.92", + "6", + "0", + "2" + ], + [ + "7988.9", + "1", + "0", + "1" + ], + [ + "7988.82", + "20", + "0", + "1" + ], + [ + "7988.8", + "1", + "0", + "1" + ], + [ + "7988.71", + "12", + "0", + "1" + ], + [ + "7988.61", + "20", + "0", + "1" + ], + [ + "7988.56", + "400", + "0", + "1" + ], + [ + "7988.52", + "40", + "0", + "1" + ], + [ + "7988.46", + "5", + "0", + "1" + ], + [ + "7988.12", + "1", + "0", + "1" + ], + [ + "7988.1", + "1", + "0", + "1" + ], + [ + "7988.07", + "12", + "0", + "1" + ], + [ + "7987.87", + "3", + "0", + "1" + ], + [ + "7987.83", + "10", + "0", + "1" + ], + [ + "7987.76", + "90", + "0", + "1" + ], + [ + "7987.63", + "19", + "0", + "1" + ], + [ + "7987.52", + "20", + "0", + "1" + ], + [ + "7987.35", + "14", + "0", + "1" + ], + [ + "7987.33", + "2", + "0", + "1" + ], + [ + "7987.3", + "22", + "0", + "1" + ], + [ + "7987.2", + "80", + "0", + "1" + ], + [ + "7987.14", + "10", + "0", + "1" + ], + [ + "7987", + "8", + "0", + "1" + ], + [ + "7986.87", + "1", + "0", + "1" + ], + [ + "7986.85", + "1", + "0", + "1" + ], + [ + "7986.81", + "60", + "0", + "1" + ], + [ + "7986.63", + "18", + "0", + "1" + ], + [ + "7986.59", + "22", + "0", + "1" + ], + [ + "7986.52", + "20", + "0", + "1" + ], + [ + "7986.51", + "18", + "0", + "1" + ], + [ + "7986.46", + "1", + "0", + "1" + ], + [ + "7986.21", + "3", + "0", + "1" + ], + [ + "7986.2", + "38", + "0", + "1" + ], + [ + "7986.16", + "81", + "0", + "2" + ], + [ + "7986.14", + "22", + "0", + "1" + ], + [ + "7986.08", + "54", + "0", + "1" + ], + [ + "7986.04", + "2", + "0", + "2" + ], + [ + "7986.02", + "22", + "0", + "1" + ], + [ + "7986", + "1", + "0", + "1" + ], + [ + "7985.8", + "40", + "0", + "1" + ], + [ + "7985.77", + "67", + "0", + "1" + ], + [ + "7985.64", + "1", + "0", + "1" + ], + [ + "7985.61", + "1", + "0", + "1" + ], + [ + "7985.6", + "22", + "0", + "1" + ], + [ + "7985.08", + "22", + "0", + "1" + ], + [ + "7985.01", + "19", + "0", + "1" + ], + [ + "7985", + "1", + "0", + "1" + ], + [ + "7984.94", + "130", + "0", + "1" + ], + [ + "7984.9", + "21", + "0", + "1" + ], + [ + "7984.76", + "22", + "0", + "1" + ], + [ + "7984.75", + "82", + "0", + "2" + ], + [ + "7984.35", + "12", + "0", + "1" + ], + [ + "7984", + "1", + "0", + "1" + ], + [ + "7983.93", + "4", + "0", + "2" + ], + [ + "7983.64", + "22", + "0", + "1" + ], + [ + "7983.34", + "22", + "0", + "1" + ], + [ + "7982.92", + "64", + "0", + "1" + ], + [ + "7982.35", + "100", + "0", + "1" + ], + [ + "7982.34", + "5", + "0", + "1" + ], + [ + "7982.13", + "1", + "0", + "1" + ], + [ + "7982.12", + "13", + "0", + "1" + ], + [ + "7982", + "1", + "0", + "1" + ], + [ + "7981.94", + "1", + "0", + "1" + ], + [ + "7981.9", + "1", + "0", + "1" + ], + [ + "7981.37", + "66", + "0", + "1" + ], + [ + "7981.25", + "299", + "0", + "1" + ], + [ + "7981.17", + "12", + "0", + "1" + ], + [ + "7981.15", + "100", + "0", + "1" + ], + [ + "7981.08", + "4", + "0", + "2" + ], + [ + "7981", + "206", + "0", + "2" + ], + [ + "7980.65", + "5", + "0", + "1" + ], + [ + "7980", + "2913", + "0", + "4" + ], + [ + "7979.98", + "120", + "0", + "1" + ], + [ + "7979.88", + "58", + "0", + "1" + ], + [ + "7979.73", + "2", + "0", + "1" + ], + [ + "7979.5", + "317", + "0", + "1" + ], + [ + "7979.42", + "5", + "0", + "1" + ], + [ + "7979", + "100", + "0", + "1" + ] + ], + "timestamp":"2019-05-21T03:25:36.908Z", + "checksum":-1602307929 + } + ] +} \ No newline at end of file diff --git a/xchange-okex-v3/src/test/resources/order-book.json b/xchange-okex-v3/src/test/resources/order-book.json deleted file mode 100644 index f81d97b82..000000000 --- a/xchange-okex-v3/src/test/resources/order-book.json +++ /dev/null @@ -1,669 +0,0 @@ -{ - "table":"futures/depth", - "action":"update", - "data":[ - { - "instrument_id":"BTC-USD-190628", - "asks":[ - [ - "8002.49", - "25", - "0", - "1" - ], - [ - "8003.6", - "0", - "0", - "0" - ], - [ - "8003.68", - "0", - "0", - "0" - ], - [ - "8003.75", - "0", - "0", - "0" - ], - [ - "8003.79", - "50", - "0", - "1" - ], - [ - "8003.84", - "0", - "0", - "0" - ], - [ - "8003.85", - "0", - "0", - "0" - ], - [ - "8003.89", - "1", - "0", - "1" - ], - [ - "8003.9", - "22", - "0", - "6" - ], - [ - "8003.91", - "2", - "0", - "2" - ], - [ - "8003.97", - "1", - "0", - "1" - ], - [ - "8003.98", - "19", - "0", - "5" - ], - [ - "8003.99", - "1", - "0", - "1" - ], - [ - "8004", - "2", - "0", - "2" - ], - [ - "8004.05", - "0", - "0", - "0" - ], - [ - "8004.11", - "0", - "0", - "0" - ], - [ - "8004.13", - "0", - "0", - "0" - ], - [ - "8004.17", - "0", - "0", - "0" - ], - [ - "8004.44", - "81", - "0", - "2" - ], - [ - "8004.69", - "1", - "0", - "1" - ], - [ - "8004.74", - "1", - "0", - "1" - ], - [ - "8004.78", - "0", - "0", - "0" - ], - [ - "8004.83", - "1", - "0", - "1" - ], - [ - "8004.86", - "0", - "0", - "0" - ], - [ - "8004.93", - "1", - "0", - "1" - ], - [ - "8005.03", - "1", - "0", - "1" - ], - [ - "8005.11", - "1", - "0", - "1" - ], - [ - "8005.12", - "1", - "0", - "1" - ], - [ - "8005.28", - "1", - "0", - "1" - ], - [ - "8005.37", - "1", - "0", - "1" - ], - [ - "8005.55", - "0", - "0", - "0" - ], - [ - "8005.57", - "0", - "0", - "0" - ], - [ - "8005.72", - "0", - "0", - "0" - ], - [ - "8006.04", - "25", - "0", - "1" - ], - [ - "8006.17", - "0", - "0", - "0" - ], - [ - "8006.3", - "0", - "0", - "0" - ], - [ - "8006.33", - "0", - "0", - "0" - ], - [ - "8006.99", - "10", - "0", - "1" - ], - [ - "8007.32", - "100", - "0", - "1" - ], - [ - "8007.64", - "0", - "0", - "0" - ], - [ - "8008.04", - "25", - "0", - "1" - ], - [ - "8008.28", - "10", - "0", - "2" - ], - [ - "8008.3", - "1", - "0", - "1" - ], - [ - "8008.51", - "0", - "0", - "0" - ], - [ - "8008.53", - "1", - "0", - "1" - ], - [ - "8008.64", - "0", - "0", - "0" - ], - [ - "8009.17", - "11", - "0", - "2" - ], - [ - "8009.23", - "16", - "0", - "1" - ], - [ - "8009.26", - "0", - "0", - "0" - ], - [ - "8009.44", - "1", - "0", - "1" - ], - [ - "8009.74", - "27", - "0", - "1" - ], - [ - "8010.28", - "46", - "0", - "1" - ], - [ - "8010.32", - "20", - "0", - "1" - ], - [ - "8010.89", - "19", - "0", - "1" - ], - [ - "8011.14", - "0", - "0", - "0" - ], - [ - "8011.31", - "1", - "0", - "1" - ], - [ - "8012", - "38", - "0", - "3" - ], - [ - "8013.74", - "0", - "0", - "0" - ], - [ - "8013.78", - "0", - "0", - "0" - ], - [ - "8013.95", - "60", - "0", - "1" - ], - [ - "8013.96", - "2", - "0", - "2" - ], - [ - "8013.99", - "1", - "0", - "1" - ], - [ - "8014.06", - "2", - "0", - "2" - ] - ], - "bids":[ - [ - "8000.5", - "20", - "0", - "2" - ], - [ - "8000", - "335", - "0", - "2" - ], - [ - "7999.99", - "100", - "0", - "1" - ], - [ - "7999.98", - "15", - "0", - "1" - ], - [ - "7998.71", - "1", - "0", - "1" - ], - [ - "7997.91", - "0", - "0", - "0" - ], - [ - "7997.39", - "50", - "0", - "1" - ], - [ - "7997.09", - "0", - "0", - "0" - ], - [ - "7995.7", - "41", - "0", - "2" - ], - [ - "7995.69", - "1", - "0", - "1" - ], - [ - "7995.62", - "1", - "0", - "1" - ], - [ - "7995.12", - "25", - "0", - "1" - ], - [ - "7995.04", - "0", - "0", - "0" - ], - [ - "7994.65", - "0", - "0", - "0" - ], - [ - "7994.43", - "0", - "0", - "0" - ], - [ - "7994.37", - "1", - "0", - "1" - ], - [ - "7994.33", - "0", - "0", - "0" - ], - [ - "7993.95", - "37", - "0", - "2" - ], - [ - "7993.36", - "0", - "0", - "0" - ], - [ - "7993.01", - "5", - "0", - "1" - ], - [ - "7992.81", - "0", - "0", - "0" - ], - [ - "7992.66", - "12", - "0", - "1" - ], - [ - "7992.64", - "23", - "0", - "2" - ], - [ - "7992.41", - "10", - "0", - "1" - ], - [ - "7992.08", - "13", - "0", - "1" - ], - [ - "7991.39", - "8", - "0", - "1" - ], - [ - "7990.73", - "0", - "0", - "0" - ], - [ - "7990.46", - "0", - "0", - "0" - ], - [ - "7989.75", - "10", - "0", - "1" - ], - [ - "7989.68", - "45", - "0", - "2" - ], - [ - "7989.52", - "1", - "0", - "1" - ], - [ - "7989.49", - "1", - "0", - "1" - ], - [ - "7989.13", - "10", - "0", - "1" - ], - [ - "7988.6", - "0", - "0", - "0" - ], - [ - "7988.26", - "0", - "0", - "0" - ], - [ - "7988.23", - "0", - "0", - "0" - ], - [ - "7987.84", - "10", - "0", - "1" - ], - [ - "7987.15", - "0", - "0", - "0" - ], - [ - "7986.46", - "60", - "0", - "2" - ], - [ - "7984.75", - "0", - "0", - "0" - ], - [ - "7983.26", - "20", - "0", - "1" - ], - [ - "7981.17", - "0", - "0", - "0" - ], - [ - "7981.08", - "0", - "0", - "0" - ], - [ - "7981", - "0", - "0", - "0" - ], - [ - "7980", - "0", - "0", - "0" - ], - [ - "7979.98", - "0", - "0", - "0" - ] - ], - "timestamp":"2019-05-21T03:25:43.764Z", - "checksum":982847349 - } - ] -} \ No newline at end of file From 844da978384e83667e35673c0f3f2b0f0e517b65 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Tue, 21 May 2019 12:42:08 +0800 Subject: [PATCH 80/97] okex npe bug --- .../xchangestream/service/netty/JsonNettyStreamingService.java | 3 +-- .../info/bitrich/xchangestream/okex/OkexStreamingService.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java index d21d489bb..9600f4f2d 100644 --- a/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java +++ b/service-netty/src/main/java/info/bitrich/xchangestream/service/netty/JsonNettyStreamingService.java @@ -43,8 +43,7 @@ public void messageHandler(String message) { handleMessage(jsonNode); } } catch (Exception exception) { - LOG.error("Error while handling message: {}", message); - LOG.trace("Traceback", message); + LOG.error("Error while handling message: {}, exception: {}", message, exception); } } } diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index bb2d171f4..5531eaad5 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -65,7 +65,7 @@ public String getUnsubscribeMessage(String channelName) throws IOException { @Override protected void handleMessage(JsonNode message) { - if ("error".equals(message.get("event").asText())) { + if (message.has("event") && "error".equals(message.get("event").asText())) { LOG.error("Error Message Received: {}", message); return; } From b59683b68f6709c6ccb9b11869a43527432cecac Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Tue, 21 May 2019 17:30:42 +0800 Subject: [PATCH 81/97] bitmex login and get order property --- .../bitmex/BitmexStreamingService.java | 19 +++++--- .../xchangestream/bitmex/dto/BitmexOrder.java | 44 +++++++++++++++++++ 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java index a63d442ba..c43f34b08 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java @@ -27,7 +27,7 @@ */ public class BitmexStreamingService extends JsonNettyStreamingService { private static final Logger LOG = LoggerFactory.getLogger(BitmexStreamingService.class); - protected final ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper = new ObjectMapper(); private List> delayEmitters = new LinkedList<>(); protected ExchangeSpecification exchangeSpecification; @@ -55,6 +55,7 @@ private void login() throws JsonProcessingException { cmd.put("op", "authKey"); cmd.put("args", args); this.sendMessage(mapper.writeValueAsString(cmd)); + } @Override @@ -116,11 +117,6 @@ protected void handleMessage(JsonNode message) { super.handleMessage(message); } - @Override - protected WebSocketClientExtensionHandler getWebSocketClientExtensionHandler() { - return null; - } - public Observable subscribeBitmexChannel(String channelName) { return subscribeChannel(channelName).map(s -> { BitmexWebSocketTransaction transaction = mapper.readValue(s.toString(), BitmexWebSocketTransaction.class); @@ -131,8 +127,11 @@ public Observable subscribeBitmexChannel(String chan @Override protected String getChannelNameFromMessage(JsonNode message) throws IOException { - String instrument = message.get("data").get(0).get("symbol").asText(); String table = message.get("table").asText(); + if (table.equals("order") || table.equals("funding") || table.equals("position")) { + return table; + } + String instrument = message.get("data").get(0).get("symbol").asText(); return String.format("%s:%s", table, instrument); } @@ -150,8 +149,14 @@ public String getUnsubscribeMessage(String channelName) throws IOException { return objectMapper.writeValueAsString(subscribeMessage); } + @Override + protected WebSocketClientExtensionHandler getWebSocketClientExtensionHandler() { + return null; + } + public void addDelayEmitter(ObservableEmitter delayEmitter) { delayEmitters.add(delayEmitter); } + } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java index e4d27b47f..ce115a427 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrder.java @@ -121,4 +121,48 @@ public Order toOrder() { return ((LimitOrder.Builder) order).build(); } } + + public String getOrderID() { + return orderID; + } + + public int getAccount() { + return account; + } + + public String getSide() { + return side; + } + + public BigDecimal getPrice() { + return price; + } + + public BigDecimal getAvgPx() { + return avgPx; + } + + public String getOrdType() { + return ordType; + } + + public OrderStatus getOrdStatus() { + return ordStatus; + } + + public String getClOrdID() { + return clOrdID; + } + + public BigDecimal getOrderQty() { + return orderQty; + } + + public BigDecimal getCumQty() { + return cumQty; + } + + public boolean isWorkingIndicator() { + return workingIndicator; + } } From d226ceeaa9642c1b7393a5e0495b8b359f86a9b2 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Tue, 21 May 2019 17:39:36 +0800 Subject: [PATCH 82/97] bitmex funding --- .../BitmexStreamingMarketDataService.java | 10 ++++--- .../bitmex/dto/BitmexFunding.java | 28 +++++++++++++++++++ .../dto/BitmexWebSocketTransaction.java | 10 +++++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexFunding.java diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index 5dab9b67d..dce1d846d 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -1,9 +1,6 @@ package info.bitrich.xchangestream.bitmex; -import info.bitrich.xchangestream.bitmex.dto.BitmexLimitOrder; -import info.bitrich.xchangestream.bitmex.dto.BitmexOrderbook; -import info.bitrich.xchangestream.bitmex.dto.BitmexTicker; -import info.bitrich.xchangestream.bitmex.dto.BitmexTrade; +import info.bitrich.xchangestream.bitmex.dto.*; import info.bitrich.xchangestream.core.StreamingMarketDataService; import io.reactivex.Observable; import org.knowm.xchange.bitmex.BitmexExchange; @@ -100,4 +97,9 @@ public Observable getTrades(CurrencyPair currencyPair, Object... args) { }); } + public Observable getFunding() { + String channelName = "funding"; + return streamingService.subscribeBitmexChannel(channelName).map(BitmexWebSocketTransaction::toBitmexFunding); + } + } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexFunding.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexFunding.java new file mode 100644 index 000000000..b5068f239 --- /dev/null +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexFunding.java @@ -0,0 +1,28 @@ +package info.bitrich.xchangestream.bitmex.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class BitmexFunding extends BitmexMarketDataEvent { + + private double fundingRate; + + private double fundingRateDaily; + + public BitmexFunding(@JsonProperty("symbol") String symbol, + @JsonProperty("timestamp") String timestamp, + @JsonProperty("fundingRate") double fundingRate, + @JsonProperty("fundingRateDaily") double fundingRateDaily) { + super(symbol, timestamp); + this.fundingRate = fundingRate; + this.fundingRateDaily = fundingRateDaily; + } + + public double getFundingRate() { + return fundingRate; + } + + public double getFundingRateDaily() { + return fundingRateDaily; + } + +} diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java index d0a4b0a4c..a2d172d1b 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexWebSocketTransaction.java @@ -83,6 +83,16 @@ public BitmexOrder[] toBitmexOrders() { return orders; } + public BitmexFunding toBitmexFunding() { + BitmexFunding funding = null; + try { + funding = this.mapper.readValue(this.data.get(0).toString(), BitmexFunding.class); + } catch (IOException var5) { + var5.printStackTrace(); + } + return funding; + } + public String getTable() { return table; } From 56557c19b7b9eadced62f435d89c97c27328ae66 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Tue, 21 May 2019 19:46:10 +0800 Subject: [PATCH 83/97] okex v3 authenticate --- .../xchangestream/okex/OkexAuthenticator.java | 23 +++++++++++++++++++ .../okex/OkexStreamingExchange.java | 1 + .../okex/OkexStreamingService.java | 21 ++++++++++++++++- .../okex/dto/RequestMessage.java | 5 ++++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexAuthenticator.java diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexAuthenticator.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexAuthenticator.java new file mode 100644 index 000000000..140b9523c --- /dev/null +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexAuthenticator.java @@ -0,0 +1,23 @@ +package info.bitrich.xchangestream.okex; + +import info.bitrich.xchangestream.okex.dto.RequestMessage; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; + +public class OkexAuthenticator { + + public static RequestMessage authenticateMessage(String apiKey, String apiSecret, String passphrase) throws NoSuchAlgorithmException, InvalidKeyException { + String timestamp = String.format("%.3f", (double)System.currentTimeMillis() / 1000); + String message = timestamp + "GET/users/self/verify"; + Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKey = new SecretKeySpec(apiSecret.getBytes(), "HmacSHA256"); + sha256_HMAC.init(secretKey); + String sign = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes())); + return new RequestMessage(RequestMessage.Operation.LOGIN, apiKey, passphrase, timestamp, sign); + } + +} diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java index ce6928bd7..6e1fb62cd 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java @@ -25,6 +25,7 @@ protected OkexStreamingExchange(OkexStreamingService streamingService) { @Override protected void initServices() { super.initServices(); + streamingService.setExchangeSpecification(this.exchangeSpecification); streamingMarketDataService = new OkexStreamingMarketDataService(streamingService); } diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index 5531eaad5..13f5a3dcc 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -14,10 +14,13 @@ import io.reactivex.Completable; import io.reactivex.CompletableSource; import io.reactivex.ObservableEmitter; +import org.knowm.xchange.ExchangeSpecification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @@ -30,17 +33,33 @@ public class OkexStreamingService extends JsonNettyStreamingService { private final ObjectMapper objectMapper = new ObjectMapper(); private List> delayEmitters = new LinkedList<>(); + protected ExchangeSpecification exchangeSpecification; + public OkexStreamingService(String apiUrl) { super(apiUrl); } + public void setExchangeSpecification(ExchangeSpecification exchangeSpecification) { + this.exchangeSpecification = exchangeSpecification; + } + @Override public Completable connect() { Completable conn = super.connect(); + if (this.exchangeSpecification.getApiKey() == null) { + return conn; + } return conn.andThen((CompletableSource) (completable) -> { try { + String apiKey = exchangeSpecification.getApiKey(); + String apiSecret = exchangeSpecification.getSecretKey(); + String passphrase = exchangeSpecification.getPassword(); + if (passphrase == null) { + passphrase = exchangeSpecification.getExchangeSpecificParametersItem("passphrase").toString(); + } + sendMessage(objectMapper.writeValueAsString(OkexAuthenticator.authenticateMessage(apiKey, apiSecret, passphrase))); completable.onComplete(); - } catch (Exception e) { + } catch (IOException | NoSuchAlgorithmException | InvalidKeyException e) { completable.onError(e); } }); diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java index 971269fa4..1c0386954 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/dto/RequestMessage.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonValue; +import java.util.Arrays; import java.util.List; public class RequestMessage { @@ -26,6 +27,10 @@ public RequestMessage(@JsonProperty("op") Operation op, @JsonProperty("args") Li this.args = args; } + public RequestMessage(Operation op, String... args) { + this(op, Arrays.asList(args)); + } + public Operation getOp() { return op; } From 0979201e456f28d5bf32673aa5ea692cafefa370 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Wed, 22 May 2019 15:00:12 +0800 Subject: [PATCH 84/97] default get passphrase --- .../bitrich/xchangestream/okex/OkexStreamingService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index 13f5a3dcc..8d5bf75ac 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -53,8 +53,10 @@ public Completable connect() { try { String apiKey = exchangeSpecification.getApiKey(); String apiSecret = exchangeSpecification.getSecretKey(); - String passphrase = exchangeSpecification.getPassword(); - if (passphrase == null) { + String passphrase; + if (exchangeSpecification.getExchangeSpecificParametersItem("passphrase") == null) { + passphrase = exchangeSpecification.getPassword(); + } else { passphrase = exchangeSpecification.getExchangeSpecificParametersItem("passphrase").toString(); } sendMessage(objectMapper.writeValueAsString(OkexAuthenticator.authenticateMessage(apiKey, apiSecret, passphrase))); From da1516779a4cb5e0b4bd893e182d15ba5948de65 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Wed, 22 May 2019 16:56:30 +0800 Subject: [PATCH 85/97] inherent XChange okex-v3 --- .../okex/OkexStreamingExchange.java | 6 +-- .../okex/OkexStreamingMarketDataService.java | 39 ++++--------------- .../okex/OkexStreamingService.java | 4 +- 3 files changed, 13 insertions(+), 36 deletions(-) diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java index 6e1fb62cd..ee14df616 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java @@ -6,9 +6,9 @@ import io.netty.channel.ChannelHandlerContext; import io.reactivex.Completable; import io.reactivex.Observable; -import org.knowm.xchange.okcoin.OkCoinExchange; +import org.knowm.xchange.okex.v3.OkexExchange; -public class OkexStreamingExchange extends OkCoinExchange implements StreamingExchange { +public class OkexStreamingExchange extends OkexExchange implements StreamingExchange { private static final String API_URI = "wss://real.okex.com:10442/ws/v3"; protected final OkexStreamingService streamingService; @@ -26,7 +26,7 @@ protected OkexStreamingExchange(OkexStreamingService streamingService) { protected void initServices() { super.initServices(); streamingService.setExchangeSpecification(this.exchangeSpecification); - streamingMarketDataService = new OkexStreamingMarketDataService(streamingService); + streamingMarketDataService = new OkexStreamingMarketDataService(streamingService, exchange); } @Override diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java index 3f7368099..41a641711 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingMarketDataService.java @@ -6,22 +6,16 @@ import info.bitrich.xchangestream.core.StreamingMarketDataService; import info.bitrich.xchangestream.okex.dto.OkCoinOrderbook; import io.reactivex.Observable; -import org.knowm.xchange.Exchange; -import org.knowm.xchange.ExchangeFactory; -import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.Order; import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Ticker; import org.knowm.xchange.dto.marketdata.Trade; -import org.knowm.xchange.exceptions.ExchangeException; import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; import org.knowm.xchange.okcoin.FuturesContract; import org.knowm.xchange.okcoin.OkCoinAdapters; import org.knowm.xchange.okcoin.dto.marketdata.OkCoinDepth; -import org.knowm.xchange.okex.v3.OkexExchange; -import org.knowm.xchange.okex.v3.dto.marketdata.FuturesInstrument; -import org.knowm.xchange.okex.v3.service.OkexFuturesMarketDataServiceRaw; +import org.knowm.xchange.okex.v3.OkexFuturesPrompt; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,39 +30,22 @@ public class OkexStreamingMarketDataService implements StreamingMarketDataServic private final Logger LOG = LoggerFactory.getLogger(OkexStreamingMarketDataService.class); private final OkexStreamingService service; - private final Exchange okexFuturesExchange; - private final FuturesInstrument[] futuresInstruments; - + private final OkexStreamingExchange exchange; private final ObjectMapper mapper = new ObjectMapper(); private final Map orderbooks = new HashMap<>(); - OkexStreamingMarketDataService(OkexStreamingService service) { + OkexStreamingMarketDataService(OkexStreamingService service, OkexStreamingExchange exchange) { this.service = service; + this.exchange = exchange; mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - ExchangeSpecification specification = new ExchangeSpecification(OkexExchange.class); - specification.setExchangeSpecificParametersItem("Use_Futures", true); - okexFuturesExchange = ExchangeFactory.INSTANCE.createExchange(specification); - futuresInstruments = ((OkexFuturesMarketDataServiceRaw) okexFuturesExchange.getMarketDataService()).getInstruments(); } @Override public Observable getOrderBook(CurrencyPair currencyPair, Object... args) { - if (args.length > 0 && args[0] instanceof FuturesContract) { - FuturesContract contract = (FuturesContract) args[0]; - String instId = null; - for (FuturesInstrument instrument : futuresInstruments) { - if (instrument.getUnderlyingIndex().toUpperCase().equals(currencyPair.base.toString().toUpperCase()) - && instrument.getQuoteCurrency().toUpperCase().equals(currencyPair.counter.toString().toUpperCase()) - && instrument.getAlias().equals(contract.getName())) { - instId = instrument.getInstrumentId(); - break; - } - } - if (instId == null) { - throw new ExchangeException("No such futures contract"); - } - final String instrumentId = instId; - String channel = "futures/depth:" + instId; + if (args.length > 0 && args[0] instanceof OkexFuturesPrompt) { + OkexFuturesPrompt contract = (OkexFuturesPrompt) args[0]; + final String instrumentId = exchange.determineFuturesInstrumentId(currencyPair, contract); + String channel = "futures/depth:" + instrumentId; return this.service.subscribeChannel(channel).map((s) -> { OkCoinOrderbook okCoinOrderbook; for (JsonNode data : s.get("data")) { diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index 8d5bf75ac..26e069b4a 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -54,10 +54,10 @@ public Completable connect() { String apiKey = exchangeSpecification.getApiKey(); String apiSecret = exchangeSpecification.getSecretKey(); String passphrase; - if (exchangeSpecification.getExchangeSpecificParametersItem("passphrase") == null) { + if (exchangeSpecification.getExchangeSpecificParametersItem("Passphrase") == null) { passphrase = exchangeSpecification.getPassword(); } else { - passphrase = exchangeSpecification.getExchangeSpecificParametersItem("passphrase").toString(); + passphrase = exchangeSpecification.getExchangeSpecificParametersItem("Passphrase").toString(); } sendMessage(objectMapper.writeValueAsString(OkexAuthenticator.authenticateMessage(apiKey, apiSecret, passphrase))); completable.onComplete(); From 5c5fb407efe370a571ab56c0a05340311a28cd7e Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Wed, 22 May 2019 17:04:22 +0800 Subject: [PATCH 86/97] bug fix --- .../info/bitrich/xchangestream/okex/OkexStreamingExchange.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java index ee14df616..6b7c0ee71 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingExchange.java @@ -26,7 +26,7 @@ protected OkexStreamingExchange(OkexStreamingService streamingService) { protected void initServices() { super.initServices(); streamingService.setExchangeSpecification(this.exchangeSpecification); - streamingMarketDataService = new OkexStreamingMarketDataService(streamingService, exchange); + streamingMarketDataService = new OkexStreamingMarketDataService(streamingService, this); } @Override From 206ad2a78f068024190ede6b2c7de3876b598ba1 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Wed, 22 May 2019 20:17:52 +0800 Subject: [PATCH 87/97] login waiting done --- .../okex/OkexStreamingService.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index 26e069b4a..8d22c24c6 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -24,6 +24,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.zip.Inflater; public class OkexStreamingService extends JsonNettyStreamingService { @@ -31,10 +32,13 @@ public class OkexStreamingService extends JsonNettyStreamingService { private final Logger LOG = LoggerFactory.getLogger(OkexStreamingService.class); private final ObjectMapper objectMapper = new ObjectMapper(); + private List> delayEmitters = new LinkedList<>(); protected ExchangeSpecification exchangeSpecification; + private ConcurrentHashMap eventResponse = new ConcurrentHashMap<>(); + public OkexStreamingService(String apiUrl) { super(apiUrl); } @@ -60,7 +64,19 @@ public Completable connect() { passphrase = exchangeSpecification.getExchangeSpecificParametersItem("Passphrase").toString(); } sendMessage(objectMapper.writeValueAsString(OkexAuthenticator.authenticateMessage(apiKey, apiSecret, passphrase))); - completable.onComplete(); + eventResponse.remove("error"); + eventResponse.remove("login"); + while (!eventResponse.containsKey("error") && !eventResponse.containsKey("login")) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + } + } + if (eventResponse.containsKey("login")) { + completable.onComplete(); + } else { + completable.onError(new Exception(eventResponse.get("error").asText())); + } } catch (IOException | NoSuchAlgorithmException | InvalidKeyException e) { completable.onError(e); } @@ -86,9 +102,12 @@ public String getUnsubscribeMessage(String channelName) throws IOException { @Override protected void handleMessage(JsonNode message) { - if (message.has("event") && "error".equals(message.get("event").asText())) { - LOG.error("Error Message Received: {}", message); - return; + if (message.has("event")) { + eventResponse.put(message.get("event").asText(), message); + if ("error".equals(message.get("event").asText())) { + LOG.error("Error Message Received: {}", message); + return; + } } if (message.get("table") != null && message.get("data") != null) { String table = message.get("table").asText(); From 6c491114873478120e2220c0e8c8032ed06ef233 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Wed, 22 May 2019 20:19:43 +0800 Subject: [PATCH 88/97] bug fix --- .../info/bitrich/xchangestream/okex/OkexStreamingService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index 8d22c24c6..8ff8b77cc 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -63,9 +63,9 @@ public Completable connect() { } else { passphrase = exchangeSpecification.getExchangeSpecificParametersItem("Passphrase").toString(); } - sendMessage(objectMapper.writeValueAsString(OkexAuthenticator.authenticateMessage(apiKey, apiSecret, passphrase))); eventResponse.remove("error"); eventResponse.remove("login"); + sendMessage(objectMapper.writeValueAsString(OkexAuthenticator.authenticateMessage(apiKey, apiSecret, passphrase))); while (!eventResponse.containsKey("error") && !eventResponse.containsKey("login")) { try { Thread.sleep(1); From a2ea2b81cdff5005fdb1dd3cedbba2cee9596a92 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Wed, 22 May 2019 20:35:43 +0800 Subject: [PATCH 89/97] login fix, need heartbeat now --- .../okex/OkexStreamingService.java | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index 8ff8b77cc..cc6bf6e5f 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -24,7 +24,6 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; import java.util.zip.Inflater; public class OkexStreamingService extends JsonNettyStreamingService { @@ -37,8 +36,6 @@ public class OkexStreamingService extends JsonNettyStreamingService { protected ExchangeSpecification exchangeSpecification; - private ConcurrentHashMap eventResponse = new ConcurrentHashMap<>(); - public OkexStreamingService(String apiUrl) { super(apiUrl); } @@ -63,20 +60,12 @@ public Completable connect() { } else { passphrase = exchangeSpecification.getExchangeSpecificParametersItem("Passphrase").toString(); } - eventResponse.remove("error"); - eventResponse.remove("login"); sendMessage(objectMapper.writeValueAsString(OkexAuthenticator.authenticateMessage(apiKey, apiSecret, passphrase))); - while (!eventResponse.containsKey("error") && !eventResponse.containsKey("login")) { - try { - Thread.sleep(1); - } catch (InterruptedException e) { - } - } - if (eventResponse.containsKey("login")) { - completable.onComplete(); - } else { - completable.onError(new Exception(eventResponse.get("error").asText())); + try { + Thread.sleep(100); + } catch (InterruptedException e) { } + completable.onComplete(); } catch (IOException | NoSuchAlgorithmException | InvalidKeyException e) { completable.onError(e); } @@ -103,11 +92,11 @@ public String getUnsubscribeMessage(String channelName) throws IOException { @Override protected void handleMessage(JsonNode message) { if (message.has("event")) { - eventResponse.put(message.get("event").asText(), message); if ("error".equals(message.get("event").asText())) { LOG.error("Error Message Received: {}", message); return; } + LOG.info("Event Message: {}", message); } if (message.get("table") != null && message.get("data") != null) { String table = message.get("table").asText(); From 39aa6868ba8d513e1665d43363fa6e26ee90ef56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=94?= Date: Wed, 22 May 2019 22:50:12 +0800 Subject: [PATCH 90/97] okex pingpong, bitmex perpetual null --- .../BitmexStreamingMarketDataService.java | 2 +- .../okex/OkexStreamingService.java | 55 ++++++++++++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index dce1d846d..c5a417132 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -32,7 +32,7 @@ public BitmexStreamingMarketDataService(BitmexStreamingService streamingService, } private String getBitmexSymbol(CurrencyPair currencyPair, Object... args) { - if (args.length > 0) { + if (args.length > 0 && args[0] != null) { BitmexPrompt prompt = (BitmexPrompt) args[0]; currencyPair = bitmexExchange.determineActiveContract(currencyPair.base.toString(), currencyPair.counter.toString(), prompt); } diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index cc6bf6e5f..cc0c85151 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -2,8 +2,9 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeType; import info.bitrich.xchangestream.okex.dto.RequestMessage; -import info.bitrich.xchangestream.service.netty.JsonNettyStreamingService; +import info.bitrich.xchangestream.service.netty.NettyStreamingService; import info.bitrich.xchangestream.service.netty.WebSocketClientHandler; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufInputStream; @@ -13,7 +14,9 @@ import io.netty.handler.codec.http.websocketx.WebSocketFrame; import io.reactivex.Completable; import io.reactivex.CompletableSource; +import io.reactivex.Observable; import io.reactivex.ObservableEmitter; +import io.reactivex.disposables.Disposable; import org.knowm.xchange.ExchangeSpecification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,12 +27,17 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.zip.Inflater; -public class OkexStreamingService extends JsonNettyStreamingService { +public class OkexStreamingService extends NettyStreamingService { private final Logger LOG = LoggerFactory.getLogger(OkexStreamingService.class); + private io.reactivex.Observable pingPongSrc = Observable.interval(15, 15, TimeUnit.SECONDS); + + private Disposable pingPongSubscription; + private final ObjectMapper objectMapper = new ObjectMapper(); private List> delayEmitters = new LinkedList<>(); @@ -52,6 +60,7 @@ public Completable connect() { } return conn.andThen((CompletableSource) (completable) -> { try { + // login String apiKey = exchangeSpecification.getApiKey(); String apiSecret = exchangeSpecification.getSecretKey(); String passphrase; @@ -61,6 +70,13 @@ public Completable connect() { passphrase = exchangeSpecification.getExchangeSpecificParametersItem("Passphrase").toString(); } sendMessage(objectMapper.writeValueAsString(OkexAuthenticator.authenticateMessage(apiKey, apiSecret, passphrase))); + // ping pong + if (pingPongSubscription != null && !pingPongSubscription.isDisposed()) { + pingPongSubscription.dispose(); + } + pingPongSubscription = pingPongSrc.subscribe(o -> { + this.sendMessage("ping"); + }); try { Thread.sleep(100); } catch (InterruptedException e) { @@ -89,9 +105,44 @@ public String getUnsubscribeMessage(String channelName) throws IOException { return objectMapper.writeValueAsString(requestMessage); } + @Override + public void messageHandler(String message) { + try { + LOG.debug("Received message: {}", message); + if ("pong".equals(message)) { + // just ignore pong now + return; + } + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode; + + // Parse incoming message to JSON + try { + jsonNode = objectMapper.readTree(message); + } catch (IOException e) { + LOG.error("Error parsing incoming message to JSON: {}", message); + return; + } + + // In case of array - handle every message separately. + if (jsonNode.getNodeType().equals(JsonNodeType.ARRAY)) { + for (JsonNode node : jsonNode) { + handleMessage(node); + } + } else { + handleMessage(jsonNode); + } + } catch (Exception exception) { + LOG.error("Error while handling message: {}, exception: {}", message, exception); + } + } + @Override protected void handleMessage(JsonNode message) { if (message.has("event")) { + if ("pong".equals(message.get("event").asText())) { + return; + } if ("error".equals(message.get("event").asText())) { LOG.error("Error Message Received: {}", message); return; From 9e57ff127b787e62d8f7fcc42345617aeb779784 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Thu, 23 May 2019 09:57:01 +0800 Subject: [PATCH 91/97] okex pingpong without apikey set --- .../xchangestream/okex/OkexStreamingService.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index cc0c85151..99d455385 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -54,7 +54,12 @@ public void setExchangeSpecification(ExchangeSpecification exchangeSpecification @Override public Completable connect() { - Completable conn = super.connect(); + if (pingPongSubscription != null && !pingPongSubscription.isDisposed()) { + pingPongSubscription.dispose(); + } + Completable conn = super.connect().andThen((CompletableSource) (completable) -> { + pingPongSubscription = pingPongSrc.subscribe(o -> this.sendMessage("ping")); + }); if (this.exchangeSpecification.getApiKey() == null) { return conn; } @@ -70,13 +75,6 @@ public Completable connect() { passphrase = exchangeSpecification.getExchangeSpecificParametersItem("Passphrase").toString(); } sendMessage(objectMapper.writeValueAsString(OkexAuthenticator.authenticateMessage(apiKey, apiSecret, passphrase))); - // ping pong - if (pingPongSubscription != null && !pingPongSubscription.isDisposed()) { - pingPongSubscription.dispose(); - } - pingPongSubscription = pingPongSrc.subscribe(o -> { - this.sendMessage("ping"); - }); try { Thread.sleep(100); } catch (InterruptedException e) { From 8b8953ba3dcd072eb6773747c420918d71fd6074 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Thu, 23 May 2019 10:05:23 +0800 Subject: [PATCH 92/97] okex streaming service bug fix --- .../info/bitrich/xchangestream/okex/OkexStreamingService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java index 99d455385..2e79e8bfc 100644 --- a/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java +++ b/xchange-okex-v3/src/main/java/info/bitrich/xchangestream/okex/OkexStreamingService.java @@ -59,6 +59,7 @@ public Completable connect() { } Completable conn = super.connect().andThen((CompletableSource) (completable) -> { pingPongSubscription = pingPongSrc.subscribe(o -> this.sendMessage("ping")); + completable.onComplete(); }); if (this.exchangeSpecification.getApiKey() == null) { return conn; From 32a7b6f02bed357c9fc5620f8da42cac180da64a Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Mon, 27 May 2019 20:25:09 +0800 Subject: [PATCH 93/97] catch price==null --- .../info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java index 2722fc19a..a8dacfe56 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java @@ -57,6 +57,9 @@ public void updateLevel(BitmexLimitOrder level, String action) { boolean shouldDelete = action.equals("delete"); String id = level.getId(); BigDecimal price = orderBookSideIds.get(id); + if (price == null) { + return; + } orderBookSide.remove(price); orderBookSideIds.remove(id); if (!shouldDelete) { From 307d79ad594efe9d8e1f6aa0e02c748ba421b8f5 Mon Sep 17 00:00:00 2001 From: Ye Chen Date: Mon, 27 May 2019 20:35:06 +0800 Subject: [PATCH 94/97] not catch npe --- .../info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java index a8dacfe56..2722fc19a 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/dto/BitmexOrderbook.java @@ -57,9 +57,6 @@ public void updateLevel(BitmexLimitOrder level, String action) { boolean shouldDelete = action.equals("delete"); String id = level.getId(); BigDecimal price = orderBookSideIds.get(id); - if (price == null) { - return; - } orderBookSide.remove(price); orderBookSideIds.remove(id); if (!shouldDelete) { From 7bd3c0a1115491ffa02090f3aba71cd5f3efae79 Mon Sep 17 00:00:00 2001 From: Henry Wong Date: Sun, 9 Jun 2019 00:41:33 +0800 Subject: [PATCH 95/97] Bugfix and fix all the test cases --- .../bitmex/BitmexStreamingService.java | 22 +++------------- .../bitmex/BitmexAuthenticatedExample.java | 4 +-- .../bitmex/BitmexDeadManSwitchTest.java | 16 +++++++----- .../bitmex/BitmexManualExample.java | 22 ++++++++-------- .../xchangestream/bitmex/BitmexOrderIT.java | 24 +++++++---------- .../bitmex/BitmexOrderReplaceTest.java | 26 +++++++++++++------ .../bitmex/BitmexTestsCommons.java | 2 +- 7 files changed, 56 insertions(+), 60 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java index 76c5448da..aba841a42 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingService.java @@ -16,7 +16,6 @@ import io.reactivex.ObservableEmitter; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; -import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.bitmex.service.BitmexDigest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,8 +35,6 @@ public class BitmexStreamingService extends JsonNettyStreamingService { private final ObjectMapper mapper = new ObjectMapper(); private List> delayEmitters = new LinkedList<>(); - protected ExchangeSpecification exchangeSpecification; - private final String apiKey; private final String secretKey; @@ -55,16 +52,10 @@ public BitmexStreamingService(String apiUrl, String apiKey, String secretKey) { this.secretKey = secretKey; } - public void setExchangeSpecification(ExchangeSpecification exchangeSpecification) { - this.exchangeSpecification = exchangeSpecification; - } - private void login() throws JsonProcessingException { long expires = System.currentTimeMillis() + 30; - String apiKey = this.exchangeSpecification.getApiKey(); - String apiSecret = this.exchangeSpecification.getSecretKey(); String path = "/realtime"; - String signature = BitmexAuthenticator.generateSignature(apiSecret, + String signature = BitmexAuthenticator.generateSignature(secretKey, "GET", path, String.valueOf(expires), ""); List args = Arrays.asList(apiKey, expires, signature); @@ -81,7 +72,7 @@ public Completable connect() { // Note that we must override connect method in streaming service instead of streaming exchange, because of the auto reconnect feature of NettyStreamingService. // We must ensure the authentication message is also resend when the connection is rebuilt. Completable conn = super.connect(); - if (this.exchangeSpecification.getApiKey() == null) { + if (apiKey == null) { return conn; } return conn.andThen((CompletableSource) (completable) -> { @@ -218,14 +209,9 @@ public void enableDeadMansSwitch(long rate, long timeout) throws IOException { LOG.warn("You already have Dead Man's switch enabled. Doing nothing"); return; } - final BitmexWebSocketSubscriptionMessage subscriptionMessage = new BitmexWebSocketSubscriptionMessage("cancelAllAfter", new Object[]{DMS_CANCEL_ALL_IN}); + final BitmexWebSocketSubscriptionMessage subscriptionMessage = new BitmexWebSocketSubscriptionMessage("cancelAllAfter", new Object[]{timeout}); String message = objectMapper.writeValueAsString(subscriptionMessage); - dmsDisposable = Schedulers.single().schedulePeriodicallyDirect(new Runnable() { - @Override - public void run() { - sendMessage(message); - } - }, 0, DMS_RESUBSCRIBE, TimeUnit.MILLISECONDS); + dmsDisposable = Schedulers.single().schedulePeriodicallyDirect(() -> sendMessage(message), 0, rate, TimeUnit.MILLISECONDS); Schedulers.single().start(); } diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java index 608923ac4..a52557c9f 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java @@ -21,8 +21,8 @@ public static void main(String[] args) throws Exception { CertHelper.trustAllCerts(); StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); ExchangeSpecification defaultExchangeSpecification = exchange.getDefaultExchangeSpecification(); - defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); - defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); +// defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); +// defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.USE_SANDBOX, true); defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ACCEPT_ALL_CERITICATES, true); diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java index 74b5816b9..b904d4dde 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java @@ -1,5 +1,6 @@ package info.bitrich.xchangestream.bitmex; +import info.bitrich.xchangestream.bitmex.dto.BitmexLimitOrder; import info.bitrich.xchangestream.core.StreamingExchange; import org.junit.Ignore; import org.junit.Test; @@ -10,7 +11,9 @@ import org.knowm.xchange.bitmex.service.BitmexMarketDataService; import org.knowm.xchange.bitmex.service.BitmexTradeService; import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.Order; import org.knowm.xchange.dto.marketdata.OrderBook; +import org.knowm.xchange.dto.trade.LimitOrder; import org.knowm.xchange.utils.CertHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,12 +42,12 @@ public void testDeadmanSwitch() throws Exception { defaultExchangeSpecification.setApiKey("QW8Ao_gx38e-8KFvDkFn-Ym4"); defaultExchangeSpecification.setSecretKey("tn7rpzvOXSKThZD0f-xXehtydt4OTHZVf42gCCyxPixiiVOb"); - defaultExchangeSpecification.setShouldLoadRemoteMetaData(true); - defaultExchangeSpecification.setProxyHost("localhost"); - defaultExchangeSpecification.setProxyPort(9999); +// defaultExchangeSpecification.setShouldLoadRemoteMetaData(true); +// defaultExchangeSpecification.setProxyHost("localhost"); +// defaultExchangeSpecification.setProxyPort(9999); - defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); - defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); +// defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); +// defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.USE_SANDBOX, true); defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ACCEPT_ALL_CERITICATES, true); @@ -79,7 +82,8 @@ public void testDeadmanSwitch() throws Exception { BigDecimal originalOrderSize = new BigDecimal("300"); // BigDecimal price = new BigDecimal("10000"); BigDecimal price = orderBook.getBids().get(0).getLimitPrice().add(new BigDecimal("100")); - BitmexPrivateOrder xbtusd = tradeService.placeLimitOrder("XBTUSD", originalOrderSize, price, BitmexSide.SELL, nosOrdId, null); + LimitOrder limitOrder = new LimitOrder.Builder(Order.OrderType.ASK, CurrencyPair.XBT_USD).originalAmount(originalOrderSize).limitPrice(price).id(nosOrdId).build(); + String xbtusd = tradeService.placeLimitOrder(limitOrder); logger.info("!!!!!PRIVATE_ORDER!!!! {}",xbtusd); Thread.sleep(100000); System.out.println(); diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java index 5c4815b47..79f18d964 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java @@ -44,19 +44,19 @@ public static void main(String[] args) { .subscribe(trade -> LOG.info("TRADE: {}", trade), throwable -> LOG.error("ERROR in getting trades: ", throwable)); - // Quarterly Contract - streamingMarketDataService.getOrderBook(xbtUsd, BitmexPrompt.QUARTERLY).subscribe(orderBook -> { - LOG.info("Quarterly Contract First ask: {}", orderBook.getAsks().get(0)); - LOG.info("Quarterly Contract First bid: {}", orderBook.getBids().get(0)); - }, throwable -> LOG.error("ERROR in getting Quarterly Contract order book: ", throwable)); + // BIQUARTERLY Contract + streamingMarketDataService.getOrderBook(xbtUsd, BitmexPrompt.BIQUARTERLY).subscribe(orderBook -> { + LOG.info("BIQUARTERLY Contract First ask: {}", orderBook.getAsks().get(0)); + LOG.info("BIQUARTERLY Contract First bid: {}", orderBook.getBids().get(0)); + }, throwable -> LOG.error("ERROR in getting BIQUARTERLY Contract order book: ", throwable)); - streamingMarketDataService.getTicker(xbtUsd, BitmexPrompt.QUARTERLY).subscribe(ticker -> { - LOG.info("Quarterly Contract TICKER: {}", ticker); - }, throwable -> LOG.error("ERROR in getting Quarterly Contract ticker: ", throwable)); + streamingMarketDataService.getTicker(xbtUsd, BitmexPrompt.BIQUARTERLY).subscribe(ticker -> { + LOG.info("BIQUARTERLY Contract TICKER: {}", ticker); + }, throwable -> LOG.error("ERROR in getting BIQUARTERLY Contract ticker: ", throwable)); - exchange.getStreamingMarketDataService().getTrades(xbtUsd, BitmexPrompt.QUARTERLY) - .subscribe(trade -> LOG.info("Quarterly Contract TRADE: {}", trade), - throwable -> LOG.error("ERROR in getting Quarterly Contract trades: ", throwable)); + exchange.getStreamingMarketDataService().getTrades(xbtUsd, BitmexPrompt.BIQUARTERLY) + .subscribe(trade -> LOG.info("BIQUARTERLY Contract TRADE: {}", trade), + throwable -> LOG.error("ERROR in getting BIQUARTERLY Contract trades: ", throwable)); try { Thread.sleep(100000); diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java index b76b6a73f..a93f789d4 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java @@ -11,6 +11,7 @@ import org.junit.Before; import org.junit.Test; import org.knowm.xchange.bitmex.dto.marketdata.BitmexPrivateOrder; +import org.knowm.xchange.bitmex.dto.trade.BitmexReplaceOrderParameters; import org.knowm.xchange.bitmex.dto.trade.BitmexSide; import org.knowm.xchange.bitmex.service.BitmexMarketDataService; import org.knowm.xchange.bitmex.service.BitmexTradeService; @@ -69,13 +70,8 @@ public void setup() throws IOException { LOG.info("Got best ask = {}, best bid = {}", topPriceAsk, topPriceBid); Assert.assertTrue("Got empty order book", topPriceAsk != null || topPriceBid != null); - if (topPriceAsk != null) { - testAskPrice = topPriceAsk.add(priceShift); - testBidPrice = topPriceAsk.subtract(priceShift); - } else { - testAskPrice = topPriceBid.add(priceShift); - testBidPrice = topPriceBid.subtract(priceShift); - } + testAskPrice = topPriceAsk; + testBidPrice = topPriceBid; tradeService = (BitmexTradeService) exchange.getTradeService(); } @@ -151,14 +147,14 @@ public void shouldReplaceOrder() throws Exception { String orderId = placeLimitOrder(clOrdId, testAskPrice, "10", Order.OrderType.ASK); final String replaceId = clOrdId + "replace"; + BitmexReplaceOrderParameters params = new BitmexReplaceOrderParameters.Builder() + .setOrderQuantity(new BigDecimal("5")) + .setOrderId(orderId) + .setOrigClOrdId(clOrdId) + .setClOrdId(replaceId) + .build(); BitmexPrivateOrder bitmexPrivateOrder = - tradeService.replaceLimitOrder( - "XBTUSD", - new BigDecimal("5"), - null, - orderId, - replaceId, - clOrdId); + tradeService.replaceOrder(params); LOG.info("Order was replaced = {}", bitmexPrivateOrder); checkPrivateOrder(orderId, testAskPrice, "5", BitmexSide.SELL, bitmexPrivateOrder); diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java index 8d0e8367b..1a4ad61fe 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java @@ -6,11 +6,14 @@ import org.knowm.xchange.ExchangeFactory; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.bitmex.dto.marketdata.BitmexPrivateOrder; +import org.knowm.xchange.bitmex.dto.trade.BitmexReplaceOrderParameters; import org.knowm.xchange.bitmex.dto.trade.BitmexSide; import org.knowm.xchange.bitmex.service.BitmexMarketDataService; import org.knowm.xchange.bitmex.service.BitmexTradeService; import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.dto.Order; import org.knowm.xchange.dto.marketdata.OrderBook; +import org.knowm.xchange.dto.trade.LimitOrder; import org.knowm.xchange.utils.CertHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,12 +42,12 @@ public void testOrderReplace() throws Exception { defaultExchangeSpecification.setApiKey("QW8Ao_gx38e-8KFvDkFn-Ym4"); defaultExchangeSpecification.setSecretKey("tn7rpzvOXSKThZD0f-xXehtydt4OTHZVf42gCCyxPixiiVOb"); - defaultExchangeSpecification.setShouldLoadRemoteMetaData(true); - defaultExchangeSpecification.setProxyHost("localhost"); - defaultExchangeSpecification.setProxyPort(9999); +// defaultExchangeSpecification.setShouldLoadRemoteMetaData(true); +// defaultExchangeSpecification.setProxyHost("localhost"); +// defaultExchangeSpecification.setProxyPort(9999); - defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); - defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); +// defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_HOST, "localhost"); +// defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.SOCKS_PROXY_PORT, 8889); defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.USE_SANDBOX, true); defaultExchangeSpecification.setExchangeSpecificParametersItem(StreamingExchange.ACCEPT_ALL_CERITICATES, true); @@ -76,7 +79,8 @@ public void testOrderReplace() throws Exception { BigDecimal originalOrderSize = new BigDecimal("300"); // BigDecimal price = new BigDecimal("10000"); BigDecimal price = orderBook.getBids().get(0).getLimitPrice().add(new BigDecimal("100")); - BitmexPrivateOrder xbtusd = tradeService.placeLimitOrder("XBTUSD", originalOrderSize, price, BitmexSide.SELL, nosOrdId, null); + LimitOrder limitOrder = new LimitOrder.Builder(Order.OrderType.ASK, CurrencyPair.XBT_USD).originalAmount(originalOrderSize).limitPrice(price).id(nosOrdId).build(); + String xbtusd = tradeService.placeLimitOrder(limitOrder); logger.info("!!!!!PRIVATE_ORDER!!!! {}",xbtusd); Thread.sleep(5000); System.out.println(); @@ -86,8 +90,14 @@ public void testOrderReplace() throws Exception { logger.info("Replacing"); String replacedOrderId = nosOrdId + "replace"; - BitmexPrivateOrder replaceBPO = tradeService.replaceLimitOrder("XBTUSD", originalOrderSize.divide(BigDecimal.valueOf(2)), price, null, replacedOrderId, nosOrdId); - logger.info("!!!!!PRIVATE_ORDER_REPLACE!!!! {}",xbtusd); + BitmexReplaceOrderParameters params = new BitmexReplaceOrderParameters.Builder() + .setOrderQuantity(originalOrderSize.divide(BigDecimal.valueOf(2))) + .setOrderId(xbtusd) + .setOrigClOrdId(nosOrdId) + .setClOrdId(replacedOrderId) + .build(); + BitmexPrivateOrder replaceBPO = tradeService.replaceOrder(params); +// logger.info("!!!!!PRIVATE_ORDER_REPLACE!!!! {}",xbtusd); Thread.sleep(10000); System.out.println(); System.out.println(); diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTestsCommons.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTestsCommons.java index 3bd1f0fd0..962ca6154 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTestsCommons.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexTestsCommons.java @@ -17,7 +17,7 @@ public static ExchangeSpecification getExchangeSpecification(LocalExchangeConfig defaultExchangeSpecification.setApiKey(localConfig.getApiKey()); defaultExchangeSpecification.setSecretKey(localConfig.getSecretKey()); - defaultExchangeSpecification.setShouldLoadRemoteMetaData(true); +// defaultExchangeSpecification.setShouldLoadRemoteMetaData(true); return defaultExchangeSpecification; } From 6345188576b90144d19c2003d4d4c8b0485e9046 Mon Sep 17 00:00:00 2001 From: Henry Wong Date: Tue, 18 Jun 2019 02:34:24 +0800 Subject: [PATCH 96/97] Update based on code review --- .../BitmexStreamingMarketDataService.java | 21 +++++++------------ .../bitmex/BitmexStreamingTradeService.java | 5 +---- .../bitmex/BitmexAuthenticatedExample.java | 4 +--- .../bitmex/BitmexDeadManSwitchTest.java | 10 +++------ .../bitmex/BitmexManualExample.java | 9 ++++---- .../xchangestream/bitmex/BitmexOrderIT.java | 12 ++++++----- .../bitmex/BitmexOrderReplaceTest.java | 6 +++--- .../core/StreamingTradeService.java | 19 ----------------- 8 files changed, 28 insertions(+), 58 deletions(-) delete mode 100644 xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java index 08d3b401c..2e52ed8af 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingMarketDataService.java @@ -7,7 +7,6 @@ import info.bitrich.xchangestream.service.netty.StreamingObjectMapperHelper; import io.reactivex.Observable; import org.knowm.xchange.bitmex.BitmexExchange; -import org.knowm.xchange.bitmex.BitmexPrompt; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.marketdata.OrderBook; import org.knowm.xchange.dto.marketdata.Ticker; @@ -41,17 +40,13 @@ public BitmexStreamingMarketDataService(BitmexStreamingService streamingService, this.bitmexExchange = bitmexExchange; } - private String getBitmexSymbol(CurrencyPair currencyPair, Object... args) { - if (args.length > 0 && args[0] != null) { - BitmexPrompt prompt = (BitmexPrompt) args[0]; - currencyPair = bitmexExchange.determineActiveContract(currencyPair.base.toString(), currencyPair.counter.toString(), prompt); - } + private String getBitmexSymbol(CurrencyPair currencyPair) { return currencyPair.base.toString() + currencyPair.counter.toString(); } @Override public Observable getOrderBook(CurrencyPair currencyPair, Object... args) { - String instrument = getBitmexSymbol(currencyPair, args); + String instrument = getBitmexSymbol(currencyPair); String channelName = String.format("orderBookL2:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).map(s -> { @@ -74,8 +69,8 @@ public Observable getOrderBook(CurrencyPair currencyPair, Object... a }); } - public Observable getRawTicker(CurrencyPair currencyPair, Object... args) { - String instrument = getBitmexSymbol(currencyPair, args); + public Observable getRawTicker(CurrencyPair currencyPair) { + String instrument = getBitmexSymbol(currencyPair); String channelName = String.format("quote:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).map(s -> s.toBitmexTicker()); @@ -83,7 +78,7 @@ public Observable getRawTicker(CurrencyPair currencyPair, Object.. @Override public Observable getTicker(CurrencyPair currencyPair, Object... args) { - String instrument = getBitmexSymbol(currencyPair, args); + String instrument = getBitmexSymbol(currencyPair); String channelName = String.format("quote:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).map(s -> { @@ -94,7 +89,7 @@ public Observable getTicker(CurrencyPair currencyPair, Object... args) { @Override public Observable getTrades(CurrencyPair currencyPair, Object... args) { - String instrument = getBitmexSymbol(currencyPair, args); + String instrument = getBitmexSymbol(currencyPair); String channelName = String.format("trade:%s", instrument); return streamingService.subscribeBitmexChannel(channelName).flatMapIterable(s -> { @@ -108,7 +103,7 @@ public Observable getTrades(CurrencyPair currencyPair, Object... args) { } - public Observable getExecutions(String symbol) { + public Observable getRawExecutions(String symbol) { return streamingService.subscribeBitmexChannel("execution:" + symbol).flatMapIterable(s -> { JsonNode executions = s.getData(); List bitmexExecutions = new ArrayList<>(executions.size()); @@ -139,7 +134,7 @@ public void disableDeadMansSwitch() throws IOException { streamingService.disableDeadMansSwitch(); } - public Observable getFunding() { + public Observable getRawFunding() { String channelName = "funding"; return streamingService.subscribeBitmexChannel(channelName).map(BitmexWebSocketTransaction::toBitmexFunding); } diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java index de6466241..c6f892dcd 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java @@ -2,7 +2,6 @@ import info.bitrich.xchangestream.bitmex.dto.BitmexOrder; -import info.bitrich.xchangestream.core.StreamingTradeService; import io.reactivex.Observable; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.Order; @@ -15,7 +14,7 @@ /** * Created by Declan */ -public class BitmexStreamingTradeService implements StreamingTradeService { +public class BitmexStreamingTradeService { private final BitmexStreamingService streamingService; @@ -23,7 +22,6 @@ public BitmexStreamingTradeService(BitmexStreamingService streamingService) { this.streamingService = streamingService; } - @Override public Observable getOrders(CurrencyPair currencyPair, Object... args) { String channelName = "order"; String instrument = currencyPair.base.toString() + currencyPair.counter.toString(); @@ -36,7 +34,6 @@ public Observable getOrders(CurrencyPair currencyPair, Object... args) { }); } - @Override public void submitOrder(Order order, CurrencyPair var1, Object... var2) { throw new NotYetImplementedForExchangeException(); } diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java index a52557c9f..b60073622 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexAuthenticatedExample.java @@ -1,9 +1,7 @@ package info.bitrich.xchangestream.bitmex; -import info.bitrich.xchangestream.bitmex.dto.BitmexExecution; import info.bitrich.xchangestream.core.StreamingExchange; import info.bitrich.xchangestream.core.StreamingExchangeFactory; -import io.reactivex.Observable; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.utils.CertHelper; @@ -55,7 +53,7 @@ public static void main(String[] args) throws Exception { /* streamingMarketDataService.getTrades(xbtUsd) .subscribe(trade -> LOG.info("TRADE: {}", trade), throwable -> LOG.error("ERROR in getting trades: ", throwable));*/ - streamingMarketDataService.getExecutions("XBTUSD").subscribe(bitmexExecution -> { + streamingMarketDataService.getRawExecutions("XBTUSD").subscribe(bitmexExecution -> { LOG.info("bitmexExecution = {}", bitmexExecution); }); try { diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java index b904d4dde..1510fcb6b 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexDeadManSwitchTest.java @@ -1,13 +1,10 @@ package info.bitrich.xchangestream.bitmex; -import info.bitrich.xchangestream.bitmex.dto.BitmexLimitOrder; import info.bitrich.xchangestream.core.StreamingExchange; import org.junit.Ignore; import org.junit.Test; import org.knowm.xchange.ExchangeFactory; import org.knowm.xchange.ExchangeSpecification; -import org.knowm.xchange.bitmex.dto.marketdata.BitmexPrivateOrder; -import org.knowm.xchange.bitmex.dto.trade.BitmexSide; import org.knowm.xchange.bitmex.service.BitmexMarketDataService; import org.knowm.xchange.bitmex.service.BitmexTradeService; import org.knowm.xchange.currency.CurrencyPair; @@ -19,7 +16,6 @@ import org.slf4j.LoggerFactory; import java.math.BigDecimal; -import java.util.List; import static org.knowm.xchange.bitmex.BitmexPrompt.PERPETUAL; @@ -62,13 +58,13 @@ public void testDeadmanSwitch() throws Exception { final BitmexStreamingMarketDataService streamingMarketDataService = (BitmexStreamingMarketDataService) exchange.getStreamingMarketDataService(); // streamingMarketDataService.authenticate(); - CurrencyPair xbtUsd = CurrencyPair.XBT_USD; + CurrencyPair xbtUsd = exchange.determineActiveContract(CurrencyPair.XBT_USD.base.toString(), CurrencyPair.XBT_USD.counter.toString(), PERPETUAL); - streamingMarketDataService.getExecutions("XBTUSD").subscribe(bitmexExecution -> { + streamingMarketDataService.getRawExecutions("XBTUSD").subscribe(bitmexExecution -> { logger.info("!!!!EXECUTION!!!! = {}", bitmexExecution); }); - OrderBook orderBook = marketDataService.getOrderBook(CurrencyPair.XBT_USD, PERPETUAL); + OrderBook orderBook = marketDataService.getOrderBook(xbtUsd); // OrderBook orderBook = marketDataService.getOrderBook(new CurrencyPair(Currency.ADA, // Currency.BTC), BitmexPrompt.QUARTERLY); // OrderBook orderBook = marketDataService.getOrderBook(new CurrencyPair(Currency.BTC, diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java index 79f18d964..79ad792ec 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexManualExample.java @@ -15,7 +15,7 @@ public class BitmexManualExample { private static final Logger LOG = LoggerFactory.getLogger(BitmexManualExample.class); public static void main(String[] args) { - StreamingExchange exchange = StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); + BitmexStreamingExchange exchange = (BitmexStreamingExchange) StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); exchange.connect().blockingAwait(); exchange.messageDelay().subscribe(delay -> LOG.info("Message delay: " + delay)); @@ -45,16 +45,17 @@ public static void main(String[] args) { throwable -> LOG.error("ERROR in getting trades: ", throwable)); // BIQUARTERLY Contract - streamingMarketDataService.getOrderBook(xbtUsd, BitmexPrompt.BIQUARTERLY).subscribe(orderBook -> { + CurrencyPair xbtUsdBiquarterly = exchange.determineActiveContract(CurrencyPair.XBT_USD.base.toString(), CurrencyPair.XBT_USD.counter.toString(), BitmexPrompt.BIQUARTERLY); + streamingMarketDataService.getOrderBook(xbtUsdBiquarterly).subscribe(orderBook -> { LOG.info("BIQUARTERLY Contract First ask: {}", orderBook.getAsks().get(0)); LOG.info("BIQUARTERLY Contract First bid: {}", orderBook.getBids().get(0)); }, throwable -> LOG.error("ERROR in getting BIQUARTERLY Contract order book: ", throwable)); - streamingMarketDataService.getTicker(xbtUsd, BitmexPrompt.BIQUARTERLY).subscribe(ticker -> { + streamingMarketDataService.getTicker(xbtUsdBiquarterly).subscribe(ticker -> { LOG.info("BIQUARTERLY Contract TICKER: {}", ticker); }, throwable -> LOG.error("ERROR in getting BIQUARTERLY Contract ticker: ", throwable)); - exchange.getStreamingMarketDataService().getTrades(xbtUsd, BitmexPrompt.BIQUARTERLY) + exchange.getStreamingMarketDataService().getTrades(xbtUsdBiquarterly) .subscribe(trade -> LOG.info("BIQUARTERLY Contract TRADE: {}", trade), throwable -> LOG.error("ERROR in getting BIQUARTERLY Contract trades: ", throwable)); diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java index a93f789d4..445996537 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderIT.java @@ -37,7 +37,7 @@ * @author Nikita Belenkiy on 18/05/2018. */ public class BitmexOrderIT { - private static final CurrencyPair xbtUsd = CurrencyPair.XBT_USD; + private CurrencyPair xbtUsd = CurrencyPair.XBT_USD; private static final Logger LOG = LoggerFactory.getLogger(BitmexTest.class); private static final BigDecimal priceShift = new BigDecimal("50"); @@ -46,22 +46,24 @@ public class BitmexOrderIT { private BigDecimal testBidPrice; private BitmexTradeService tradeService; - private StreamingExchange exchange; + private BitmexStreamingExchange exchange; @Before public void setup() throws IOException { LocalExchangeConfig localConfig = PropsLoader.loadKeys( "bitmex.secret.keys", "bitmex.secret.keys.origin", "bitmex"); - exchange = StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); + exchange = (BitmexStreamingExchange) StreamingExchangeFactory.INSTANCE.createExchange(BitmexStreamingExchange.class.getName()); exchange.applySpecification(BitmexTestsCommons.getExchangeSpecification(localConfig, exchange.getDefaultExchangeSpecification())); exchange.connect().blockingAwait(); + xbtUsd = exchange.determineActiveContract(CurrencyPair.XBT_USD.base.toString(), CurrencyPair.XBT_USD.counter.toString(), PERPETUAL); + BitmexMarketDataService marketDataService = (BitmexMarketDataService) exchange.getMarketDataService(); - OrderBook orderBook = marketDataService.getOrderBook(xbtUsd, PERPETUAL); + OrderBook orderBook = marketDataService.getOrderBook(xbtUsd); List asks = orderBook.getAsks(); // todo : for the streaming service best ask is at 0 pos BigDecimal topPriceAsk = getPrice(asks, asks.size() - 1); @@ -206,7 +208,7 @@ public void shouldGetExecutionOnFill() { }, 1, TimeUnit.SECONDS); Observable executionObservable = ((BitmexStreamingMarketDataService) - exchange.getStreamingMarketDataService()).getExecutions("XBTUSD"); + exchange.getStreamingMarketDataService()).getRawExecutions("XBTUSD"); executionObservable.test() .awaitCount(5) .assertNever(execution -> Objects.equals(execution.getClOrdID(), clOrdId)) diff --git a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java index 1a4ad61fe..38bdc9ece 100644 --- a/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java +++ b/xchange-bitmex/src/test/java/info/bitrich/xchangestream/bitmex/BitmexOrderReplaceTest.java @@ -62,12 +62,12 @@ public void testOrderReplace() throws Exception { final BitmexStreamingMarketDataService streamingMarketDataService = (BitmexStreamingMarketDataService) exchange.getStreamingMarketDataService(); // streamingMarketDataService.authenticate(); - CurrencyPair xbtUsd = CurrencyPair.XBT_USD; + CurrencyPair xbtUsd = exchange.determineActiveContract(CurrencyPair.XBT_USD.base.toString(), CurrencyPair.XBT_USD.counter.toString(), PERPETUAL); - streamingMarketDataService.getExecutions("XBTUSD").subscribe(bitmexExecution -> { + streamingMarketDataService.getRawExecutions("XBTUSD").subscribe(bitmexExecution -> { logger.info("!!!!EXECUTION!!!! = {}", bitmexExecution); }); - OrderBook orderBook = marketDataService.getOrderBook(CurrencyPair.XBT_USD, PERPETUAL); + OrderBook orderBook = marketDataService.getOrderBook(xbtUsd); // OrderBook orderBook = marketDataService.getOrderBook(new CurrencyPair(Currency.ADA, // Currency.BTC), BitmexPrompt.QUARTERLY); // OrderBook orderBook = marketDataService.getOrderBook(new CurrencyPair(Currency.BTC, diff --git a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java b/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java deleted file mode 100644 index 26ef91955..000000000 --- a/xchange-stream-core/src/main/java/info/bitrich/xchangestream/core/StreamingTradeService.java +++ /dev/null @@ -1,19 +0,0 @@ -package info.bitrich.xchangestream.core; - -import io.reactivex.Observable; -import org.knowm.xchange.currency.CurrencyPair; -import org.knowm.xchange.dto.Order; -import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; - - - -public interface StreamingTradeService { - - default Observable getOrders(CurrencyPair var1, Object... var2) { - throw new NotYetImplementedForExchangeException(); - } - - default void submitOrder(Order order, CurrencyPair var1, Object...var2) { - throw new NotYetImplementedForExchangeException(); - } -} From b180f1b98ebdfd958a2cefa120828773be96f5fa Mon Sep 17 00:00:00 2001 From: Henry Wong Date: Tue, 18 Jun 2019 02:45:13 +0800 Subject: [PATCH 97/97] Delete submit order --- .../xchangestream/bitmex/BitmexStreamingTradeService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java index c6f892dcd..871583ad1 100644 --- a/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java +++ b/xchange-bitmex/src/main/java/info/bitrich/xchangestream/bitmex/BitmexStreamingTradeService.java @@ -33,8 +33,4 @@ public Observable getOrders(CurrencyPair currencyPair, Object... args) { .map(BitmexOrder::toOrder).collect(Collectors.toList()); }); } - - public void submitOrder(Order order, CurrencyPair var1, Object... var2) { - throw new NotYetImplementedForExchangeException(); - } }