From d173251d07de242ff8124429c04e8be2df5daa11 Mon Sep 17 00:00:00 2001 From: David Peisakhov Date: Mon, 23 Mar 2020 01:25:28 +0000 Subject: [PATCH 1/4] Issue #561: [HitBTC] OrderBook is missing support of timestamp --- .../dto/HitbtcOrderBookWithTimestamp.java | 40 +++++++++++++++++++ .../hitbtc/dto/HitbtcWebSocketOrderBook.java | 28 ++++++++++--- .../dto/HitbtcWebSocketOrderBookParams.java | 12 +++++- 3 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcOrderBookWithTimestamp.java diff --git a/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcOrderBookWithTimestamp.java b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcOrderBookWithTimestamp.java new file mode 100644 index 000000000..9cceb2866 --- /dev/null +++ b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcOrderBookWithTimestamp.java @@ -0,0 +1,40 @@ +package info.bitrich.xchangestream.hitbtc.dto; + +import org.knowm.xchange.hitbtc.v2.dto.HitbtcOrderBook; +import org.knowm.xchange.hitbtc.v2.dto.HitbtcOrderLimit; + +import java.util.Date; + +public class HitbtcOrderBookWithTimestamp extends HitbtcOrderBook { + + private final Date timestamp; + + HitbtcOrderBookWithTimestamp(Date timestamp, HitbtcOrderLimit[] asks, HitbtcOrderLimit[] bids) { + super(asks, bids); + this.timestamp = timestamp; + } + + public Date getTimestamp() { + return timestamp; + } + + @Override + public String toString() { + StringBuilder asks = new StringBuilder(); + StringBuilder bids = new StringBuilder(); + + for (HitbtcOrderLimit ask : getAsks()) { + asks.append(ask).append(';'); + } + + for (HitbtcOrderLimit bid : getBids()) { + bids.append(bid).append(';'); + } + + return "HitbtcOrderBookWithTimestamp{" + + "asks=" + asks + + ", bids=" + bids + + ", timestamp=" + timestamp + + '}'; + } +} diff --git a/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java index 61f9e55a4..6abdec73c 100644 --- a/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java +++ b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java @@ -3,6 +3,11 @@ import static java.util.Collections.reverseOrder; import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.util.Date; import java.util.Map; import java.util.TreeMap; import org.knowm.xchange.hitbtc.v2.dto.HitbtcOrderBook; @@ -10,9 +15,13 @@ /** Created by Pavel Chertalev on 15.03.2018. */ public class HitbtcWebSocketOrderBook { + // To parse dates in format of '2018-11-19T05:00:28.700Z' + private static DateTimeFormatter DATE_FORMAT = + new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").toFormatter(); private Map asks; private Map bids; private long sequence = 0; + private long timestamp = 0; public HitbtcWebSocketOrderBook(HitbtcWebSocketOrderBookTransaction orderbookTransaction) { createFromLevels(orderbookTransaction); @@ -35,16 +44,22 @@ private void createFromLevels(HitbtcWebSocketOrderBookTransaction orderbookTrans } sequence = orderbookTransaction.getParams().getSequence(); + timestamp = parseISOTimestampInUTC(orderbookTransaction.getParams().getTimestamp()); } - public HitbtcOrderBook toHitbtcOrderBook() { - HitbtcOrderLimit[] askLimits = - asks.entrySet().stream().map(Map.Entry::getValue).toArray(HitbtcOrderLimit[]::new); + private long parseISOTimestampInUTC(String timestamp) { + if (timestamp != null) { + LocalDateTime time = LocalDateTime.parse(timestamp, DATE_FORMAT); + return time.toInstant(ZoneOffset.UTC).toEpochMilli(); + } + return 0L; + } - HitbtcOrderLimit[] bidLimits = - bids.entrySet().stream().map(Map.Entry::getValue).toArray(HitbtcOrderLimit[]::new); + public HitbtcOrderBook toHitbtcOrderBook() { + HitbtcOrderLimit[] asks = this.asks.values().toArray(new HitbtcOrderLimit[0]); + HitbtcOrderLimit[] bids = this.bids.values().toArray(new HitbtcOrderLimit[0]); - return new HitbtcOrderBook(askLimits, bidLimits); + return new HitbtcOrderBookWithTimestamp(new Date(timestamp), asks, bids); } public void updateOrderBook(HitbtcWebSocketOrderBookTransaction orderBookTransaction) { @@ -54,6 +69,7 @@ public void updateOrderBook(HitbtcWebSocketOrderBookTransaction orderBookTransac updateOrderBookItems(orderBookTransaction.getParams().getAsk(), asks); updateOrderBookItems(orderBookTransaction.getParams().getBid(), bids); sequence = orderBookTransaction.getParams().getSequence(); + timestamp = parseISOTimestampInUTC(orderBookTransaction.getParams().getTimestamp()); } private void updateOrderBookItems( diff --git a/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBookParams.java b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBookParams.java index 45883a1f4..ca3294000 100644 --- a/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBookParams.java +++ b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBookParams.java @@ -1,6 +1,7 @@ package info.bitrich.xchangestream.hitbtc.dto; import com.fasterxml.jackson.annotation.JsonProperty; +import info.bitrich.xchangestream.hitbtc.dto.HitbtcWebSocketBaseParams; import org.knowm.xchange.hitbtc.v2.dto.HitbtcOrderLimit; /** Created by Pavel Chertalev on 15.03.2018. */ @@ -9,16 +10,19 @@ public class HitbtcWebSocketOrderBookParams extends HitbtcWebSocketBaseParams { private final HitbtcOrderLimit[] ask; private final HitbtcOrderLimit[] bid; private final long sequence; + private final String timestamp; public HitbtcWebSocketOrderBookParams( - @JsonProperty("property") String symbol, + @JsonProperty("symbol") String symbol, @JsonProperty("sequence") long sequence, @JsonProperty("ask") HitbtcOrderLimit[] ask, - @JsonProperty("bid") HitbtcOrderLimit[] bid) { + @JsonProperty("bid") HitbtcOrderLimit[] bid, + @JsonProperty("timestamp") String timestamp) { super(symbol); this.ask = ask; this.bid = bid; this.sequence = sequence; + this.timestamp = timestamp; } public HitbtcOrderLimit[] getAsk() { @@ -32,4 +36,8 @@ public HitbtcOrderLimit[] getBid() { public long getSequence() { return sequence; } + + public String getTimestamp() { + return timestamp; + } } From 63dc267cc79e404b7ea1508509b8f95d4110d802 Mon Sep 17 00:00:00 2001 From: dp770 Date: Sun, 3 May 2020 20:10:10 +0100 Subject: [PATCH 2/4] Issue #561: [HitBTC] OrderBook is missing support of timestamp. Using built-in date time formatter with UTC timezone. --- .../hitbtc/dto/HitbtcWebSocketOrderBook.java | 35 +++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java index 6abdec73c..42e07ddbd 100644 --- a/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java +++ b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java @@ -3,10 +3,9 @@ import static java.util.Collections.reverseOrder; import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.ZoneOffset; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; import java.util.Date; import java.util.Map; import java.util.TreeMap; @@ -15,44 +14,35 @@ /** Created by Pavel Chertalev on 15.03.2018. */ public class HitbtcWebSocketOrderBook { - // To parse dates in format of '2018-11-19T05:00:28.700Z' - private static DateTimeFormatter DATE_FORMAT = - new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").toFormatter(); + private static DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ISO_ZONED_DATE_TIME.withZone(ZoneId.of("UTC")); private Map asks; private Map bids; private long sequence = 0; private long timestamp = 0; - public HitbtcWebSocketOrderBook(HitbtcWebSocketOrderBookTransaction orderbookTransaction) { - createFromLevels(orderbookTransaction); + public HitbtcWebSocketOrderBook(HitbtcWebSocketOrderBookTransaction orderBookTransaction) { + createFromLevels(orderBookTransaction); } - private void createFromLevels(HitbtcWebSocketOrderBookTransaction orderbookTransaction) { + private void createFromLevels(HitbtcWebSocketOrderBookTransaction orderBookTransaction) { this.asks = new TreeMap<>(BigDecimal::compareTo); this.bids = new TreeMap<>(reverseOrder(BigDecimal::compareTo)); - for (HitbtcOrderLimit orderBookItem : orderbookTransaction.getParams().getAsk()) { + for (HitbtcOrderLimit orderBookItem : orderBookTransaction.getParams().getAsk()) { if (orderBookItem.getSize().signum() != 0) { asks.put(orderBookItem.getPrice(), orderBookItem); } } - for (HitbtcOrderLimit orderBookItem : orderbookTransaction.getParams().getBid()) { + for (HitbtcOrderLimit orderBookItem : orderBookTransaction.getParams().getBid()) { if (orderBookItem.getSize().signum() != 0) { bids.put(orderBookItem.getPrice(), orderBookItem); } } - sequence = orderbookTransaction.getParams().getSequence(); - timestamp = parseISOTimestampInUTC(orderbookTransaction.getParams().getTimestamp()); - } - - private long parseISOTimestampInUTC(String timestamp) { - if (timestamp != null) { - LocalDateTime time = LocalDateTime.parse(timestamp, DATE_FORMAT); - return time.toInstant(ZoneOffset.UTC).toEpochMilli(); - } - return 0L; + sequence = orderBookTransaction.getParams().getSequence(); + timestamp = ZonedDateTime.parse(orderBookTransaction.getParams().getTimestamp(), DATE_FORMAT) + .toInstant().toEpochMilli(); } public HitbtcOrderBook toHitbtcOrderBook() { @@ -69,7 +59,8 @@ public void updateOrderBook(HitbtcWebSocketOrderBookTransaction orderBookTransac updateOrderBookItems(orderBookTransaction.getParams().getAsk(), asks); updateOrderBookItems(orderBookTransaction.getParams().getBid(), bids); sequence = orderBookTransaction.getParams().getSequence(); - timestamp = parseISOTimestampInUTC(orderBookTransaction.getParams().getTimestamp()); + timestamp = ZonedDateTime.parse(orderBookTransaction.getParams().getTimestamp(), DATE_FORMAT) + .toInstant().toEpochMilli(); } private void updateOrderBookItems( From 2a9e05d2f4dda22e61a47b5f3ad54b1de35d68d8 Mon Sep 17 00:00:00 2001 From: dp770 Date: Sun, 3 May 2020 20:24:10 +0100 Subject: [PATCH 3/4] Issue #561: [HitBTC] OrderBook is missing support of timestamp. Using built-in date time formatter with UTC timezone. --- .../test/resources/example/notificationSnapshotOrderBook.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xchange-stream-hitbtc/src/test/resources/example/notificationSnapshotOrderBook.json b/xchange-stream-hitbtc/src/test/resources/example/notificationSnapshotOrderBook.json index deff497d5..c628dd5af 100644 --- a/xchange-stream-hitbtc/src/test/resources/example/notificationSnapshotOrderBook.json +++ b/xchange-stream-hitbtc/src/test/resources/example/notificationSnapshotOrderBook.json @@ -31,6 +31,7 @@ } ], "symbol": "ETHBTC", - "sequence": 8073827 + "sequence": 8073827, + "timestamp": "2020-05-03T18:26:28.714Z" } } \ No newline at end of file From 2346111980af75d2050032608347103d62466271 Mon Sep 17 00:00:00 2001 From: dp770 Date: Sun, 3 May 2020 21:40:13 +0100 Subject: [PATCH 4/4] Issue #561: [HitBTC] OrderBook is missing support of timestamp. Using built-in date time formatter with UTC timezone. --- .../hitbtc/dto/HitbtcWebSocketOrderBook.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java index 42e07ddbd..962eb51a6 100644 --- a/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java +++ b/xchange-stream-hitbtc/src/main/java/info/bitrich/xchangestream/hitbtc/dto/HitbtcWebSocketOrderBook.java @@ -3,9 +3,7 @@ import static java.util.Collections.reverseOrder; import java.math.BigDecimal; -import java.time.ZoneId; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.Map; import java.util.TreeMap; @@ -14,7 +12,6 @@ /** Created by Pavel Chertalev on 15.03.2018. */ public class HitbtcWebSocketOrderBook { - private static DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ISO_ZONED_DATE_TIME.withZone(ZoneId.of("UTC")); private Map asks; private Map bids; private long sequence = 0; @@ -41,8 +38,7 @@ private void createFromLevels(HitbtcWebSocketOrderBookTransaction orderBookTrans } sequence = orderBookTransaction.getParams().getSequence(); - timestamp = ZonedDateTime.parse(orderBookTransaction.getParams().getTimestamp(), DATE_FORMAT) - .toInstant().toEpochMilli(); + timestamp = ZonedDateTime.parse(orderBookTransaction.getParams().getTimestamp()).toInstant().toEpochMilli(); } public HitbtcOrderBook toHitbtcOrderBook() { @@ -59,8 +55,7 @@ public void updateOrderBook(HitbtcWebSocketOrderBookTransaction orderBookTransac updateOrderBookItems(orderBookTransaction.getParams().getAsk(), asks); updateOrderBookItems(orderBookTransaction.getParams().getBid(), bids); sequence = orderBookTransaction.getParams().getSequence(); - timestamp = ZonedDateTime.parse(orderBookTransaction.getParams().getTimestamp(), DATE_FORMAT) - .toInstant().toEpochMilli(); + timestamp = ZonedDateTime.parse(orderBookTransaction.getParams().getTimestamp()).toInstant().toEpochMilli(); } private void updateOrderBookItems(