From 3cae348d2ed57cb95a880eb036e108de40553b01 Mon Sep 17 00:00:00 2001 From: Alfredo Ferreira <15140256+aaoferreira@users.noreply.github.com> Date: Thu, 30 Jul 2020 19:10:11 +0200 Subject: [PATCH] Add websocket bookTicker call --- .../api/client/BinanceApiWebSocketClient.java | 15 ++-- .../client/domain/event/BookTickerEvent.java | 90 +++++++++++++++++++ .../impl/BinanceApiWebSocketClientImpl.java | 15 ++-- .../api/examples/MarketDataStreamExample.java | 3 + 4 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/binance/api/client/domain/event/BookTickerEvent.java diff --git a/src/main/java/com/binance/api/client/BinanceApiWebSocketClient.java b/src/main/java/com/binance/api/client/BinanceApiWebSocketClient.java index 1e8421e79..213c37c44 100644 --- a/src/main/java/com/binance/api/client/BinanceApiWebSocketClient.java +++ b/src/main/java/com/binance/api/client/BinanceApiWebSocketClient.java @@ -1,10 +1,6 @@ package com.binance.api.client; -import com.binance.api.client.domain.event.AggTradeEvent; -import com.binance.api.client.domain.event.AllMarketTickersEvent; -import com.binance.api.client.domain.event.CandlestickEvent; -import com.binance.api.client.domain.event.DepthEvent; -import com.binance.api.client.domain.event.UserDataUpdateEvent; +import com.binance.api.client.domain.event.*; import com.binance.api.client.domain.market.CandlestickInterval; import java.io.Closeable; @@ -15,6 +11,15 @@ */ public interface BinanceApiWebSocketClient extends Closeable { + /** + * Open a new web socket to receive {@link BookTickerEvent bookTickerEvents} on a callback. + * + * @param symbols market (one or coma-separated) symbol(s) to subscribe to + * @param callback the callback to call on new events + * @return a {@link Closeable} that allows the underlying web socket to be closed. + */ + Closeable onBookTicker(String symbols, BinanceApiCallback callback); + /** * Open a new web socket to receive {@link DepthEvent depthEvents} on a callback. * diff --git a/src/main/java/com/binance/api/client/domain/event/BookTickerEvent.java b/src/main/java/com/binance/api/client/domain/event/BookTickerEvent.java new file mode 100644 index 000000000..f85bc7a72 --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/event/BookTickerEvent.java @@ -0,0 +1,90 @@ +package com.binance.api.client.domain.event; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.math.BigDecimal; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class BookTickerEvent { + + @JsonProperty("u") + private long updateId; + + @JsonProperty("s") + private String symbol; + + @JsonProperty("b") + private String bestBidPrice; + + @JsonProperty("B") + private String bestBidQuantity; + + @JsonProperty("a") + private String bestAskPrice; + + @JsonProperty("A") + private String bestAskQuantity; + + public long getUpdateId() { + return updateId; + } + + public void setUpdateId(long updateId) { + this.updateId = updateId; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getBestBidPrice() { + return bestBidPrice; + } + + public void setBestBidPrice(String bestBidPrice) { + this.bestBidPrice = bestBidPrice; + } + + public String getBestBidQuantity() { + return bestBidQuantity; + } + + public void setBestBidQuantity(String bestBidQuantity) { + this.bestBidQuantity = bestBidQuantity; + } + + public String getBestAskPrice() { + return bestAskPrice; + } + + public void setBestAskPrice(String bestAskPrice) { + this.bestAskPrice = bestAskPrice; + } + + public String getBestAskQuantity() { + return bestAskQuantity; + } + + public void setBestAskQuantity(String bestAskQuantity) { + this.bestAskQuantity = bestAskQuantity; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("updateId", updateId) + .append("symbol", symbol) + .append("bestBidPrice", bestBidPrice) + .append("bestBidQuantity", bestBidQuantity) + .append("bestAskPrice", bestAskPrice) + .append("bestAskQuantity", bestAskQuantity) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java index e9be1f690..dd85c193a 100644 --- a/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java @@ -4,11 +4,7 @@ import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.config.BinanceApiConfig; import com.binance.api.client.constant.BinanceApiConstants; -import com.binance.api.client.domain.event.AggTradeEvent; -import com.binance.api.client.domain.event.AllMarketTickersEvent; -import com.binance.api.client.domain.event.CandlestickEvent; -import com.binance.api.client.domain.event.DepthEvent; -import com.binance.api.client.domain.event.UserDataUpdateEvent; +import com.binance.api.client.domain.event.*; import com.binance.api.client.domain.market.CandlestickInterval; import com.fasterxml.jackson.core.type.TypeReference; @@ -32,6 +28,15 @@ public BinanceApiWebSocketClientImpl(OkHttpClient client) { this.client = client; } + @Override + public Closeable onBookTicker(String symbols, BinanceApiCallback callback) { + final String channel = Arrays.stream(symbols.split(",")) + .map(String::trim) + .map(s -> String.format("%s@bookTicker", s)) + .collect(Collectors.joining("/")); + return createNewWebSocket(channel, new BinanceApiWebSocketListener<>(callback, BookTickerEvent.class)); + } + @Override public Closeable onDepthEvent(String symbols, BinanceApiCallback callback) { final String channel = Arrays.stream(symbols.split(",")) diff --git a/src/test/java/com/binance/api/examples/MarketDataStreamExample.java b/src/test/java/com/binance/api/examples/MarketDataStreamExample.java index f2b790510..013721f27 100644 --- a/src/test/java/com/binance/api/examples/MarketDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/MarketDataStreamExample.java @@ -19,6 +19,9 @@ public static void main(String[] args) throws InterruptedException, IOException // Listen for aggregated trade events for ETH/BTC client.onAggTradeEvent("ethbtc", response -> System.out.println(response)); + // Listen for book ticker events for ETH/BTC + client.onBookTicker("ethbtc", response -> System.out.println(response)); + // Listen for changes in the order book in ETH/BTC client.onDepthEvent("ethbtc", response -> System.out.println(response));