From cb90b214bd3e58eed93f978381ef810478ff2d08 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Thu, 1 Apr 2021 02:21:10 +0430 Subject: [PATCH 01/18] cleanUp Code --- .../api/examples/OrdersExampleAsync.java | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/test/java/com/binance/api/examples/OrdersExampleAsync.java b/src/test/java/com/binance/api/examples/OrdersExampleAsync.java index 776e694a6..63f1ce3d5 100755 --- a/src/test/java/com/binance/api/examples/OrdersExampleAsync.java +++ b/src/test/java/com/binance/api/examples/OrdersExampleAsync.java @@ -16,33 +16,30 @@ */ public class OrdersExampleAsync { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); + public static void main(String[] args) { + BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); - // Getting list of open orders - client.getOpenOrders(new OrderRequest("LINKETH"), response -> System.out.println(response)); + // Getting list of open orders + client.getOpenOrders(new OrderRequest("LINKETH"), System.out::println); - // Get status of a particular order - client.getOrderStatus(new OrderStatusRequest("LINKETH", 745262L), - response -> System.out.println(response)); + // Get status of a particular order + client.getOrderStatus(new OrderStatusRequest("LINKETH", 745262L), System.out::println); - // Getting list of all orders with a limit of 10 - client.getAllOrders(new AllOrdersRequest("LINKETH").limit(10), response -> System.out.println(response)); + // Getting list of all orders with a limit of 10 + client.getAllOrders(new AllOrdersRequest("LINKETH").limit(10), System.out::println); - // Canceling an order - client.cancelOrder(new CancelOrderRequest("LINKETH", 756703L), - response -> System.out.println(response)); + // Canceling an order + client.cancelOrder(new CancelOrderRequest("LINKETH", 756703L), System.out::println); - // Placing a test LIMIT order - client.newOrderTest(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001"), - response -> System.out.println("Test order has succeeded.")); + // Placing a test LIMIT order + client.newOrderTest(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001"), + response -> System.out.println("Test order has succeeded.")); - // Placing a test MARKET order - client.newOrderTest(marketBuy("LINKETH", "1000"), response -> System.out.println("Test order has succeeded.")); + // Placing a test MARKET order + client.newOrderTest(marketBuy("LINKETH", "1000"), response -> System.out.println("Test order has succeeded.")); - // Placing a real LIMIT order - client.newOrder(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001"), - response -> System.out.println(response)); - } + // Placing a real LIMIT order + client.newOrder(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001"), System.out::println); + } } From f0dd37875026b8329e486b1731e8c72b33c265e4 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Thu, 1 Apr 2021 03:54:47 +0430 Subject: [PATCH 02/18] Implemented Binance Futures API --- .../BinanceApiAsyncFuturesRestClient.java | 30 ++ .../api/client/BinanceApiAsyncRestClient.java | 2 +- .../api/client/BinanceApiClientFactory.java | 186 ++++++----- .../client/BinanceApiFuturesRestClient.java | 49 +++ .../binance/api/client/BinanceEngineType.java | 9 + .../api/client/config/BinanceApiConfig.java | 99 +++--- .../binance/api/client/domain/OrderType.java | 15 +- .../api/client/domain/PositionSide.java | 13 + .../api/client/domain/WorkingType.java | 14 + .../client/domain/account/FuturesAccount.java | 203 ++++++++++++ .../domain/account/FuturesAssetBalance.java | 146 +++++++++ .../domain/account/FuturesNewOrder.java | 296 ++++++++++++++++++ .../account/FuturesNewOrderResponse.java | 255 +++++++++++++++ .../domain/account/FuturesPosition.java | 141 +++++++++ .../BinanceApiAsyncFuturesRestClientImpl.java | 74 +++++ .../BinanceApiAsyncMarginRestClientImpl.java | 3 +- .../impl/BinanceApiAsyncRestClientImpl.java | 3 +- .../impl/BinanceApiFuturesRestClientImpl.java | 64 ++++ .../impl/BinanceApiMarginRestClientImpl.java | 3 +- .../client/impl/BinanceApiRestClientImpl.java | 3 +- .../impl/BinanceApiServiceGenerator.java | 9 +- .../impl/BinanceApiSwapRestClientImpl.java | 3 +- .../impl/BinanceApiWebSocketClientImpl.java | 17 +- .../client/impl/BinanceFuturesApiService.java | 103 ++++++ .../api/examples/FuturesAccountExample.java | 22 ++ .../examples/FuturesOrdersAsyncExample.java | 38 +++ .../api/examples/FuturesOrdersExample.java | 33 ++ .../api/examples/FuturesWebSocketExample.java | 23 ++ 28 files changed, 1706 insertions(+), 150 deletions(-) create mode 100755 src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java create mode 100755 src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java create mode 100644 src/main/java/com/binance/api/client/BinanceEngineType.java create mode 100755 src/main/java/com/binance/api/client/domain/PositionSide.java create mode 100755 src/main/java/com/binance/api/client/domain/WorkingType.java create mode 100755 src/main/java/com/binance/api/client/domain/account/FuturesAccount.java create mode 100755 src/main/java/com/binance/api/client/domain/account/FuturesAssetBalance.java create mode 100755 src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java create mode 100755 src/main/java/com/binance/api/client/domain/account/FuturesNewOrderResponse.java create mode 100755 src/main/java/com/binance/api/client/domain/account/FuturesPosition.java create mode 100755 src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java create mode 100755 src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java create mode 100755 src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java create mode 100755 src/test/java/com/binance/api/examples/FuturesAccountExample.java create mode 100755 src/test/java/com/binance/api/examples/FuturesOrdersAsyncExample.java create mode 100755 src/test/java/com/binance/api/examples/FuturesOrdersExample.java create mode 100755 src/test/java/com/binance/api/examples/FuturesWebSocketExample.java diff --git a/src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java b/src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java new file mode 100755 index 000000000..7d7fbc2d9 --- /dev/null +++ b/src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java @@ -0,0 +1,30 @@ +package com.binance.api.client; + +import com.binance.api.client.domain.account.*; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; + +import java.util.List; + +/** + * Binance API façade, supporting asynchronous/non-blocking access Binance's Futures REST API. + * + * @author Mahdi Shiekh Hosseini + */ +public interface BinanceApiAsyncFuturesRestClient { + + void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback); + + void getAccount(BinanceApiCallback callback); + + void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback); + + void newOrder(FuturesNewOrder order, BinanceApiCallback callback); + + void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback); + + void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback); + +} \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java b/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java index d0e3b1c01..112d439d6 100755 --- a/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java +++ b/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java @@ -80,7 +80,7 @@ public interface BinanceApiAsyncRestClient { * Get older trades. Weight: 5 * * @param symbol ticker symbol (e.g. ETHBTC) - * @param limit of last trades (Default 500; max 1000.) + * @param limit of last trades (Default 500; max 1000.)getMyTrades * @param fromId TradeId to fetch from. Default gets most recent trades. * @param callback the callback that handles the response */ diff --git a/src/main/java/com/binance/api/client/BinanceApiClientFactory.java b/src/main/java/com/binance/api/client/BinanceApiClientFactory.java index 842ad20d5..34da39374 100755 --- a/src/main/java/com/binance/api/client/BinanceApiClientFactory.java +++ b/src/main/java/com/binance/api/client/BinanceApiClientFactory.java @@ -9,87 +9,107 @@ */ public class BinanceApiClientFactory { - /** - * API Key - */ - private String apiKey; - - /** - * Secret. - */ - private String secret; - - /** - * Instantiates a new binance api client factory. - * - * @param apiKey the API key - * @param secret the Secret - */ - private BinanceApiClientFactory(String apiKey, String secret) { - this.apiKey = apiKey; - this.secret = secret; - } - - /** - * New instance. - * - * @param apiKey the API key - * @param secret the Secret - * - * @return the binance api client factory - */ - public static BinanceApiClientFactory newInstance(String apiKey, String secret) { - return new BinanceApiClientFactory(apiKey, secret); - } - - /** - * New instance without authentication. - * - * @return the binance api client factory - */ - public static BinanceApiClientFactory newInstance() { - return new BinanceApiClientFactory(null, null); - } - - /** - * Creates a new synchronous/blocking REST client. - */ - public BinanceApiRestClient newRestClient() { - return new BinanceApiRestClientImpl(apiKey, secret); - } - - /** - * Creates a new asynchronous/non-blocking REST client. - */ - public BinanceApiAsyncRestClient newAsyncRestClient() { - return new BinanceApiAsyncRestClientImpl(apiKey, secret); - } - - /** - * Creates a new asynchronous/non-blocking Margin REST client. - */ - public BinanceApiAsyncMarginRestClient newAsyncMarginRestClient() { - return new BinanceApiAsyncMarginRestClientImpl(apiKey, secret); - } - - /** - * Creates a new synchronous/blocking Margin REST client. - */ - public BinanceApiMarginRestClient newMarginRestClient() { - return new BinanceApiMarginRestClientImpl(apiKey, secret); - } - - /** - * Creates a new web socket client used for handling data streams. - */ - public BinanceApiWebSocketClient newWebSocketClient() { - return new BinanceApiWebSocketClientImpl(getSharedClient()); - } - - /** - * Creates a new synchronous/blocking Swap REST client. - */ - public BinanceApiSwapRestClient newSwapRestClient() { - return new BinanceApiSwapRestClientImpl(apiKey, secret); - } + /** + * API Key + */ + private String apiKey; + + /** + * Secret. + */ + private String secret; + + /** + * Instantiates a new binance api client factory. + * + * @param apiKey the API key + * @param secret the Secret + */ + private BinanceApiClientFactory(String apiKey, String secret) { + this.apiKey = apiKey; + this.secret = secret; + } + + /** + * New instance. + * + * @param apiKey the API key + * @param secret the Secret + * @return the binance api client factory + */ + public static BinanceApiClientFactory newInstance(String apiKey, String secret) { + return new BinanceApiClientFactory(apiKey, secret); + } + + /** + * New instance without authentication. + * + * @return the binance api client factory + */ + public static BinanceApiClientFactory newInstance() { + return new BinanceApiClientFactory(null, null); + } + + /** + * Creates a new synchronous/blocking REST client. + */ + public BinanceApiRestClient newRestClient() { + return new BinanceApiRestClientImpl(apiKey, secret); + } + + /** + * Creates a new asynchronous/non-blocking REST client. + */ + public BinanceApiAsyncRestClient newAsyncRestClient() { + return new BinanceApiAsyncRestClientImpl(apiKey, secret); + } + + /** + * Creates a new asynchronous/non-blocking Margin REST client. + */ + public BinanceApiAsyncMarginRestClient newAsyncMarginRestClient() { + return new BinanceApiAsyncMarginRestClientImpl(apiKey, secret); + } + + /** + * Creates a new asynchronous/non-blocking Margin REST client. + */ + public BinanceApiAsyncFuturesRestClient newAsyncFuturesRestClient() { + return new BinanceApiAsyncFuturesRestClientImpl(apiKey, secret); + } + + /** + * Creates a new synchronous/blocking Margin REST client. + */ + public BinanceApiMarginRestClient newMarginRestClient() { + return new BinanceApiMarginRestClientImpl(apiKey, secret); + } + + /** + * Creates a new synchronous/blocking Futures REST client. + */ + public BinanceApiFuturesRestClient newFuturesRestClient() { + return new BinanceApiFuturesRestClientImpl(apiKey, secret); + } + + /** + * Creates a new web socket client used for handling data streams. + */ + public BinanceApiWebSocketClient newWebSocketClient() { + return new BinanceApiWebSocketClientImpl(getSharedClient(), BinanceEngineType.SPOT); + } + + /** + * Creates a new web socket client used for handling data streams. + */ + public BinanceApiWebSocketClient newFuturesWebSocketClient() { + return new BinanceApiWebSocketClientImpl(getSharedClient(), BinanceEngineType.FUTURES); + } + + /** + * Creates a new synchronous/blocking Swap REST client. + */ + public BinanceApiSwapRestClient newSwapRestClient() { + return new BinanceApiSwapRestClientImpl(apiKey, secret); + } } diff --git a/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java b/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java new file mode 100755 index 000000000..9fe492b9c --- /dev/null +++ b/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java @@ -0,0 +1,49 @@ +package com.binance.api.client; + +import com.binance.api.client.domain.account.FuturesAccount; +import com.binance.api.client.domain.account.FuturesNewOrder; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.Order; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; + +import java.util.List; + +public interface BinanceApiFuturesRestClient { + /** + * Get current margin account information using default parameters. + */ + FuturesAccount getAccount(); + + /** + * Get all open orders on margin account for a symbol. + * + * @param orderRequest order request parameters + */ + List getOpenOrders(OrderRequest orderRequest); + + /** + * Send in a new margin order. + * + * @param order the new order to submit. + * @return a response containing details about the newly placed order. + */ + FuturesNewOrderResponse newOrder(FuturesNewOrder order); + + /** + * Cancel an active margin order. + * + * @param cancelOrderRequest order status request parameters + */ + CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest); + + /** + * Check margin order's status. + * + * @param orderStatusRequest order status request options/filters + * @return an order + */ + Order getOrderStatus(OrderStatusRequest orderStatusRequest); +} diff --git a/src/main/java/com/binance/api/client/BinanceEngineType.java b/src/main/java/com/binance/api/client/BinanceEngineType.java new file mode 100644 index 000000000..cff8b7e24 --- /dev/null +++ b/src/main/java/com/binance/api/client/BinanceEngineType.java @@ -0,0 +1,9 @@ +package com.binance.api.client; + +/** + * @author Mahdi Sheikh Hosseini + */ +public enum BinanceEngineType { + SPOT, + FUTURES +} diff --git a/src/main/java/com/binance/api/client/config/BinanceApiConfig.java b/src/main/java/com/binance/api/client/config/BinanceApiConfig.java index d05538efb..ba699dff2 100755 --- a/src/main/java/com/binance/api/client/config/BinanceApiConfig.java +++ b/src/main/java/com/binance/api/client/config/BinanceApiConfig.java @@ -5,48 +5,61 @@ */ public class BinanceApiConfig { - /** - * Base domain for URLs. - */ - private static String BASE_DOMAIN = "binance.com"; - - /** - * Set the URL base domain name (e.g., binance.com). - * - * @param baseDomain Base domain name - */ - public static void setBaseDomain(final String baseDomain) { - BASE_DOMAIN = baseDomain; - } - - /** - * Get the URL base domain name (e.g., binance.com). - * - * @return The base domain for URLs - */ - public static String getBaseDomain() { - return BASE_DOMAIN; - } - - /** - * REST API base URL. - */ - public static String getApiBaseUrl() { - return String.format("https://api.%s", getBaseDomain()); - } - - /** - * Streaming API base URL. - */ - public static String getStreamApiBaseUrl() { - return String.format("wss://stream.%s:9443/ws", getBaseDomain()); - } - - /** - * Asset info base URL. - */ - public static String getAssetInfoApiBaseUrl() { - return String.format("https://%s/", getBaseDomain()); - } + /** + * Base domain for URLs. + */ + private static String BASE_DOMAIN = "binance.com"; + /** + * Set the URL base domain name (e.g., binance.com). + * + * @param baseDomain Base domain name + */ + public static void setBaseDomain(final String baseDomain) { + BASE_DOMAIN = baseDomain; + } + + /** + * Get the URL base domain name (e.g., binance.com). + * + * @return The base domain for URLs + */ + public static String getBaseDomain() { + return BASE_DOMAIN; + } + + /** + * REST API base URL. + */ + public static String getApiBaseUrl() { + return String.format("https://api.%s", getBaseDomain()); + } + + /** + * Streaming API base URL. + */ + public static String getStreamApiBaseUrl() { + return String.format("wss://stream.%s:9443/ws", getBaseDomain()); + } + + /** + * Asset info base URL. + */ + public static String getAssetInfoApiBaseUrl() { + return String.format("https://%s/", getBaseDomain()); + } + + /** + * Futures REST API base URL. + */ + public static String getFuturesApiBaseUrl() { + return String.format("https://fapi.%s", getBaseDomain()); + } + + /** + * Futures Streaming API base URL. + */ + public static String getFuturesStreamApiBaseUrl() { + return String.format("wss://fstream.%s/ws", getBaseDomain()); + } } diff --git a/src/main/java/com/binance/api/client/domain/OrderType.java b/src/main/java/com/binance/api/client/domain/OrderType.java index 78ee6b6fe..f3735200d 100755 --- a/src/main/java/com/binance/api/client/domain/OrderType.java +++ b/src/main/java/com/binance/api/client/domain/OrderType.java @@ -7,11 +7,12 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) public enum OrderType { - LIMIT, - MARKET, - STOP_LOSS, - STOP_LOSS_LIMIT, - TAKE_PROFIT, - TAKE_PROFIT_LIMIT, - LIMIT_MAKER + LIMIT, + MARKET, + STOP_LOSS, + STOP_LOSS_LIMIT, + TAKE_PROFIT, + TAKE_PROFIT_LIMIT, + LIMIT_MAKER, + TRAILING_STOP_MARKET } diff --git a/src/main/java/com/binance/api/client/domain/PositionSide.java b/src/main/java/com/binance/api/client/domain/PositionSide.java new file mode 100755 index 000000000..993e90bee --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/PositionSide.java @@ -0,0 +1,13 @@ +package com.binance.api.client.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * Buy/Sell order side. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public enum PositionSide { + SHORT, + LONG, + BOTH +} diff --git a/src/main/java/com/binance/api/client/domain/WorkingType.java b/src/main/java/com/binance/api/client/domain/WorkingType.java new file mode 100755 index 000000000..1489ba43b --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/WorkingType.java @@ -0,0 +1,14 @@ +package com.binance.api.client.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * price type + * + * @author Mahdi Sheikh Hosseini + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public enum WorkingType { + CONTRACT_PRICE, + MARK_PRICE +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java b/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java new file mode 100755 index 000000000..54d220459 --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java @@ -0,0 +1,203 @@ +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.util.List; + +/** + * Futures Account information. + */ +@JsonIgnoreProperties +public class FuturesAccount { + private int feeTier; + private boolean canTrade; + private boolean canDeposit; + private boolean canWithdraw; + private long updateTime; + private String totalInitialMargin; + private String totalMaintMargin; + private String totalWalletBalance; + private String totalUnrealizedProfit; + private String totalMarginBalance; + private String totalPositionInitialMargin; + private String totalOpenOrderInitialMargin; + private String totalCrossWalletBalance; + private String totalCrossUnPnl; + private String availableBalance; + private String maxWithdrawAmount; + + private List assets; + private List positions; + + public int getFeeTier() { + return feeTier; + } + + public void setFeeTier(int feeTier) { + this.feeTier = feeTier; + } + + public boolean isCanTrade() { + return canTrade; + } + + public void setCanTrade(boolean canTrade) { + this.canTrade = canTrade; + } + + public boolean isCanDeposit() { + return canDeposit; + } + + public void setCanDeposit(boolean canDeposit) { + this.canDeposit = canDeposit; + } + + public boolean isCanWithdraw() { + return canWithdraw; + } + + public void setCanWithdraw(boolean canWithdraw) { + this.canWithdraw = canWithdraw; + } + + public long getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(long updateTime) { + this.updateTime = updateTime; + } + + public String getTotalInitialMargin() { + return totalInitialMargin; + } + + public void setTotalInitialMargin(String totalInitialMargin) { + this.totalInitialMargin = totalInitialMargin; + } + + public String getTotalMaintMargin() { + return totalMaintMargin; + } + + public void setTotalMaintMargin(String totalMaintMargin) { + this.totalMaintMargin = totalMaintMargin; + } + + public String getTotalWalletBalance() { + return totalWalletBalance; + } + + public void setTotalWalletBalance(String totalWalletBalance) { + this.totalWalletBalance = totalWalletBalance; + } + + public String getTotalUnrealizedProfit() { + return totalUnrealizedProfit; + } + + public void setTotalUnrealizedProfit(String totalUnrealizedProfit) { + this.totalUnrealizedProfit = totalUnrealizedProfit; + } + + public String getTotalMarginBalance() { + return totalMarginBalance; + } + + public void setTotalMarginBalance(String totalMarginBalance) { + this.totalMarginBalance = totalMarginBalance; + } + + public String getTotalPositionInitialMargin() { + return totalPositionInitialMargin; + } + + public void setTotalPositionInitialMargin(String totalPositionInitialMargin) { + this.totalPositionInitialMargin = totalPositionInitialMargin; + } + + public String getTotalOpenOrderInitialMargin() { + return totalOpenOrderInitialMargin; + } + + public void setTotalOpenOrderInitialMargin(String totalOpenOrderInitialMargin) { + this.totalOpenOrderInitialMargin = totalOpenOrderInitialMargin; + } + + public String getTotalCrossWalletBalance() { + return totalCrossWalletBalance; + } + + public void setTotalCrossWalletBalance(String totalCrossWalletBalance) { + this.totalCrossWalletBalance = totalCrossWalletBalance; + } + + public String getTotalCrossUnPnl() { + return totalCrossUnPnl; + } + + public void setTotalCrossUnPnl(String totalCrossUnPnl) { + this.totalCrossUnPnl = totalCrossUnPnl; + } + + public String getAvailableBalance() { + return availableBalance; + } + + public void setAvailableBalance(String availableBalance) { + this.availableBalance = availableBalance; + } + + public String getMaxWithdrawAmount() { + return maxWithdrawAmount; + } + + public void setMaxWithdrawAmount(String maxWithdrawAmount) { + this.maxWithdrawAmount = maxWithdrawAmount; + } + + public List getAssets() { + return assets; + } + + public List getPositions() { + return positions; + } + + public void setPositions(List positions) { + this.positions = positions; + } + + public void setAssets(List assets) { + this.assets = assets; + } + + public FuturesAssetBalance getAssetBalance(final String symbol) { + return assets.stream() + .filter(marginAssetBalance -> marginAssetBalance.getAsset().equals(symbol)) + .findFirst() + .orElse(FuturesAssetBalance.of(symbol)); + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("totalInitialMargin", totalInitialMargin) + .append("totalMaintMargin", totalMaintMargin) + .append("totalWalletBalance", totalWalletBalance) + .append("totalUnrealizedProfit", totalUnrealizedProfit) + .append("totalMarginBalance", totalMarginBalance) + .append("totalPositionInitialMargin", totalPositionInitialMargin) + .append("totalOpenOrderInitialMargin", totalOpenOrderInitialMargin) + .append("totalCrossWalletBalance", totalCrossWalletBalance) + .append("totalCrossUnPnl", totalCrossUnPnl) + .append("availableBalance", availableBalance) + .append("maxWithdrawAmount", maxWithdrawAmount) + .toString(); + + + } +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesAssetBalance.java b/src/main/java/com/binance/api/client/domain/account/FuturesAssetBalance.java new file mode 100755 index 000000000..b7864a8a4 --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/FuturesAssetBalance.java @@ -0,0 +1,146 @@ +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * An asset balance in an Account. + * + * @see Account + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class FuturesAssetBalance { + private String asset; + private String walletBalance; + private String unrealizedProfit; + private String marginBalance; + private String maintMargin; + private String initialMargin; + private String positionInitialMargin; + private String openOrderInitialMargin; + private String crossWalletBalance; + private String crossUnPnl; + private String availableBalance; + private String maxWithdrawAmount; + + public String getAsset() { + return asset; + } + + public void setAsset(String asset) { + this.asset = asset; + } + + public String getWalletBalance() { + return walletBalance; + } + + public void setWalletBalance(String walletBalance) { + this.walletBalance = walletBalance; + } + + public String getUnrealizedProfit() { + return unrealizedProfit; + } + + public void setUnrealizedProfit(String unrealizedProfit) { + this.unrealizedProfit = unrealizedProfit; + } + + public String getMarginBalance() { + return marginBalance; + } + + public void setMarginBalance(String marginBalance) { + this.marginBalance = marginBalance; + } + + public String getMaintMargin() { + return maintMargin; + } + + public void setMaintMargin(String maintMargin) { + this.maintMargin = maintMargin; + } + + public String getInitialMargin() { + return initialMargin; + } + + public void setInitialMargin(String initialMargin) { + this.initialMargin = initialMargin; + } + + public String getPositionInitialMargin() { + return positionInitialMargin; + } + + public void setPositionInitialMargin(String positionInitialMargin) { + this.positionInitialMargin = positionInitialMargin; + } + + public String getOpenOrderInitialMargin() { + return openOrderInitialMargin; + } + + public void setOpenOrderInitialMargin(String openOrderInitialMargin) { + this.openOrderInitialMargin = openOrderInitialMargin; + } + + public String getCrossWalletBalance() { + return crossWalletBalance; + } + + public void setCrossWalletBalance(String crossWalletBalance) { + this.crossWalletBalance = crossWalletBalance; + } + + public String getCrossUnPnl() { + return crossUnPnl; + } + + public void setCrossUnPnl(String crossUnPnl) { + this.crossUnPnl = crossUnPnl; + } + + public String getAvailableBalance() { + return availableBalance; + } + + public void setAvailableBalance(String availableBalance) { + this.availableBalance = availableBalance; + } + + public String getMaxWithdrawAmount() { + return maxWithdrawAmount; + } + + public void setMaxWithdrawAmount(String maxWithdrawAmount) { + this.maxWithdrawAmount = maxWithdrawAmount; + } + + public static FuturesAssetBalance of(final String asset) { + final FuturesAssetBalance assetBalance = new FuturesAssetBalance(); + assetBalance.setAsset(asset); + return assetBalance; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("asset", asset) + .append("walletBalance", walletBalance) + .append("unrealizedProfit", unrealizedProfit) + .append("marginBalance", marginBalance) + .append("maintMargin", maintMargin) + .append("initialMargin", initialMargin) + .append("positionInitialMargin", positionInitialMargin) + .append("openOrderInitialMargin", openOrderInitialMargin) + .append("crossWalletBalance", crossWalletBalance) + .append("crossUnPnl", crossUnPnl) + .append("availableBalance", availableBalance) + .append("maxWithdrawAmount", maxWithdrawAmount) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java new file mode 100755 index 000000000..5c995f60f --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java @@ -0,0 +1,296 @@ +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.*; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * A trade order to enter or exit a position. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class FuturesNewOrder { + + /** + * Symbol to place the order on. + */ + private String symbol; + + /** + * Buy/Sell order side. + */ + private OrderSide side; + + /** + * Type of orderSide + */ + private PositionSide positionSide; + + /** + * Type of order. + */ + private OrderType type; + + /** + * Time in force to indicate how long will the order remain active. + */ + private TimeInForce timeInForce; + + /** + * Quantity. + */ + private String quantity; + + /** + * reduceOnly. + */ + private boolean reduceOnly; + + /** + * Price. + */ + private String price; + + /** + * A unique id for the order. Automatically generated if not sent. + */ + private String newClientOrderId; + + /** + * Used with stop orders. + */ + private String stopPrice; + + /** + * Used with close position true/false used with STOP_MARKET or TAKE_PROFIT_MARKET. + */ + private boolean closePosition; + + /** + * Used with TRAILING_STOP_MARKET. + */ + private String activationPrice; + + /** + * callbackRate + */ + private String callbackRate; + + /** + * workingType + */ + private WorkingType workingType; + + /** + * priceProtect + */ + private boolean priceProtect; + + /** + * Set the response JSON. ACK, RESULT, or FULL; default: RESULT. + */ + private NewOrderResponseType newOrderRespType; + + /** + * Receiving window. + */ + private Long recvWindow; + + /** + * Order timestamp. + */ + private long timestamp; + + /** + * Creates a new order with all required parameters. + */ + + public FuturesNewOrder(String symbol, OrderSide side, OrderType type, TimeInForce timeInForce, WorkingType workingType, String quantity, String price, boolean reduceOnly) { + this.symbol = symbol; + this.side = side; + this.type = type; + this.timeInForce = timeInForce; + this.workingType = workingType; + this.quantity = quantity; + this.price = price; + this.reduceOnly = reduceOnly; + this.newOrderRespType = NewOrderResponseType.RESULT; + this.timestamp = System.currentTimeMillis(); + this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; + } + + public FuturesNewOrder(String symbol, OrderSide side, OrderType type, String quantity, boolean reduceOnly) { + this.symbol = symbol; + this.side = side; + this.type = type; + this.quantity = quantity; + this.reduceOnly = reduceOnly; + this.newOrderRespType = NewOrderResponseType.RESULT; + this.timestamp = System.currentTimeMillis(); + this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public OrderSide getSide() { + return side; + } + + public void setSide(OrderSide side) { + this.side = side; + } + + public PositionSide getPositionSide() { + return positionSide; + } + + public void setPositionSide(PositionSide positionSide) { + this.positionSide = positionSide; + } + + public OrderType getType() { + return type; + } + + public void setType(OrderType type) { + this.type = type; + } + + public TimeInForce getTimeInForce() { + return timeInForce; + } + + public void setTimeInForce(TimeInForce timeInForce) { + this.timeInForce = timeInForce; + } + + public String getQuantity() { + return quantity; + } + + public void setQuantity(String quantity) { + this.quantity = quantity; + } + + public boolean isReduceOnly() { + return reduceOnly; + } + + public void setReduceOnly(boolean reduceOnly) { + this.reduceOnly = reduceOnly; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getNewClientOrderId() { + return newClientOrderId; + } + + public void setNewClientOrderId(String newClientOrderId) { + this.newClientOrderId = newClientOrderId; + } + + public String getStopPrice() { + return stopPrice; + } + + public void setStopPrice(String stopPrice) { + this.stopPrice = stopPrice; + } + + public boolean isClosePosition() { + return closePosition; + } + + public void setClosePosition(boolean closePosition) { + this.closePosition = closePosition; + } + + public String getActivationPrice() { + return activationPrice; + } + + public void setActivationPrice(String activationPrice) { + this.activationPrice = activationPrice; + } + + public String getCallbackRate() { + return callbackRate; + } + + public void setCallbackRate(String callbackRate) { + this.callbackRate = callbackRate; + } + + public WorkingType getWorkingType() { + return workingType; + } + + public void setWorkingType(WorkingType workingType) { + this.workingType = workingType; + } + + public boolean isPriceProtect() { + return priceProtect; + } + + public void setPriceProtect(boolean priceProtect) { + this.priceProtect = priceProtect; + } + + public NewOrderResponseType getNewOrderRespType() { + return newOrderRespType; + } + + public void setNewOrderRespType(NewOrderResponseType newOrderRespType) { + this.newOrderRespType = newOrderRespType; + } + + public Long getRecvWindow() { + return recvWindow; + } + + public void setRecvWindow(Long recvWindow) { + this.recvWindow = recvWindow; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public static FuturesNewOrder limitLong(String symbol, TimeInForce timeInForce, WorkingType workingType, String quantity, String price, boolean reduceOnly) { + return new FuturesNewOrder(symbol, OrderSide.BUY, OrderType.LIMIT, timeInForce, workingType, quantity, price, reduceOnly); + } + + public static FuturesNewOrder limitShort(String symbol, TimeInForce timeInForce, WorkingType workingType, String quantity, String price, boolean reduceOnly) { + return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.LIMIT, timeInForce, workingType, quantity, price, reduceOnly); + } + + public static FuturesNewOrder MarketLong(String symbol, String quantity, boolean reduceOnly) { + return new FuturesNewOrder(symbol, OrderSide.BUY, OrderType.MARKET, quantity, reduceOnly); + } + + public static FuturesNewOrder MarketShort(String symbol, String quantity, boolean reduceOnly) { + return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.MARKET, quantity, reduceOnly); + } + + /* public static FuturesNewOrder stopLimitLong(String symbol, String quantity, boolean reduceOnly) { + return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.MARKET, quantity); + }*/ + +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrderResponse.java b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrderResponse.java new file mode 100755 index 000000000..339383643 --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrderResponse.java @@ -0,0 +1,255 @@ +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.OrderSide; +import com.binance.api.client.domain.OrderStatus; +import com.binance.api.client.domain.PositionSide; +import com.binance.api.client.domain.WorkingType; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * Response returned when placing a new order on the system. + * + * @see NewOrder for the request + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class FuturesNewOrderResponse { + + private String clientOrderId; + private String cumQty; + private String cumQuote; + private String executedQty; + private long orderId; + private String avgPrice; + private String origQty; + private String price; + private boolean reduceOnly; + private OrderSide side; + private PositionSide positionSide; + private OrderStatus status; + private String stopPrice; + private boolean closePosition; + private String symbol; + private String timeInForce; + private String type; + private String origType; + private String activatePrice; + private String priceRate; + private long updateTime; + private WorkingType workingType; + private boolean priceProtect; + + public String getClientOrderId() { + return clientOrderId; + } + + public void setClientOrderId(String clientOrderId) { + this.clientOrderId = clientOrderId; + } + + public String getCumQty() { + return cumQty; + } + + public void setCumQty(String cumQty) { + this.cumQty = cumQty; + } + + public String getCumQuote() { + return cumQuote; + } + + public void setCumQuote(String cumQuote) { + this.cumQuote = cumQuote; + } + + public String getExecutedQty() { + return executedQty; + } + + public void setExecutedQty(String executedQty) { + this.executedQty = executedQty; + } + + public long getOrderId() { + return orderId; + } + + public void setOrderId(long orderId) { + this.orderId = orderId; + } + + public String getAvgPrice() { + return avgPrice; + } + + public void setAvgPrice(String avgPrice) { + this.avgPrice = avgPrice; + } + + public String getOrigQty() { + return origQty; + } + + public void setOrigQty(String origQty) { + this.origQty = origQty; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public boolean isReduceOnly() { + return reduceOnly; + } + + public void setReduceOnly(boolean reduceOnly) { + this.reduceOnly = reduceOnly; + } + + public OrderSide getSide() { + return side; + } + + public void setSide(OrderSide side) { + this.side = side; + } + + public PositionSide getPositionSide() { + return positionSide; + } + + public void setPositionSide(PositionSide positionSide) { + this.positionSide = positionSide; + } + + public OrderStatus getStatus() { + return status; + } + + public void setStatus(OrderStatus status) { + this.status = status; + } + + public String getStopPrice() { + return stopPrice; + } + + public void setStopPrice(String stopPrice) { + this.stopPrice = stopPrice; + } + + public boolean isClosePosition() { + return closePosition; + } + + public void setClosePosition(boolean closePosition) { + this.closePosition = closePosition; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getTimeInForce() { + return timeInForce; + } + + public void setTimeInForce(String timeInForce) { + this.timeInForce = timeInForce; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getOrigType() { + return origType; + } + + public void setOrigType(String origType) { + this.origType = origType; + } + + public String getActivatePrice() { + return activatePrice; + } + + public void setActivatePrice(String activatePrice) { + this.activatePrice = activatePrice; + } + + public String getPriceRate() { + return priceRate; + } + + public void setPriceRate(String priceRate) { + this.priceRate = priceRate; + } + + public long getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(long updateTime) { + this.updateTime = updateTime; + } + + public WorkingType getWorkingType() { + return workingType; + } + + public void setWorkingType(WorkingType workingType) { + this.workingType = workingType; + } + + public boolean isPriceProtect() { + return priceProtect; + } + + public void setPriceProtect(boolean priceProtect) { + this.priceProtect = priceProtect; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("clientOrderId", clientOrderId) + .append("cumQty", cumQty) + .append("cumQuote", cumQuote) + .append("executedQty", executedQty) + .append("orderId", orderId) + .append("avgPrice", avgPrice) + .append("origQty", origQty) + .append("price", price) + .append("reduceOnly", reduceOnly) + .append("side", side) + .append("positionSide", positionSide) + .append("status", status) + .append("stopPrice", stopPrice) + .append("closePosition", closePosition) + .append("symbol", symbol) + .append("timeInForce", timeInForce) + .append("type", type) + .append("origType", origType) + .append("activatePrice", activatePrice) + .append("priceRate", priceRate) + .append("updateTime", updateTime) + .append("workingType", workingType) + .append("priceProtect", priceProtect) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesPosition.java b/src/main/java/com/binance/api/client/domain/account/FuturesPosition.java new file mode 100755 index 000000000..a3b9ff48c --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/FuturesPosition.java @@ -0,0 +1,141 @@ +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.PositionSide; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * An asset balance in an Account. + * + * @see Account + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class FuturesPosition { + private String symbol; + private String initialMargin; + private String maintMargin; + private String unrealizedProfit; + private String positionInitialMargin; + private String openOrderInitialMargin; + private String leverage; + private boolean isolated; + private String entryPrice; + private String maxNotional; + private PositionSide positionSide; + private String positionAmt; + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getInitialMargin() { + return initialMargin; + } + + public void setInitialMargin(String initialMargin) { + this.initialMargin = initialMargin; + } + + public String getMaintMargin() { + return maintMargin; + } + + public void setMaintMargin(String maintMargin) { + this.maintMargin = maintMargin; + } + + public String getUnrealizedProfit() { + return unrealizedProfit; + } + + public void setUnrealizedProfit(String unrealizedProfit) { + this.unrealizedProfit = unrealizedProfit; + } + + public String getPositionInitialMargin() { + return positionInitialMargin; + } + + public void setPositionInitialMargin(String positionInitialMargin) { + this.positionInitialMargin = positionInitialMargin; + } + + public String getOpenOrderInitialMargin() { + return openOrderInitialMargin; + } + + public void setOpenOrderInitialMargin(String openOrderInitialMargin) { + this.openOrderInitialMargin = openOrderInitialMargin; + } + + public String getLeverage() { + return leverage; + } + + public void setLeverage(String leverage) { + this.leverage = leverage; + } + + public boolean isIsolated() { + return isolated; + } + + public void setIsolated(boolean isolated) { + this.isolated = isolated; + } + + public String getEntryPrice() { + return entryPrice; + } + + public void setEntryPrice(String entryPrice) { + this.entryPrice = entryPrice; + } + + public String getMaxNotional() { + return maxNotional; + } + + public void setMaxNotional(String maxNotional) { + this.maxNotional = maxNotional; + } + + public PositionSide getPositionSide() { + return positionSide; + } + + public void setPositionSide(PositionSide positionSide) { + this.positionSide = positionSide; + } + + public String getPositionAmt() { + return positionAmt; + } + + public void setPositionAmt(String positionAmt) { + this.positionAmt = positionAmt; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("symbol", symbol) + .append("initialMargin", initialMargin) + .append("maintMargin", maintMargin) + .append("unrealizedProfit", unrealizedProfit) + .append("positionInitialMargin", positionInitialMargin) + .append("openOrderInitialMargin", openOrderInitialMargin) + .append("leverage", leverage) + .append("isolated", isolated) + .append("entryPrice", entryPrice) + .append("maxNotional", maxNotional) + .append("positionSide", positionSide) + .append("positionAmt", positionAmt) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java new file mode 100755 index 000000000..eeb2c1053 --- /dev/null +++ b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java @@ -0,0 +1,74 @@ +package com.binance.api.client.impl; + +import com.binance.api.client.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.BinanceApiCallback; +import com.binance.api.client.BinanceEngineType; +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.account.FuturesAccount; +import com.binance.api.client.domain.account.FuturesNewOrder; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.Order; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; + +import java.util.List; + +import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; + +/** + * Implementation of Binance's Margin REST API using Retrofit with asynchronous/non-blocking method calls. + * + * @author Mahdi Sheikh Hosseini + */ +public class BinanceApiAsyncFuturesRestClientImpl implements BinanceApiAsyncFuturesRestClient { + + private final BinanceFuturesApiService binanceFuturesApiService; + + public BinanceApiAsyncFuturesRestClientImpl(String apiKey, String secret) { + binanceFuturesApiService = createService(BinanceFuturesApiService.class, apiKey, secret, BinanceEngineType.FUTURES); + } + + // Margin Account endpoints + + @Override + public void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback) { + binanceFuturesApiService.getAccount(recvWindow, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getAccount(BinanceApiCallback callback) { + long timestamp = System.currentTimeMillis(); + binanceFuturesApiService.getAccount(BinanceApiConstants.DEFAULT_MARGIN_RECEIVING_WINDOW, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback) { + binanceFuturesApiService.getOpenOrders(orderRequest.getSymbol(), orderRequest.getRecvWindow(), + orderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void newOrder(FuturesNewOrder order, BinanceApiCallback callback) { + binanceFuturesApiService.newOrder(order.getSymbol(), order.getSide(), order.getPositionSide(), + order.getType(), order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), + order.getStopPrice(), order.isClosePosition(), order.getActivationPrice(), order.getWorkingType(), + order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp()) + .enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback) { + binanceFuturesApiService.cancelOrder(cancelOrderRequest.getSymbol(), + cancelOrderRequest.getOrderId(), cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), + cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback) { + binanceFuturesApiService.getOrderStatus(orderStatusRequest.getSymbol(), + orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), + orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } +} diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java index d3e5c22f6..f40ee790f 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java @@ -2,6 +2,7 @@ import com.binance.api.client.BinanceApiAsyncMarginRestClient; import com.binance.api.client.BinanceApiCallback; +import com.binance.api.client.BinanceEngineType; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.*; @@ -23,7 +24,7 @@ public class BinanceApiAsyncMarginRestClientImpl implements BinanceApiAsyncMargi private final BinanceApiService binanceApiService; public BinanceApiAsyncMarginRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret); + binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); } // Margin Account endpoints diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java index e6ea387b9..6dd0aaaed 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java @@ -2,6 +2,7 @@ import com.binance.api.client.BinanceApiAsyncRestClient; import com.binance.api.client.BinanceApiCallback; +import com.binance.api.client.BinanceEngineType; import com.binance.api.client.config.BinanceApiConfig; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.account.Account; @@ -43,7 +44,7 @@ public class BinanceApiAsyncRestClientImpl implements BinanceApiAsyncRestClient private final BinanceApiService binanceApiService; public BinanceApiAsyncRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret); + binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); } // General endpoints diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java new file mode 100755 index 000000000..629758213 --- /dev/null +++ b/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java @@ -0,0 +1,64 @@ +package com.binance.api.client.impl; + +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.BinanceEngineType; +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.account.FuturesAccount; +import com.binance.api.client.domain.account.FuturesNewOrder; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.Order; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; + +import java.util.List; + +import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; +import static com.binance.api.client.impl.BinanceApiServiceGenerator.executeSync; + +/** + * Implementation of Binance's Margin REST API using Retrofit with asynchronous/non-blocking method calls. + */ +public class BinanceApiFuturesRestClientImpl implements BinanceApiFuturesRestClient { + + private final BinanceFuturesApiService binanceApiService; + + public BinanceApiFuturesRestClientImpl(String apiKey, String secret) { + binanceApiService = createService(BinanceFuturesApiService.class, apiKey, secret, BinanceEngineType.FUTURES); + } + + @Override + public FuturesAccount getAccount() { + long timestamp = System.currentTimeMillis(); + return executeSync(binanceApiService.getAccount(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp)); + } + + @Override + public List getOpenOrders(OrderRequest orderRequest) { + return executeSync(binanceApiService.getOpenOrders(orderRequest.getSymbol(), orderRequest.getRecvWindow(), + orderRequest.getTimestamp())); + } + + @Override + public FuturesNewOrderResponse newOrder(FuturesNewOrder order) { + return executeSync(binanceApiService.newOrder(order.getSymbol(), order.getSide(), order.getPositionSide(), + order.getType(), order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), + order.getStopPrice(), order.isClosePosition(), order.getActivationPrice(), order.getWorkingType(), + order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp())); + } + + @Override + public CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest) { + return executeSync(binanceApiService.cancelOrder(cancelOrderRequest.getSymbol(), + cancelOrderRequest.getOrderId(), cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), + cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp())); + } + + @Override + public Order getOrderStatus(OrderStatusRequest orderStatusRequest) { + return executeSync(binanceApiService.getOrderStatus(orderStatusRequest.getSymbol(), + orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), + orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp())); + } +} \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java index 959fa2a5f..b4fb74fd1 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java @@ -1,6 +1,7 @@ package com.binance.api.client.impl; import com.binance.api.client.BinanceApiMarginRestClient; +import com.binance.api.client.BinanceEngineType; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.*; @@ -22,7 +23,7 @@ public class BinanceApiMarginRestClientImpl implements BinanceApiMarginRestClien private final BinanceApiService binanceApiService; public BinanceApiMarginRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret); + binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); } @Override diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java index dd647166d..09c80863c 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java @@ -1,6 +1,7 @@ package com.binance.api.client.impl; import com.binance.api.client.BinanceApiRestClient; +import com.binance.api.client.BinanceEngineType; import com.binance.api.client.config.BinanceApiConfig; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.account.*; @@ -24,7 +25,7 @@ public class BinanceApiRestClientImpl implements BinanceApiRestClient { private final BinanceApiService binanceApiService; public BinanceApiRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret); + binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); } // General endpoints diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java b/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java index 1bd11a9e2..8a6689162 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java @@ -1,6 +1,7 @@ package com.binance.api.client.impl; import com.binance.api.client.BinanceApiError; +import com.binance.api.client.BinanceEngineType; import com.binance.api.client.config.BinanceApiConfig; import com.binance.api.client.exception.BinanceApiException; import com.binance.api.client.security.AuthenticationInterceptor; @@ -38,16 +39,16 @@ public class BinanceApiServiceGenerator { @SuppressWarnings("unchecked") private static final Converter errorBodyConverter = - (Converter)converterFactory.responseBodyConverter( + (Converter) converterFactory.responseBodyConverter( BinanceApiError.class, new Annotation[0], null); public static S createService(Class serviceClass) { - return createService(serviceClass, null, null); + return createService(serviceClass, null, null, null); } - public static S createService(Class serviceClass, String apiKey, String secret) { + public static S createService(Class serviceClass, String apiKey, String secret, BinanceEngineType engineType) { Retrofit.Builder retrofitBuilder = new Retrofit.Builder() - .baseUrl(BinanceApiConfig.getApiBaseUrl()) + .baseUrl(engineType.equals(BinanceEngineType.SPOT) ? BinanceApiConfig.getApiBaseUrl() : BinanceApiConfig.getFuturesApiBaseUrl()) .addConverterFactory(converterFactory); if (StringUtils.isEmpty(apiKey) || StringUtils.isEmpty(secret)) { diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java index 4f1a18bc4..5b28b6115 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java @@ -1,6 +1,7 @@ package com.binance.api.client.impl; import com.binance.api.client.BinanceApiSwapRestClient; +import com.binance.api.client.BinanceEngineType; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.SwapRemoveType; import com.binance.api.client.domain.account.*; @@ -18,7 +19,7 @@ public class BinanceApiSwapRestClientImpl implements BinanceApiSwapRestClient { private final BinanceApiService binanceApiService; public BinanceApiSwapRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret); + binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); } @Override 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 be0dcf518..a4b4a522b 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java @@ -2,6 +2,7 @@ import com.binance.api.client.BinanceApiCallback; import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.BinanceEngineType; import com.binance.api.client.config.BinanceApiConfig; import com.binance.api.client.domain.event.*; import com.binance.api.client.domain.market.CandlestickInterval; @@ -21,14 +22,16 @@ public class BinanceApiWebSocketClientImpl implements BinanceApiWebSocketClient, Closeable { private final OkHttpClient client; + private final BinanceEngineType engineType; - public BinanceApiWebSocketClientImpl(OkHttpClient client) { + public BinanceApiWebSocketClientImpl(OkHttpClient client, BinanceEngineType engineType) { this.client = client; + this.engineType = engineType; } @Override public Closeable onDepthEvent(String symbols, BinanceApiCallback callback) { - final String channel = Arrays.stream(symbols.split(",")) + final String channel = Arrays.stream(symbols.toLowerCase().split(",")) .map(String::trim) .map(s -> String.format("%s@depth", s)) .collect(Collectors.joining("/")); @@ -37,7 +40,7 @@ public Closeable onDepthEvent(String symbols, BinanceApiCallback cal @Override public Closeable onCandlestickEvent(String symbols, CandlestickInterval interval, BinanceApiCallback callback) { - final String channel = Arrays.stream(symbols.split(",")) + final String channel = Arrays.stream(symbols.toLowerCase().split(",")) .map(String::trim) .map(s -> String.format("%s@kline_%s", s, interval.getIntervalId())) .collect(Collectors.joining("/")); @@ -45,7 +48,7 @@ public Closeable onCandlestickEvent(String symbols, CandlestickInterval interval } public Closeable onAggTradeEvent(String symbols, BinanceApiCallback callback) { - final String channel = Arrays.stream(symbols.split(",")) + final String channel = Arrays.stream(symbols.toLowerCase().split(",")) .map(String::trim) .map(s -> String.format("%s@aggTrade", s)) .collect(Collectors.joining("/")); @@ -58,7 +61,7 @@ public Closeable onUserDataUpdateEvent(String listenKey, BinanceApiCallback callback) { - final String channel = Arrays.stream(symbols.split(",")) + final String channel = Arrays.stream(symbols.toLowerCase().split(",")) .map(String::trim) .map(s -> String.format("%s@ticker", s)) .collect(Collectors.joining("/")); @@ -73,7 +76,7 @@ public Closeable onAllMarketTickersEvent(BinanceApiCallback> c @Override public Closeable onBookTickerEvent(String symbols, BinanceApiCallback callback) { - final String channel = Arrays.stream(symbols.split(",")) + final String channel = Arrays.stream(symbols.toLowerCase().split(",")) .map(String::trim) .map(s -> String.format("%s@bookTicker", s)) .collect(Collectors.joining("/")); @@ -93,7 +96,7 @@ public void close() { } private Closeable createNewWebSocket(String channel, BinanceApiWebSocketListener listener) { - String streamingUrl = String.format("%s/%s", BinanceApiConfig.getStreamApiBaseUrl(), channel); + String streamingUrl = String.format("%s/%s", engineType.equals(BinanceEngineType.SPOT) ? BinanceApiConfig.getStreamApiBaseUrl() : BinanceApiConfig.getFuturesStreamApiBaseUrl(), channel); Request request = new Request.Builder().url(streamingUrl).build(); final WebSocket webSocket = client.newWebSocket(request, listener); return () -> { diff --git a/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java b/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java new file mode 100755 index 000000000..687a8c82f --- /dev/null +++ b/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java @@ -0,0 +1,103 @@ +package com.binance.api.client.impl; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.*; +import com.binance.api.client.domain.account.*; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.general.Asset; +import com.binance.api.client.domain.general.ExchangeInfo; +import com.binance.api.client.domain.general.ServerTime; +import com.binance.api.client.domain.market.*; +import retrofit2.Call; +import retrofit2.http.*; + +import java.util.List; + +/** + * Binance's REST API URL mappings and endpoint security configuration. + * Implemented according to : https://binance-docs.github.io/apidocs/futures/en/#change-log + * + * @author Mahdi Sheikh Hosseini + */ +public interface BinanceFuturesApiService { + + // General endpoints + + @GET("/fapi/v1/ping") + Call ping(); + + @GET("/fapi/v1/time") + Call getServerTime(); + + @GET("/fapi/v1/exchangeInfo") + Call getExchangeInfo(); + + @GET + Call> getAllAssets(@Url String url); + + // Market data endpoints + + @GET("/fapi/v1/depth") + Call getOrderBook(@Query("symbol") String symbol, @Query("limit") Integer limit); + + @GET("/fapi/v1/trades") + Call> getTrades(@Query("symbol") String symbol, @Query("limit") Integer limit); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) + @GET("/fapi/v1/historicalTrades") + Call> getHistoricalTrades(@Query("symbol") String symbol, @Query("limit") Integer limit, @Query("fromId") Long fromId); + + @GET("/fapi/v1/aggTrades") + Call> getAggTrades(@Query("symbol") String symbol, @Query("fromId") String fromId, @Query("limit") Integer limit, + @Query("startTime") Long startTime, @Query("endTime") Long endTime); + + @GET("/fapi/v1/klines") + Call> getCandlestickBars(@Query("symbol") String symbol, @Query("interval") String interval, @Query("limit") Integer limit, + @Query("startTime") Long startTime, @Query("endTime") Long endTime); + + @GET("/fapi/v1/ticker/24hr") + Call get24HrPriceStatistics(@Query("symbol") String symbol); + + @GET("/fapi/v1/ticker/24hr") + Call> getAll24HrPriceStatistics(); + + @GET("/fapi/v1/ticker/price") + Call getLatestPrice(@Query("symbol") String symbol); + + // Account endpoints + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @POST("/fapi/v1/order") + Call newOrder(@Query("symbol") String symbol, @Query("side") OrderSide side, @Query("positionSide") PositionSide positionSide, + @Query("type") OrderType type, @Query("timeInForce") TimeInForce timeInForce, @Query("quantity") String quantity, + @Query("price") String price, @Query("newClientOrderId") String newClientOrderId, @Query("stopPrice") String stopPrice, + @Query("closePosition") boolean closePosition, @Query("activationPrice") String activationPrice, + @Query("workingType") WorkingType workingType, @Query("newOrderRespType") NewOrderResponseType newOrderRespType, + @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @GET("/fapi/v1/order") + Call getOrderStatus(@Query("symbol") String symbol, @Query("orderId") Long orderId, + @Query("origClientOrderId") String origClientOrderId, @Query("recvWindow") Long recvWindow, + @Query("timestamp") Long timestamp); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @DELETE("/fapi/v1/order") + Call cancelOrder(@Query("symbol") String symbol, @Query("orderId") Long orderId, + @Query("origClientOrderId") String origClientOrderId, @Query("newClientOrderId") String newClientOrderId, + @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @GET("/fapi/v1/openOrders") + Call> getOpenOrders(@Query("symbol") String symbol, @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @GET("/fapi/v1/allOrders") + Call> getAllOrders(@Query("symbol") String symbol, @Query("orderId") Long orderId, + @Query("limit") Integer limit, @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @GET("/fapi/v2/account") + Call getAccount(@Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + +} diff --git a/src/test/java/com/binance/api/examples/FuturesAccountExample.java b/src/test/java/com/binance/api/examples/FuturesAccountExample.java new file mode 100755 index 000000000..b703ed852 --- /dev/null +++ b/src/test/java/com/binance/api/examples/FuturesAccountExample.java @@ -0,0 +1,22 @@ +package com.binance.api.examples; + +import com.binance.api.client.BinanceApiClientFactory; +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.BinanceEngineType; +import com.binance.api.client.domain.account.FuturesAccount; + +/** + * Examples binance futures account information + */ +public class FuturesAccountExample { + private static final String SYMBOL = "LINKUSDT"; + + public static void main(String[] args) { + BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); + + FuturesAccount account = client.getAccount(); + System.out.println("Available Balance: " + account.getAvailableBalance()); + } + +} diff --git a/src/test/java/com/binance/api/examples/FuturesOrdersAsyncExample.java b/src/test/java/com/binance/api/examples/FuturesOrdersAsyncExample.java new file mode 100755 index 000000000..b0d6109c4 --- /dev/null +++ b/src/test/java/com/binance/api/examples/FuturesOrdersAsyncExample.java @@ -0,0 +1,38 @@ +package com.binance.api.examples; + +import com.binance.api.client.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.BinanceApiClientFactory; +import com.binance.api.client.domain.TimeInForce; +import com.binance.api.client.domain.WorkingType; + +import static com.binance.api.client.domain.account.FuturesNewOrder.limitLong; + +/** + * Examples on how to place orders, cancel them, and query account information. + * + * @author Mahdi Sheikh Hosseini + */ +public class FuturesOrdersAsyncExample { + + private static final String SYMBOL = "LINKETH"; + + public static void main(String[] args) { + BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiAsyncFuturesRestClient client = factory.newAsyncFuturesRestClient(); + + + // Placing a real LIMIT order +// client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false), System.out::println); + + // Getting list of open orders +// client.getOpenOrders(new OrderRequest(SYMBOL), System.out::println); + + // Get status of a particular order +// client.getOrderStatus(new OrderStatusRequest(SYMBOL, 751698L), System.out::println); + + // Canceling an order +// client.cancelOrder(new CancelOrderRequest(SYMBOL, 756762l), System.out::println); + + } + +} diff --git a/src/test/java/com/binance/api/examples/FuturesOrdersExample.java b/src/test/java/com/binance/api/examples/FuturesOrdersExample.java new file mode 100755 index 000000000..64ea34c35 --- /dev/null +++ b/src/test/java/com/binance/api/examples/FuturesOrdersExample.java @@ -0,0 +1,33 @@ +package com.binance.api.examples; + +import com.binance.api.client.BinanceApiClientFactory; +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.domain.TimeInForce; +import com.binance.api.client.domain.WorkingType; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; + +import static com.binance.api.client.domain.account.FuturesNewOrder.limitLong; + +/** + * Examples on how to place orders, cancel them. + * + * @author Mahdi Sheikh Hosseini + */ +public class FuturesOrdersExample { + private static final String SYMBOL = "LINKUSDT"; + + public static void main(String[] args) { + BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); + + FuturesNewOrderResponse futuresNewOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false)); + long orderId = futuresNewOrderResponse.getOrderId(); + System.out.println("OrderID: " + orderId); + + CancelOrderResponse cancelOrderResponse = client.cancelOrder(new CancelOrderRequest(SYMBOL, orderId)); + System.out.println("Order Status: " + cancelOrderResponse.getStatus()); + } + +} diff --git a/src/test/java/com/binance/api/examples/FuturesWebSocketExample.java b/src/test/java/com/binance/api/examples/FuturesWebSocketExample.java new file mode 100755 index 000000000..5cb85dd72 --- /dev/null +++ b/src/test/java/com/binance/api/examples/FuturesWebSocketExample.java @@ -0,0 +1,23 @@ +package com.binance.api.examples; + +import com.binance.api.client.BinanceApiClientFactory; +import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.domain.market.CandlestickInterval; + +/** + * Example binance futures websocket connection + * + * @author Mahdi Sheikh Hosseini + */ +public class FuturesWebSocketExample { + private static final String SYMBOL = "LINKUSDT"; + + public static void main(String[] args) { + BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); + BinanceApiWebSocketClient webSocketClient = factory.newFuturesWebSocketClient(); + +// webSocketClient.onTickerEvent(SYMBOL, System.out::println); + webSocketClient.onCandlestickEvent(SYMBOL, CandlestickInterval.FIFTEEN_MINUTES, System.out::println); + } + +} From 3f6475b703c49fbed3cd249c09a41f325e424f23 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Thu, 1 Apr 2021 19:41:39 +0430 Subject: [PATCH 03/18] Improvement Code --- .../BinanceApiAsyncFuturesRestClient.java | 58 +- .../api/client/BinanceApiAsyncRestClient.java | 575 +++++++++--------- .../client/BinanceApiFuturesRestClient.java | 98 +-- .../api/client/BinanceApiRestClient.java | 555 ++++++++--------- .../binance/api/client/BinanceEngineType.java | 3 +- .../binance/api/client/config/ApiConfig.java | 27 + .../api/client/config/BinanceApiConfig.java | 63 +- .../api/client/config/FuturesApiConfig.java | 6 + .../api/client/config/SpotApiConfig.java | 10 + .../api/client/config/TestnetApiConfig.java | 5 + .../api/client/domain/PositionSide.java | 26 +- .../api/client/domain/WorkingType.java | 28 +- .../client/domain/account/FuturesAccount.java | 406 ++++++------- .../domain/account/FuturesAssetBalance.java | 292 ++++----- .../domain/account/FuturesNewOrder.java | 0 .../account/FuturesNewOrderResponse.java | 0 .../domain/account/FuturesPosition.java | 282 ++++----- .../client/domain/account/MarginNewOrder.java | 0 .../account/MarginNewOrderResponse.java | 0 .../api/client/domain/account/NewOrder.java | 0 .../domain/account/NewOrderResponse.java | 0 .../domain/account/NewOrderResponseType.java | 0 .../api/client/domain/account/Order.java | 0 .../exception/BinanceIllegalException.java | 10 + .../factory/BinanceAbstractFactory.java | 80 +++ .../api/client/factory/BinanceFactory.java | 10 + .../BinanceFuturesApiClientFactory.java | 84 +++ .../factory/BinanceSpotApiClientFactory.java | 103 ++++ .../BinanceApiAsyncFuturesRestClientImpl.java | 145 +++-- .../BinanceApiAsyncMarginRestClientImpl.java | 6 +- .../impl/BinanceApiAsyncRestClientImpl.java | 439 +++++++------ .../impl/BinanceApiFuturesRestClientImpl.java | 124 ++-- .../impl/BinanceApiMarginRestClientImpl.java | 6 +- .../client/impl/BinanceApiRestClientImpl.java | 448 +++++++------- .../impl/BinanceApiServiceGenerator.java | 10 +- .../impl/BinanceApiSwapRestClientImpl.java | 6 +- .../impl/BinanceApiWebSocketClientImpl.java | 10 +- .../domain/account/SpotOrderResponseTest.java | 48 ++ .../examples/AccountBalanceCacheExample.java | 120 ++-- .../api/examples/AccountEndpointsExample.java | 41 +- .../AccountEndpointsExampleAsync.java | 32 +- .../api/examples/AggTradesCacheExample.java | 110 ++-- .../api/examples/AllMarketTickersExample.java | 16 +- .../examples/CandlesticksCacheExample.java | 120 ++-- .../api/examples/DepthCacheExample.java | 417 +++++++------ .../api/examples/GeneralEndpointsExample.java | 47 +- .../GeneralEndpointsExampleAsync.java | 47 +- .../MarginAccountEndpointsExample.java | 45 +- .../MarginAccountEndpointsExampleAsync.java | 41 +- ...arginAccountEndpointsLoanQueryExample.java | 5 +- .../api/examples/MarginOrdersExample.java | 5 +- .../examples/MarginOrdersExampleAsync.java | 16 +- .../examples/MarginUserDataStreamExample.java | 78 +-- .../examples/MarketDataEndpointsExample.java | 80 ++- .../MarketDataEndpointsExampleAsync.java | 75 +-- .../api/examples/MarketDataStreamExample.java | 24 +- .../binance/api/examples/OrdersExample.java | 65 +- .../api/examples/OrdersExampleAsync.java | 5 +- .../api/examples/SwapEndpointExample.java | 15 +- .../examples/TotalAccountBalanceExample.java | 10 +- .../api/examples/UserDataStreamExample.java | 77 +-- .../futures/FuturesAccountExample.java | 23 + .../futures/FuturesOrdersAsyncExample.java | 36 ++ .../futures/FuturesOrdersExample.java | 34 ++ .../futures/FuturesWebSocketExample.java | 24 + .../testnet/TestnetAccountExample.java | 23 + .../testnet/TestnetOrdersAsyncExample.java | 38 ++ .../testnet/TestnetOrdersExample.java | 36 ++ .../testnet/TestnetWebSocketExample.java | 24 + 69 files changed, 3056 insertions(+), 2636 deletions(-) create mode 100755 src/main/java/com/binance/api/client/config/ApiConfig.java mode change 100755 => 100644 src/main/java/com/binance/api/client/config/BinanceApiConfig.java create mode 100644 src/main/java/com/binance/api/client/config/FuturesApiConfig.java create mode 100755 src/main/java/com/binance/api/client/config/SpotApiConfig.java create mode 100644 src/main/java/com/binance/api/client/config/TestnetApiConfig.java mode change 100755 => 100644 src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java mode change 100755 => 100644 src/main/java/com/binance/api/client/domain/account/FuturesNewOrderResponse.java mode change 100755 => 100644 src/main/java/com/binance/api/client/domain/account/MarginNewOrder.java mode change 100755 => 100644 src/main/java/com/binance/api/client/domain/account/MarginNewOrderResponse.java mode change 100755 => 100644 src/main/java/com/binance/api/client/domain/account/NewOrder.java mode change 100755 => 100644 src/main/java/com/binance/api/client/domain/account/NewOrderResponse.java mode change 100755 => 100644 src/main/java/com/binance/api/client/domain/account/NewOrderResponseType.java mode change 100755 => 100644 src/main/java/com/binance/api/client/domain/account/Order.java create mode 100644 src/main/java/com/binance/api/client/exception/BinanceIllegalException.java create mode 100644 src/main/java/com/binance/api/client/factory/BinanceAbstractFactory.java create mode 100644 src/main/java/com/binance/api/client/factory/BinanceFactory.java create mode 100755 src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java create mode 100755 src/main/java/com/binance/api/client/factory/BinanceSpotApiClientFactory.java create mode 100755 src/test/java/com/binance/api/client/domain/account/SpotOrderResponseTest.java create mode 100755 src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java create mode 100755 src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java create mode 100755 src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java create mode 100755 src/test/java/com/binance/api/examples/futures/FuturesWebSocketExample.java create mode 100755 src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java create mode 100755 src/test/java/com/binance/api/examples/testnet/TestnetOrdersAsyncExample.java create mode 100755 src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java create mode 100755 src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java diff --git a/src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java b/src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java index 7d7fbc2d9..b932df43d 100755 --- a/src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java +++ b/src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java @@ -1,30 +1,30 @@ -package com.binance.api.client; - -import com.binance.api.client.domain.account.*; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; - -import java.util.List; - -/** - * Binance API façade, supporting asynchronous/non-blocking access Binance's Futures REST API. - * - * @author Mahdi Shiekh Hosseini - */ -public interface BinanceApiAsyncFuturesRestClient { - - void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback); - - void getAccount(BinanceApiCallback callback); - - void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback); - - void newOrder(FuturesNewOrder order, BinanceApiCallback callback); - - void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback); - - void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback); - +package com.binance.api.client; + +import com.binance.api.client.domain.account.*; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; + +import java.util.List; + +/** + * Binance API façade, supporting asynchronous/non-blocking access Binance's Futures REST API. + * + * @author Mahdi Shiekh Hosseini + */ +public interface BinanceApiAsyncFuturesRestClient { + + void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback); + + void getAccount(BinanceApiCallback callback); + + void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback); + + void newOrder(FuturesNewOrder order, BinanceApiCallback callback); + + void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback); + + void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback); + } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java b/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java index 112d439d6..989562868 100755 --- a/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java +++ b/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java @@ -1,31 +1,11 @@ package com.binance.api.client; -import com.binance.api.client.domain.account.Account; -import com.binance.api.client.domain.account.DepositAddress; -import com.binance.api.client.domain.account.DepositHistory; -import com.binance.api.client.domain.account.NewOrder; -import com.binance.api.client.domain.account.NewOrderResponse; -import com.binance.api.client.domain.account.Order; -import com.binance.api.client.domain.account.Trade; -import com.binance.api.client.domain.account.TradeHistoryItem; -import com.binance.api.client.domain.account.WithdrawHistory; -import com.binance.api.client.domain.account.WithdrawResult; -import com.binance.api.client.domain.account.request.AllOrdersRequest; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; +import com.binance.api.client.domain.account.*; +import com.binance.api.client.domain.account.request.*; import com.binance.api.client.domain.event.ListenKey; -import com.binance.api.client.domain.general.Asset; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.general.ServerTime; -import com.binance.api.client.domain.market.AggTrade; -import com.binance.api.client.domain.market.BookTicker; -import com.binance.api.client.domain.market.Candlestick; -import com.binance.api.client.domain.market.CandlestickInterval; -import com.binance.api.client.domain.market.OrderBook; -import com.binance.api.client.domain.market.TickerPrice; -import com.binance.api.client.domain.market.TickerStatistics; +import com.binance.api.client.domain.market.*; import java.util.List; @@ -34,281 +14,276 @@ */ public interface BinanceApiAsyncRestClient { - // General endpoints - - /** - * Test connectivity to the Rest API. - */ - void ping(BinanceApiCallback callback); - - /** - * Check server time. - */ - void getServerTime(BinanceApiCallback callback); - - /** - * Current exchange trading rules and symbol information - */ - void getExchangeInfo(BinanceApiCallback callback); - - /** - * ALL supported assets and whether or not they can be withdrawn. - */ - void getAllAssets(BinanceApiCallback> callback); - - // Market Data endpoints - - /** - * Get order book of a symbol (asynchronous) - * - * @param symbol ticker symbol (e.g. ETHBTC) - * @param limit depth of the order book (max 100) - * @param callback the callback that handles the response - */ - void getOrderBook(String symbol, Integer limit, BinanceApiCallback callback); - - /** - * Get recent trades (up to last 500). Weight: 1 - * - * @param symbol ticker symbol (e.g. ETHBTC) - * @param limit of last trades (Default 500; max 1000.) - * @param callback the callback that handles the response - */ - void getTrades(String symbol, Integer limit, BinanceApiCallback> callback); - - /** - * Get older trades. Weight: 5 - * - * @param symbol ticker symbol (e.g. ETHBTC) - * @param limit of last trades (Default 500; max 1000.)getMyTrades - * @param fromId TradeId to fetch from. Default gets most recent trades. - * @param callback the callback that handles the response - */ - void getHistoricalTrades(String symbol, Integer limit, Long fromId, BinanceApiCallback> callback); - - /** - * Get compressed, aggregate trades. Trades that fill at the time, from the same order, with - * the same price will have the quantity aggregated. - * - * If both startTime and endTime are sent, limitshould not - * be sent AND the distance between startTime and endTime must be less than 24 hours. - * - * @param symbol symbol to aggregate (mandatory) - * @param fromId ID to get aggregate trades from INCLUSIVE (optional) - * @param limit Default 500; max 1000 (optional) - * @param startTime Timestamp in ms to get aggregate trades from INCLUSIVE (optional). - * @param endTime Timestamp in ms to get aggregate trades until INCLUSIVE (optional). - * @param callback the callback that handles the response - * @return a list of aggregate trades for the given symbol - */ - void getAggTrades(String symbol, String fromId, Integer limit, Long startTime, Long endTime, BinanceApiCallback> callback); - - /** - * Return the most recent aggregate trades for symbol - * - * @see #getAggTrades(String, String, Integer, Long, Long, BinanceApiCallback) - */ - void getAggTrades(String symbol, BinanceApiCallback> callback); - - /** - * Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. - * - * @param symbol symbol to aggregate (mandatory) - * @param interval candlestick interval (mandatory) - * @param limit Default 500; max 1000 (optional) - * @param startTime Timestamp in ms to get candlestick bars from INCLUSIVE (optional). - * @param endTime Timestamp in ms to get candlestick bars until INCLUSIVE (optional). - * @param callback the callback that handles the response containing a candlestick bar for the given symbol and interval - */ - void getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime, BinanceApiCallback> callback); - - /** - * Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. - * - * @see #getCandlestickBars(String, CandlestickInterval, BinanceApiCallback) - */ - void getCandlestickBars(String symbol, CandlestickInterval interval, BinanceApiCallback> callback); - - /** - * Get 24 hour price change statistics (asynchronous). - * - * @param symbol ticker symbol (e.g. ETHBTC) - * @param callback the callback that handles the response - */ - void get24HrPriceStatistics(String symbol, BinanceApiCallback callback); - - /** - * Get 24 hour price change statistics for all symbols (asynchronous). - * - * @param callback the callback that handles the response - */ - void getAll24HrPriceStatistics(BinanceApiCallback> callback); - - /** - * Get Latest price for all symbols (asynchronous). - * - * @param callback the callback that handles the response - */ - void getAllPrices(BinanceApiCallback> callback); - - /** - * Get latest price for symbol (asynchronous). - * - * @param symbol ticker symbol (e.g. ETHBTC) - * @param callback the callback that handles the response - */ - void getPrice(String symbol , BinanceApiCallback callback); - - /** - * Get best price/qty on the order book for all symbols (asynchronous). - * - * @param callback the callback that handles the response - */ - void getBookTickers(BinanceApiCallback> callback); - - // Account endpoints - - /** - * Send in a new order (asynchronous) - * - * @param order the new order to submit. - * @param callback the callback that handles the response - */ - void newOrder(NewOrder order, BinanceApiCallback callback); - - /** - * Test new order creation and signature/recvWindow long. Creates and validates a new order but does not send it into the matching engine. - * - * @param order the new TEST order to submit. - * @param callback the callback that handles the response - */ - void newOrderTest(NewOrder order, BinanceApiCallback callback); - - /** - * Check an order's status (asynchronous). - * - * @param orderStatusRequest order status request parameters - * @param callback the callback that handles the response - */ - void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback); - - /** - * Cancel an active order (asynchronous). - * - * @param cancelOrderRequest order status request parameters - * @param callback the callback that handles the response - */ - void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback); - - /** - * Get all open orders on a symbol (asynchronous). - * - * @param orderRequest order request parameters - * @param callback the callback that handles the response - */ - void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback); - - /** - * Get all account orders; active, canceled, or filled. - * - * @param orderRequest order request parameters - * @param callback the callback that handles the response - */ - void getAllOrders(AllOrdersRequest orderRequest, BinanceApiCallback> callback); - - /** - * Get current account information (async). - */ - void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback); - - /** - * Get current account information using default parameters (async). - */ - void getAccount(BinanceApiCallback callback); - - /** - * Get trades for a specific account and symbol. - * - * @param symbol symbol to get trades from - * @param limit default 500; max 1000 - * @param fromId TradeId to fetch from. Default gets most recent trades. - * @param callback the callback that handles the response with a list of trades - */ - void getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp, BinanceApiCallback> callback); - - /** - * Get trades for a specific account and symbol. - * - * @param symbol symbol to get trades from - * @param limit default 500; max 1000 - * @param callback the callback that handles the response with a list of trades - */ - void getMyTrades(String symbol, Integer limit, BinanceApiCallback> callback); - - /** - * Get trades for a specific account and symbol. - * - * @param symbol symbol to get trades from - * @param callback the callback that handles the response with a list of trades - */ - void getMyTrades(String symbol, BinanceApiCallback> callback); - - /** - * Submit a withdraw request. - * - * Enable Withdrawals option has to be active in the API settings. - * - * @param asset asset symbol to withdraw - * @param address address to withdraw to - * @param amount amount to withdraw - * @param name description/alias of the address - * @param addressTag Secondary address identifier for coins like XRP,XMR etc. - */ - void withdraw(String asset, String address, String amount, String name, String addressTag, BinanceApiCallback callback); - - /** - * Fetch account deposit history. - * - * @param callback the callback that handles the response and returns the deposit history - */ - void getDepositHistory(String asset, BinanceApiCallback callback); - - /** - * Fetch account withdraw history. - * - * @param callback the callback that handles the response and returns the withdraw history - */ - void getWithdrawHistory(String asset, BinanceApiCallback callback); - - /** - * Fetch deposit address. - * - * @param callback the callback that handles the response and returns the deposit address - */ - void getDepositAddress(String asset, BinanceApiCallback callback); - - // User stream endpoints - - /** - * Start a new user data stream. - * - * @param callback the callback that handles the response which contains a listenKey - */ - void startUserDataStream(BinanceApiCallback callback); - - /** - * PING a user data stream to prevent a time out. - * - * @param listenKey listen key that identifies a data stream - * @param callback the callback that handles the response which contains a listenKey - */ - void keepAliveUserDataStream(String listenKey, BinanceApiCallback callback); - - /** - * Close out a new user data stream. - * - * @param listenKey listen key that identifies a data stream - * @param callback the callback that handles the response which contains a listenKey - */ - void closeUserDataStream(String listenKey, BinanceApiCallback callback); + // General endpoints + + /** + * Test connectivity to the Rest API. + */ + void ping(BinanceApiCallback callback); + + /** + * Check server time. + */ + void getServerTime(BinanceApiCallback callback); + + /** + * Current exchange trading rules and symbol information + */ + void getExchangeInfo(BinanceApiCallback callback); + + // Market Data endpoints + + /** + * Get order book of a symbol (asynchronous) + * + * @param symbol ticker symbol (e.g. ETHBTC) + * @param limit depth of the order book (max 100) + * @param callback the callback that handles the response + */ + void getOrderBook(String symbol, Integer limit, BinanceApiCallback callback); + + /** + * Get recent trades (up to last 500). Weight: 1 + * + * @param symbol ticker symbol (e.g. ETHBTC) + * @param limit of last trades (Default 500; max 1000.) + * @param callback the callback that handles the response + */ + void getTrades(String symbol, Integer limit, BinanceApiCallback> callback); + + /** + * Get older trades. Weight: 5 + * + * @param symbol ticker symbol (e.g. ETHBTC) + * @param limit of last trades (Default 500; max 1000.)getMyTrades + * @param fromId TradeId to fetch from. Default gets most recent trades. + * @param callback the callback that handles the response + */ + void getHistoricalTrades(String symbol, Integer limit, Long fromId, BinanceApiCallback> callback); + + /** + * Get compressed, aggregate trades. Trades that fill at the time, from the same order, with + * the same price will have the quantity aggregated. + *

+ * If both startTime and endTime are sent, limitshould not + * be sent AND the distance between startTime and endTime must be less than 24 hours. + * + * @param symbol symbol to aggregate (mandatory) + * @param fromId ID to get aggregate trades from INCLUSIVE (optional) + * @param limit Default 500; max 1000 (optional) + * @param startTime Timestamp in ms to get aggregate trades from INCLUSIVE (optional). + * @param endTime Timestamp in ms to get aggregate trades until INCLUSIVE (optional). + * @param callback the callback that handles the response + * @return a list of aggregate trades for the given symbol + */ + void getAggTrades(String symbol, String fromId, Integer limit, Long startTime, Long endTime, BinanceApiCallback> callback); + + /** + * Return the most recent aggregate trades for symbol + * + * @see #getAggTrades(String, String, Integer, Long, Long, BinanceApiCallback) + */ + void getAggTrades(String symbol, BinanceApiCallback> callback); + + /** + * Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. + * + * @param symbol symbol to aggregate (mandatory) + * @param interval candlestick interval (mandatory) + * @param limit Default 500; max 1000 (optional) + * @param startTime Timestamp in ms to get candlestick bars from INCLUSIVE (optional). + * @param endTime Timestamp in ms to get candlestick bars until INCLUSIVE (optional). + * @param callback the callback that handles the response containing a candlestick bar for the given symbol and interval + */ + void getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime, BinanceApiCallback> callback); + + /** + * Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. + * + * @see #getCandlestickBars(String, CandlestickInterval, BinanceApiCallback) + */ + void getCandlestickBars(String symbol, CandlestickInterval interval, BinanceApiCallback> callback); + + /** + * Get 24 hour price change statistics (asynchronous). + * + * @param symbol ticker symbol (e.g. ETHBTC) + * @param callback the callback that handles the response + */ + void get24HrPriceStatistics(String symbol, BinanceApiCallback callback); + + /** + * Get 24 hour price change statistics for all symbols (asynchronous). + * + * @param callback the callback that handles the response + */ + void getAll24HrPriceStatistics(BinanceApiCallback> callback); + + /** + * Get Latest price for all symbols (asynchronous). + * + * @param callback the callback that handles the response + */ + void getAllPrices(BinanceApiCallback> callback); + + /** + * Get latest price for symbol (asynchronous). + * + * @param symbol ticker symbol (e.g. ETHBTC) + * @param callback the callback that handles the response + */ + void getPrice(String symbol, BinanceApiCallback callback); + + /** + * Get best price/qty on the order book for all symbols (asynchronous). + * + * @param callback the callback that handles the response + */ + void getBookTickers(BinanceApiCallback> callback); + + // Account endpoints + + /** + * Send in a new order (asynchronous) + * + * @param order the new order to submit. + * @param callback the callback that handles the response + */ + void newOrder(NewOrder order, BinanceApiCallback callback); + + /** + * Test new order creation and signature/recvWindow long. Creates and validates a new order but does not send it into the matching engine. + * + * @param order the new TEST order to submit. + * @param callback the callback that handles the response + */ + void newOrderTest(NewOrder order, BinanceApiCallback callback); + + /** + * Check an order's status (asynchronous). + * + * @param orderStatusRequest order status request parameters + * @param callback the callback that handles the response + */ + void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback); + + /** + * Cancel an active order (asynchronous). + * + * @param cancelOrderRequest order status request parameters + * @param callback the callback that handles the response + */ + void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback); + + /** + * Get all open orders on a symbol (asynchronous). + * + * @param orderRequest order request parameters + * @param callback the callback that handles the response + */ + void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback); + + /** + * Get all account orders; active, canceled, or filled. + * + * @param orderRequest order request parameters + * @param callback the callback that handles the response + */ + void getAllOrders(AllOrdersRequest orderRequest, BinanceApiCallback> callback); + + /** + * Get current account information (async). + */ + void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback); + + /** + * Get current account information using default parameters (async). + */ + void getAccount(BinanceApiCallback callback); + + /** + * Get trades for a specific account and symbol. + * + * @param symbol symbol to get trades from + * @param limit default 500; max 1000 + * @param fromId TradeId to fetch from. Default gets most recent trades. + * @param callback the callback that handles the response with a list of trades + */ + void getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp, BinanceApiCallback> callback); + + /** + * Get trades for a specific account and symbol. + * + * @param symbol symbol to get trades from + * @param limit default 500; max 1000 + * @param callback the callback that handles the response with a list of trades + */ + void getMyTrades(String symbol, Integer limit, BinanceApiCallback> callback); + + /** + * Get trades for a specific account and symbol. + * + * @param symbol symbol to get trades from + * @param callback the callback that handles the response with a list of trades + */ + void getMyTrades(String symbol, BinanceApiCallback> callback); + + /** + * Submit a withdraw request. + *

+ * Enable Withdrawals option has to be active in the API settings. + * + * @param asset asset symbol to withdraw + * @param address address to withdraw to + * @param amount amount to withdraw + * @param name description/alias of the address + * @param addressTag Secondary address identifier for coins like XRP,XMR etc. + */ + void withdraw(String asset, String address, String amount, String name, String addressTag, BinanceApiCallback callback); + + /** + * Fetch account deposit history. + * + * @param callback the callback that handles the response and returns the deposit history + */ + void getDepositHistory(String asset, BinanceApiCallback callback); + + /** + * Fetch account withdraw history. + * + * @param callback the callback that handles the response and returns the withdraw history + */ + void getWithdrawHistory(String asset, BinanceApiCallback callback); + + /** + * Fetch deposit address. + * + * @param callback the callback that handles the response and returns the deposit address + */ + void getDepositAddress(String asset, BinanceApiCallback callback); + + // User stream endpoints + + /** + * Start a new user data stream. + * + * @param callback the callback that handles the response which contains a listenKey + */ + void startUserDataStream(BinanceApiCallback callback); + + /** + * PING a user data stream to prevent a time out. + * + * @param listenKey listen key that identifies a data stream + * @param callback the callback that handles the response which contains a listenKey + */ + void keepAliveUserDataStream(String listenKey, BinanceApiCallback callback); + + /** + * Close out a new user data stream. + * + * @param listenKey listen key that identifies a data stream + * @param callback the callback that handles the response which contains a listenKey + */ + void closeUserDataStream(String listenKey, BinanceApiCallback callback); } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java b/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java index 9fe492b9c..6273a4325 100755 --- a/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java +++ b/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java @@ -1,49 +1,49 @@ -package com.binance.api.client; - -import com.binance.api.client.domain.account.FuturesAccount; -import com.binance.api.client.domain.account.FuturesNewOrder; -import com.binance.api.client.domain.account.FuturesNewOrderResponse; -import com.binance.api.client.domain.account.Order; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; - -import java.util.List; - -public interface BinanceApiFuturesRestClient { - /** - * Get current margin account information using default parameters. - */ - FuturesAccount getAccount(); - - /** - * Get all open orders on margin account for a symbol. - * - * @param orderRequest order request parameters - */ - List getOpenOrders(OrderRequest orderRequest); - - /** - * Send in a new margin order. - * - * @param order the new order to submit. - * @return a response containing details about the newly placed order. - */ - FuturesNewOrderResponse newOrder(FuturesNewOrder order); - - /** - * Cancel an active margin order. - * - * @param cancelOrderRequest order status request parameters - */ - CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest); - - /** - * Check margin order's status. - * - * @param orderStatusRequest order status request options/filters - * @return an order - */ - Order getOrderStatus(OrderStatusRequest orderStatusRequest); -} +package com.binance.api.client; + +import com.binance.api.client.domain.account.FuturesAccount; +import com.binance.api.client.domain.account.FuturesNewOrder; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.Order; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; + +import java.util.List; + +public interface BinanceApiFuturesRestClient { + /** + * Get current margin account information using default parameters. + */ + FuturesAccount getAccount(); + + /** + * Get all open orders on margin account for a symbol. + * + * @param orderRequest order request parameters + */ + List getOpenOrders(OrderRequest orderRequest); + + /** + * Send in a new margin order. + * + * @param order the new order to submit. + * @return a response containing details about the newly placed order. + */ + FuturesNewOrderResponse newOrder(FuturesNewOrder order); + + /** + * Cancel an active margin order. + * + * @param cancelOrderRequest order status request parameters + */ + CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest); + + /** + * Check margin order's status. + * + * @param orderStatusRequest order status request options/filters + * @return an order + */ + Order getOrderStatus(OrderStatusRequest orderStatusRequest); +} diff --git a/src/main/java/com/binance/api/client/BinanceApiRestClient.java b/src/main/java/com/binance/api/client/BinanceApiRestClient.java index bfc4797c4..2567b257b 100755 --- a/src/main/java/com/binance/api/client/BinanceApiRestClient.java +++ b/src/main/java/com/binance/api/client/BinanceApiRestClient.java @@ -1,20 +1,10 @@ package com.binance.api.client; import com.binance.api.client.domain.account.*; -import com.binance.api.client.domain.account.request.AllOrdersRequest; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; -import com.binance.api.client.domain.general.ExchangeInfo; +import com.binance.api.client.domain.account.request.*; import com.binance.api.client.domain.general.Asset; -import com.binance.api.client.domain.market.AggTrade; -import com.binance.api.client.domain.market.BookTicker; -import com.binance.api.client.domain.market.Candlestick; -import com.binance.api.client.domain.market.CandlestickInterval; -import com.binance.api.client.domain.market.OrderBook; -import com.binance.api.client.domain.market.TickerPrice; -import com.binance.api.client.domain.market.TickerStatistics; +import com.binance.api.client.domain.general.ExchangeInfo; +import com.binance.api.client.domain.market.*; import java.util.List; @@ -23,276 +13,271 @@ */ public interface BinanceApiRestClient { - // General endpoints - - /** - * Test connectivity to the Rest API. - */ - void ping(); - - /** - * Test connectivity to the Rest API and get the current server time. - * - * @return current server time. - */ - Long getServerTime(); - - /** - * @return Current exchange trading rules and symbol information - */ - ExchangeInfo getExchangeInfo(); - - /** - * @return All the supported assets and whether or not they can be withdrawn. - */ - List getAllAssets(); - - // Market Data endpoints - - /** - * Get order book of a symbol. - * - * @param symbol ticker symbol (e.g. ETHBTC) - * @param limit depth of the order book (max 100) - */ - OrderBook getOrderBook(String symbol, Integer limit); - - /** - * Get recent trades (up to last 500). Weight: 1 - * - * @param symbol ticker symbol (e.g. ETHBTC) - * @param limit of last trades (Default 500; max 1000.) - */ - List getTrades(String symbol, Integer limit); - - /** - * Get older trades. Weight: 5 - * - * @param symbol ticker symbol (e.g. ETHBTC) - * @param limit of last trades (Default 500; max 1000.) - * @param fromId TradeId to fetch from. Default gets most recent trades. - */ - List getHistoricalTrades(String symbol, Integer limit, Long fromId); - - /** - * Get compressed, aggregate trades. Trades that fill at the time, from the same order, with - * the same price will have the quantity aggregated. - * - * If both startTime and endTime are sent, limitshould not - * be sent AND the distance between startTime and endTime must be less than 24 hours. - * - * @param symbol symbol to aggregate (mandatory) - * @param fromId ID to get aggregate trades from INCLUSIVE (optional) - * @param limit Default 500; max 1000 (optional) - * @param startTime Timestamp in ms to get aggregate trades from INCLUSIVE (optional). - * @param endTime Timestamp in ms to get aggregate trades until INCLUSIVE (optional). - * @return a list of aggregate trades for the given symbol - */ - List getAggTrades(String symbol, String fromId, Integer limit, Long startTime, Long endTime); - - /** - * Return the most recent aggregate trades for symbol - * - * @see #getAggTrades(String, String, Integer, Long, Long) - */ - List getAggTrades(String symbol); - - /** - * Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. - * - * @param symbol symbol to aggregate (mandatory) - * @param interval candlestick interval (mandatory) - * @param limit Default 500; max 1000 (optional) - * @param startTime Timestamp in ms to get candlestick bars from INCLUSIVE (optional). - * @param endTime Timestamp in ms to get candlestick bars until INCLUSIVE (optional). - * @return a candlestick bar for the given symbol and interval - */ - List getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime); - - /** - * Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. - * - * @see #getCandlestickBars(String, CandlestickInterval, Integer, Long, Long) - */ - List getCandlestickBars(String symbol, CandlestickInterval interval); - - /** - * Get 24 hour price change statistics. - * - * @param symbol ticker symbol (e.g. ETHBTC) - */ - TickerStatistics get24HrPriceStatistics(String symbol); - - /** - * Get 24 hour price change statistics for all symbols. - */ - List getAll24HrPriceStatistics(); - - /** - * Get Latest price for all symbols. - */ - List getAllPrices(); - - /** - * Get latest price for symbol. - * - * @param symbol ticker symbol (e.g. ETHBTC) - */ - TickerPrice getPrice(String symbol); - - /** - * Get best price/qty on the order book for all symbols. - */ - List getBookTickers(); - - // Account endpoints - - /** - * Send in a new order. - * - * @param order the new order to submit. - * @return a response containing details about the newly placed order. - */ - NewOrderResponse newOrder(NewOrder order); - - /** - * Test new order creation and signature/recvWindow long. Creates and validates a new order but does not send it into the matching engine. - * - * @param order the new TEST order to submit. - */ - void newOrderTest(NewOrder order); - - /** - * Check an order's status. - * @param orderStatusRequest order status request options/filters - * - * @return an order - */ - Order getOrderStatus(OrderStatusRequest orderStatusRequest); - - /** - * Cancel an active order. - * - * @param cancelOrderRequest order status request parameters - */ - CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest); - - /** - * Get all open orders on a symbol. - * - * @param orderRequest order request parameters - * @return a list of all account open orders on a symbol. - */ - List getOpenOrders(OrderRequest orderRequest); - - /** - * Get all account orders; active, canceled, or filled. - * - * @param orderRequest order request parameters - * @return a list of all account orders - */ - List getAllOrders(AllOrdersRequest orderRequest); - - /** - * Get current account information. - */ - Account getAccount(Long recvWindow, Long timestamp); - - /** - * Get current account information using default parameters. - */ - Account getAccount(); - - /** - * Get trades for a specific account and symbol. - * - * @param symbol symbol to get trades from - * @param limit default 500; max 1000 - * @param fromId TradeId to fetch from. Default gets most recent trades. - * @return a list of trades - */ - List getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp); - - /** - * Get trades for a specific account and symbol. - * - * @param symbol symbol to get trades from - * @param limit default 500; max 1000 - * @return a list of trades - */ - List getMyTrades(String symbol, Integer limit); - - /** - * Get trades for a specific account and symbol. - * - * @param symbol symbol to get trades from - * @return a list of trades - */ - List getMyTrades(String symbol); - - List getMyTrades(String symbol, Long fromId); - - /** - * Submit a withdraw request. - * - * Enable Withdrawals option has to be active in the API settings. - * - * @param asset asset symbol to withdraw - * @param address address to withdraw to - * @param amount amount to withdraw - * @param name description/alias of the address - * @param addressTag Secondary address identifier for coins like XRP,XMR etc. - */ - WithdrawResult withdraw(String asset, String address, String amount, String name, String addressTag); - - /** - * Fetch account deposit history. - * - * @return deposit history, containing a list of deposits - */ - DepositHistory getDepositHistory(String asset); - - /** - * Fetch account withdraw history. - * - * @return withdraw history, containing a list of withdrawals - */ - WithdrawHistory getWithdrawHistory(String asset); - - /** - * Fetch sub-account transfer history. - * - * @return sub-account transfers - */ - List getSubAccountTransfers(); - - /** - * Fetch deposit address. - * - * @return deposit address for a given asset. - */ - DepositAddress getDepositAddress(String asset); - - // User stream endpoints - - /** - * Start a new user data stream. - * - * @return a listen key that can be used with data streams - */ - String startUserDataStream(); - - /** - * PING a user data stream to prevent a time out. - * - * @param listenKey listen key that identifies a data stream - */ - void keepAliveUserDataStream(String listenKey); - - /** - * Close out a new user data stream. - * - * @param listenKey listen key that identifies a data stream - */ - void closeUserDataStream(String listenKey); + // General endpoints + + /** + * Test connectivity to the Rest API. + */ + void ping(); + + /** + * Test connectivity to the Rest API and get the current server time. + * + * @return current server time. + */ + Long getServerTime(); + + /** + * @return Current exchange trading rules and symbol information + */ + ExchangeInfo getExchangeInfo(); + + // Market Data endpoints + + /** + * Get order book of a symbol. + * + * @param symbol ticker symbol (e.g. ETHBTC) + * @param limit depth of the order book (max 100) + */ + OrderBook getOrderBook(String symbol, Integer limit); + + /** + * Get recent trades (up to last 500). Weight: 1 + * + * @param symbol ticker symbol (e.g. ETHBTC) + * @param limit of last trades (Default 500; max 1000.) + */ + List getTrades(String symbol, Integer limit); + + /** + * Get older trades. Weight: 5 + * + * @param symbol ticker symbol (e.g. ETHBTC) + * @param limit of last trades (Default 500; max 1000.) + * @param fromId TradeId to fetch from. Default gets most recent trades. + */ + List getHistoricalTrades(String symbol, Integer limit, Long fromId); + + /** + * Get compressed, aggregate trades. Trades that fill at the time, from the same order, with + * the same price will have the quantity aggregated. + *

+ * If both startTime and endTime are sent, limitshould not + * be sent AND the distance between startTime and endTime must be less than 24 hours. + * + * @param symbol symbol to aggregate (mandatory) + * @param fromId ID to get aggregate trades from INCLUSIVE (optional) + * @param limit Default 500; max 1000 (optional) + * @param startTime Timestamp in ms to get aggregate trades from INCLUSIVE (optional). + * @param endTime Timestamp in ms to get aggregate trades until INCLUSIVE (optional). + * @return a list of aggregate trades for the given symbol + */ + List getAggTrades(String symbol, String fromId, Integer limit, Long startTime, Long endTime); + + /** + * Return the most recent aggregate trades for symbol + * + * @see #getAggTrades(String, String, Integer, Long, Long) + */ + List getAggTrades(String symbol); + + /** + * Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. + * + * @param symbol symbol to aggregate (mandatory) + * @param interval candlestick interval (mandatory) + * @param limit Default 500; max 1000 (optional) + * @param startTime Timestamp in ms to get candlestick bars from INCLUSIVE (optional). + * @param endTime Timestamp in ms to get candlestick bars until INCLUSIVE (optional). + * @return a candlestick bar for the given symbol and interval + */ + List getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime); + + /** + * Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. + * + * @see #getCandlestickBars(String, CandlestickInterval, Integer, Long, Long) + */ + List getCandlestickBars(String symbol, CandlestickInterval interval); + + /** + * Get 24 hour price change statistics. + * + * @param symbol ticker symbol (e.g. ETHBTC) + */ + TickerStatistics get24HrPriceStatistics(String symbol); + + /** + * Get 24 hour price change statistics for all symbols. + */ + List getAll24HrPriceStatistics(); + + /** + * Get Latest price for all symbols. + */ + List getAllPrices(); + + /** + * Get latest price for symbol. + * + * @param symbol ticker symbol (e.g. ETHBTC) + */ + TickerPrice getPrice(String symbol); + + /** + * Get best price/qty on the order book for all symbols. + */ + List getBookTickers(); + + // Account endpoints + + /** + * Send in a new order. + * + * @param order the new order to submit. + * @return a response containing details about the newly placed order. + */ + NewOrderResponse newOrder(NewOrder order); + + /** + * Test new order creation and signature/recvWindow long. Creates and validates a new order but does not send it into the matching engine. + * + * @param order the new TEST order to submit. + */ + void newOrderTest(NewOrder order); + + /** + * Check an order's status. + * + * @param orderStatusRequest order status request options/filters + * @return an order + */ + Order getOrderStatus(OrderStatusRequest orderStatusRequest); + + /** + * Cancel an active order. + * + * @param cancelOrderRequest order status request parameters + */ + CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest); + + /** + * Get all open orders on a symbol. + * + * @param orderRequest order request parameters + * @return a list of all account open orders on a symbol. + */ + List getOpenOrders(OrderRequest orderRequest); + + /** + * Get all account orders; active, canceled, or filled. + * + * @param orderRequest order request parameters + * @return a list of all account orders + */ + List getAllOrders(AllOrdersRequest orderRequest); + + /** + * Get current account information. + */ + Account getAccount(Long recvWindow, Long timestamp); + + /** + * Get current account information using default parameters. + */ + Account getAccount(); + + /** + * Get trades for a specific account and symbol. + * + * @param symbol symbol to get trades from + * @param limit default 500; max 1000 + * @param fromId TradeId to fetch from. Default gets most recent trades. + * @return a list of trades + */ + List getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp); + + /** + * Get trades for a specific account and symbol. + * + * @param symbol symbol to get trades from + * @param limit default 500; max 1000 + * @return a list of trades + */ + List getMyTrades(String symbol, Integer limit); + + /** + * Get trades for a specific account and symbol. + * + * @param symbol symbol to get trades from + * @return a list of trades + */ + List getMyTrades(String symbol); + + List getMyTrades(String symbol, Long fromId); + + /** + * Submit a withdraw request. + *

+ * Enable Withdrawals option has to be active in the API settings. + * + * @param asset asset symbol to withdraw + * @param address address to withdraw to + * @param amount amount to withdraw + * @param name description/alias of the address + * @param addressTag Secondary address identifier for coins like XRP,XMR etc. + */ + WithdrawResult withdraw(String asset, String address, String amount, String name, String addressTag); + + /** + * Fetch account deposit history. + * + * @return deposit history, containing a list of deposits + */ + DepositHistory getDepositHistory(String asset); + + /** + * Fetch account withdraw history. + * + * @return withdraw history, containing a list of withdrawals + */ + WithdrawHistory getWithdrawHistory(String asset); + + /** + * Fetch sub-account transfer history. + * + * @return sub-account transfers + */ + List getSubAccountTransfers(); + + /** + * Fetch deposit address. + * + * @return deposit address for a given asset. + */ + DepositAddress getDepositAddress(String asset); + + // User stream endpoints + + /** + * Start a new user data stream. + * + * @return a listen key that can be used with data streams + */ + String startUserDataStream(); + + /** + * PING a user data stream to prevent a time out. + * + * @param listenKey listen key that identifies a data stream + */ + void keepAliveUserDataStream(String listenKey); + + /** + * Close out a new user data stream. + * + * @param listenKey listen key that identifies a data stream + */ + void closeUserDataStream(String listenKey); } diff --git a/src/main/java/com/binance/api/client/BinanceEngineType.java b/src/main/java/com/binance/api/client/BinanceEngineType.java index cff8b7e24..2a07a9545 100644 --- a/src/main/java/com/binance/api/client/BinanceEngineType.java +++ b/src/main/java/com/binance/api/client/BinanceEngineType.java @@ -5,5 +5,6 @@ */ public enum BinanceEngineType { SPOT, - FUTURES + FUTURES, + TESTNET } diff --git a/src/main/java/com/binance/api/client/config/ApiConfig.java b/src/main/java/com/binance/api/client/config/ApiConfig.java new file mode 100755 index 000000000..0d24e7bb4 --- /dev/null +++ b/src/main/java/com/binance/api/client/config/ApiConfig.java @@ -0,0 +1,27 @@ +package com.binance.api.client.config; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + + +/** + * Configuration used for Binance operations. + */ + +@Retention(RUNTIME) +@Target(TYPE) +public @interface ApiConfig { + + /** + * Domain of Rest URLs. + */ + String apiUrl(); + + /** + * Domain of WebSocket. + */ + String webSocketUrl(); +} diff --git a/src/main/java/com/binance/api/client/config/BinanceApiConfig.java b/src/main/java/com/binance/api/client/config/BinanceApiConfig.java old mode 100755 new mode 100644 index ba699dff2..0384771ab --- a/src/main/java/com/binance/api/client/config/BinanceApiConfig.java +++ b/src/main/java/com/binance/api/client/config/BinanceApiConfig.java @@ -1,65 +1,4 @@ package com.binance.api.client.config; -/** - * Configuration used for Binance operations. - */ -public class BinanceApiConfig { - - /** - * Base domain for URLs. - */ - private static String BASE_DOMAIN = "binance.com"; - - /** - * Set the URL base domain name (e.g., binance.com). - * - * @param baseDomain Base domain name - */ - public static void setBaseDomain(final String baseDomain) { - BASE_DOMAIN = baseDomain; - } - - /** - * Get the URL base domain name (e.g., binance.com). - * - * @return The base domain for URLs - */ - public static String getBaseDomain() { - return BASE_DOMAIN; - } - - /** - * REST API base URL. - */ - public static String getApiBaseUrl() { - return String.format("https://api.%s", getBaseDomain()); - } - - /** - * Streaming API base URL. - */ - public static String getStreamApiBaseUrl() { - return String.format("wss://stream.%s:9443/ws", getBaseDomain()); - } - - /** - * Asset info base URL. - */ - public static String getAssetInfoApiBaseUrl() { - return String.format("https://%s/", getBaseDomain()); - } - - /** - * Futures REST API base URL. - */ - public static String getFuturesApiBaseUrl() { - return String.format("https://fapi.%s", getBaseDomain()); - } - - /** - * Futures Streaming API base URL. - */ - public static String getFuturesStreamApiBaseUrl() { - return String.format("wss://fstream.%s/ws", getBaseDomain()); - } +public interface BinanceApiConfig { } diff --git a/src/main/java/com/binance/api/client/config/FuturesApiConfig.java b/src/main/java/com/binance/api/client/config/FuturesApiConfig.java new file mode 100644 index 000000000..3d435f94e --- /dev/null +++ b/src/main/java/com/binance/api/client/config/FuturesApiConfig.java @@ -0,0 +1,6 @@ +package com.binance.api.client.config; + +@ApiConfig(apiUrl = "https://fapi.binance.com", webSocketUrl = "wss://fstream.binance.com/ws") +public class FuturesApiConfig implements BinanceApiConfig { + +} diff --git a/src/main/java/com/binance/api/client/config/SpotApiConfig.java b/src/main/java/com/binance/api/client/config/SpotApiConfig.java new file mode 100755 index 000000000..439caa5fd --- /dev/null +++ b/src/main/java/com/binance/api/client/config/SpotApiConfig.java @@ -0,0 +1,10 @@ +package com.binance.api.client.config; + +/** + * Configuration used for Binance operations. + */ + +@ApiConfig(apiUrl = "https://api.binance.com", webSocketUrl = "wss://stream.binance.com:9443/ws") +public class SpotApiConfig implements BinanceApiConfig { + +} diff --git a/src/main/java/com/binance/api/client/config/TestnetApiConfig.java b/src/main/java/com/binance/api/client/config/TestnetApiConfig.java new file mode 100644 index 000000000..31b205cd7 --- /dev/null +++ b/src/main/java/com/binance/api/client/config/TestnetApiConfig.java @@ -0,0 +1,5 @@ +package com.binance.api.client.config; + +@ApiConfig(apiUrl = "https://testnet.binancefuture.com", webSocketUrl = "wss://stream.binancefuture.com/ws") +public class TestnetApiConfig implements BinanceApiConfig { +} diff --git a/src/main/java/com/binance/api/client/domain/PositionSide.java b/src/main/java/com/binance/api/client/domain/PositionSide.java index 993e90bee..2aed098d2 100755 --- a/src/main/java/com/binance/api/client/domain/PositionSide.java +++ b/src/main/java/com/binance/api/client/domain/PositionSide.java @@ -1,13 +1,13 @@ -package com.binance.api.client.domain; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -/** - * Buy/Sell order side. - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public enum PositionSide { - SHORT, - LONG, - BOTH -} +package com.binance.api.client.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * Buy/Sell order side. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public enum PositionSide { + SHORT, + LONG, + BOTH +} diff --git a/src/main/java/com/binance/api/client/domain/WorkingType.java b/src/main/java/com/binance/api/client/domain/WorkingType.java index 1489ba43b..a04d70303 100755 --- a/src/main/java/com/binance/api/client/domain/WorkingType.java +++ b/src/main/java/com/binance/api/client/domain/WorkingType.java @@ -1,14 +1,14 @@ -package com.binance.api.client.domain; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -/** - * price type - * - * @author Mahdi Sheikh Hosseini - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public enum WorkingType { - CONTRACT_PRICE, - MARK_PRICE -} +package com.binance.api.client.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * price type + * + * @author Mahdi Sheikh Hosseini + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public enum WorkingType { + CONTRACT_PRICE, + MARK_PRICE +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java b/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java index 54d220459..af1b6a474 100755 --- a/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java +++ b/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java @@ -1,203 +1,203 @@ -package com.binance.api.client.domain.account; - -import com.binance.api.client.constant.BinanceApiConstants; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.apache.commons.lang3.builder.ToStringBuilder; - -import java.util.List; - -/** - * Futures Account information. - */ -@JsonIgnoreProperties -public class FuturesAccount { - private int feeTier; - private boolean canTrade; - private boolean canDeposit; - private boolean canWithdraw; - private long updateTime; - private String totalInitialMargin; - private String totalMaintMargin; - private String totalWalletBalance; - private String totalUnrealizedProfit; - private String totalMarginBalance; - private String totalPositionInitialMargin; - private String totalOpenOrderInitialMargin; - private String totalCrossWalletBalance; - private String totalCrossUnPnl; - private String availableBalance; - private String maxWithdrawAmount; - - private List assets; - private List positions; - - public int getFeeTier() { - return feeTier; - } - - public void setFeeTier(int feeTier) { - this.feeTier = feeTier; - } - - public boolean isCanTrade() { - return canTrade; - } - - public void setCanTrade(boolean canTrade) { - this.canTrade = canTrade; - } - - public boolean isCanDeposit() { - return canDeposit; - } - - public void setCanDeposit(boolean canDeposit) { - this.canDeposit = canDeposit; - } - - public boolean isCanWithdraw() { - return canWithdraw; - } - - public void setCanWithdraw(boolean canWithdraw) { - this.canWithdraw = canWithdraw; - } - - public long getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(long updateTime) { - this.updateTime = updateTime; - } - - public String getTotalInitialMargin() { - return totalInitialMargin; - } - - public void setTotalInitialMargin(String totalInitialMargin) { - this.totalInitialMargin = totalInitialMargin; - } - - public String getTotalMaintMargin() { - return totalMaintMargin; - } - - public void setTotalMaintMargin(String totalMaintMargin) { - this.totalMaintMargin = totalMaintMargin; - } - - public String getTotalWalletBalance() { - return totalWalletBalance; - } - - public void setTotalWalletBalance(String totalWalletBalance) { - this.totalWalletBalance = totalWalletBalance; - } - - public String getTotalUnrealizedProfit() { - return totalUnrealizedProfit; - } - - public void setTotalUnrealizedProfit(String totalUnrealizedProfit) { - this.totalUnrealizedProfit = totalUnrealizedProfit; - } - - public String getTotalMarginBalance() { - return totalMarginBalance; - } - - public void setTotalMarginBalance(String totalMarginBalance) { - this.totalMarginBalance = totalMarginBalance; - } - - public String getTotalPositionInitialMargin() { - return totalPositionInitialMargin; - } - - public void setTotalPositionInitialMargin(String totalPositionInitialMargin) { - this.totalPositionInitialMargin = totalPositionInitialMargin; - } - - public String getTotalOpenOrderInitialMargin() { - return totalOpenOrderInitialMargin; - } - - public void setTotalOpenOrderInitialMargin(String totalOpenOrderInitialMargin) { - this.totalOpenOrderInitialMargin = totalOpenOrderInitialMargin; - } - - public String getTotalCrossWalletBalance() { - return totalCrossWalletBalance; - } - - public void setTotalCrossWalletBalance(String totalCrossWalletBalance) { - this.totalCrossWalletBalance = totalCrossWalletBalance; - } - - public String getTotalCrossUnPnl() { - return totalCrossUnPnl; - } - - public void setTotalCrossUnPnl(String totalCrossUnPnl) { - this.totalCrossUnPnl = totalCrossUnPnl; - } - - public String getAvailableBalance() { - return availableBalance; - } - - public void setAvailableBalance(String availableBalance) { - this.availableBalance = availableBalance; - } - - public String getMaxWithdrawAmount() { - return maxWithdrawAmount; - } - - public void setMaxWithdrawAmount(String maxWithdrawAmount) { - this.maxWithdrawAmount = maxWithdrawAmount; - } - - public List getAssets() { - return assets; - } - - public List getPositions() { - return positions; - } - - public void setPositions(List positions) { - this.positions = positions; - } - - public void setAssets(List assets) { - this.assets = assets; - } - - public FuturesAssetBalance getAssetBalance(final String symbol) { - return assets.stream() - .filter(marginAssetBalance -> marginAssetBalance.getAsset().equals(symbol)) - .findFirst() - .orElse(FuturesAssetBalance.of(symbol)); - } - - @Override - public String toString() { - return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) - .append("totalInitialMargin", totalInitialMargin) - .append("totalMaintMargin", totalMaintMargin) - .append("totalWalletBalance", totalWalletBalance) - .append("totalUnrealizedProfit", totalUnrealizedProfit) - .append("totalMarginBalance", totalMarginBalance) - .append("totalPositionInitialMargin", totalPositionInitialMargin) - .append("totalOpenOrderInitialMargin", totalOpenOrderInitialMargin) - .append("totalCrossWalletBalance", totalCrossWalletBalance) - .append("totalCrossUnPnl", totalCrossUnPnl) - .append("availableBalance", availableBalance) - .append("maxWithdrawAmount", maxWithdrawAmount) - .toString(); - - - } -} +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.util.List; + +/** + * Futures Account information. + */ +@JsonIgnoreProperties +public class FuturesAccount { + private int feeTier; + private boolean canTrade; + private boolean canDeposit; + private boolean canWithdraw; + private long updateTime; + private String totalInitialMargin; + private String totalMaintMargin; + private String totalWalletBalance; + private String totalUnrealizedProfit; + private String totalMarginBalance; + private String totalPositionInitialMargin; + private String totalOpenOrderInitialMargin; + private String totalCrossWalletBalance; + private String totalCrossUnPnl; + private String availableBalance; + private String maxWithdrawAmount; + + private List assets; + private List positions; + + public int getFeeTier() { + return feeTier; + } + + public void setFeeTier(int feeTier) { + this.feeTier = feeTier; + } + + public boolean isCanTrade() { + return canTrade; + } + + public void setCanTrade(boolean canTrade) { + this.canTrade = canTrade; + } + + public boolean isCanDeposit() { + return canDeposit; + } + + public void setCanDeposit(boolean canDeposit) { + this.canDeposit = canDeposit; + } + + public boolean isCanWithdraw() { + return canWithdraw; + } + + public void setCanWithdraw(boolean canWithdraw) { + this.canWithdraw = canWithdraw; + } + + public long getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(long updateTime) { + this.updateTime = updateTime; + } + + public String getTotalInitialMargin() { + return totalInitialMargin; + } + + public void setTotalInitialMargin(String totalInitialMargin) { + this.totalInitialMargin = totalInitialMargin; + } + + public String getTotalMaintMargin() { + return totalMaintMargin; + } + + public void setTotalMaintMargin(String totalMaintMargin) { + this.totalMaintMargin = totalMaintMargin; + } + + public String getTotalWalletBalance() { + return totalWalletBalance; + } + + public void setTotalWalletBalance(String totalWalletBalance) { + this.totalWalletBalance = totalWalletBalance; + } + + public String getTotalUnrealizedProfit() { + return totalUnrealizedProfit; + } + + public void setTotalUnrealizedProfit(String totalUnrealizedProfit) { + this.totalUnrealizedProfit = totalUnrealizedProfit; + } + + public String getTotalMarginBalance() { + return totalMarginBalance; + } + + public void setTotalMarginBalance(String totalMarginBalance) { + this.totalMarginBalance = totalMarginBalance; + } + + public String getTotalPositionInitialMargin() { + return totalPositionInitialMargin; + } + + public void setTotalPositionInitialMargin(String totalPositionInitialMargin) { + this.totalPositionInitialMargin = totalPositionInitialMargin; + } + + public String getTotalOpenOrderInitialMargin() { + return totalOpenOrderInitialMargin; + } + + public void setTotalOpenOrderInitialMargin(String totalOpenOrderInitialMargin) { + this.totalOpenOrderInitialMargin = totalOpenOrderInitialMargin; + } + + public String getTotalCrossWalletBalance() { + return totalCrossWalletBalance; + } + + public void setTotalCrossWalletBalance(String totalCrossWalletBalance) { + this.totalCrossWalletBalance = totalCrossWalletBalance; + } + + public String getTotalCrossUnPnl() { + return totalCrossUnPnl; + } + + public void setTotalCrossUnPnl(String totalCrossUnPnl) { + this.totalCrossUnPnl = totalCrossUnPnl; + } + + public String getAvailableBalance() { + return availableBalance; + } + + public void setAvailableBalance(String availableBalance) { + this.availableBalance = availableBalance; + } + + public String getMaxWithdrawAmount() { + return maxWithdrawAmount; + } + + public void setMaxWithdrawAmount(String maxWithdrawAmount) { + this.maxWithdrawAmount = maxWithdrawAmount; + } + + public List getAssets() { + return assets; + } + + public List getPositions() { + return positions; + } + + public void setPositions(List positions) { + this.positions = positions; + } + + public void setAssets(List assets) { + this.assets = assets; + } + + public FuturesAssetBalance getAssetBalance(final String symbol) { + return assets.stream() + .filter(marginAssetBalance -> marginAssetBalance.getAsset().equals(symbol)) + .findFirst() + .orElse(FuturesAssetBalance.of(symbol)); + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("totalInitialMargin", totalInitialMargin) + .append("totalMaintMargin", totalMaintMargin) + .append("totalWalletBalance", totalWalletBalance) + .append("totalUnrealizedProfit", totalUnrealizedProfit) + .append("totalMarginBalance", totalMarginBalance) + .append("totalPositionInitialMargin", totalPositionInitialMargin) + .append("totalOpenOrderInitialMargin", totalOpenOrderInitialMargin) + .append("totalCrossWalletBalance", totalCrossWalletBalance) + .append("totalCrossUnPnl", totalCrossUnPnl) + .append("availableBalance", availableBalance) + .append("maxWithdrawAmount", maxWithdrawAmount) + .toString(); + + + } +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesAssetBalance.java b/src/main/java/com/binance/api/client/domain/account/FuturesAssetBalance.java index b7864a8a4..6998b6c2c 100755 --- a/src/main/java/com/binance/api/client/domain/account/FuturesAssetBalance.java +++ b/src/main/java/com/binance/api/client/domain/account/FuturesAssetBalance.java @@ -1,146 +1,146 @@ -package com.binance.api.client.domain.account; - -import com.binance.api.client.constant.BinanceApiConstants; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.apache.commons.lang3.builder.ToStringBuilder; - -/** - * An asset balance in an Account. - * - * @see Account - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class FuturesAssetBalance { - private String asset; - private String walletBalance; - private String unrealizedProfit; - private String marginBalance; - private String maintMargin; - private String initialMargin; - private String positionInitialMargin; - private String openOrderInitialMargin; - private String crossWalletBalance; - private String crossUnPnl; - private String availableBalance; - private String maxWithdrawAmount; - - public String getAsset() { - return asset; - } - - public void setAsset(String asset) { - this.asset = asset; - } - - public String getWalletBalance() { - return walletBalance; - } - - public void setWalletBalance(String walletBalance) { - this.walletBalance = walletBalance; - } - - public String getUnrealizedProfit() { - return unrealizedProfit; - } - - public void setUnrealizedProfit(String unrealizedProfit) { - this.unrealizedProfit = unrealizedProfit; - } - - public String getMarginBalance() { - return marginBalance; - } - - public void setMarginBalance(String marginBalance) { - this.marginBalance = marginBalance; - } - - public String getMaintMargin() { - return maintMargin; - } - - public void setMaintMargin(String maintMargin) { - this.maintMargin = maintMargin; - } - - public String getInitialMargin() { - return initialMargin; - } - - public void setInitialMargin(String initialMargin) { - this.initialMargin = initialMargin; - } - - public String getPositionInitialMargin() { - return positionInitialMargin; - } - - public void setPositionInitialMargin(String positionInitialMargin) { - this.positionInitialMargin = positionInitialMargin; - } - - public String getOpenOrderInitialMargin() { - return openOrderInitialMargin; - } - - public void setOpenOrderInitialMargin(String openOrderInitialMargin) { - this.openOrderInitialMargin = openOrderInitialMargin; - } - - public String getCrossWalletBalance() { - return crossWalletBalance; - } - - public void setCrossWalletBalance(String crossWalletBalance) { - this.crossWalletBalance = crossWalletBalance; - } - - public String getCrossUnPnl() { - return crossUnPnl; - } - - public void setCrossUnPnl(String crossUnPnl) { - this.crossUnPnl = crossUnPnl; - } - - public String getAvailableBalance() { - return availableBalance; - } - - public void setAvailableBalance(String availableBalance) { - this.availableBalance = availableBalance; - } - - public String getMaxWithdrawAmount() { - return maxWithdrawAmount; - } - - public void setMaxWithdrawAmount(String maxWithdrawAmount) { - this.maxWithdrawAmount = maxWithdrawAmount; - } - - public static FuturesAssetBalance of(final String asset) { - final FuturesAssetBalance assetBalance = new FuturesAssetBalance(); - assetBalance.setAsset(asset); - return assetBalance; - } - - @Override - public String toString() { - return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) - .append("asset", asset) - .append("walletBalance", walletBalance) - .append("unrealizedProfit", unrealizedProfit) - .append("marginBalance", marginBalance) - .append("maintMargin", maintMargin) - .append("initialMargin", initialMargin) - .append("positionInitialMargin", positionInitialMargin) - .append("openOrderInitialMargin", openOrderInitialMargin) - .append("crossWalletBalance", crossWalletBalance) - .append("crossUnPnl", crossUnPnl) - .append("availableBalance", availableBalance) - .append("maxWithdrawAmount", maxWithdrawAmount) - .toString(); - } -} +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * An asset balance in an Account. + * + * @see Account + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class FuturesAssetBalance { + private String asset; + private String walletBalance; + private String unrealizedProfit; + private String marginBalance; + private String maintMargin; + private String initialMargin; + private String positionInitialMargin; + private String openOrderInitialMargin; + private String crossWalletBalance; + private String crossUnPnl; + private String availableBalance; + private String maxWithdrawAmount; + + public String getAsset() { + return asset; + } + + public void setAsset(String asset) { + this.asset = asset; + } + + public String getWalletBalance() { + return walletBalance; + } + + public void setWalletBalance(String walletBalance) { + this.walletBalance = walletBalance; + } + + public String getUnrealizedProfit() { + return unrealizedProfit; + } + + public void setUnrealizedProfit(String unrealizedProfit) { + this.unrealizedProfit = unrealizedProfit; + } + + public String getMarginBalance() { + return marginBalance; + } + + public void setMarginBalance(String marginBalance) { + this.marginBalance = marginBalance; + } + + public String getMaintMargin() { + return maintMargin; + } + + public void setMaintMargin(String maintMargin) { + this.maintMargin = maintMargin; + } + + public String getInitialMargin() { + return initialMargin; + } + + public void setInitialMargin(String initialMargin) { + this.initialMargin = initialMargin; + } + + public String getPositionInitialMargin() { + return positionInitialMargin; + } + + public void setPositionInitialMargin(String positionInitialMargin) { + this.positionInitialMargin = positionInitialMargin; + } + + public String getOpenOrderInitialMargin() { + return openOrderInitialMargin; + } + + public void setOpenOrderInitialMargin(String openOrderInitialMargin) { + this.openOrderInitialMargin = openOrderInitialMargin; + } + + public String getCrossWalletBalance() { + return crossWalletBalance; + } + + public void setCrossWalletBalance(String crossWalletBalance) { + this.crossWalletBalance = crossWalletBalance; + } + + public String getCrossUnPnl() { + return crossUnPnl; + } + + public void setCrossUnPnl(String crossUnPnl) { + this.crossUnPnl = crossUnPnl; + } + + public String getAvailableBalance() { + return availableBalance; + } + + public void setAvailableBalance(String availableBalance) { + this.availableBalance = availableBalance; + } + + public String getMaxWithdrawAmount() { + return maxWithdrawAmount; + } + + public void setMaxWithdrawAmount(String maxWithdrawAmount) { + this.maxWithdrawAmount = maxWithdrawAmount; + } + + public static FuturesAssetBalance of(final String asset) { + final FuturesAssetBalance assetBalance = new FuturesAssetBalance(); + assetBalance.setAsset(asset); + return assetBalance; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("asset", asset) + .append("walletBalance", walletBalance) + .append("unrealizedProfit", unrealizedProfit) + .append("marginBalance", marginBalance) + .append("maintMargin", maintMargin) + .append("initialMargin", initialMargin) + .append("positionInitialMargin", positionInitialMargin) + .append("openOrderInitialMargin", openOrderInitialMargin) + .append("crossWalletBalance", crossWalletBalance) + .append("crossUnPnl", crossUnPnl) + .append("availableBalance", availableBalance) + .append("maxWithdrawAmount", maxWithdrawAmount) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java old mode 100755 new mode 100644 diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrderResponse.java b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrderResponse.java old mode 100755 new mode 100644 diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesPosition.java b/src/main/java/com/binance/api/client/domain/account/FuturesPosition.java index a3b9ff48c..0ba301247 100755 --- a/src/main/java/com/binance/api/client/domain/account/FuturesPosition.java +++ b/src/main/java/com/binance/api/client/domain/account/FuturesPosition.java @@ -1,141 +1,141 @@ -package com.binance.api.client.domain.account; - -import com.binance.api.client.constant.BinanceApiConstants; -import com.binance.api.client.domain.PositionSide; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.apache.commons.lang3.builder.ToStringBuilder; - -/** - * An asset balance in an Account. - * - * @see Account - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class FuturesPosition { - private String symbol; - private String initialMargin; - private String maintMargin; - private String unrealizedProfit; - private String positionInitialMargin; - private String openOrderInitialMargin; - private String leverage; - private boolean isolated; - private String entryPrice; - private String maxNotional; - private PositionSide positionSide; - private String positionAmt; - - public String getSymbol() { - return symbol; - } - - public void setSymbol(String symbol) { - this.symbol = symbol; - } - - public String getInitialMargin() { - return initialMargin; - } - - public void setInitialMargin(String initialMargin) { - this.initialMargin = initialMargin; - } - - public String getMaintMargin() { - return maintMargin; - } - - public void setMaintMargin(String maintMargin) { - this.maintMargin = maintMargin; - } - - public String getUnrealizedProfit() { - return unrealizedProfit; - } - - public void setUnrealizedProfit(String unrealizedProfit) { - this.unrealizedProfit = unrealizedProfit; - } - - public String getPositionInitialMargin() { - return positionInitialMargin; - } - - public void setPositionInitialMargin(String positionInitialMargin) { - this.positionInitialMargin = positionInitialMargin; - } - - public String getOpenOrderInitialMargin() { - return openOrderInitialMargin; - } - - public void setOpenOrderInitialMargin(String openOrderInitialMargin) { - this.openOrderInitialMargin = openOrderInitialMargin; - } - - public String getLeverage() { - return leverage; - } - - public void setLeverage(String leverage) { - this.leverage = leverage; - } - - public boolean isIsolated() { - return isolated; - } - - public void setIsolated(boolean isolated) { - this.isolated = isolated; - } - - public String getEntryPrice() { - return entryPrice; - } - - public void setEntryPrice(String entryPrice) { - this.entryPrice = entryPrice; - } - - public String getMaxNotional() { - return maxNotional; - } - - public void setMaxNotional(String maxNotional) { - this.maxNotional = maxNotional; - } - - public PositionSide getPositionSide() { - return positionSide; - } - - public void setPositionSide(PositionSide positionSide) { - this.positionSide = positionSide; - } - - public String getPositionAmt() { - return positionAmt; - } - - public void setPositionAmt(String positionAmt) { - this.positionAmt = positionAmt; - } - - @Override - public String toString() { - return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) - .append("symbol", symbol) - .append("initialMargin", initialMargin) - .append("maintMargin", maintMargin) - .append("unrealizedProfit", unrealizedProfit) - .append("positionInitialMargin", positionInitialMargin) - .append("openOrderInitialMargin", openOrderInitialMargin) - .append("leverage", leverage) - .append("isolated", isolated) - .append("entryPrice", entryPrice) - .append("maxNotional", maxNotional) - .append("positionSide", positionSide) - .append("positionAmt", positionAmt) - .toString(); - } -} +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.PositionSide; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * An asset balance in an Account. + * + * @see Account + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class FuturesPosition { + private String symbol; + private String initialMargin; + private String maintMargin; + private String unrealizedProfit; + private String positionInitialMargin; + private String openOrderInitialMargin; + private String leverage; + private boolean isolated; + private String entryPrice; + private String maxNotional; + private PositionSide positionSide; + private String positionAmt; + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getInitialMargin() { + return initialMargin; + } + + public void setInitialMargin(String initialMargin) { + this.initialMargin = initialMargin; + } + + public String getMaintMargin() { + return maintMargin; + } + + public void setMaintMargin(String maintMargin) { + this.maintMargin = maintMargin; + } + + public String getUnrealizedProfit() { + return unrealizedProfit; + } + + public void setUnrealizedProfit(String unrealizedProfit) { + this.unrealizedProfit = unrealizedProfit; + } + + public String getPositionInitialMargin() { + return positionInitialMargin; + } + + public void setPositionInitialMargin(String positionInitialMargin) { + this.positionInitialMargin = positionInitialMargin; + } + + public String getOpenOrderInitialMargin() { + return openOrderInitialMargin; + } + + public void setOpenOrderInitialMargin(String openOrderInitialMargin) { + this.openOrderInitialMargin = openOrderInitialMargin; + } + + public String getLeverage() { + return leverage; + } + + public void setLeverage(String leverage) { + this.leverage = leverage; + } + + public boolean isIsolated() { + return isolated; + } + + public void setIsolated(boolean isolated) { + this.isolated = isolated; + } + + public String getEntryPrice() { + return entryPrice; + } + + public void setEntryPrice(String entryPrice) { + this.entryPrice = entryPrice; + } + + public String getMaxNotional() { + return maxNotional; + } + + public void setMaxNotional(String maxNotional) { + this.maxNotional = maxNotional; + } + + public PositionSide getPositionSide() { + return positionSide; + } + + public void setPositionSide(PositionSide positionSide) { + this.positionSide = positionSide; + } + + public String getPositionAmt() { + return positionAmt; + } + + public void setPositionAmt(String positionAmt) { + this.positionAmt = positionAmt; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("symbol", symbol) + .append("initialMargin", initialMargin) + .append("maintMargin", maintMargin) + .append("unrealizedProfit", unrealizedProfit) + .append("positionInitialMargin", positionInitialMargin) + .append("openOrderInitialMargin", openOrderInitialMargin) + .append("leverage", leverage) + .append("isolated", isolated) + .append("entryPrice", entryPrice) + .append("maxNotional", maxNotional) + .append("positionSide", positionSide) + .append("positionAmt", positionAmt) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/domain/account/MarginNewOrder.java b/src/main/java/com/binance/api/client/domain/account/MarginNewOrder.java old mode 100755 new mode 100644 diff --git a/src/main/java/com/binance/api/client/domain/account/MarginNewOrderResponse.java b/src/main/java/com/binance/api/client/domain/account/MarginNewOrderResponse.java old mode 100755 new mode 100644 diff --git a/src/main/java/com/binance/api/client/domain/account/NewOrder.java b/src/main/java/com/binance/api/client/domain/account/NewOrder.java old mode 100755 new mode 100644 diff --git a/src/main/java/com/binance/api/client/domain/account/NewOrderResponse.java b/src/main/java/com/binance/api/client/domain/account/NewOrderResponse.java old mode 100755 new mode 100644 diff --git a/src/main/java/com/binance/api/client/domain/account/NewOrderResponseType.java b/src/main/java/com/binance/api/client/domain/account/NewOrderResponseType.java old mode 100755 new mode 100644 diff --git a/src/main/java/com/binance/api/client/domain/account/Order.java b/src/main/java/com/binance/api/client/domain/account/Order.java old mode 100755 new mode 100644 diff --git a/src/main/java/com/binance/api/client/exception/BinanceIllegalException.java b/src/main/java/com/binance/api/client/exception/BinanceIllegalException.java new file mode 100644 index 000000000..a175080d3 --- /dev/null +++ b/src/main/java/com/binance/api/client/exception/BinanceIllegalException.java @@ -0,0 +1,10 @@ +package com.binance.api.client.exception; + +public class BinanceIllegalException extends RuntimeException { + public BinanceIllegalException() { + } + + public BinanceIllegalException(String message) { + super(message); + } +} diff --git a/src/main/java/com/binance/api/client/factory/BinanceAbstractFactory.java b/src/main/java/com/binance/api/client/factory/BinanceAbstractFactory.java new file mode 100644 index 000000000..7e0ba0864 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceAbstractFactory.java @@ -0,0 +1,80 @@ +package com.binance.api.client.factory; + +import com.binance.api.client.BinanceEngineType; +import com.binance.api.client.config.*; +import com.binance.api.client.exception.BinanceIllegalException; + +public abstract class BinanceAbstractFactory { + + public static BinanceFactory createFactory(String apiKey, String secretKey, BinanceEngineType engineType, Class apiConfigClass) { + final String apiUrl = getApiUrl(apiConfigClass); + final String websocketUrl = getWebsocketUrl(apiConfigClass); + switch (engineType) { + case SPOT: + return BinanceSpotApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); + case FUTURES: + case TESTNET: + return BinanceFuturesApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); + } + throw new IllegalArgumentException(); + } + + public static BinanceFactory createFactory(String apiKey, String secretKey, BinanceEngineType engineType) { + switch (engineType) { + case SPOT: + return createSpotFactory(apiKey, secretKey); + case FUTURES: + return createFuturesFactory(apiKey, secretKey); + case TESTNET: + return createTestnetFactory(apiKey, secretKey); + } + throw new IllegalArgumentException(); + } + + public static BinanceSpotApiClientFactory createSpotFactory(String apiKey, String secretKey) { + final String apiUrl = getApiUrl(SpotApiConfig.class); + final String websocketUrl = getWebsocketUrl(SpotApiConfig.class); + return BinanceSpotApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); + } + + public static BinanceFuturesApiClientFactory createFuturesFactory(String apiKey, String secretKey) { + final String apiUrl = getApiUrl(FuturesApiConfig.class); + final String websocketUrl = getWebsocketUrl(FuturesApiConfig.class); + return BinanceFuturesApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); + } + + public static BinanceFuturesApiClientFactory createTestnetFactory(String apiKey, String secretKey) { + final String apiUrl = getApiUrl(TestnetApiConfig.class); + final String websocketUrl = getWebsocketUrl(TestnetApiConfig.class); + return BinanceFuturesApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); + } + + public static BinanceSpotApiClientFactory createSpotFactory() { + return createSpotFactory(null, null); + } + + public static BinanceFuturesApiClientFactory createFuturesFactory() { + return createFuturesFactory(null, null); + } + + public static BinanceFuturesApiClientFactory createTestnetFactory() { + return createTestnetFactory(null, null); + } + + private static String getApiUrl(Class apiConfigClass) { + return getApiConfig(apiConfigClass).apiUrl(); + } + + private static String getWebsocketUrl(Class apiConfigClass) { + return getApiConfig(apiConfigClass).webSocketUrl(); + } + + private static ApiConfig getApiConfig(Class apiConfigClass) { + if (apiConfigClass.isAnnotationPresent(ApiConfig.class)) { + return apiConfigClass.getAnnotation(ApiConfig.class); + } else { + throw new BinanceIllegalException("Class should implemented BinanceApiConfig"); + } + } + +} diff --git a/src/main/java/com/binance/api/client/factory/BinanceFactory.java b/src/main/java/com/binance/api/client/factory/BinanceFactory.java new file mode 100644 index 000000000..4daa32477 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceFactory.java @@ -0,0 +1,10 @@ +package com.binance.api.client.factory; + +public interface BinanceFactory { + + T newAsyncRestClient(); + + T newRestClient(); + + T newWebSocketClient(); +} diff --git a/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java b/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java new file mode 100755 index 000000000..706f74f18 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java @@ -0,0 +1,84 @@ +package com.binance.api.client.factory; + +import com.binance.api.client.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.impl.BinanceApiAsyncFuturesRestClientImpl; +import com.binance.api.client.impl.BinanceApiFuturesRestClientImpl; +import com.binance.api.client.impl.BinanceApiWebSocketClientImpl; + +import static com.binance.api.client.impl.BinanceApiServiceGenerator.getSharedClient; + +/** + * A factory for creating BinanceApi client objects. + */ +public class BinanceFuturesApiClientFactory implements BinanceFactory { + + /** + * API Key + */ + private final String apiKey; + + /** + * Secret. + */ + private final String secret; + + private final String apiUrl; + private final String websocketUrl; + + /** + * Instantiates a new binance api client factory. + * + * @param apiKey the API key + * @param secret the Secret + */ + private BinanceFuturesApiClientFactory(String apiKey, String secret, String apiUrl, String websocketUrl) { + this.apiKey = apiKey; + this.secret = secret; + this.apiUrl = apiUrl; + this.websocketUrl = websocketUrl; + } + + /** + * New instance. + * + * @param apiKey the API key + * @param secret the Secret + * @return the binance api client factory + */ + public static BinanceFuturesApiClientFactory newInstance(String apiKey, String secret, String apiUrl, String websocketUrl) { + return new BinanceFuturesApiClientFactory(apiKey, secret, apiUrl, websocketUrl); + } + + /** + * New instance without authentication. + * + * @return the binance api client factory + */ + public static BinanceFuturesApiClientFactory newInstance() { + return new BinanceFuturesApiClientFactory(null, null, null, null); + } + + + /** + * Creates a new asynchronous/non-blocking Futures REST client. + */ + public BinanceApiAsyncFuturesRestClient newAsyncRestClient() { + return new BinanceApiAsyncFuturesRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new synchronous/blocking Futures REST client. + */ + public BinanceApiFuturesRestClient newRestClient() { + return new BinanceApiFuturesRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new web socket client used for handling data streams. + */ + public BinanceApiWebSocketClient newWebSocketClient() { + return new BinanceApiWebSocketClientImpl(getSharedClient(), websocketUrl); + } +} diff --git a/src/main/java/com/binance/api/client/factory/BinanceSpotApiClientFactory.java b/src/main/java/com/binance/api/client/factory/BinanceSpotApiClientFactory.java new file mode 100755 index 000000000..483b79dd6 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceSpotApiClientFactory.java @@ -0,0 +1,103 @@ +package com.binance.api.client.factory; + +import com.binance.api.client.*; +import com.binance.api.client.impl.*; + +import static com.binance.api.client.impl.BinanceApiServiceGenerator.getSharedClient; + +/** + * A factory for creating BinanceApi client objects. + */ +public class BinanceSpotApiClientFactory implements BinanceFactory { + + /** + * API Key + */ + private final String apiKey; + + /** + * Secret. + */ + private final String secret; + + private final String apiUrl; + private final String websocketUrl; + + /** + * Instantiates a new binance api client factory. + * + * @param apiKey the API key + * @param secret the Secret + */ + private BinanceSpotApiClientFactory(String apiKey, String secret, String apiUrl, String websocketUrl) { + this.apiKey = apiKey; + this.secret = secret; + this.apiUrl = apiUrl; + this.websocketUrl = websocketUrl; + } + + /** + * New instance. + * + * @param apiKey the API key + * @param secret the Secret + * @return the binance api client factory + */ + public static BinanceSpotApiClientFactory newInstance(String apiKey, String secret, String apiUrl, String websocketUrl) { + return new BinanceSpotApiClientFactory(apiKey, secret, apiUrl, websocketUrl); + } + + /** + * New instance without authentication. + * + * @return the binance api client factory + * @see BinanceAbstractFactory + * @deprecated please use BinanceAbstractFactory.createSpotFactory() + */ + @Deprecated + public static BinanceSpotApiClientFactory newInstance() { + return new BinanceSpotApiClientFactory(null, null, null, null); + } + + /** + * Creates a new synchronous/blocking REST client. + */ + public BinanceApiRestClient newRestClient() { + return new BinanceApiRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new asynchronous/non-blocking REST client. + */ + public BinanceApiAsyncRestClient newAsyncRestClient() { + return new BinanceApiAsyncRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new asynchronous/non-blocking Margin REST client. + */ + public BinanceApiAsyncMarginRestClient newAsyncMarginRestClient() { + return new BinanceApiAsyncMarginRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new synchronous/blocking Margin REST client. + */ + public BinanceApiMarginRestClient newMarginRestClient() { + return new BinanceApiMarginRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new web socket client used for handling data streams. + */ + public BinanceApiWebSocketClient newWebSocketClient() { + return new BinanceApiWebSocketClientImpl(getSharedClient(), websocketUrl); + } + + /** + * Creates a new synchronous/blocking Swap REST client. + */ + public BinanceApiSwapRestClient newSwapRestClient() { + return new BinanceApiSwapRestClientImpl(apiKey, secret, apiUrl); + } +} diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java index eeb2c1053..321c0167d 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java @@ -1,74 +1,71 @@ -package com.binance.api.client.impl; - -import com.binance.api.client.BinanceApiAsyncFuturesRestClient; -import com.binance.api.client.BinanceApiCallback; -import com.binance.api.client.BinanceEngineType; -import com.binance.api.client.constant.BinanceApiConstants; -import com.binance.api.client.domain.account.FuturesAccount; -import com.binance.api.client.domain.account.FuturesNewOrder; -import com.binance.api.client.domain.account.FuturesNewOrderResponse; -import com.binance.api.client.domain.account.Order; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; - -import java.util.List; - -import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; - -/** - * Implementation of Binance's Margin REST API using Retrofit with asynchronous/non-blocking method calls. - * - * @author Mahdi Sheikh Hosseini - */ -public class BinanceApiAsyncFuturesRestClientImpl implements BinanceApiAsyncFuturesRestClient { - - private final BinanceFuturesApiService binanceFuturesApiService; - - public BinanceApiAsyncFuturesRestClientImpl(String apiKey, String secret) { - binanceFuturesApiService = createService(BinanceFuturesApiService.class, apiKey, secret, BinanceEngineType.FUTURES); - } - - // Margin Account endpoints - - @Override - public void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback) { - binanceFuturesApiService.getAccount(recvWindow, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getAccount(BinanceApiCallback callback) { - long timestamp = System.currentTimeMillis(); - binanceFuturesApiService.getAccount(BinanceApiConstants.DEFAULT_MARGIN_RECEIVING_WINDOW, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback) { - binanceFuturesApiService.getOpenOrders(orderRequest.getSymbol(), orderRequest.getRecvWindow(), - orderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void newOrder(FuturesNewOrder order, BinanceApiCallback callback) { - binanceFuturesApiService.newOrder(order.getSymbol(), order.getSide(), order.getPositionSide(), - order.getType(), order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), - order.getStopPrice(), order.isClosePosition(), order.getActivationPrice(), order.getWorkingType(), - order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp()) - .enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback) { - binanceFuturesApiService.cancelOrder(cancelOrderRequest.getSymbol(), - cancelOrderRequest.getOrderId(), cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), - cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback) { - binanceFuturesApiService.getOrderStatus(orderStatusRequest.getSymbol(), - orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), - orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } -} +package com.binance.api.client.impl; + +import com.binance.api.client.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.BinanceApiCallback; +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.account.FuturesAccount; +import com.binance.api.client.domain.account.FuturesNewOrder; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.Order; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; + +import java.util.List; + +/** + * Implementation of Binance's Margin REST API using Retrofit with asynchronous/non-blocking method calls. + * + * @author Mahdi Sheikh Hosseini + */ +public class BinanceApiAsyncFuturesRestClientImpl implements BinanceApiAsyncFuturesRestClient { + + private final BinanceFuturesApiService binanceFuturesApiService; + + public BinanceApiAsyncFuturesRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceFuturesApiService = BinanceApiServiceGenerator.createService(BinanceFuturesApiService.class, apiKey, secret, apiUrl); + } + + // Margin Account endpoints + + @Override + public void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback) { + binanceFuturesApiService.getAccount(recvWindow, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getAccount(BinanceApiCallback callback) { + long timestamp = System.currentTimeMillis(); + binanceFuturesApiService.getAccount(BinanceApiConstants.DEFAULT_MARGIN_RECEIVING_WINDOW, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback) { + binanceFuturesApiService.getOpenOrders(orderRequest.getSymbol(), orderRequest.getRecvWindow(), + orderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void newOrder(FuturesNewOrder order, BinanceApiCallback callback) { + binanceFuturesApiService.newOrder(order.getSymbol(), order.getSide(), order.getPositionSide(), + order.getType(), order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), + order.getStopPrice(), order.isClosePosition(), order.getActivationPrice(), order.getWorkingType(), + order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp()) + .enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback) { + binanceFuturesApiService.cancelOrder(cancelOrderRequest.getSymbol(), + cancelOrderRequest.getOrderId(), cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), + cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback) { + binanceFuturesApiService.getOrderStatus(orderStatusRequest.getSymbol(), + orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), + orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } +} diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java index f40ee790f..3c2ed5c7f 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java @@ -2,7 +2,6 @@ import com.binance.api.client.BinanceApiAsyncMarginRestClient; import com.binance.api.client.BinanceApiCallback; -import com.binance.api.client.BinanceEngineType; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.*; @@ -14,7 +13,6 @@ import java.util.List; -import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; /** * Implementation of Binance's Margin REST API using Retrofit with asynchronous/non-blocking method calls. @@ -23,8 +21,8 @@ public class BinanceApiAsyncMarginRestClientImpl implements BinanceApiAsyncMargi private final BinanceApiService binanceApiService; - public BinanceApiAsyncMarginRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); + public BinanceApiAsyncMarginRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); } // Margin Account endpoints diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java index 6dd0aaaed..2ae969d8b 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java @@ -2,251 +2,222 @@ import com.binance.api.client.BinanceApiAsyncRestClient; import com.binance.api.client.BinanceApiCallback; -import com.binance.api.client.BinanceEngineType; -import com.binance.api.client.config.BinanceApiConfig; import com.binance.api.client.constant.BinanceApiConstants; -import com.binance.api.client.domain.account.Account; -import com.binance.api.client.domain.account.DepositAddress; -import com.binance.api.client.domain.account.DepositHistory; -import com.binance.api.client.domain.account.NewOrder; -import com.binance.api.client.domain.account.NewOrderResponse; -import com.binance.api.client.domain.account.Order; -import com.binance.api.client.domain.account.Trade; -import com.binance.api.client.domain.account.TradeHistoryItem; -import com.binance.api.client.domain.account.WithdrawHistory; -import com.binance.api.client.domain.account.WithdrawResult; -import com.binance.api.client.domain.account.request.AllOrdersRequest; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; +import com.binance.api.client.domain.account.*; +import com.binance.api.client.domain.account.request.*; import com.binance.api.client.domain.event.ListenKey; -import com.binance.api.client.domain.general.Asset; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.general.ServerTime; -import com.binance.api.client.domain.market.AggTrade; -import com.binance.api.client.domain.market.BookTicker; -import com.binance.api.client.domain.market.Candlestick; -import com.binance.api.client.domain.market.CandlestickInterval; -import com.binance.api.client.domain.market.OrderBook; -import com.binance.api.client.domain.market.TickerPrice; -import com.binance.api.client.domain.market.TickerStatistics; +import com.binance.api.client.domain.market.*; import java.util.List; -import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; /** * Implementation of Binance's REST API using Retrofit with asynchronous/non-blocking method calls. */ public class BinanceApiAsyncRestClientImpl implements BinanceApiAsyncRestClient { - private final BinanceApiService binanceApiService; - - public BinanceApiAsyncRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); - } - - // General endpoints - - @Override - public void ping(BinanceApiCallback callback) { - binanceApiService.ping().enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getServerTime(BinanceApiCallback callback) { - binanceApiService.getServerTime().enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getExchangeInfo(BinanceApiCallback callback) { - binanceApiService.getExchangeInfo().enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getAllAssets(BinanceApiCallback> callback) { - binanceApiService.getAllAssets(BinanceApiConfig.getAssetInfoApiBaseUrl() + "assetWithdraw/getAllAsset.html") - .enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - // Market Data endpoints - - @Override - public void getOrderBook(String symbol, Integer limit, BinanceApiCallback callback) { - binanceApiService.getOrderBook(symbol, limit).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getTrades(String symbol, Integer limit, BinanceApiCallback> callback) { - binanceApiService.getTrades(symbol, limit).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getHistoricalTrades(String symbol, Integer limit, Long fromId, BinanceApiCallback> callback) { - binanceApiService.getHistoricalTrades(symbol, limit, fromId).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getAggTrades(String symbol, String fromId, Integer limit, Long startTime, Long endTime, BinanceApiCallback> callback) { - binanceApiService.getAggTrades(symbol, fromId, limit, startTime, endTime).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getAggTrades(String symbol, BinanceApiCallback> callback) { - getAggTrades(symbol, null, null, null, null, callback); - } - - @Override - public void getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime, BinanceApiCallback> callback) { - binanceApiService.getCandlestickBars(symbol, interval.getIntervalId(), limit, startTime, endTime).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getCandlestickBars(String symbol, CandlestickInterval interval, BinanceApiCallback> callback) { - getCandlestickBars(symbol, interval, null, null, null, callback); - } - - @Override - public void get24HrPriceStatistics(String symbol, BinanceApiCallback callback) { - binanceApiService.get24HrPriceStatistics(symbol).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getAll24HrPriceStatistics(BinanceApiCallback> callback) { - binanceApiService.getAll24HrPriceStatistics().enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getAllPrices(BinanceApiCallback> callback) { - binanceApiService.getLatestPrices().enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getPrice(String symbol , BinanceApiCallback callback) { - binanceApiService.getLatestPrice(symbol).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getBookTickers(BinanceApiCallback> callback) { - binanceApiService.getBookTickers().enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void newOrder(NewOrder order, BinanceApiCallback callback) { - if (order.getQuoteOrderQty() == null) { - binanceApiService.newOrder(order.getSymbol(), order.getSide(), order.getType(), - order.getTimeInForce(), order.getQuantity(), order.getPrice(), - order.getNewClientOrderId(), order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), - order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } else { - binanceApiService.newOrderQuoteQty(order.getSymbol(), order.getSide(), order.getType(), - order.getTimeInForce(), order.getQuoteOrderQty(), order.getPrice(), - order.getNewClientOrderId(), order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), - order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - } - - @Override - public void newOrderTest(NewOrder order, BinanceApiCallback callback) { - binanceApiService.newOrderTest(order.getSymbol(), order.getSide(), order.getType(), - order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), order.getStopPrice(), - order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - // Account endpoints - - @Override - public void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback) { - binanceApiService.getOrderStatus(orderStatusRequest.getSymbol(), - orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), - orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback) { - binanceApiService.cancelOrder(cancelOrderRequest.getSymbol(), - cancelOrderRequest.getOrderId(), cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), - cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback) { - binanceApiService.getOpenOrders(orderRequest.getSymbol(), - orderRequest.getRecvWindow(), orderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getAllOrders(AllOrdersRequest orderRequest, BinanceApiCallback> callback) { - binanceApiService.getAllOrders(orderRequest.getSymbol(), - orderRequest.getOrderId(), orderRequest.getLimit(), - orderRequest.getRecvWindow(), orderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback) { - binanceApiService.getAccount(recvWindow, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getAccount(BinanceApiCallback callback) { - long timestamp = System.currentTimeMillis(); - binanceApiService.getAccount(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp, BinanceApiCallback> callback) { - binanceApiService.getMyTrades(symbol, limit, fromId, recvWindow, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getMyTrades(String symbol, Integer limit, BinanceApiCallback> callback) { - getMyTrades(symbol, limit, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis(), callback); - } - - @Override - public void getMyTrades(String symbol, BinanceApiCallback> callback) { - getMyTrades(symbol, null, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis(), callback); - } - - @Override - public void withdraw(String asset, String address, String amount, String name, String addressTag, BinanceApiCallback callback) { - binanceApiService.withdraw(asset, address, amount, name, addressTag, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()) - .enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getDepositHistory(String asset, BinanceApiCallback callback) { - binanceApiService.getDepositHistory(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()) - .enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getWithdrawHistory(String asset, BinanceApiCallback callback) { - binanceApiService.getWithdrawHistory(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()) - .enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void getDepositAddress(String asset, BinanceApiCallback callback) { - binanceApiService.getDepositAddress(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()) - .enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - // User stream endpoints - - @Override - public void startUserDataStream(BinanceApiCallback callback) { - binanceApiService.startUserDataStream().enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void keepAliveUserDataStream(String listenKey, BinanceApiCallback callback) { - binanceApiService.keepAliveUserDataStream(listenKey).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - - @Override - public void closeUserDataStream(String listenKey, BinanceApiCallback callback) { - binanceApiService.closeAliveUserDataStream(listenKey).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } + private final BinanceApiService binanceApiService; + + public BinanceApiAsyncRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); + } + + // General endpoints + + @Override + public void ping(BinanceApiCallback callback) { + binanceApiService.ping().enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getServerTime(BinanceApiCallback callback) { + binanceApiService.getServerTime().enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getExchangeInfo(BinanceApiCallback callback) { + binanceApiService.getExchangeInfo().enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + // Market Data endpoints + + @Override + public void getOrderBook(String symbol, Integer limit, BinanceApiCallback callback) { + binanceApiService.getOrderBook(symbol, limit).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getTrades(String symbol, Integer limit, BinanceApiCallback> callback) { + binanceApiService.getTrades(symbol, limit).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getHistoricalTrades(String symbol, Integer limit, Long fromId, BinanceApiCallback> callback) { + binanceApiService.getHistoricalTrades(symbol, limit, fromId).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getAggTrades(String symbol, String fromId, Integer limit, Long startTime, Long endTime, BinanceApiCallback> callback) { + binanceApiService.getAggTrades(symbol, fromId, limit, startTime, endTime).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getAggTrades(String symbol, BinanceApiCallback> callback) { + getAggTrades(symbol, null, null, null, null, callback); + } + + @Override + public void getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime, BinanceApiCallback> callback) { + binanceApiService.getCandlestickBars(symbol, interval.getIntervalId(), limit, startTime, endTime).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getCandlestickBars(String symbol, CandlestickInterval interval, BinanceApiCallback> callback) { + getCandlestickBars(symbol, interval, null, null, null, callback); + } + + @Override + public void get24HrPriceStatistics(String symbol, BinanceApiCallback callback) { + binanceApiService.get24HrPriceStatistics(symbol).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getAll24HrPriceStatistics(BinanceApiCallback> callback) { + binanceApiService.getAll24HrPriceStatistics().enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getAllPrices(BinanceApiCallback> callback) { + binanceApiService.getLatestPrices().enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getPrice(String symbol, BinanceApiCallback callback) { + binanceApiService.getLatestPrice(symbol).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getBookTickers(BinanceApiCallback> callback) { + binanceApiService.getBookTickers().enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void newOrder(NewOrder order, BinanceApiCallback callback) { + if (order.getQuoteOrderQty() == null) { + binanceApiService.newOrder(order.getSymbol(), order.getSide(), order.getType(), + order.getTimeInForce(), order.getQuantity(), order.getPrice(), + order.getNewClientOrderId(), order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), + order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } else { + binanceApiService.newOrderQuoteQty(order.getSymbol(), order.getSide(), order.getType(), + order.getTimeInForce(), order.getQuoteOrderQty(), order.getPrice(), + order.getNewClientOrderId(), order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), + order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + } + + @Override + public void newOrderTest(NewOrder order, BinanceApiCallback callback) { + binanceApiService.newOrderTest(order.getSymbol(), order.getSide(), order.getType(), + order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), order.getStopPrice(), + order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + // Account endpoints + + @Override + public void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback) { + binanceApiService.getOrderStatus(orderStatusRequest.getSymbol(), + orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), + orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void cancelOrder(CancelOrderRequest cancelOrderRequest, BinanceApiCallback callback) { + binanceApiService.cancelOrder(cancelOrderRequest.getSymbol(), + cancelOrderRequest.getOrderId(), cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), + cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getOpenOrders(OrderRequest orderRequest, BinanceApiCallback> callback) { + binanceApiService.getOpenOrders(orderRequest.getSymbol(), + orderRequest.getRecvWindow(), orderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getAllOrders(AllOrdersRequest orderRequest, BinanceApiCallback> callback) { + binanceApiService.getAllOrders(orderRequest.getSymbol(), + orderRequest.getOrderId(), orderRequest.getLimit(), + orderRequest.getRecvWindow(), orderRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getAccount(Long recvWindow, Long timestamp, BinanceApiCallback callback) { + binanceApiService.getAccount(recvWindow, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getAccount(BinanceApiCallback callback) { + long timestamp = System.currentTimeMillis(); + binanceApiService.getAccount(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp, BinanceApiCallback> callback) { + binanceApiService.getMyTrades(symbol, limit, fromId, recvWindow, timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getMyTrades(String symbol, Integer limit, BinanceApiCallback> callback) { + getMyTrades(symbol, limit, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis(), callback); + } + + @Override + public void getMyTrades(String symbol, BinanceApiCallback> callback) { + getMyTrades(symbol, null, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis(), callback); + } + + @Override + public void withdraw(String asset, String address, String amount, String name, String addressTag, BinanceApiCallback callback) { + binanceApiService.withdraw(asset, address, amount, name, addressTag, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()) + .enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getDepositHistory(String asset, BinanceApiCallback callback) { + binanceApiService.getDepositHistory(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()) + .enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getWithdrawHistory(String asset, BinanceApiCallback callback) { + binanceApiService.getWithdrawHistory(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()) + .enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getDepositAddress(String asset, BinanceApiCallback callback) { + binanceApiService.getDepositAddress(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()) + .enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + // User stream endpoints + + @Override + public void startUserDataStream(BinanceApiCallback callback) { + binanceApiService.startUserDataStream().enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void keepAliveUserDataStream(String listenKey, BinanceApiCallback callback) { + binanceApiService.keepAliveUserDataStream(listenKey).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void closeUserDataStream(String listenKey, BinanceApiCallback callback) { + binanceApiService.closeAliveUserDataStream(listenKey).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } } diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java index 629758213..fc56ba3e5 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java @@ -1,64 +1,62 @@ -package com.binance.api.client.impl; - -import com.binance.api.client.BinanceApiFuturesRestClient; -import com.binance.api.client.BinanceEngineType; -import com.binance.api.client.constant.BinanceApiConstants; -import com.binance.api.client.domain.account.FuturesAccount; -import com.binance.api.client.domain.account.FuturesNewOrder; -import com.binance.api.client.domain.account.FuturesNewOrderResponse; -import com.binance.api.client.domain.account.Order; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; - -import java.util.List; - -import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; -import static com.binance.api.client.impl.BinanceApiServiceGenerator.executeSync; - -/** - * Implementation of Binance's Margin REST API using Retrofit with asynchronous/non-blocking method calls. - */ -public class BinanceApiFuturesRestClientImpl implements BinanceApiFuturesRestClient { - - private final BinanceFuturesApiService binanceApiService; - - public BinanceApiFuturesRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceFuturesApiService.class, apiKey, secret, BinanceEngineType.FUTURES); - } - - @Override - public FuturesAccount getAccount() { - long timestamp = System.currentTimeMillis(); - return executeSync(binanceApiService.getAccount(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp)); - } - - @Override - public List getOpenOrders(OrderRequest orderRequest) { - return executeSync(binanceApiService.getOpenOrders(orderRequest.getSymbol(), orderRequest.getRecvWindow(), - orderRequest.getTimestamp())); - } - - @Override - public FuturesNewOrderResponse newOrder(FuturesNewOrder order) { - return executeSync(binanceApiService.newOrder(order.getSymbol(), order.getSide(), order.getPositionSide(), - order.getType(), order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), - order.getStopPrice(), order.isClosePosition(), order.getActivationPrice(), order.getWorkingType(), - order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp())); - } - - @Override - public CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest) { - return executeSync(binanceApiService.cancelOrder(cancelOrderRequest.getSymbol(), - cancelOrderRequest.getOrderId(), cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), - cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp())); - } - - @Override - public Order getOrderStatus(OrderStatusRequest orderStatusRequest) { - return executeSync(binanceApiService.getOrderStatus(orderStatusRequest.getSymbol(), - orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), - orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp())); - } +package com.binance.api.client.impl; + +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.account.FuturesAccount; +import com.binance.api.client.domain.account.FuturesNewOrder; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.Order; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; + +import java.util.List; + +import static com.binance.api.client.impl.BinanceApiServiceGenerator.executeSync; + +/** + * Implementation of Binance's Margin REST API using Retrofit with asynchronous/non-blocking method calls. + */ +public class BinanceApiFuturesRestClientImpl implements BinanceApiFuturesRestClient { + + private final BinanceFuturesApiService binanceApiService; + + public BinanceApiFuturesRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceApiService = BinanceApiServiceGenerator.createService(BinanceFuturesApiService.class, apiKey, secret, apiUrl); + } + + @Override + public FuturesAccount getAccount() { + long timestamp = System.currentTimeMillis(); + return executeSync(binanceApiService.getAccount(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp)); + } + + @Override + public List getOpenOrders(OrderRequest orderRequest) { + return executeSync(binanceApiService.getOpenOrders(orderRequest.getSymbol(), orderRequest.getRecvWindow(), + orderRequest.getTimestamp())); + } + + @Override + public FuturesNewOrderResponse newOrder(FuturesNewOrder order) { + return executeSync(binanceApiService.newOrder(order.getSymbol(), order.getSide(), order.getPositionSide(), + order.getType(), order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), + order.getStopPrice(), order.isClosePosition(), order.getActivationPrice(), order.getWorkingType(), + order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp())); + } + + @Override + public CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest) { + return executeSync(binanceApiService.cancelOrder(cancelOrderRequest.getSymbol(), + cancelOrderRequest.getOrderId(), cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), + cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp())); + } + + @Override + public Order getOrderStatus(OrderStatusRequest orderStatusRequest) { + return executeSync(binanceApiService.getOrderStatus(orderStatusRequest.getSymbol(), + orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), + orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp())); + } } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java index b4fb74fd1..f8bc30721 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java @@ -1,7 +1,6 @@ package com.binance.api.client.impl; import com.binance.api.client.BinanceApiMarginRestClient; -import com.binance.api.client.BinanceEngineType; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.*; @@ -12,7 +11,6 @@ import java.util.List; -import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; import static com.binance.api.client.impl.BinanceApiServiceGenerator.executeSync; /** @@ -22,8 +20,8 @@ public class BinanceApiMarginRestClientImpl implements BinanceApiMarginRestClien private final BinanceApiService binanceApiService; - public BinanceApiMarginRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); + public BinanceApiMarginRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); } @Override diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java index 09c80863c..aaeaf980f 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java @@ -1,19 +1,15 @@ package com.binance.api.client.impl; import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.BinanceEngineType; -import com.binance.api.client.config.BinanceApiConfig; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.*; -import com.binance.api.client.domain.general.Asset; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.market.*; import retrofit2.Call; import java.util.List; -import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; import static com.binance.api.client.impl.BinanceApiServiceGenerator.executeSync; /** @@ -22,229 +18,223 @@ */ public class BinanceApiRestClientImpl implements BinanceApiRestClient { - private final BinanceApiService binanceApiService; - - public BinanceApiRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); - } - - // General endpoints - - @Override - public void ping() { - executeSync(binanceApiService.ping()); - } - - @Override - public Long getServerTime() { - return executeSync(binanceApiService.getServerTime()).getServerTime(); - } - - @Override - public ExchangeInfo getExchangeInfo() { - return executeSync(binanceApiService.getExchangeInfo()); - } - - @Override - public List getAllAssets() { - return executeSync(binanceApiService - .getAllAssets(BinanceApiConfig.getAssetInfoApiBaseUrl() + "assetWithdraw/getAllAsset.html")); - } - - // Market Data endpoints - - @Override - public OrderBook getOrderBook(String symbol, Integer limit) { - return executeSync(binanceApiService.getOrderBook(symbol, limit)); - } - - @Override - public List getTrades(String symbol, Integer limit) { - return executeSync(binanceApiService.getTrades(symbol, limit)); - } - - @Override - public List getHistoricalTrades(String symbol, Integer limit, Long fromId) { - return executeSync(binanceApiService.getHistoricalTrades(symbol, limit, fromId)); - } - - @Override - public List getAggTrades(String symbol, String fromId, Integer limit, Long startTime, Long endTime) { - return executeSync(binanceApiService.getAggTrades(symbol, fromId, limit, startTime, endTime)); - } - - @Override - public List getAggTrades(String symbol) { - return getAggTrades(symbol, null, null, null, null); - } - - @Override - public List getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit, - Long startTime, Long endTime) { - return executeSync( - binanceApiService.getCandlestickBars(symbol, interval.getIntervalId(), limit, startTime, endTime)); - } - - @Override - public List getCandlestickBars(String symbol, CandlestickInterval interval) { - return getCandlestickBars(symbol, interval, null, null, null); - } - - @Override - public TickerStatistics get24HrPriceStatistics(String symbol) { - return executeSync(binanceApiService.get24HrPriceStatistics(symbol)); - } - - @Override - public List getAll24HrPriceStatistics() { - return executeSync(binanceApiService.getAll24HrPriceStatistics()); - } - - @Override - public TickerPrice getPrice(String symbol) { - return executeSync(binanceApiService.getLatestPrice(symbol)); - } - - @Override - public List getAllPrices() { - return executeSync(binanceApiService.getLatestPrices()); - } - - @Override - public List getBookTickers() { - return executeSync(binanceApiService.getBookTickers()); - } - - @Override - public NewOrderResponse newOrder(NewOrder order) { - final Call call; - if (order.getQuoteOrderQty() == null) { - call = binanceApiService.newOrder(order.getSymbol(), order.getSide(), order.getType(), - order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), - order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), - order.getTimestamp()); - } else { - call = binanceApiService.newOrderQuoteQty(order.getSymbol(), order.getSide(), order.getType(), - order.getTimeInForce(), order.getQuoteOrderQty(), order.getPrice(), order.getNewClientOrderId(), - order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), - order.getTimestamp()); - } - return executeSync(call); - } - - @Override - public void newOrderTest(NewOrder order) { - executeSync(binanceApiService.newOrderTest(order.getSymbol(), order.getSide(), order.getType(), - order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), - order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), - order.getTimestamp())); - } - - // Account endpoints - - @Override - public Order getOrderStatus(OrderStatusRequest orderStatusRequest) { - return executeSync(binanceApiService.getOrderStatus(orderStatusRequest.getSymbol(), - orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), - orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp())); - } - - @Override - public CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest) { - return executeSync( - binanceApiService.cancelOrder(cancelOrderRequest.getSymbol(), cancelOrderRequest.getOrderId(), - cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), - cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp())); - } - - @Override - public List getOpenOrders(OrderRequest orderRequest) { - return executeSync(binanceApiService.getOpenOrders(orderRequest.getSymbol(), orderRequest.getRecvWindow(), - orderRequest.getTimestamp())); - } - - @Override - public List getAllOrders(AllOrdersRequest orderRequest) { - return executeSync(binanceApiService.getAllOrders(orderRequest.getSymbol(), orderRequest.getOrderId(), - orderRequest.getLimit(), orderRequest.getRecvWindow(), orderRequest.getTimestamp())); - } - - @Override - public Account getAccount(Long recvWindow, Long timestamp) { - return executeSync(binanceApiService.getAccount(recvWindow, timestamp)); - } - - @Override - public Account getAccount() { - return getAccount(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()); - } - - @Override - public List getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp) { - return executeSync(binanceApiService.getMyTrades(symbol, limit, fromId, recvWindow, timestamp)); - } - - @Override - public List getMyTrades(String symbol, Integer limit) { - return getMyTrades(symbol, limit, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, - System.currentTimeMillis()); - } - - @Override - public List getMyTrades(String symbol) { - return getMyTrades(symbol, null, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, - System.currentTimeMillis()); - } - - @Override - public List getMyTrades(String symbol, Long fromId) { - return getMyTrades(symbol, null, fromId, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, - System.currentTimeMillis()); - } - - @Override - public WithdrawResult withdraw(String asset, String address, String amount, String name, String addressTag) { - return executeSync(binanceApiService.withdraw(asset, address, amount, name, addressTag, - BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis())); - } - - @Override - public DepositHistory getDepositHistory(String asset) { - return executeSync(binanceApiService.getDepositHistory(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, - System.currentTimeMillis())); - } - - @Override - public WithdrawHistory getWithdrawHistory(String asset) { - return executeSync(binanceApiService.getWithdrawHistory(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, - System.currentTimeMillis())); - } - - @Override - public List getSubAccountTransfers() { - return executeSync(binanceApiService.getSubAccountTransfers(System.currentTimeMillis())); - } - - @Override - public DepositAddress getDepositAddress(String asset) { - return executeSync(binanceApiService.getDepositAddress(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, - System.currentTimeMillis())); - } - - // User stream endpoints - - @Override - public String startUserDataStream() { - return executeSync(binanceApiService.startUserDataStream()).toString(); - } - - @Override - public void keepAliveUserDataStream(String listenKey) { - executeSync(binanceApiService.keepAliveUserDataStream(listenKey)); - } - - @Override - public void closeUserDataStream(String listenKey) { - executeSync(binanceApiService.closeAliveUserDataStream(listenKey)); - } + private final BinanceApiService binanceApiService; + + public BinanceApiRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); + } + + // General endpoints + + @Override + public void ping() { + executeSync(binanceApiService.ping()); + } + + @Override + public Long getServerTime() { + return executeSync(binanceApiService.getServerTime()).getServerTime(); + } + + @Override + public ExchangeInfo getExchangeInfo() { + return executeSync(binanceApiService.getExchangeInfo()); + } + + // Market Data endpoints + + @Override + public OrderBook getOrderBook(String symbol, Integer limit) { + return executeSync(binanceApiService.getOrderBook(symbol, limit)); + } + + @Override + public List getTrades(String symbol, Integer limit) { + return executeSync(binanceApiService.getTrades(symbol, limit)); + } + + @Override + public List getHistoricalTrades(String symbol, Integer limit, Long fromId) { + return executeSync(binanceApiService.getHistoricalTrades(symbol, limit, fromId)); + } + + @Override + public List getAggTrades(String symbol, String fromId, Integer limit, Long startTime, Long endTime) { + return executeSync(binanceApiService.getAggTrades(symbol, fromId, limit, startTime, endTime)); + } + + @Override + public List getAggTrades(String symbol) { + return getAggTrades(symbol, null, null, null, null); + } + + @Override + public List getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit, + Long startTime, Long endTime) { + return executeSync( + binanceApiService.getCandlestickBars(symbol, interval.getIntervalId(), limit, startTime, endTime)); + } + + @Override + public List getCandlestickBars(String symbol, CandlestickInterval interval) { + return getCandlestickBars(symbol, interval, null, null, null); + } + + @Override + public TickerStatistics get24HrPriceStatistics(String symbol) { + return executeSync(binanceApiService.get24HrPriceStatistics(symbol)); + } + + @Override + public List getAll24HrPriceStatistics() { + return executeSync(binanceApiService.getAll24HrPriceStatistics()); + } + + @Override + public TickerPrice getPrice(String symbol) { + return executeSync(binanceApiService.getLatestPrice(symbol)); + } + + @Override + public List getAllPrices() { + return executeSync(binanceApiService.getLatestPrices()); + } + + @Override + public List getBookTickers() { + return executeSync(binanceApiService.getBookTickers()); + } + + @Override + public NewOrderResponse newOrder(NewOrder order) { + final Call call; + if (order.getQuoteOrderQty() == null) { + call = binanceApiService.newOrder(order.getSymbol(), order.getSide(), order.getType(), + order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), + order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), + order.getTimestamp()); + } else { + call = binanceApiService.newOrderQuoteQty(order.getSymbol(), order.getSide(), order.getType(), + order.getTimeInForce(), order.getQuoteOrderQty(), order.getPrice(), order.getNewClientOrderId(), + order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), + order.getTimestamp()); + } + return executeSync(call); + } + + @Override + public void newOrderTest(NewOrder order) { + executeSync(binanceApiService.newOrderTest(order.getSymbol(), order.getSide(), order.getType(), + order.getTimeInForce(), order.getQuantity(), order.getPrice(), order.getNewClientOrderId(), + order.getStopPrice(), order.getIcebergQty(), order.getNewOrderRespType(), order.getRecvWindow(), + order.getTimestamp())); + } + + // Account endpoints + + @Override + public Order getOrderStatus(OrderStatusRequest orderStatusRequest) { + return executeSync(binanceApiService.getOrderStatus(orderStatusRequest.getSymbol(), + orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), + orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp())); + } + + @Override + public CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest) { + return executeSync( + binanceApiService.cancelOrder(cancelOrderRequest.getSymbol(), cancelOrderRequest.getOrderId(), + cancelOrderRequest.getOrigClientOrderId(), cancelOrderRequest.getNewClientOrderId(), + cancelOrderRequest.getRecvWindow(), cancelOrderRequest.getTimestamp())); + } + + @Override + public List getOpenOrders(OrderRequest orderRequest) { + return executeSync(binanceApiService.getOpenOrders(orderRequest.getSymbol(), orderRequest.getRecvWindow(), + orderRequest.getTimestamp())); + } + + @Override + public List getAllOrders(AllOrdersRequest orderRequest) { + return executeSync(binanceApiService.getAllOrders(orderRequest.getSymbol(), orderRequest.getOrderId(), + orderRequest.getLimit(), orderRequest.getRecvWindow(), orderRequest.getTimestamp())); + } + + @Override + public Account getAccount(Long recvWindow, Long timestamp) { + return executeSync(binanceApiService.getAccount(recvWindow, timestamp)); + } + + @Override + public Account getAccount() { + return getAccount(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()); + } + + @Override + public List getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp) { + return executeSync(binanceApiService.getMyTrades(symbol, limit, fromId, recvWindow, timestamp)); + } + + @Override + public List getMyTrades(String symbol, Integer limit) { + return getMyTrades(symbol, limit, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, + System.currentTimeMillis()); + } + + @Override + public List getMyTrades(String symbol) { + return getMyTrades(symbol, null, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, + System.currentTimeMillis()); + } + + @Override + public List getMyTrades(String symbol, Long fromId) { + return getMyTrades(symbol, null, fromId, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, + System.currentTimeMillis()); + } + + @Override + public WithdrawResult withdraw(String asset, String address, String amount, String name, String addressTag) { + return executeSync(binanceApiService.withdraw(asset, address, amount, name, addressTag, + BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis())); + } + + @Override + public DepositHistory getDepositHistory(String asset) { + return executeSync(binanceApiService.getDepositHistory(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, + System.currentTimeMillis())); + } + + @Override + public WithdrawHistory getWithdrawHistory(String asset) { + return executeSync(binanceApiService.getWithdrawHistory(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, + System.currentTimeMillis())); + } + + @Override + public List getSubAccountTransfers() { + return executeSync(binanceApiService.getSubAccountTransfers(System.currentTimeMillis())); + } + + @Override + public DepositAddress getDepositAddress(String asset) { + return executeSync(binanceApiService.getDepositAddress(asset, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, + System.currentTimeMillis())); + } + + // User stream endpoints + + @Override + public String startUserDataStream() { + return executeSync(binanceApiService.startUserDataStream()).toString(); + } + + @Override + public void keepAliveUserDataStream(String listenKey) { + executeSync(binanceApiService.keepAliveUserDataStream(listenKey)); + } + + @Override + public void closeUserDataStream(String listenKey) { + executeSync(binanceApiService.closeAliveUserDataStream(listenKey)); + } } diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java b/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java index 8a6689162..9d3e9ac94 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java @@ -1,8 +1,6 @@ package com.binance.api.client.impl; import com.binance.api.client.BinanceApiError; -import com.binance.api.client.BinanceEngineType; -import com.binance.api.client.config.BinanceApiConfig; import com.binance.api.client.exception.BinanceApiException; import com.binance.api.client.security.AuthenticationInterceptor; import okhttp3.Dispatcher; @@ -42,13 +40,9 @@ public class BinanceApiServiceGenerator { (Converter) converterFactory.responseBodyConverter( BinanceApiError.class, new Annotation[0], null); - public static S createService(Class serviceClass) { - return createService(serviceClass, null, null, null); - } - - public static S createService(Class serviceClass, String apiKey, String secret, BinanceEngineType engineType) { + public static S createService(Class serviceClass, String apiKey, String secret, String apiUrl) { Retrofit.Builder retrofitBuilder = new Retrofit.Builder() - .baseUrl(engineType.equals(BinanceEngineType.SPOT) ? BinanceApiConfig.getApiBaseUrl() : BinanceApiConfig.getFuturesApiBaseUrl()) + .baseUrl(apiUrl) .addConverterFactory(converterFactory); if (StringUtils.isEmpty(apiKey) || StringUtils.isEmpty(secret)) { diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java index 5b28b6115..71d1e050f 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java @@ -1,14 +1,12 @@ package com.binance.api.client.impl; import com.binance.api.client.BinanceApiSwapRestClient; -import com.binance.api.client.BinanceEngineType; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.SwapRemoveType; import com.binance.api.client.domain.account.*; import java.util.List; -import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; import static com.binance.api.client.impl.BinanceApiServiceGenerator.executeSync; /** @@ -18,8 +16,8 @@ public class BinanceApiSwapRestClientImpl implements BinanceApiSwapRestClient { private final BinanceApiService binanceApiService; - public BinanceApiSwapRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret, BinanceEngineType.SPOT); + public BinanceApiSwapRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); } @Override 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 a4b4a522b..056bd251a 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java @@ -2,8 +2,6 @@ import com.binance.api.client.BinanceApiCallback; import com.binance.api.client.BinanceApiWebSocketClient; -import com.binance.api.client.BinanceEngineType; -import com.binance.api.client.config.BinanceApiConfig; import com.binance.api.client.domain.event.*; import com.binance.api.client.domain.market.CandlestickInterval; import com.fasterxml.jackson.core.type.TypeReference; @@ -22,11 +20,11 @@ public class BinanceApiWebSocketClientImpl implements BinanceApiWebSocketClient, Closeable { private final OkHttpClient client; - private final BinanceEngineType engineType; + private final String websocketUrl; - public BinanceApiWebSocketClientImpl(OkHttpClient client, BinanceEngineType engineType) { + public BinanceApiWebSocketClientImpl(OkHttpClient client, String websocketUrl) { this.client = client; - this.engineType = engineType; + this.websocketUrl = websocketUrl; } @Override @@ -96,7 +94,7 @@ public void close() { } private Closeable createNewWebSocket(String channel, BinanceApiWebSocketListener listener) { - String streamingUrl = String.format("%s/%s", engineType.equals(BinanceEngineType.SPOT) ? BinanceApiConfig.getStreamApiBaseUrl() : BinanceApiConfig.getFuturesStreamApiBaseUrl(), channel); + String streamingUrl = String.format("%s/%s", websocketUrl, channel); Request request = new Request.Builder().url(streamingUrl).build(); final WebSocket webSocket = client.newWebSocket(request, listener); return () -> { diff --git a/src/test/java/com/binance/api/client/domain/account/SpotOrderResponseTest.java b/src/test/java/com/binance/api/client/domain/account/SpotOrderResponseTest.java new file mode 100755 index 000000000..5bf083d22 --- /dev/null +++ b/src/test/java/com/binance/api/client/domain/account/SpotOrderResponseTest.java @@ -0,0 +1,48 @@ +package com.binance.api.client.domain.account; + +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; + +/** + * @see NewOrderResponse + */ +public class SpotOrderResponseTest { + + private NewOrderResponse newOrderResponse; + private Trade trade; + + @Before + public void setUp() { + newOrderResponse = new NewOrderResponse(); + trade = new Trade(); + trade.setId(123L); + } + + @Test + public void shouldHandleToStringWithNullFills() { + assertThat(newOrderResponse.toString(), containsString(",fills=")); + } + + @Test + public void shouldHandleToStringWithNoFills() { + newOrderResponse.setFills(Collections.emptyList()); + assertThat(newOrderResponse.toString(), containsString(",fills=")); + } + + @Test + public void shouldHandleToStringWithFills() { + newOrderResponse.setFills(trades(trade)); + assertThat(newOrderResponse.toString(), containsString(",fills=Trade[id=123,")); + } + + private static List trades(final Trade... trades) { + return Arrays.asList(trades); + } +} \ No newline at end of file diff --git a/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java b/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java index 8fcd51118..e0d8ede45 100755 --- a/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java +++ b/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java @@ -1,10 +1,11 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.domain.account.Account; import com.binance.api.client.domain.account.AssetBalance; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.Map; import java.util.TreeMap; @@ -16,66 +17,67 @@ */ public class AccountBalanceCacheExample { - private final BinanceApiClientFactory clientFactory; - - /** - * Key is the symbol, and the value is the balance of that symbol on the account. - */ - private Map accountBalanceCache; - - /** - * Listen key used to interact with the user data streaming API. - */ - private final String listenKey; - - public AccountBalanceCacheExample(String apiKey, String secret) { - this.clientFactory = BinanceApiClientFactory.newInstance(apiKey, secret); - this.listenKey = initializeAssetBalanceCacheAndStreamSession(); - startAccountBalanceEventStreaming(listenKey); - } - - /** - * Initializes the asset balance cache by using the REST API and starts a new user data streaming session. - * - * @return a listenKey that can be used with the user data streaming API. - */ - private String initializeAssetBalanceCacheAndStreamSession() { - BinanceApiRestClient client = clientFactory.newRestClient(); - Account account = client.getAccount(); - - this.accountBalanceCache = new TreeMap<>(); - for (AssetBalance assetBalance : account.getBalances()) { - accountBalanceCache.put(assetBalance.getAsset(), assetBalance); - } + private final BinanceSpotApiClientFactory clientFactory; + + /** + * Key is the symbol, and the value is the balance of that symbol on the account. + */ + private Map accountBalanceCache; - return client.startUserDataStream(); - } + /** + * Listen key used to interact with the user data streaming API. + */ + private final String listenKey; - /** - * Begins streaming of agg trades events. - */ - private void startAccountBalanceEventStreaming(String listenKey) { - BinanceApiWebSocketClient client = clientFactory.newWebSocketClient(); + public AccountBalanceCacheExample(String apiKey, String secret) { + this.clientFactory = BinanceAbstractFactory.createSpotFactory(apiKey, secret); + + this.listenKey = initializeAssetBalanceCacheAndStreamSession(); + startAccountBalanceEventStreaming(listenKey); + } - client.onUserDataUpdateEvent(listenKey, response -> { - if (response.getEventType() == ACCOUNT_UPDATE) { - // Override cached asset balances - for (AssetBalance assetBalance : response.getAccountUpdateEvent().getBalances()) { - accountBalanceCache.put(assetBalance.getAsset(), assetBalance); + /** + * Initializes the asset balance cache by using the REST API and starts a new user data streaming session. + * + * @return a listenKey that can be used with the user data streaming API. + */ + private String initializeAssetBalanceCacheAndStreamSession() { + BinanceApiRestClient client = clientFactory.newRestClient(); + Account account = client.getAccount(); + + this.accountBalanceCache = new TreeMap<>(); + for (AssetBalance assetBalance : account.getBalances()) { + accountBalanceCache.put(assetBalance.getAsset(), assetBalance); } - System.out.println(accountBalanceCache); - } - }); - } - - /** - * @return an account balance cache, containing the balance for every asset in this account. - */ - public Map getAccountBalanceCache() { - return accountBalanceCache; - } - - public static void main(String[] args) { - new AccountBalanceCacheExample("YOUR_API_KEY", "YOUR_SECRET"); - } + + return client.startUserDataStream(); + } + + /** + * Begins streaming of agg trades events. + */ + private void startAccountBalanceEventStreaming(String listenKey) { + BinanceApiWebSocketClient client = clientFactory.newWebSocketClient(); + + client.onUserDataUpdateEvent(listenKey, response -> { + if (response.getEventType() == ACCOUNT_UPDATE) { + // Override cached asset balances + for (AssetBalance assetBalance : response.getAccountUpdateEvent().getBalances()) { + accountBalanceCache.put(assetBalance.getAsset(), assetBalance); + } + System.out.println(accountBalanceCache); + } + }); + } + + /** + * @return an account balance cache, containing the balance for every asset in this account. + */ + public Map getAccountBalanceCache() { + return accountBalanceCache; + } + + public static void main(String[] args) { + new AccountBalanceCacheExample("YOUR_API_KEY", "YOUR_SECRET"); + } } diff --git a/src/test/java/com/binance/api/examples/AccountEndpointsExample.java b/src/test/java/com/binance/api/examples/AccountEndpointsExample.java index 72fc68c3d..7e82db9a2 100755 --- a/src/test/java/com/binance/api/examples/AccountEndpointsExample.java +++ b/src/test/java/com/binance/api/examples/AccountEndpointsExample.java @@ -1,9 +1,10 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.domain.account.Account; import com.binance.api.client.domain.account.Trade; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.List; @@ -12,29 +13,29 @@ */ public class AccountEndpointsExample { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiRestClient client = factory.newRestClient(); + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiRestClient client = factory.newRestClient(); - // Get account balances - Account account = client.getAccount(60_000L, System.currentTimeMillis()); - System.out.println(account.getBalances()); - System.out.println(account.getAssetBalance("ETH")); + // Get account balances + Account account = client.getAccount(60_000L, System.currentTimeMillis()); + System.out.println(account.getBalances()); + System.out.println(account.getAssetBalance("ETH")); - // Get list of trades - List myTrades = client.getMyTrades("NEOETH"); - System.out.println(myTrades); + // Get list of trades + List myTrades = client.getMyTrades("NEOETH"); + System.out.println(myTrades); - // Get withdraw history - System.out.println(client.getWithdrawHistory("ETH")); + // Get withdraw history + System.out.println(client.getWithdrawHistory("ETH")); - // Get deposit history - System.out.println(client.getDepositHistory("ETH")); + // Get deposit history + System.out.println(client.getDepositHistory("ETH")); - // Get deposit address - System.out.println(client.getDepositAddress("ETH")); + // Get deposit address + System.out.println(client.getDepositAddress("ETH")); - // Withdraw - client.withdraw("ETH", "0x123", "0.1", null, null); - } + // Withdraw + client.withdraw("ETH", "0x123", "0.1", null, null); + } } diff --git a/src/test/java/com/binance/api/examples/AccountEndpointsExampleAsync.java b/src/test/java/com/binance/api/examples/AccountEndpointsExampleAsync.java index 5ede0526b..65d6a6ffa 100755 --- a/src/test/java/com/binance/api/examples/AccountEndpointsExampleAsync.java +++ b/src/test/java/com/binance/api/examples/AccountEndpointsExampleAsync.java @@ -1,31 +1,33 @@ package com.binance.api.examples; import com.binance.api.client.BinanceApiAsyncRestClient; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.domain.account.Account; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * Examples on how to get account information. */ public class AccountEndpointsExampleAsync { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); - // Get account balances (async) - client.getAccount((Account response) -> System.out.println(response.getAssetBalance("ETH"))); + // Get account balances (async) + client.getAccount((Account response) -> System.out.println(response.getAssetBalance("ETH"))); - // Get list of trades (async) - client.getMyTrades("NEOETH", response -> System.out.println(response)); + // Get list of trades (async) + client.getMyTrades("NEOETH", System.out::println); - // Get withdraw history (async) - client.getWithdrawHistory("ETH", response -> System.out.println(response)); + // Get withdraw history (async) + client.getWithdrawHistory("ETH", System.out::println); - // Get deposit history (async) - client.getDepositHistory("ETH", response -> System.out.println(response)); + // Get deposit history (async) + client.getDepositHistory("ETH", System.out::println); - // Withdraw (async) - client.withdraw("ETH", "0x123", "0.1", null, null, response -> {}); - } + // Withdraw (async) + client.withdraw("ETH", "0x123", "0.1", null, null, response -> { + }); + } } diff --git a/src/test/java/com/binance/api/examples/AggTradesCacheExample.java b/src/test/java/com/binance/api/examples/AggTradesCacheExample.java index 985ffe4ca..90fea3bf5 100755 --- a/src/test/java/com/binance/api/examples/AggTradesCacheExample.java +++ b/src/test/java/com/binance/api/examples/AggTradesCacheExample.java @@ -1,9 +1,9 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.domain.market.AggTrade; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.HashMap; import java.util.List; @@ -14,67 +14,67 @@ */ public class AggTradesCacheExample { - /** - * Key is the aggregate trade id, and the value contains the aggregated trade data, which is - * automatically updated whenever a new agg data stream event arrives. - */ - private Map aggTradesCache; + /** + * Key is the aggregate trade id, and the value contains the aggregated trade data, which is + * automatically updated whenever a new agg data stream event arrives. + */ + private Map aggTradesCache; - public AggTradesCacheExample(String symbol) { - initializeAggTradesCache(symbol); - startAggTradesEventStreaming(symbol); - } + public AggTradesCacheExample(String symbol) { + initializeAggTradesCache(symbol); + startAggTradesEventStreaming(symbol); + } - /** - * Initializes the aggTrades cache by using the REST API. - */ - private void initializeAggTradesCache(String symbol) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiRestClient client = factory.newRestClient(); - List aggTrades = client.getAggTrades(symbol.toUpperCase()); + /** + * Initializes the aggTrades cache by using the REST API. + */ + private void initializeAggTradesCache(String symbol) { + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + BinanceApiRestClient client = factory.newRestClient(); + List aggTrades = client.getAggTrades(symbol.toUpperCase()); - this.aggTradesCache = new HashMap<>(); - for (AggTrade aggTrade : aggTrades) { - aggTradesCache.put(aggTrade.getAggregatedTradeId(), aggTrade); + this.aggTradesCache = new HashMap<>(); + for (AggTrade aggTrade : aggTrades) { + aggTradesCache.put(aggTrade.getAggregatedTradeId(), aggTrade); + } } - } - /** - * Begins streaming of agg trades events. - */ - private void startAggTradesEventStreaming(String symbol) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiWebSocketClient client = factory.newWebSocketClient(); + /** + * Begins streaming of agg trades events. + */ + private void startAggTradesEventStreaming(String symbol) { + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + BinanceApiWebSocketClient client = factory.newWebSocketClient(); - client.onAggTradeEvent(symbol.toLowerCase(), response -> { - Long aggregatedTradeId = response.getAggregatedTradeId(); - AggTrade updateAggTrade = aggTradesCache.get(aggregatedTradeId); - if (updateAggTrade == null) { - // new agg trade - updateAggTrade = new AggTrade(); - } - updateAggTrade.setAggregatedTradeId(aggregatedTradeId); - updateAggTrade.setPrice(response.getPrice()); - updateAggTrade.setQuantity(response.getQuantity()); - updateAggTrade.setFirstBreakdownTradeId(response.getFirstBreakdownTradeId()); - updateAggTrade.setLastBreakdownTradeId(response.getLastBreakdownTradeId()); - updateAggTrade.setBuyerMaker(response.isBuyerMaker()); + client.onAggTradeEvent(symbol.toLowerCase(), response -> { + Long aggregatedTradeId = response.getAggregatedTradeId(); + AggTrade updateAggTrade = aggTradesCache.get(aggregatedTradeId); + if (updateAggTrade == null) { + // new agg trade + updateAggTrade = new AggTrade(); + } + updateAggTrade.setAggregatedTradeId(aggregatedTradeId); + updateAggTrade.setPrice(response.getPrice()); + updateAggTrade.setQuantity(response.getQuantity()); + updateAggTrade.setFirstBreakdownTradeId(response.getFirstBreakdownTradeId()); + updateAggTrade.setLastBreakdownTradeId(response.getLastBreakdownTradeId()); + updateAggTrade.setBuyerMaker(response.isBuyerMaker()); - // Store the updated agg trade in the cache - aggTradesCache.put(aggregatedTradeId, updateAggTrade); - System.out.println(updateAggTrade); - }); - } + // Store the updated agg trade in the cache + aggTradesCache.put(aggregatedTradeId, updateAggTrade); + System.out.println(updateAggTrade); + }); + } - /** - * @return an aggTrades cache, containing the aggregated trade id as the key, - * and the agg trade data as the value. - */ - public Map getAggTradesCache() { - return aggTradesCache; - } + /** + * @return an aggTrades cache, containing the aggregated trade id as the key, + * and the agg trade data as the value. + */ + public Map getAggTradesCache() { + return aggTradesCache; + } - public static void main(String[] args) { - new AggTradesCacheExample("ETHBTC"); - } + public static void main(String[] args) { + new AggTradesCacheExample("ETHBTC"); + } } diff --git a/src/test/java/com/binance/api/examples/AllMarketTickersExample.java b/src/test/java/com/binance/api/examples/AllMarketTickersExample.java index 4bee760ce..8afc52005 100755 --- a/src/test/java/com/binance/api/examples/AllMarketTickersExample.java +++ b/src/test/java/com/binance/api/examples/AllMarketTickersExample.java @@ -1,21 +1,19 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * All market tickers channel examples. - * + *

* It illustrates how to create a stream to obtain all market tickers. */ public class AllMarketTickersExample { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiWebSocketClient client = factory.newWebSocketClient(); + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + BinanceApiWebSocketClient client = factory.newWebSocketClient(); - client.onAllMarketTickersEvent(event -> { - System.out.println(event); - }); - } + client.onAllMarketTickersEvent(System.out::println); + } } diff --git a/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java b/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java index 4b0be5217..0e18faa1c 100755 --- a/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java +++ b/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java @@ -1,10 +1,10 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.domain.market.Candlestick; import com.binance.api.client.domain.market.CandlestickInterval; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.List; import java.util.Map; @@ -15,72 +15,72 @@ */ public class CandlesticksCacheExample { - /** - * Key is the start/open time of the candle, and the value contains candlestick date. - */ - private Map candlesticksCache; + /** + * Key is the start/open time of the candle, and the value contains candlestick date. + */ + private Map candlesticksCache; - public CandlesticksCacheExample(String symbol, CandlestickInterval interval) { - initializeCandlestickCache(symbol, interval); - startCandlestickEventStreaming(symbol, interval); - } + public CandlesticksCacheExample(String symbol, CandlestickInterval interval) { + initializeCandlestickCache(symbol, interval); + startCandlestickEventStreaming(symbol, interval); + } - /** - * Initializes the candlestick cache by using the REST API. - */ - private void initializeCandlestickCache(String symbol, CandlestickInterval interval) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiRestClient client = factory.newRestClient(); - List candlestickBars = client.getCandlestickBars(symbol.toUpperCase(), interval); + /** + * Initializes the candlestick cache by using the REST API. + */ + private void initializeCandlestickCache(String symbol, CandlestickInterval interval) { + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + BinanceApiRestClient client = factory.newRestClient(); + List candlestickBars = client.getCandlestickBars(symbol.toUpperCase(), interval); - this.candlesticksCache = new TreeMap<>(); - for (Candlestick candlestickBar : candlestickBars) { - candlesticksCache.put(candlestickBar.getOpenTime(), candlestickBar); + this.candlesticksCache = new TreeMap<>(); + for (Candlestick candlestickBar : candlestickBars) { + candlesticksCache.put(candlestickBar.getOpenTime(), candlestickBar); + } } - } - /** - * Begins streaming of depth events. - */ - private void startCandlestickEventStreaming(String symbol, CandlestickInterval interval) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiWebSocketClient client = factory.newWebSocketClient(); + /** + * Begins streaming of depth events. + */ + private void startCandlestickEventStreaming(String symbol, CandlestickInterval interval) { + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + BinanceApiWebSocketClient client = factory.newWebSocketClient(); - client.onCandlestickEvent(symbol.toLowerCase(), interval, response -> { - Long openTime = response.getOpenTime(); - Candlestick updateCandlestick = candlesticksCache.get(openTime); - if (updateCandlestick == null) { - // new candlestick - updateCandlestick = new Candlestick(); - } - // update candlestick with the stream data - updateCandlestick.setOpenTime(response.getOpenTime()); - updateCandlestick.setOpen(response.getOpen()); - updateCandlestick.setLow(response.getLow()); - updateCandlestick.setHigh(response.getHigh()); - updateCandlestick.setClose(response.getClose()); - updateCandlestick.setCloseTime(response.getCloseTime()); - updateCandlestick.setVolume(response.getVolume()); - updateCandlestick.setNumberOfTrades(response.getNumberOfTrades()); - updateCandlestick.setQuoteAssetVolume(response.getQuoteAssetVolume()); - updateCandlestick.setTakerBuyQuoteAssetVolume(response.getTakerBuyQuoteAssetVolume()); - updateCandlestick.setTakerBuyBaseAssetVolume(response.getTakerBuyQuoteAssetVolume()); + client.onCandlestickEvent(symbol.toLowerCase(), interval, response -> { + Long openTime = response.getOpenTime(); + Candlestick updateCandlestick = candlesticksCache.get(openTime); + if (updateCandlestick == null) { + // new candlestick + updateCandlestick = new Candlestick(); + } + // update candlestick with the stream data + updateCandlestick.setOpenTime(response.getOpenTime()); + updateCandlestick.setOpen(response.getOpen()); + updateCandlestick.setLow(response.getLow()); + updateCandlestick.setHigh(response.getHigh()); + updateCandlestick.setClose(response.getClose()); + updateCandlestick.setCloseTime(response.getCloseTime()); + updateCandlestick.setVolume(response.getVolume()); + updateCandlestick.setNumberOfTrades(response.getNumberOfTrades()); + updateCandlestick.setQuoteAssetVolume(response.getQuoteAssetVolume()); + updateCandlestick.setTakerBuyQuoteAssetVolume(response.getTakerBuyQuoteAssetVolume()); + updateCandlestick.setTakerBuyBaseAssetVolume(response.getTakerBuyQuoteAssetVolume()); - // Store the updated candlestick in the cache - candlesticksCache.put(openTime, updateCandlestick); - System.out.println(updateCandlestick); - }); - } + // Store the updated candlestick in the cache + candlesticksCache.put(openTime, updateCandlestick); + System.out.println(updateCandlestick); + }); + } - /** - * @return a klines/candlestick cache, containing the open/start time of the candlestick as the key, - * and the candlestick data as the value. - */ - public Map getCandlesticksCache() { - return candlesticksCache; - } + /** + * @return a klines/candlestick cache, containing the open/start time of the candlestick as the key, + * and the candlestick data as the value. + */ + public Map getCandlesticksCache() { + return candlesticksCache; + } - public static void main(String[] args) { - new CandlesticksCacheExample("ETHBTC", CandlestickInterval.ONE_MINUTE); - } + public static void main(String[] args) { + new CandlesticksCacheExample("ETHBTC", CandlestickInterval.ONE_MINUTE); + } } diff --git a/src/test/java/com/binance/api/examples/DepthCacheExample.java b/src/test/java/com/binance/api/examples/DepthCacheExample.java index 25adc8c55..2bc4460e4 100755 --- a/src/test/java/com/binance/api/examples/DepthCacheExample.java +++ b/src/test/java/com/binance/api/examples/DepthCacheExample.java @@ -1,244 +1,239 @@ package com.binance.api.examples; import com.binance.api.client.BinanceApiCallback; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.DepthEvent; import com.binance.api.client.domain.market.OrderBook; import com.binance.api.client.domain.market.OrderBookEntry; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.io.Closeable; import java.io.IOException; import java.math.BigDecimal; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.NavigableMap; -import java.util.TreeMap; +import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; /** * Illustrates how to use the depth event stream to create a local cache of bids/asks for a symbol. - * + *

* Snapshots of the order book can be retrieved from the REST API. * Delta changes to the book can be received by subscribing for updates via the web socket API. - * + *

* To ensure no updates are missed, it is important to subscribe for updates on the web socket API * _before_ getting the snapshot from the REST API. Done the other way around it is possible to * miss one or more updates on the web socket, leaving the local cache in an inconsistent state. - * + *

* Steps: * 1. Subscribe to depth events and cache any events that are received. * 2. Get a snapshot from the rest endpoint and use it to build your initial depth cache. * 3. Apply any cache events that have a final updateId later than the snapshot's update id. * 4. Start applying any newly received depth events to the depth cache. - * + *

* The example repeats these steps, on a new web socket, should the web socket connection be lost. */ public class DepthCacheExample { - private static final String BIDS = "BIDS"; - private static final String ASKS = "ASKS"; - - private final String symbol; - private final BinanceApiRestClient restClient; - private final BinanceApiWebSocketClient wsClient; - private final WsCallback wsCallback = new WsCallback(); - private final Map> depthCache = new HashMap<>(); - - private long lastUpdateId = -1; - private volatile Closeable webSocket; - - public DepthCacheExample(String symbol) { - this.symbol = symbol; - - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - this.wsClient = factory.newWebSocketClient(); - this.restClient = factory.newRestClient(); - - initialize(); - } - - private void initialize() { - // 1. Subscribe to depth events and cache any events that are received. - final List pendingDeltas = startDepthEventStreaming(); - - // 2. Get a snapshot from the rest endpoint and use it to build your initial depth cache. - initializeDepthCache(); - - // 3. & 4. handled in here. - applyPendingDeltas(pendingDeltas); - } - - /** - * Begins streaming of depth events. - * - * Any events received are cached until the rest API is polled for an initial snapshot. - */ - private List startDepthEventStreaming() { - final List pendingDeltas = new CopyOnWriteArrayList<>(); - wsCallback.setHandler(pendingDeltas::add); - - this.webSocket = wsClient.onDepthEvent(symbol.toLowerCase(), wsCallback); - - return pendingDeltas; - } - - /** - * 2. Initializes the depth cache by getting a snapshot from the REST API. - */ - private void initializeDepthCache() { - OrderBook orderBook = restClient.getOrderBook(symbol.toUpperCase(), 10); - - this.lastUpdateId = orderBook.getLastUpdateId(); - - NavigableMap asks = new TreeMap<>(Comparator.reverseOrder()); - for (OrderBookEntry ask : orderBook.getAsks()) { - asks.put(new BigDecimal(ask.getPrice()), new BigDecimal(ask.getQty())); - } - depthCache.put(ASKS, asks); - - NavigableMap bids = new TreeMap<>(Comparator.reverseOrder()); - for (OrderBookEntry bid : orderBook.getBids()) { - bids.put(new BigDecimal(bid.getPrice()), new BigDecimal(bid.getQty())); - } - depthCache.put(BIDS, bids); - } - - /** - * Deal with any cached updates and switch to normal running. - */ - private void applyPendingDeltas(final List pendingDeltas) { - final Consumer updateOrderBook = newEvent -> { - if (newEvent.getFinalUpdateId() > lastUpdateId) { - System.out.println(newEvent); - lastUpdateId = newEvent.getFinalUpdateId(); - updateOrderBook(getAsks(), newEvent.getAsks()); - updateOrderBook(getBids(), newEvent.getBids()); - printDepthCache(); - } - }; - - final Consumer drainPending = newEvent -> { - pendingDeltas.add(newEvent); - - // 3. Apply any deltas received on the web socket that have an update-id indicating they come - // after the snapshot. - pendingDeltas.stream() - .filter( - e -> e.getFinalUpdateId() > lastUpdateId) // Ignore any updates before the snapshot - .forEach(updateOrderBook); - - // 4. Start applying any newly received depth events to the depth cache. - wsCallback.setHandler(updateOrderBook); - }; - - wsCallback.setHandler(drainPending); - } - - /** - * Updates an order book (bids or asks) with a delta received from the server. - * - * Whenever the qty specified is ZERO, it means the price should was removed from the order book. - */ - private void updateOrderBook(NavigableMap lastOrderBookEntries, - List orderBookDeltas) { - for (OrderBookEntry orderBookDelta : orderBookDeltas) { - BigDecimal price = new BigDecimal(orderBookDelta.getPrice()); - BigDecimal qty = new BigDecimal(orderBookDelta.getQty()); - if (qty.compareTo(BigDecimal.ZERO) == 0) { - // qty=0 means remove this level - lastOrderBookEntries.remove(price); - } else { - lastOrderBookEntries.put(price, qty); - } - } - } - - public NavigableMap getAsks() { - return depthCache.get(ASKS); - } - - public NavigableMap getBids() { - return depthCache.get(BIDS); - } - - /** - * @return the best ask in the order book - */ - private Map.Entry getBestAsk() { - return getAsks().lastEntry(); - } - - /** - * @return the best bid in the order book - */ - private Map.Entry getBestBid() { - return getBids().firstEntry(); - } - - /** - * @return a depth cache, containing two keys (ASKs and BIDs), and for each, an ordered list of book entries. - */ - public Map> getDepthCache() { - return depthCache; - } - - public void close() throws IOException { - webSocket.close(); - } - - /** - * Prints the cached order book / depth of a symbol as well as the best ask and bid price in the book. - */ - private void printDepthCache() { - System.out.println(depthCache); - System.out.println("ASKS:(" + getAsks().size() + ")"); - getAsks().entrySet().forEach(entry -> System.out.println(toDepthCacheEntryString(entry))); - System.out.println("BIDS:(" + getBids().size() + ")"); - getBids().entrySet().forEach(entry -> System.out.println(toDepthCacheEntryString(entry))); - System.out.println("BEST ASK: " + toDepthCacheEntryString(getBestAsk())); - System.out.println("BEST BID: " + toDepthCacheEntryString(getBestBid())); - } - - /** - * Pretty prints an order book entry in the format "price / quantity". - */ - private static String toDepthCacheEntryString(Map.Entry depthCacheEntry) { - return depthCacheEntry.getKey().toPlainString() + " / " + depthCacheEntry.getValue(); - } - - public static void main(String[] args) { - new DepthCacheExample("ETHBTC"); - } - - private final class WsCallback implements BinanceApiCallback { - - private final AtomicReference> handler = new AtomicReference<>(); - - @Override - public void onResponse(DepthEvent depthEvent) { - try { - handler.get().accept(depthEvent); - } catch (final Exception e) { - System.err.println("Exception caught processing depth event"); - e.printStackTrace(System.err); - } - } - - @Override - public void onFailure(Throwable cause) { - System.out.println("WS connection failed. Reconnecting. cause:" + cause.getMessage()); - - initialize(); - } - - private void setHandler(final Consumer handler) { - this.handler.set(handler); - } - } + private static final String BIDS = "BIDS"; + private static final String ASKS = "ASKS"; + + private final String symbol; + private final BinanceApiRestClient restClient; + private final BinanceApiWebSocketClient wsClient; + private final WsCallback wsCallback = new WsCallback(); + private final Map> depthCache = new HashMap<>(); + + private long lastUpdateId = -1; + private volatile Closeable webSocket; + + public DepthCacheExample(String symbol) { + this.symbol = symbol; + + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + this.wsClient = factory.newWebSocketClient(); + this.restClient = factory.newRestClient(); + + initialize(); + } + + private void initialize() { + // 1. Subscribe to depth events and cache any events that are received. + final List pendingDeltas = startDepthEventStreaming(); + + // 2. Get a snapshot from the rest endpoint and use it to build your initial depth cache. + initializeDepthCache(); + + // 3. & 4. handled in here. + applyPendingDeltas(pendingDeltas); + } + + /** + * Begins streaming of depth events. + *

+ * Any events received are cached until the rest API is polled for an initial snapshot. + */ + private List startDepthEventStreaming() { + final List pendingDeltas = new CopyOnWriteArrayList<>(); + wsCallback.setHandler(pendingDeltas::add); + + this.webSocket = wsClient.onDepthEvent(symbol.toLowerCase(), wsCallback); + + return pendingDeltas; + } + + /** + * 2. Initializes the depth cache by getting a snapshot from the REST API. + */ + private void initializeDepthCache() { + OrderBook orderBook = restClient.getOrderBook(symbol.toUpperCase(), 10); + + this.lastUpdateId = orderBook.getLastUpdateId(); + + NavigableMap asks = new TreeMap<>(Comparator.reverseOrder()); + for (OrderBookEntry ask : orderBook.getAsks()) { + asks.put(new BigDecimal(ask.getPrice()), new BigDecimal(ask.getQty())); + } + depthCache.put(ASKS, asks); + + NavigableMap bids = new TreeMap<>(Comparator.reverseOrder()); + for (OrderBookEntry bid : orderBook.getBids()) { + bids.put(new BigDecimal(bid.getPrice()), new BigDecimal(bid.getQty())); + } + depthCache.put(BIDS, bids); + } + + /** + * Deal with any cached updates and switch to normal running. + */ + private void applyPendingDeltas(final List pendingDeltas) { + final Consumer updateOrderBook = newEvent -> { + if (newEvent.getFinalUpdateId() > lastUpdateId) { + System.out.println(newEvent); + lastUpdateId = newEvent.getFinalUpdateId(); + updateOrderBook(getAsks(), newEvent.getAsks()); + updateOrderBook(getBids(), newEvent.getBids()); + printDepthCache(); + } + }; + + final Consumer drainPending = newEvent -> { + pendingDeltas.add(newEvent); + + // 3. Apply any deltas received on the web socket that have an update-id indicating they come + // after the snapshot. + pendingDeltas.stream() + .filter( + e -> e.getFinalUpdateId() > lastUpdateId) // Ignore any updates before the snapshot + .forEach(updateOrderBook); + + // 4. Start applying any newly received depth events to the depth cache. + wsCallback.setHandler(updateOrderBook); + }; + + wsCallback.setHandler(drainPending); + } + + /** + * Updates an order book (bids or asks) with a delta received from the server. + *

+ * Whenever the qty specified is ZERO, it means the price should was removed from the order book. + */ + private void updateOrderBook(NavigableMap lastOrderBookEntries, + List orderBookDeltas) { + for (OrderBookEntry orderBookDelta : orderBookDeltas) { + BigDecimal price = new BigDecimal(orderBookDelta.getPrice()); + BigDecimal qty = new BigDecimal(orderBookDelta.getQty()); + if (qty.compareTo(BigDecimal.ZERO) == 0) { + // qty=0 means remove this level + lastOrderBookEntries.remove(price); + } else { + lastOrderBookEntries.put(price, qty); + } + } + } + + public NavigableMap getAsks() { + return depthCache.get(ASKS); + } + + public NavigableMap getBids() { + return depthCache.get(BIDS); + } + + /** + * @return the best ask in the order book + */ + private Map.Entry getBestAsk() { + return getAsks().lastEntry(); + } + + /** + * @return the best bid in the order book + */ + private Map.Entry getBestBid() { + return getBids().firstEntry(); + } + + /** + * @return a depth cache, containing two keys (ASKs and BIDs), and for each, an ordered list of book entries. + */ + public Map> getDepthCache() { + return depthCache; + } + + public void close() throws IOException { + webSocket.close(); + } + + /** + * Prints the cached order book / depth of a symbol as well as the best ask and bid price in the book. + */ + private void printDepthCache() { + System.out.println(depthCache); + System.out.println("ASKS:(" + getAsks().size() + ")"); + getAsks().entrySet().forEach(entry -> System.out.println(toDepthCacheEntryString(entry))); + System.out.println("BIDS:(" + getBids().size() + ")"); + getBids().entrySet().forEach(entry -> System.out.println(toDepthCacheEntryString(entry))); + System.out.println("BEST ASK: " + toDepthCacheEntryString(getBestAsk())); + System.out.println("BEST BID: " + toDepthCacheEntryString(getBestBid())); + } + + /** + * Pretty prints an order book entry in the format "price / quantity". + */ + private static String toDepthCacheEntryString(Map.Entry depthCacheEntry) { + return depthCacheEntry.getKey().toPlainString() + " / " + depthCacheEntry.getValue(); + } + + public static void main(String[] args) { + new DepthCacheExample("ETHBTC"); + } + + private final class WsCallback implements BinanceApiCallback { + + private final AtomicReference> handler = new AtomicReference<>(); + + @Override + public void onResponse(DepthEvent depthEvent) { + try { + handler.get().accept(depthEvent); + } catch (final Exception e) { + System.err.println("Exception caught processing depth event"); + e.printStackTrace(System.err); + } + } + + @Override + public void onFailure(Throwable cause) { + System.out.println("WS connection failed. Reconnecting. cause:" + cause.getMessage()); + + initialize(); + } + + private void setHandler(final Consumer handler) { + this.handler.set(handler); + } + } } diff --git a/src/test/java/com/binance/api/examples/GeneralEndpointsExample.java b/src/test/java/com/binance/api/examples/GeneralEndpointsExample.java index 760d6f26a..757c4d283 100755 --- a/src/test/java/com/binance/api/examples/GeneralEndpointsExample.java +++ b/src/test/java/com/binance/api/examples/GeneralEndpointsExample.java @@ -1,46 +1,39 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.domain.general.Asset; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.general.FilterType; import com.binance.api.client.domain.general.SymbolFilter; import com.binance.api.client.domain.general.SymbolInfo; - -import java.util.List; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * Examples on how to use the general endpoints. */ public class GeneralEndpointsExample { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiRestClient client = factory.newRestClient(); - - // Test connectivity - client.ping(); + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + BinanceApiRestClient client = factory.newRestClient(); - // Check server time - long serverTime = client.getServerTime(); - System.out.println(serverTime); + // Test connectivity + client.ping(); - // Exchange info - ExchangeInfo exchangeInfo = client.getExchangeInfo(); - System.out.println(exchangeInfo.getTimezone()); - System.out.println(exchangeInfo.getSymbols()); + // Check server time + long serverTime = client.getServerTime(); + System.out.println(serverTime); - // Obtain symbol information - SymbolInfo symbolInfo = exchangeInfo.getSymbolInfo("ETHBTC"); - System.out.println(symbolInfo.getStatus()); + // Exchange info + ExchangeInfo exchangeInfo = client.getExchangeInfo(); + System.out.println(exchangeInfo.getTimezone()); + System.out.println(exchangeInfo.getSymbols()); - SymbolFilter priceFilter = symbolInfo.getSymbolFilter(FilterType.PRICE_FILTER); - System.out.println(priceFilter.getMinPrice()); - System.out.println(priceFilter.getTickSize()); + // Obtain symbol information + SymbolInfo symbolInfo = exchangeInfo.getSymbolInfo("ETHBTC"); + System.out.println(symbolInfo.getStatus()); - // Obtain asset information - List allAssets = client.getAllAssets(); - System.out.println(allAssets.stream().filter(asset -> asset.getAssetCode().equals("BNB")).findFirst().get()); - } + SymbolFilter priceFilter = symbolInfo.getSymbolFilter(FilterType.PRICE_FILTER); + System.out.println(priceFilter.getMinPrice()); + System.out.println(priceFilter.getTickSize()); + } } diff --git a/src/test/java/com/binance/api/examples/GeneralEndpointsExampleAsync.java b/src/test/java/com/binance/api/examples/GeneralEndpointsExampleAsync.java index 96739a5c2..38d86f1e6 100755 --- a/src/test/java/com/binance/api/examples/GeneralEndpointsExampleAsync.java +++ b/src/test/java/com/binance/api/examples/GeneralEndpointsExampleAsync.java @@ -1,45 +1,38 @@ package com.binance.api.examples; import com.binance.api.client.BinanceApiAsyncRestClient; -import com.binance.api.client.BinanceApiClientFactory; -import com.binance.api.client.domain.general.Asset; import com.binance.api.client.domain.general.FilterType; import com.binance.api.client.domain.general.SymbolFilter; import com.binance.api.client.domain.general.SymbolInfo; - -import java.util.List; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * Examples on how to use the general endpoints. */ public class GeneralEndpointsExampleAsync { - public static void main(String[] args) throws InterruptedException { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); - - // Test connectivity - client.ping(response -> System.out.println("Ping succeeded.")); + public static void main(String[] args) throws InterruptedException { + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); - // Check server time - client.getServerTime(response -> System.out.println(response.getServerTime())); + // Test connectivity + client.ping(response -> System.out.println("Ping succeeded.")); - // Exchange info - client.getExchangeInfo(exchangeInfo -> { - System.out.println(exchangeInfo.getTimezone()); - System.out.println(exchangeInfo.getSymbols()); + // Check server time + client.getServerTime(response -> System.out.println(response.getServerTime())); - // Obtain symbol information - SymbolInfo symbolInfo = exchangeInfo.getSymbolInfo("ETHBTC"); - System.out.println(symbolInfo.getStatus()); + // Exchange info + client.getExchangeInfo(exchangeInfo -> { + System.out.println(exchangeInfo.getTimezone()); + System.out.println(exchangeInfo.getSymbols()); - SymbolFilter priceFilter = symbolInfo.getSymbolFilter(FilterType.PRICE_FILTER); - System.out.println(priceFilter.getMinPrice()); - System.out.println(priceFilter.getTickSize()); - }); + // Obtain symbol information + SymbolInfo symbolInfo = exchangeInfo.getSymbolInfo("ETHBTC"); + System.out.println(symbolInfo.getStatus()); - // Obtain asset information - client.getAllAssets(allAssets -> - System.out.println(allAssets.stream().filter(asset -> asset.getAssetCode().equals("BNB")).findFirst().get())); - } + SymbolFilter priceFilter = symbolInfo.getSymbolFilter(FilterType.PRICE_FILTER); + System.out.println(priceFilter.getMinPrice()); + System.out.println(priceFilter.getTickSize()); + }); + } } diff --git a/src/test/java/com/binance/api/examples/MarginAccountEndpointsExample.java b/src/test/java/com/binance/api/examples/MarginAccountEndpointsExample.java index 0d204fac1..b1476b871 100755 --- a/src/test/java/com/binance/api/examples/MarginAccountEndpointsExample.java +++ b/src/test/java/com/binance/api/examples/MarginAccountEndpointsExample.java @@ -1,11 +1,12 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiMarginRestClient; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.MarginAccount; import com.binance.api.client.domain.account.MarginTransaction; import com.binance.api.client.domain.account.Trade; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.List; @@ -14,28 +15,28 @@ */ public class MarginAccountEndpointsExample { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiMarginRestClient client = factory.newMarginRestClient(); + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiMarginRestClient client = factory.newMarginRestClient(); - // Get account balances - MarginAccount marginAccount = client.getAccount(); - System.out.println(marginAccount.getUserAssets()); - System.out.println(marginAccount.getAssetBalance("ETH")); - System.out.println(marginAccount.getMarginLevel()); + // Get account balances + MarginAccount marginAccount = client.getAccount(); + System.out.println(marginAccount.getUserAssets()); + System.out.println(marginAccount.getAssetBalance("ETH")); + System.out.println(marginAccount.getMarginLevel()); - // Get list of trades - List myTrades = client.getMyTrades("NEOETH"); - System.out.println(myTrades); + // Get list of trades + List myTrades = client.getMyTrades("NEOETH"); + System.out.println(myTrades); - // Transfer, borrow, repay - MarginTransaction spotToMargin = client.transfer("USDT", "1", TransferType.SPOT_TO_MARGIN); - System.out.println(spotToMargin.getTranId()); - MarginTransaction borrowed = client.borrow("USDT", "1"); - System.out.println(borrowed.getTranId()); - MarginTransaction repayed = client.repay("USDT", "1"); - System.out.println(repayed.getTranId()); - MarginTransaction marginToSpot = client.transfer("USDT", "1", TransferType.MARGIN_TO_SPOT); - System.out.println(marginToSpot.getTranId()); - } + // Transfer, borrow, repay + MarginTransaction spotToMargin = client.transfer("USDT", "1", TransferType.SPOT_TO_MARGIN); + System.out.println(spotToMargin.getTranId()); + MarginTransaction borrowed = client.borrow("USDT", "1"); + System.out.println(borrowed.getTranId()); + MarginTransaction repayed = client.repay("USDT", "1"); + System.out.println(repayed.getTranId()); + MarginTransaction marginToSpot = client.transfer("USDT", "1", TransferType.MARGIN_TO_SPOT); + System.out.println(marginToSpot.getTranId()); + } } diff --git a/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java b/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java index 07c3507be..5d342b31b 100755 --- a/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java +++ b/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java @@ -1,36 +1,33 @@ package com.binance.api.examples; import com.binance.api.client.BinanceApiAsyncMarginRestClient; -import com.binance.api.client.BinanceApiCallback; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.domain.TransferType; -import com.binance.api.client.domain.account.MarginTransaction; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * Examples on how to get margin account information asynchronously. */ public class MarginAccountEndpointsExampleAsync { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiAsyncMarginRestClient client = factory.newAsyncMarginRestClient(); + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiAsyncMarginRestClient client = factory.newAsyncMarginRestClient(); - // Get account balances - client.getAccount(marginAccount -> { - System.out.println(marginAccount.getUserAssets()); - System.out.println(marginAccount.getAssetBalance("ETH")); - System.out.println(marginAccount.getMarginLevel()); - }); + // Get account balances + client.getAccount(marginAccount -> { + System.out.println(marginAccount.getUserAssets()); + System.out.println(marginAccount.getAssetBalance("ETH")); + System.out.println(marginAccount.getMarginLevel()); + }); - // Get list of trades - client.getMyTrades("NEOETH", myTrades -> { - System.out.println(myTrades); - }); + // Get list of trades + client.getMyTrades("NEOETH", System.out::println); - // Transfer, borrow, repay - client.transfer("USDT", "1", TransferType.SPOT_TO_MARGIN, transaction -> System.out.println(transaction.getTranId())); - client.borrow("USDT", "1", transaction -> System.out.println(transaction.getTranId())); - client.repay("USDT", "1", transaction -> System.out.println(transaction.getTranId())); - client.transfer("USDT", "1", TransferType.MARGIN_TO_SPOT, transaction -> System.out.println(transaction.getTranId())); - } + // Transfer, borrow, repay + client.transfer("USDT", "1", TransferType.SPOT_TO_MARGIN, transaction -> System.out.println(transaction.getTranId())); + client.borrow("USDT", "1", transaction -> System.out.println(transaction.getTranId())); + client.repay("USDT", "1", transaction -> System.out.println(transaction.getTranId())); + client.transfer("USDT", "1", TransferType.MARGIN_TO_SPOT, transaction -> System.out.println(transaction.getTranId())); + } } diff --git a/src/test/java/com/binance/api/examples/MarginAccountEndpointsLoanQueryExample.java b/src/test/java/com/binance/api/examples/MarginAccountEndpointsLoanQueryExample.java index 4cc4bf01f..967328a79 100755 --- a/src/test/java/com/binance/api/examples/MarginAccountEndpointsLoanQueryExample.java +++ b/src/test/java/com/binance/api/examples/MarginAccountEndpointsLoanQueryExample.java @@ -1,10 +1,11 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiMarginRestClient; import com.binance.api.client.domain.account.MarginTransaction; import com.binance.api.client.domain.account.MaxBorrowableQueryResult; import com.binance.api.client.domain.account.RepayQueryResult; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * Examples on how to get margin account information. @@ -12,7 +13,7 @@ public class MarginAccountEndpointsLoanQueryExample { public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); BinanceApiMarginRestClient client = factory.newMarginRestClient(); MaxBorrowableQueryResult usdt = client.queryMaxBorrowable("USDT"); System.out.println(usdt.getAmount()); diff --git a/src/test/java/com/binance/api/examples/MarginOrdersExample.java b/src/test/java/com/binance/api/examples/MarginOrdersExample.java index 969ca784f..59780a64e 100755 --- a/src/test/java/com/binance/api/examples/MarginOrdersExample.java +++ b/src/test/java/com/binance/api/examples/MarginOrdersExample.java @@ -1,6 +1,5 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiMarginRestClient; import com.binance.api.client.domain.TimeInForce; import com.binance.api.client.domain.account.MarginNewOrderResponse; @@ -11,6 +10,8 @@ import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; import com.binance.api.client.exception.BinanceApiException; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.List; @@ -22,7 +23,7 @@ public class MarginOrdersExample { public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); BinanceApiMarginRestClient client = factory.newMarginRestClient(); // Getting list of open orders diff --git a/src/test/java/com/binance/api/examples/MarginOrdersExampleAsync.java b/src/test/java/com/binance/api/examples/MarginOrdersExampleAsync.java index b07a01792..e9a61ab9a 100755 --- a/src/test/java/com/binance/api/examples/MarginOrdersExampleAsync.java +++ b/src/test/java/com/binance/api/examples/MarginOrdersExampleAsync.java @@ -1,11 +1,12 @@ package com.binance.api.examples; import com.binance.api.client.BinanceApiAsyncMarginRestClient; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.domain.TimeInForce; import com.binance.api.client.domain.account.request.CancelOrderRequest; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import static com.binance.api.client.domain.account.MarginNewOrder.limitBuy; @@ -15,22 +16,19 @@ public class MarginOrdersExampleAsync { public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); BinanceApiAsyncMarginRestClient client = factory.newAsyncMarginRestClient(); // Getting list of open orders - client.getOpenOrders(new OrderRequest("LINKETH"), response -> System.out.println(response)); + client.getOpenOrders(new OrderRequest("LINKETH"), System.out::println); // Get status of a particular order - client.getOrderStatus(new OrderStatusRequest("LINKETH", 745262L), - response -> System.out.println(response)); + client.getOrderStatus(new OrderStatusRequest("LINKETH", 745262L), System.out::println); // Canceling an order - client.cancelOrder(new CancelOrderRequest("LINKETH", 756703L), - response -> System.out.println(response)); + client.cancelOrder(new CancelOrderRequest("LINKETH", 756703L), System.out::println); // Placing a real LIMIT order - client.newOrder(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001"), - response -> System.out.println(response)); + client.newOrder(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001"), System.out::println); } } diff --git a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java index d6bab71fd..2226b469b 100755 --- a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java @@ -1,55 +1,55 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiMarginRestClient; -import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.OrderTradeUpdateEvent; import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * User data stream endpoints examples. - * + *

* It illustrates how to create a stream to obtain updates on a user account, * as well as update on trades/orders on a user account. */ public class MarginUserDataStreamExample { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiMarginRestClient client = factory.newMarginRestClient(); - - // First, we obtain a listenKey which is required to interact with the user data stream - String listenKey = client.startUserDataStream(); - - // Then, we open a new web socket client, and provide a callback that is called on every update - BinanceApiWebSocketClient webSocketClient = factory.newWebSocketClient(); - - // Listen for changes in the account - webSocketClient.onUserDataUpdateEvent(listenKey, response -> { - if (response.getEventType() == UserDataUpdateEventType.ACCOUNT_UPDATE) { - AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); - // Print new balances of every available asset - System.out.println(accountUpdateEvent.getBalances()); - } else { - OrderTradeUpdateEvent orderTradeUpdateEvent = response.getOrderTradeUpdateEvent(); - // Print details about an order/trade - System.out.println(orderTradeUpdateEvent); - - // Print original quantity - System.out.println(orderTradeUpdateEvent.getOriginalQuantity()); - - // Or price - System.out.println(orderTradeUpdateEvent.getPrice()); - } - }); - System.out.println("Waiting for events..."); - - // We can keep alive the user data stream - // client.keepAliveUserDataStream(listenKey); - - // Or we can invalidate it, whenever it is no longer needed - // client.closeUserDataStream(listenKey); - } + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiMarginRestClient client = factory.newMarginRestClient(); + + // First, we obtain a listenKey which is required to interact with the user data stream + String listenKey = client.startUserDataStream(); + + // Then, we open a new web socket client, and provide a callback that is called on every update + BinanceApiWebSocketClient webSocketClient = factory.newWebSocketClient(); + + // Listen for changes in the account + webSocketClient.onUserDataUpdateEvent(listenKey, response -> { + if (response.getEventType() == UserDataUpdateEventType.ACCOUNT_UPDATE) { + AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); + // Print new balances of every available asset + System.out.println(accountUpdateEvent.getBalances()); + } else { + OrderTradeUpdateEvent orderTradeUpdateEvent = response.getOrderTradeUpdateEvent(); + // Print details about an order/trade + System.out.println(orderTradeUpdateEvent); + + // Print original quantity + System.out.println(orderTradeUpdateEvent.getOriginalQuantity()); + + // Or price + System.out.println(orderTradeUpdateEvent.getPrice()); + } + }); + System.out.println("Waiting for events..."); + + // We can keep alive the user data stream + // client.keepAliveUserDataStream(listenKey); + + // Or we can invalidate it, whenever it is no longer needed + // client.closeUserDataStream(listenKey); + } } diff --git a/src/test/java/com/binance/api/examples/MarketDataEndpointsExample.java b/src/test/java/com/binance/api/examples/MarketDataEndpointsExample.java index 592aba46a..8893a42e1 100755 --- a/src/test/java/com/binance/api/examples/MarketDataEndpointsExample.java +++ b/src/test/java/com/binance/api/examples/MarketDataEndpointsExample.java @@ -1,15 +1,9 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.domain.market.AggTrade; -import com.binance.api.client.domain.market.BookTicker; -import com.binance.api.client.domain.market.Candlestick; -import com.binance.api.client.domain.market.CandlestickInterval; -import com.binance.api.client.domain.market.OrderBook; -import com.binance.api.client.domain.market.TickerPrice; -import com.binance.api.client.domain.market.TickerStatistics; +import com.binance.api.client.domain.market.*; import com.binance.api.client.exception.BinanceApiException; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.List; @@ -18,40 +12,40 @@ */ public class MarketDataEndpointsExample { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiRestClient client = factory.newRestClient(); - - // Getting depth of a symbol - OrderBook orderBook = client.getOrderBook("NEOETH", 10); - System.out.println(orderBook.getAsks()); - - // Getting latest price of a symbol - TickerStatistics tickerStatistics = client.get24HrPriceStatistics("NEOETH"); - System.out.println(tickerStatistics); - - // Getting all latest prices - List allPrices = client.getAllPrices(); - System.out.println(allPrices); - - // Getting agg trades - List aggTrades = client.getAggTrades("NEOETH"); - System.out.println(aggTrades); - - // Weekly candlestick bars for a symbol - List candlesticks = client.getCandlestickBars("NEOETH", CandlestickInterval.WEEKLY); - System.out.println(candlesticks); - - // Getting all book tickers - List allBookTickers = client.getBookTickers(); - System.out.println(allBookTickers); - - // Exception handling - try { - client.getOrderBook("UNKNOWN", 10); - } catch (BinanceApiException e) { - System.out.println(e.getError().getCode()); // -1121 - System.out.println(e.getError().getMsg()); // Invalid symbol + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + BinanceApiRestClient client = factory.newRestClient(); + + // Getting depth of a symbol + OrderBook orderBook = client.getOrderBook("NEOETH", 10); + System.out.println(orderBook.getAsks()); + + // Getting latest price of a symbol + TickerStatistics tickerStatistics = client.get24HrPriceStatistics("NEOETH"); + System.out.println(tickerStatistics); + + // Getting all latest prices + List allPrices = client.getAllPrices(); + System.out.println(allPrices); + + // Getting agg trades + List aggTrades = client.getAggTrades("NEOETH"); + System.out.println(aggTrades); + + // Weekly candlestick bars for a symbol + List candlesticks = client.getCandlestickBars("NEOETH", CandlestickInterval.WEEKLY); + System.out.println(candlesticks); + + // Getting all book tickers + List allBookTickers = client.getBookTickers(); + System.out.println(allBookTickers); + + // Exception handling + try { + client.getOrderBook("UNKNOWN", 10); + } catch (BinanceApiException e) { + System.out.println(e.getError().getCode()); // -1121 + System.out.println(e.getError().getMsg()); // Invalid symbol + } } - } } diff --git a/src/test/java/com/binance/api/examples/MarketDataEndpointsExampleAsync.java b/src/test/java/com/binance/api/examples/MarketDataEndpointsExampleAsync.java index f27fab7ff..2888ac2ae 100755 --- a/src/test/java/com/binance/api/examples/MarketDataEndpointsExampleAsync.java +++ b/src/test/java/com/binance/api/examples/MarketDataEndpointsExampleAsync.java @@ -1,57 +1,46 @@ package com.binance.api.examples; import com.binance.api.client.BinanceApiAsyncRestClient; -import com.binance.api.client.BinanceApiClientFactory; -import com.binance.api.client.domain.market.AggTrade; -import com.binance.api.client.domain.market.Candlestick; import com.binance.api.client.domain.market.CandlestickInterval; import com.binance.api.client.domain.market.OrderBook; -import com.binance.api.client.domain.market.TickerPrice; -import com.binance.api.client.domain.market.TickerStatistics; import com.binance.api.client.exception.BinanceApiException; - -import java.util.List; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * Examples on how to get market data information such as the latest price of a symbol, etc., in an async way. */ public class MarketDataEndpointsExampleAsync { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); - - // Getting depth of a symbol (async) - client.getOrderBook("NEOETH", 10, (OrderBook response) -> { - System.out.println(response.getBids()); - }); - - // Getting latest price of a symbol (async) - client.get24HrPriceStatistics("NEOETH", (TickerStatistics response) -> { - System.out.println(response); - }); - - // Getting all latest prices (async) - client.getAllPrices((List response) -> { - System.out.println(response); - }); - - // Getting agg trades (async) - client.getAggTrades("NEOETH", (List response) -> System.out.println(response)); - - // Weekly candlestick bars for a symbol - client.getCandlestickBars("NEOETH", CandlestickInterval.WEEKLY, - (List response) -> System.out.println(response)); - - // Book tickers (async) - client.getBookTickers(response -> System.out.println(response)); - - // Exception handling - try { - client.getOrderBook("UNKNOWN", 10, response -> System.out.println(response)); - } catch (BinanceApiException e) { - System.out.println(e.getError().getCode()); // -1121 - System.out.println(e.getError().getMsg()); // Invalid symbol + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); + BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); + + // Getting depth of a symbol (async) + client.getOrderBook("NEOETH", 10, (OrderBook response) -> { + System.out.println(response.getBids()); + }); + + // Getting latest price of a symbol (async) + client.get24HrPriceStatistics("NEOETH", System.out::println); + + // Getting all latest prices (async) + client.getAllPrices(System.out::println); + + // Getting agg trades (async) + client.getAggTrades("NEOETH", System.out::println); + + // Weekly candlestick bars for a symbol + client.getCandlestickBars("NEOETH", CandlestickInterval.WEEKLY, System.out::println); + + // Book tickers (async) + client.getBookTickers(System.out::println); + + // Exception handling + try { + client.getOrderBook("UNKNOWN", 10, System.out::println); + } catch (BinanceApiException e) { + System.out.println(e.getError().getCode()); // -1121 + System.out.println(e.getError().getMsg()); // Invalid symbol + } } - } } diff --git a/src/test/java/com/binance/api/examples/MarketDataStreamExample.java b/src/test/java/com/binance/api/examples/MarketDataStreamExample.java index 898d49b10..fef44d045 100755 --- a/src/test/java/com/binance/api/examples/MarketDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/MarketDataStreamExample.java @@ -1,28 +1,26 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.domain.market.CandlestickInterval; - -import java.io.IOException; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * Market data stream endpoints examples. - * + *

* It illustrates how to create a stream to obtain updates on market data such as executed trades. */ public class MarketDataStreamExample { - public static void main(String[] args) throws InterruptedException, IOException { - BinanceApiWebSocketClient client = BinanceApiClientFactory.newInstance().newWebSocketClient(); + public static void main(String[] args) { + BinanceApiWebSocketClient client = BinanceSpotApiClientFactory.newInstance().newWebSocketClient(); - // Listen for aggregated trade events for ETH/BTC - client.onAggTradeEvent("ethbtc", response -> System.out.println(response)); + // Listen for aggregated trade events for ETH/BTC + client.onAggTradeEvent("ethbtc", System.out::println); - // Listen for changes in the order book in ETH/BTC - client.onDepthEvent("ethbtc", response -> System.out.println(response)); + // Listen for changes in the order book in ETH/BTC + client.onDepthEvent("ethbtc", System.out::println); - // Obtain 1m candlesticks in real-time for ETH/BTC - client.onCandlestickEvent("ethbtc", CandlestickInterval.ONE_MINUTE, response -> System.out.println(response)); - } + // Obtain 1m candlesticks in real-time for ETH/BTC + client.onCandlestickEvent("ethbtc", CandlestickInterval.ONE_MINUTE, System.out::println); + } } diff --git a/src/test/java/com/binance/api/examples/OrdersExample.java b/src/test/java/com/binance/api/examples/OrdersExample.java index a1dd9d6cd..7249cc2af 100755 --- a/src/test/java/com/binance/api/examples/OrdersExample.java +++ b/src/test/java/com/binance/api/examples/OrdersExample.java @@ -1,17 +1,14 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.domain.TimeInForce; import com.binance.api.client.domain.account.NewOrderResponse; import com.binance.api.client.domain.account.NewOrderResponseType; import com.binance.api.client.domain.account.Order; -import com.binance.api.client.domain.account.request.AllOrdersRequest; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; +import com.binance.api.client.domain.account.request.*; import com.binance.api.client.exception.BinanceApiException; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.List; @@ -23,39 +20,41 @@ */ public class OrdersExample { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiRestClient client = factory.newRestClient(); + private static final String SYMBOL = "LINKUSDT"; - // Getting list of open orders - List openOrders = client.getOpenOrders(new OrderRequest("LINKETH")); - System.out.println(openOrders); + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("MWzDJFwWf4jaCkqEv6NFYZyv2fDhdY3c1FMNN0E639wAlKvvD6oH2QxMlg5Be8jP", "ioIv2eCzPCtKeD6DcN5YYHiOA2X6Wn5Ao5kPbQ184wPZkn9Z7bv2F1apafh2f3Mm"); + BinanceApiRestClient client = factory.newRestClient(); - // Getting list of all orders with a limit of 10 - List allOrders = client.getAllOrders(new AllOrdersRequest("LINKETH").limit(10)); - System.out.println(allOrders); + // Getting list of open orders + List openOrders = client.getOpenOrders(new OrderRequest(SYMBOL)); + System.out.println(openOrders); - // Get status of a particular order - Order order = client.getOrderStatus(new OrderStatusRequest("LINKETH", 751698L)); - System.out.println(order); + // Getting list of all orders with a limit of 10 + List allOrders = client.getAllOrders(new AllOrdersRequest(SYMBOL).limit(10)); + System.out.println(allOrders); - // Canceling an order - try { - CancelOrderResponse cancelOrderResponse = client.cancelOrder(new CancelOrderRequest("LINKETH", 756762l)); - System.out.println(cancelOrderResponse); - } catch (BinanceApiException e) { - System.out.println(e.getError().getMsg()); - } + // Get status of a particular order + Order order = client.getOrderStatus(new OrderStatusRequest(SYMBOL, 751698L)); + System.out.println(order); + + // Canceling an order + try { + CancelOrderResponse cancelOrderResponse = client.cancelOrder(new CancelOrderRequest(SYMBOL, 756762L)); + System.out.println(cancelOrderResponse); + } catch (BinanceApiException e) { + System.out.println(e.getError().getMsg()); + } - // Placing a test LIMIT order - client.newOrderTest(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001")); + // Placing a test LIMIT order + client.newOrderTest(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001")); - // Placing a test MARKET order - client.newOrderTest(marketBuy("LINKETH", "1000")); + // Placing a test MARKET order + client.newOrderTest(marketBuy("LINKETH", "1000")); - // Placing a real LIMIT order - NewOrderResponse newOrderResponse = client.newOrder(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001").newOrderRespType(NewOrderResponseType.FULL)); - System.out.println(newOrderResponse); - } + // Placing a real LIMIT order + NewOrderResponse newOrderResponse = client.newOrder(limitBuy("LINKETH", TimeInForce.GTC, "1000", "0.0001").newOrderRespType(NewOrderResponseType.FULL)); + System.out.println(newOrderResponse); + } } diff --git a/src/test/java/com/binance/api/examples/OrdersExampleAsync.java b/src/test/java/com/binance/api/examples/OrdersExampleAsync.java index 63f1ce3d5..1b4728b7d 100755 --- a/src/test/java/com/binance/api/examples/OrdersExampleAsync.java +++ b/src/test/java/com/binance/api/examples/OrdersExampleAsync.java @@ -1,12 +1,13 @@ package com.binance.api.examples; import com.binance.api.client.BinanceApiAsyncRestClient; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.domain.TimeInForce; import com.binance.api.client.domain.account.request.AllOrdersRequest; import com.binance.api.client.domain.account.request.CancelOrderRequest; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import static com.binance.api.client.domain.account.NewOrder.limitBuy; import static com.binance.api.client.domain.account.NewOrder.marketBuy; @@ -17,7 +18,7 @@ public class OrdersExampleAsync { public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); // Getting list of open orders diff --git a/src/test/java/com/binance/api/examples/SwapEndpointExample.java b/src/test/java/com/binance/api/examples/SwapEndpointExample.java index c4c32d98d..b789777fe 100755 --- a/src/test/java/com/binance/api/examples/SwapEndpointExample.java +++ b/src/test/java/com/binance/api/examples/SwapEndpointExample.java @@ -1,22 +1,19 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiSwapRestClient; import com.binance.api.client.domain.account.*; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.List; public class SwapEndpointExample { - public static String API_KEY = "api-key"; - public static String SECRET_KEY = "secret-key"; - public static void main(String[] args) { - - BinanceApiClientFactory binanceApiClientFactory = BinanceApiClientFactory.newInstance(API_KEY, SECRET_KEY); - BinanceApiSwapRestClient swapClient = binanceApiClientFactory.newSwapRestClient(); + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiSwapRestClient swapClient = factory.newSwapRestClient(); List pools = swapClient.listAllSwapPools(); - for(Pool pool:pools) { + for (Pool pool : pools) { System.out.println(pool); Liquidity poolLiquidityInfo = swapClient.getPoolLiquidityInfo(pool.getPoolId()); System.out.println(poolLiquidityInfo); @@ -27,6 +24,4 @@ public static void main(String[] args) { SwapHistory swapHistory = swapClient.getSwapHistory(swapRecord.getSwapId()); System.out.println(swapHistory); } - - } diff --git a/src/test/java/com/binance/api/examples/TotalAccountBalanceExample.java b/src/test/java/com/binance/api/examples/TotalAccountBalanceExample.java index 5abfe04f1..b82cc7391 100755 --- a/src/test/java/com/binance/api/examples/TotalAccountBalanceExample.java +++ b/src/test/java/com/binance/api/examples/TotalAccountBalanceExample.java @@ -1,10 +1,11 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.constant.Util; import com.binance.api.client.domain.account.Account; import com.binance.api.client.domain.account.AssetBalance; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * Example how to get total of balances on your account @@ -13,7 +14,7 @@ public class TotalAccountBalanceExample { public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); BinanceApiRestClient client = factory.newRestClient(); // Get account balances @@ -21,15 +22,13 @@ public static void main(String[] args) { // Get total account balance in BTC (spot only) TotalAccountBalanceExample accountBalance = new TotalAccountBalanceExample(); - double totalBalanceInBTC = accountBalance.getTotalAccountBalance(client,account); + double totalBalanceInBTC = accountBalance.getTotalAccountBalance(client, account); System.out.println(totalBalanceInBTC); // Get total account balance in USDT (spot only) double totalBalanceInUSDT = totalBalanceInBTC * Double.parseDouble(client.getPrice("BTCUSDT").getPrice()); System.out.println(totalBalanceInUSDT); - - } // Get total account balance in BTC (spot only) @@ -59,5 +58,4 @@ public double getTotalAccountBalance(BinanceApiRestClient client, Account accoun } - } diff --git a/src/test/java/com/binance/api/examples/UserDataStreamExample.java b/src/test/java/com/binance/api/examples/UserDataStreamExample.java index 180f5d7b7..d8dc3c5e0 100755 --- a/src/test/java/com/binance/api/examples/UserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/UserDataStreamExample.java @@ -1,54 +1,55 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.OrderTradeUpdateEvent; import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * User data stream endpoints examples. - * + *

* It illustrates how to create a stream to obtain updates on a user account, * as well as update on trades/orders on a user account. */ public class UserDataStreamExample { - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiRestClient client = factory.newRestClient(); - - // First, we obtain a listenKey which is required to interact with the user data stream - String listenKey = client.startUserDataStream(); - - // Then, we open a new web socket client, and provide a callback that is called on every update - BinanceApiWebSocketClient webSocketClient = factory.newWebSocketClient(); - - // Listen for changes in the account - webSocketClient.onUserDataUpdateEvent(listenKey, response -> { - if (response.getEventType() == UserDataUpdateEventType.ACCOUNT_UPDATE) { - AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); - // Print new balances of every available asset - System.out.println(accountUpdateEvent.getBalances()); - } else { - OrderTradeUpdateEvent orderTradeUpdateEvent = response.getOrderTradeUpdateEvent(); - // Print details about an order/trade - System.out.println(orderTradeUpdateEvent); - - // Print original quantity - System.out.println(orderTradeUpdateEvent.getOriginalQuantity()); - - // Or price - System.out.println(orderTradeUpdateEvent.getPrice()); - } - }); - System.out.println("Waiting for events..."); - - // We can keep alive the user data stream - // client.keepAliveUserDataStream(listenKey); - - // Or we can invalidate it, whenever it is no longer needed - // client.closeUserDataStream(listenKey); - } + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiRestClient client = factory.newRestClient(); + + // First, we obtain a listenKey which is required to interact with the user data stream + String listenKey = client.startUserDataStream(); + + // Then, we open a new web socket client, and provide a callback that is called on every update + BinanceApiWebSocketClient webSocketClient = factory.newWebSocketClient(); + + // Listen for changes in the account + webSocketClient.onUserDataUpdateEvent(listenKey, response -> { + if (response.getEventType() == UserDataUpdateEventType.ACCOUNT_UPDATE) { + AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); + // Print new balances of every available asset + System.out.println(accountUpdateEvent.getBalances()); + } else { + OrderTradeUpdateEvent orderTradeUpdateEvent = response.getOrderTradeUpdateEvent(); + // Print details about an order/trade + System.out.println(orderTradeUpdateEvent); + + // Print original quantity + System.out.println(orderTradeUpdateEvent.getOriginalQuantity()); + + // Or price + System.out.println(orderTradeUpdateEvent.getPrice()); + } + }); + System.out.println("Waiting for events..."); + + // We can keep alive the user data stream + // client.keepAliveUserDataStream(listenKey); + + // Or we can invalidate it, whenever it is no longer needed + // client.closeUserDataStream(listenKey); + } } diff --git a/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java b/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java new file mode 100755 index 000000000..8a436a59d --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java @@ -0,0 +1,23 @@ +package com.binance.api.examples.futures; + +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.domain.account.FuturesAccount; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; + +/** + * Examples binance futures account information + */ +public class FuturesAccountExample { + private static final String SYMBOL = "LINKUSDT"; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiFuturesRestClient client = factory.newRestClient(); + + FuturesAccount account = client.getAccount(); + System.out.println("Available Balance: " + account.getAvailableBalance()); + } + +} diff --git a/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java new file mode 100755 index 000000000..d6a68961f --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java @@ -0,0 +1,36 @@ +package com.binance.api.examples.futures; + +import com.binance.api.client.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +/** + * Examples on how to place orders, cancel them, and query account information. + * + * @author Mahdi Sheikh Hosseini + */ +public class FuturesOrdersAsyncExample { + + private static final String SYMBOL = "LINKETH"; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiAsyncFuturesRestClient client = factory.newAsyncRestClient(); + + + // Placing a real LIMIT order +// client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false), System.out::println); + + // Getting list of open orders + client.getOpenOrders(new OrderRequest(SYMBOL), System.out::println); + + // Get status of a particular order +// client.getOrderStatus(new OrderStatusRequest(SYMBOL, 751698L), System.out::println); + + // Canceling an order +// client.cancelOrder(new CancelOrderRequest(SYMBOL, 756762l), System.out::println); + + } + +} diff --git a/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java new file mode 100755 index 000000000..b34a44875 --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java @@ -0,0 +1,34 @@ +package com.binance.api.examples.futures; + +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.domain.TimeInForce; +import com.binance.api.client.domain.WorkingType; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +import static com.binance.api.client.domain.account.FuturesNewOrder.limitLong; + +/** + * Examples on how to place orders, cancel them. + * + * @author Mahdi Sheikh Hosseini + */ +public class FuturesOrdersExample { + private static final String SYMBOL = "LINKUSDT"; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiFuturesRestClient client = futuresApiClientFactory.newRestClient(); + + FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false)); + long orderId = futuresOrderResponse.getOrderId(); + System.out.println("OrderID: " + orderId); + + CancelOrderResponse cancelOrderResponse = client.cancelOrder(new CancelOrderRequest(SYMBOL, orderId)); + System.out.println("Order Status: " + cancelOrderResponse.getStatus()); + } + +} diff --git a/src/test/java/com/binance/api/examples/futures/FuturesWebSocketExample.java b/src/test/java/com/binance/api/examples/futures/FuturesWebSocketExample.java new file mode 100755 index 000000000..6ce47c016 --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesWebSocketExample.java @@ -0,0 +1,24 @@ +package com.binance.api.examples.futures; + +import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.domain.market.CandlestickInterval; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +/** + * Example binance futures websocket connection + * + * @author Mahdi Sheikh Hosseini + */ +public class FuturesWebSocketExample { + private static final String SYMBOL = "LINKUSDT"; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory(); + BinanceApiWebSocketClient webSocketClient = factory.newWebSocketClient(); + +// webSocketClient.onTickerEvent(SYMBOL, System.out::println); + webSocketClient.onCandlestickEvent(SYMBOL, CandlestickInterval.FIFTEEN_MINUTES, System.out::println); + } + +} diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java new file mode 100755 index 000000000..79f1eac63 --- /dev/null +++ b/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java @@ -0,0 +1,23 @@ +package com.binance.api.examples.testnet; + +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.domain.account.FuturesAccount; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +/** + * Examples binance futures account information + */ +public class TestnetAccountExample { + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); + BinanceApiFuturesRestClient client = factory.newRestClient(); + + FuturesAccount account = client.getAccount(); + System.out.println("Available Balance: " + account.getAvailableBalance()); + } + +} diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersAsyncExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersAsyncExample.java new file mode 100755 index 000000000..011236d5f --- /dev/null +++ b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersAsyncExample.java @@ -0,0 +1,38 @@ +package com.binance.api.examples.testnet; + +import com.binance.api.client.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +/** + * Examples on how to place orders, cancel them, and query account information. + * + * @author Mahdi Sheikh Hosseini + */ +public class TestnetOrdersAsyncExample { + + private static final String SYMBOL = "LTCUSDT"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); + BinanceApiAsyncFuturesRestClient client = factory.newAsyncRestClient(); + + + // Placing a real LIMIT order +// client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false), System.out::println); + + // Getting list of open orders + client.getOpenOrders(new OrderRequest(SYMBOL), System.out::println); + + // Get status of a particular order +// client.getOrderStatus(new OrderStatusRequest(SYMBOL, 751698L), System.out::println); + + // Canceling an order +// client.cancelOrder(new CancelOrderRequest(SYMBOL, 756762l), System.out::println); + + } + +} diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java new file mode 100755 index 000000000..9c61b32c7 --- /dev/null +++ b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java @@ -0,0 +1,36 @@ +package com.binance.api.examples.testnet; + +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.domain.TimeInForce; +import com.binance.api.client.domain.WorkingType; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +import static com.binance.api.client.domain.account.FuturesNewOrder.limitLong; + +/** + * Examples on how to place orders, cancel them. + * + * @author Mahdi Sheikh Hosseini + */ +public class TestnetOrdersExample { + private static final String SYMBOL = "LTCUSDT"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); + BinanceApiFuturesRestClient client = futuresApiClientFactory.newRestClient(); + + FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "200", false)); + long orderId = futuresOrderResponse.getOrderId(); + System.out.println("OrderID: " + orderId); + + CancelOrderResponse cancelOrderResponse = client.cancelOrder(new CancelOrderRequest(SYMBOL, orderId)); + System.out.println("Order Status: " + cancelOrderResponse.getStatus()); + } + +} diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java new file mode 100755 index 000000000..671832905 --- /dev/null +++ b/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java @@ -0,0 +1,24 @@ +package com.binance.api.examples.testnet; + +import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.domain.market.CandlestickInterval; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +/** + * Example binance futures websocket connection + * + * @author Mahdi Sheikh Hosseini + */ +public class TestnetWebSocketExample { + private static final String SYMBOL = "LTCUSDT"; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createTestnetFactory(); + BinanceApiWebSocketClient webSocketClient = factory.newWebSocketClient(); + +// webSocketClient.onTickerEvent(SYMBOL, System.out::println); + webSocketClient.onCandlestickEvent(SYMBOL, CandlestickInterval.ONE_MINUTE, System.out::println); + } + +} From 4fb7af908a5480b3ad5a62c5c29a65e79bdc9e65 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Thu, 1 Apr 2021 22:24:42 +0430 Subject: [PATCH 04/18] Remove useless files --- .../api/client/BinanceApiClientFactory.java | 115 ------------------ .../api/examples/FuturesAccountExample.java | 22 ---- .../examples/FuturesOrdersAsyncExample.java | 38 ------ .../api/examples/FuturesOrdersExample.java | 33 ----- .../api/examples/FuturesWebSocketExample.java | 23 ---- 5 files changed, 231 deletions(-) delete mode 100755 src/main/java/com/binance/api/client/BinanceApiClientFactory.java delete mode 100755 src/test/java/com/binance/api/examples/FuturesAccountExample.java delete mode 100755 src/test/java/com/binance/api/examples/FuturesOrdersAsyncExample.java delete mode 100755 src/test/java/com/binance/api/examples/FuturesOrdersExample.java delete mode 100755 src/test/java/com/binance/api/examples/FuturesWebSocketExample.java diff --git a/src/main/java/com/binance/api/client/BinanceApiClientFactory.java b/src/main/java/com/binance/api/client/BinanceApiClientFactory.java deleted file mode 100755 index 34da39374..000000000 --- a/src/main/java/com/binance/api/client/BinanceApiClientFactory.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.binance.api.client; - -import com.binance.api.client.impl.*; - -import static com.binance.api.client.impl.BinanceApiServiceGenerator.getSharedClient; - -/** - * A factory for creating BinanceApi client objects. - */ -public class BinanceApiClientFactory { - - /** - * API Key - */ - private String apiKey; - - /** - * Secret. - */ - private String secret; - - /** - * Instantiates a new binance api client factory. - * - * @param apiKey the API key - * @param secret the Secret - */ - private BinanceApiClientFactory(String apiKey, String secret) { - this.apiKey = apiKey; - this.secret = secret; - } - - /** - * New instance. - * - * @param apiKey the API key - * @param secret the Secret - * @return the binance api client factory - */ - public static BinanceApiClientFactory newInstance(String apiKey, String secret) { - return new BinanceApiClientFactory(apiKey, secret); - } - - /** - * New instance without authentication. - * - * @return the binance api client factory - */ - public static BinanceApiClientFactory newInstance() { - return new BinanceApiClientFactory(null, null); - } - - /** - * Creates a new synchronous/blocking REST client. - */ - public BinanceApiRestClient newRestClient() { - return new BinanceApiRestClientImpl(apiKey, secret); - } - - /** - * Creates a new asynchronous/non-blocking REST client. - */ - public BinanceApiAsyncRestClient newAsyncRestClient() { - return new BinanceApiAsyncRestClientImpl(apiKey, secret); - } - - /** - * Creates a new asynchronous/non-blocking Margin REST client. - */ - public BinanceApiAsyncMarginRestClient newAsyncMarginRestClient() { - return new BinanceApiAsyncMarginRestClientImpl(apiKey, secret); - } - - /** - * Creates a new asynchronous/non-blocking Margin REST client. - */ - public BinanceApiAsyncFuturesRestClient newAsyncFuturesRestClient() { - return new BinanceApiAsyncFuturesRestClientImpl(apiKey, secret); - } - - /** - * Creates a new synchronous/blocking Margin REST client. - */ - public BinanceApiMarginRestClient newMarginRestClient() { - return new BinanceApiMarginRestClientImpl(apiKey, secret); - } - - /** - * Creates a new synchronous/blocking Futures REST client. - */ - public BinanceApiFuturesRestClient newFuturesRestClient() { - return new BinanceApiFuturesRestClientImpl(apiKey, secret); - } - - /** - * Creates a new web socket client used for handling data streams. - */ - public BinanceApiWebSocketClient newWebSocketClient() { - return new BinanceApiWebSocketClientImpl(getSharedClient(), BinanceEngineType.SPOT); - } - - /** - * Creates a new web socket client used for handling data streams. - */ - public BinanceApiWebSocketClient newFuturesWebSocketClient() { - return new BinanceApiWebSocketClientImpl(getSharedClient(), BinanceEngineType.FUTURES); - } - - /** - * Creates a new synchronous/blocking Swap REST client. - */ - public BinanceApiSwapRestClient newSwapRestClient() { - return new BinanceApiSwapRestClientImpl(apiKey, secret); - } -} diff --git a/src/test/java/com/binance/api/examples/FuturesAccountExample.java b/src/test/java/com/binance/api/examples/FuturesAccountExample.java deleted file mode 100755 index b703ed852..000000000 --- a/src/test/java/com/binance/api/examples/FuturesAccountExample.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.binance.api.examples; - -import com.binance.api.client.BinanceApiClientFactory; -import com.binance.api.client.BinanceApiFuturesRestClient; -import com.binance.api.client.BinanceEngineType; -import com.binance.api.client.domain.account.FuturesAccount; - -/** - * Examples binance futures account information - */ -public class FuturesAccountExample { - private static final String SYMBOL = "LINKUSDT"; - - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); - - FuturesAccount account = client.getAccount(); - System.out.println("Available Balance: " + account.getAvailableBalance()); - } - -} diff --git a/src/test/java/com/binance/api/examples/FuturesOrdersAsyncExample.java b/src/test/java/com/binance/api/examples/FuturesOrdersAsyncExample.java deleted file mode 100755 index b0d6109c4..000000000 --- a/src/test/java/com/binance/api/examples/FuturesOrdersAsyncExample.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.binance.api.examples; - -import com.binance.api.client.BinanceApiAsyncFuturesRestClient; -import com.binance.api.client.BinanceApiClientFactory; -import com.binance.api.client.domain.TimeInForce; -import com.binance.api.client.domain.WorkingType; - -import static com.binance.api.client.domain.account.FuturesNewOrder.limitLong; - -/** - * Examples on how to place orders, cancel them, and query account information. - * - * @author Mahdi Sheikh Hosseini - */ -public class FuturesOrdersAsyncExample { - - private static final String SYMBOL = "LINKETH"; - - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiAsyncFuturesRestClient client = factory.newAsyncFuturesRestClient(); - - - // Placing a real LIMIT order -// client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false), System.out::println); - - // Getting list of open orders -// client.getOpenOrders(new OrderRequest(SYMBOL), System.out::println); - - // Get status of a particular order -// client.getOrderStatus(new OrderStatusRequest(SYMBOL, 751698L), System.out::println); - - // Canceling an order -// client.cancelOrder(new CancelOrderRequest(SYMBOL, 756762l), System.out::println); - - } - -} diff --git a/src/test/java/com/binance/api/examples/FuturesOrdersExample.java b/src/test/java/com/binance/api/examples/FuturesOrdersExample.java deleted file mode 100755 index 64ea34c35..000000000 --- a/src/test/java/com/binance/api/examples/FuturesOrdersExample.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.binance.api.examples; - -import com.binance.api.client.BinanceApiClientFactory; -import com.binance.api.client.BinanceApiFuturesRestClient; -import com.binance.api.client.domain.TimeInForce; -import com.binance.api.client.domain.WorkingType; -import com.binance.api.client.domain.account.FuturesNewOrderResponse; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; - -import static com.binance.api.client.domain.account.FuturesNewOrder.limitLong; - -/** - * Examples on how to place orders, cancel them. - * - * @author Mahdi Sheikh Hosseini - */ -public class FuturesOrdersExample { - private static final String SYMBOL = "LINKUSDT"; - - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); - - FuturesNewOrderResponse futuresNewOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false)); - long orderId = futuresNewOrderResponse.getOrderId(); - System.out.println("OrderID: " + orderId); - - CancelOrderResponse cancelOrderResponse = client.cancelOrder(new CancelOrderRequest(SYMBOL, orderId)); - System.out.println("Order Status: " + cancelOrderResponse.getStatus()); - } - -} diff --git a/src/test/java/com/binance/api/examples/FuturesWebSocketExample.java b/src/test/java/com/binance/api/examples/FuturesWebSocketExample.java deleted file mode 100755 index 5cb85dd72..000000000 --- a/src/test/java/com/binance/api/examples/FuturesWebSocketExample.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.binance.api.examples; - -import com.binance.api.client.BinanceApiClientFactory; -import com.binance.api.client.BinanceApiWebSocketClient; -import com.binance.api.client.domain.market.CandlestickInterval; - -/** - * Example binance futures websocket connection - * - * @author Mahdi Sheikh Hosseini - */ -public class FuturesWebSocketExample { - private static final String SYMBOL = "LINKUSDT"; - - public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(); - BinanceApiWebSocketClient webSocketClient = factory.newFuturesWebSocketClient(); - -// webSocketClient.onTickerEvent(SYMBOL, System.out::println); - webSocketClient.onCandlestickEvent(SYMBOL, CandlestickInterval.FIFTEEN_MINUTES, System.out::println); - } - -} From c7e73e1a051d388fdfbc1757a6ca4ecb70be7341 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Thu, 1 Apr 2021 22:52:56 +0430 Subject: [PATCH 05/18] Fix bugs --- .../BinanceFuturesApiClientFactory.java | 13 ++++- .../futures/FuturesAccountExample.java | 3 +- .../futures/FuturesOrdersExample.java | 2 +- .../futures/FuturesUserDataStreamExample.java | 56 +++++++++++++++++++ .../testnet/TestnetAccountExample.java | 2 +- .../testnet/TestnetOrdersExample.java | 2 +- 6 files changed, 71 insertions(+), 7 deletions(-) create mode 100755 src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java diff --git a/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java b/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java index 706f74f18..77c07e02e 100755 --- a/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java +++ b/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java @@ -2,9 +2,11 @@ import com.binance.api.client.BinanceApiAsyncFuturesRestClient; import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.impl.BinanceApiAsyncFuturesRestClientImpl; import com.binance.api.client.impl.BinanceApiFuturesRestClientImpl; +import com.binance.api.client.impl.BinanceApiRestClientImpl; import com.binance.api.client.impl.BinanceApiWebSocketClientImpl; import static com.binance.api.client.impl.BinanceApiServiceGenerator.getSharedClient; @@ -71,8 +73,8 @@ public BinanceApiAsyncFuturesRestClient newAsyncRestClient() { /** * Creates a new synchronous/blocking Futures REST client. */ - public BinanceApiFuturesRestClient newRestClient() { - return new BinanceApiFuturesRestClientImpl(apiKey, secret, apiUrl); + public BinanceApiRestClient newRestClient() { + return new BinanceApiRestClientImpl(apiKey, secret, apiUrl); } /** @@ -81,4 +83,11 @@ public BinanceApiFuturesRestClient newRestClient() { public BinanceApiWebSocketClient newWebSocketClient() { return new BinanceApiWebSocketClientImpl(getSharedClient(), websocketUrl); } + + /** + * Creates a new synchronous/blocking Futures REST client. + */ + public BinanceApiFuturesRestClient newFuturesRestClient() { + return new BinanceApiFuturesRestClientImpl(apiKey, secret, apiUrl); + } } diff --git a/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java b/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java index 8a436a59d..d621e1084 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java @@ -4,7 +4,6 @@ import com.binance.api.client.domain.account.FuturesAccount; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; -import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** * Examples binance futures account information @@ -14,7 +13,7 @@ public class FuturesAccountExample { public static void main(String[] args) { BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiFuturesRestClient client = factory.newRestClient(); + BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); FuturesAccount account = client.getAccount(); System.out.println("Available Balance: " + account.getAvailableBalance()); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java index b34a44875..962ce4ea3 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java @@ -21,7 +21,7 @@ public class FuturesOrdersExample { public static void main(String[] args) { BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiFuturesRestClient client = futuresApiClientFactory.newRestClient(); + BinanceApiFuturesRestClient client = futuresApiClientFactory.newFuturesRestClient(); FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false)); long orderId = futuresOrderResponse.getOrderId(); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java new file mode 100755 index 000000000..bffe94273 --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java @@ -0,0 +1,56 @@ +package com.binance.api.examples.futures; + +import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.BinanceApiRestClient; +import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.domain.event.AccountUpdateEvent; +import com.binance.api.client.domain.event.OrderTradeUpdateEvent; +import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +/** + * User data stream endpoints examples. + *

+ * It illustrates how to create a stream to obtain updates on a user account, + * as well as update on trades/orders on a user account. + */ +public class FuturesUserDataStreamExample { + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiRestClient client = factory.newRestClient(); + + // First, we obtain a listenKey which is required to interact with the user data stream + String listenKey = client.startUserDataStream(); + + // Then, we open a new web socket client, and provide a callback that is called on every update + BinanceApiWebSocketClient webSocketClient = factory.newWebSocketClient(); + + // Listen for changes in the account + webSocketClient.onUserDataUpdateEvent(listenKey, response -> { + if (response.getEventType() == UserDataUpdateEventType.ACCOUNT_UPDATE) { + AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); + // Print new balances of every available asset + System.out.println(accountUpdateEvent.getBalances()); + } else { + OrderTradeUpdateEvent orderTradeUpdateEvent = response.getOrderTradeUpdateEvent(); + // Print details about an order/trade + System.out.println(orderTradeUpdateEvent); + + // Print original quantity + System.out.println(orderTradeUpdateEvent.getOriginalQuantity()); + + // Or price + System.out.println(orderTradeUpdateEvent.getPrice()); + } + }); + System.out.println("Waiting for events..."); + + // We can keep alive the user data stream + // client.keepAliveUserDataStream(listenKey); + + // Or we can invalidate it, whenever it is no longer needed + // client.closeUserDataStream(listenKey); + } +} diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java index 79f1eac63..6b1cdd9e1 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java @@ -14,7 +14,7 @@ public class TestnetAccountExample { public static void main(String[] args) { BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); - BinanceApiFuturesRestClient client = factory.newRestClient(); + BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); FuturesAccount account = client.getAccount(); System.out.println("Available Balance: " + account.getAvailableBalance()); diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java index 9c61b32c7..3ad910d59 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java @@ -23,7 +23,7 @@ public class TestnetOrdersExample { public static void main(String[] args) { BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); - BinanceApiFuturesRestClient client = futuresApiClientFactory.newRestClient(); + BinanceApiFuturesRestClient client = futuresApiClientFactory.newFuturesRestClient(); FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "200", false)); long orderId = futuresOrderResponse.getOrderId(); From 171af1802197d69caf4d1504f65e8df4cfd05e8e Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Thu, 1 Apr 2021 23:58:04 +0430 Subject: [PATCH 06/18] Bug fix and improvemtns --- .../client/BinanceApiFuturesRestClient.java | 21 +++++++++++ .../client/BinanceApiMarginRestClient.java | 18 --------- .../api/client/BinanceApiRestClient.java | 2 - .../impl/BinanceApiFuturesRestClientImpl.java | 15 ++++++++ .../impl/BinanceApiMarginRestClientImpl.java | 13 +------ .../client/impl/BinanceApiRestClientImpl.java | 7 ++-- .../api/client/impl/BinanceApiService.java | 6 +-- .../client/impl/BinanceFuturesApiService.java | 14 +++++++ .../examples/MarginUserDataStreamExample.java | 8 ++-- .../futures/FuturesAccountExample.java | 4 +- .../futures/FuturesOrdersAsyncExample.java | 5 ++- .../futures/FuturesOrdersExample.java | 4 +- .../futures/FuturesUserDataStreamExample.java | 7 ++-- .../testnet/TestnetOrdersExample.java | 37 +++++++++++-------- 14 files changed, 97 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java b/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java index 6273a4325..faca20e4f 100755 --- a/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java +++ b/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java @@ -46,4 +46,25 @@ public interface BinanceApiFuturesRestClient { * @return an order */ Order getOrderStatus(OrderStatusRequest orderStatusRequest); + + /** + * Start a new user data stream. + * + * @return a listen key that can be used with data streams + */ + String startUserDataStream(); + + /** + * PING a user data stream to prevent a time out. + * + * @param listenKey listen key that identifies a data stream + */ + void keepAliveUserDataStream(String listenKey); + + /** + * Close out a new user data stream. + * + * @param listenKey listen key that identifies a data stream + */ + void closeUserDataStream(String listenKey); } diff --git a/src/main/java/com/binance/api/client/BinanceApiMarginRestClient.java b/src/main/java/com/binance/api/client/BinanceApiMarginRestClient.java index 6f100a365..fd051bd6b 100755 --- a/src/main/java/com/binance/api/client/BinanceApiMarginRestClient.java +++ b/src/main/java/com/binance/api/client/BinanceApiMarginRestClient.java @@ -53,22 +53,6 @@ public interface BinanceApiMarginRestClient { */ List getMyTrades(String symbol); - // User stream endpoints - - /** - * Start a new user data stream. - * - * @return a listen key that can be used with data streams - */ - String startUserDataStream(); - - /** - * PING a user data stream to prevent a time out. - * - * @param listenKey listen key that identifies a data stream - */ - void keepAliveUserDataStream(String listenKey); - /** * Execute transfer between spot account and margin account * @param asset asset to repay @@ -122,6 +106,4 @@ public interface BinanceApiMarginRestClient { * @return loan records */ LoanQueryResult queryLoan(String asset, String txId); - - } diff --git a/src/main/java/com/binance/api/client/BinanceApiRestClient.java b/src/main/java/com/binance/api/client/BinanceApiRestClient.java index 2567b257b..97c6dbe90 100755 --- a/src/main/java/com/binance/api/client/BinanceApiRestClient.java +++ b/src/main/java/com/binance/api/client/BinanceApiRestClient.java @@ -2,7 +2,6 @@ import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.*; -import com.binance.api.client.domain.general.Asset; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.market.*; @@ -259,7 +258,6 @@ public interface BinanceApiRestClient { DepositAddress getDepositAddress(String asset); // User stream endpoints - /** * Start a new user data stream. * diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java index fc56ba3e5..48e3f6b1e 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java @@ -59,4 +59,19 @@ public Order getOrderStatus(OrderStatusRequest orderStatusRequest) { orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp())); } + + @Override + public String startUserDataStream() { + return executeSync(binanceApiService.startUserDataStream()).toString(); + } + + @Override + public void keepAliveUserDataStream(String listenKey) { + executeSync(binanceApiService.keepAliveUserDataStream(listenKey)); + } + + @Override + public void closeUserDataStream(String listenKey) { + executeSync(binanceApiService.closeAliveUserDataStream(listenKey)); + } } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java index f8bc30721..c00b51043 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java @@ -62,18 +62,6 @@ public List getMyTrades(String symbol) { return executeSync(binanceApiService.getMyTrades(symbol, null, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis())); } - // user stream endpoints - - @Override - public String startUserDataStream() { - return executeSync(binanceApiService.startMarginUserDataStream()).toString(); - } - - @Override - public void keepAliveUserDataStream(String listenKey) { - executeSync(binanceApiService.keepAliveMarginUserDataStream(listenKey)); - } - @Override public MarginTransaction transfer(String asset, String amount, TransferType type) { long timestamp = System.currentTimeMillis(); @@ -115,4 +103,5 @@ public MarginTransaction repay(String asset, String amount) { long timestamp = System.currentTimeMillis(); return executeSync(binanceApiService.repay(asset, amount, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp)); } + } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java index aaeaf980f..d91857286 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java @@ -221,16 +221,15 @@ public DepositAddress getDepositAddress(String asset) { System.currentTimeMillis())); } - // User stream endpoints - + // user stream endpoints @Override public String startUserDataStream() { - return executeSync(binanceApiService.startUserDataStream()).toString(); + return executeSync(binanceApiService.startMarginUserDataStream()).toString(); } @Override public void keepAliveUserDataStream(String listenKey) { - executeSync(binanceApiService.keepAliveUserDataStream(listenKey)); + executeSync(binanceApiService.keepAliveMarginUserDataStream(listenKey)); } @Override diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiService.java b/src/main/java/com/binance/api/client/impl/BinanceApiService.java index 35e21de0c..fd6016c3b 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiService.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiService.java @@ -152,15 +152,15 @@ Call withdraw(@Query("asset") String asset, @Query("address") St // User stream endpoints @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) - @POST("/api/v1/userDataStream") + @POST("/api/v3/userDataStream") Call startUserDataStream(); @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) - @PUT("/api/v1/userDataStream") + @PUT("/api/v3/userDataStream") Call keepAliveUserDataStream(@Query("listenKey") String listenKey); @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) - @DELETE("/api/v1/userDataStream") + @DELETE("/api/v3/userDataStream") Call closeAliveUserDataStream(@Query("listenKey") String listenKey); // Margin Account endpoints diff --git a/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java b/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java index 687a8c82f..1867a0f56 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java +++ b/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java @@ -4,6 +4,7 @@ import com.binance.api.client.domain.*; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.event.ListenKey; import com.binance.api.client.domain.general.Asset; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.general.ServerTime; @@ -100,4 +101,17 @@ Call> getAllOrders(@Query("symbol") String symbol, @Query("orderId") @GET("/fapi/v2/account") Call getAccount(@Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + // User stream endpoints + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) + @POST("/fapi/v1/listenKey") + Call startUserDataStream(); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) + @PUT("/fapi/v1/listenKey") + Call keepAliveUserDataStream(@Query("listenKey") String listenKey); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) + @DELETE("/fapi/v1/listenKey") + Call closeAliveUserDataStream(@Query("listenKey") String listenKey); } diff --git a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java index 2226b469b..120cb0d81 100755 --- a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiMarginRestClient; +import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.OrderTradeUpdateEvent; @@ -15,10 +15,12 @@ * as well as update on trades/orders on a user account. */ public class MarginUserDataStreamExample { + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; public static void main(String[] args) { - BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiMarginRestClient client = factory.newMarginRestClient(); + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory(API_KEY, SECRET_KEY); + BinanceApiRestClient client = factory.newRestClient(); // First, we obtain a listenKey which is required to interact with the user data stream String listenKey = client.startUserDataStream(); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java b/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java index d621e1084..fc9c514e1 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java @@ -10,9 +10,11 @@ */ public class FuturesAccountExample { private static final String SYMBOL = "LINKUSDT"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; public static void main(String[] args) { - BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); FuturesAccount account = client.getAccount(); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java index d6a68961f..b48c57bd2 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java @@ -11,11 +11,12 @@ * @author Mahdi Sheikh Hosseini */ public class FuturesOrdersAsyncExample { - private static final String SYMBOL = "LINKETH"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; public static void main(String[] args) { - BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); BinanceApiAsyncFuturesRestClient client = factory.newAsyncRestClient(); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java index 962ce4ea3..6a9775c2a 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java @@ -18,9 +18,11 @@ */ public class FuturesOrdersExample { private static final String SYMBOL = "LINKUSDT"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; public static void main(String[] args) { - BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); BinanceApiFuturesRestClient client = futuresApiClientFactory.newFuturesRestClient(); FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false)); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java index bffe94273..37cce47c4 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java @@ -1,7 +1,6 @@ package com.binance.api.examples.futures; import com.binance.api.client.BinanceApiFuturesRestClient; -import com.binance.api.client.BinanceApiRestClient; import com.binance.api.client.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.OrderTradeUpdateEvent; @@ -16,10 +15,12 @@ * as well as update on trades/orders on a user account. */ public class FuturesUserDataStreamExample { + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; public static void main(String[] args) { - BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiRestClient client = factory.newRestClient(); + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); + BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); // First, we obtain a listenKey which is required to interact with the user data stream String listenKey = client.startUserDataStream(); diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java index 3ad910d59..8518aaec0 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java @@ -1,36 +1,43 @@ package com.binance.api.examples.testnet; import com.binance.api.client.BinanceApiFuturesRestClient; -import com.binance.api.client.domain.TimeInForce; -import com.binance.api.client.domain.WorkingType; +import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.domain.account.FuturesNewOrder; import com.binance.api.client.domain.account.FuturesNewOrderResponse; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; -import static com.binance.api.client.domain.account.FuturesNewOrder.limitLong; - /** * Examples on how to place orders, cancel them. * * @author Mahdi Sheikh Hosseini */ public class TestnetOrdersExample { - private static final String SYMBOL = "LTCUSDT"; + private static final String SYMBOL = "BTCUSDT"; private static final String API_KEY = ""; private static final String SECRET_KEY = ""; - public static void main(String[] args) { - BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); - BinanceApiFuturesRestClient client = futuresApiClientFactory.newFuturesRestClient(); - FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "200", false)); - long orderId = futuresOrderResponse.getOrderId(); - System.out.println("OrderID: " + orderId); + public static void main(String[] args) throws InterruptedException { + BinanceFuturesApiClientFactory testnetFactory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); + BinanceApiWebSocketClient streamClient = testnetFactory.newWebSocketClient(); + BinanceApiFuturesRestClient restClient = testnetFactory.newFuturesRestClient(); + + + String listenKey = restClient.startUserDataStream(); + + streamClient.onUserDataUpdateEvent(listenKey, System.out::println); + System.out.println("Waiting for events..."); + + + BinanceApiFuturesRestClient futureClient = testnetFactory.newFuturesRestClient(); + FuturesNewOrderResponse response1 = futureClient.newOrder(FuturesNewOrder.MarketLong(SYMBOL, "1", false)); + System.out.println(response1.getStatus()); + - CancelOrderResponse cancelOrderResponse = client.cancelOrder(new CancelOrderRequest(SYMBOL, orderId)); - System.out.println("Order Status: " + cancelOrderResponse.getStatus()); + Thread.sleep(5000); + FuturesNewOrderResponse response2 = futureClient.newOrder(FuturesNewOrder.MarketShort(SYMBOL, "1", false)); + System.out.println(response2); } } From d4b9b78458bc36e01cc33f694a082038f741be85 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Fri, 2 Apr 2021 02:06:29 +0430 Subject: [PATCH 07/18] add new order types --- src/main/java/com/binance/api/client/domain/OrderType.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/binance/api/client/domain/OrderType.java b/src/main/java/com/binance/api/client/domain/OrderType.java index f3735200d..7cde1db0b 100755 --- a/src/main/java/com/binance/api/client/domain/OrderType.java +++ b/src/main/java/com/binance/api/client/domain/OrderType.java @@ -9,10 +9,13 @@ public enum OrderType { LIMIT, MARKET, + STOP, STOP_LOSS, STOP_LOSS_LIMIT, TAKE_PROFIT, TAKE_PROFIT_LIMIT, LIMIT_MAKER, - TRAILING_STOP_MARKET + STOP_MARKET, + TRAILING_STOP_MARKET, + TAKE_PROFIT_MARKET, } From c1ab5a431c7693244b5b3f84d2d04268b70ec1c5 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Fri, 2 Apr 2021 15:59:47 +0430 Subject: [PATCH 08/18] Refactor whole project --- .../client/BinanceApiFuturesRestClient.java | 70 ---------- .../binance/api/client/BinanceEngineType.java | 2 + .../client/{ => api}/BinanceApiCallback.java | 2 +- .../api/client/{ => api}/BinanceApiError.java | 2 +- .../{ => api}/BinanceApiWebSocketClient.java | 2 +- .../BinanceApiAsyncFuturesRestClient.java | 3 +- .../BinanceApiAsyncMarginRestClient.java | 11 +- .../async/BinanceApiSpotAsyncRestClient.java} | 5 +- .../api/sync/BinanceApiFuturesRestClient.java | 21 +++ .../sync/BinanceApiGeneralRestClient.java} | 118 +--------------- .../sync}/BinanceApiMarginRestClient.java | 29 ++-- .../api/sync/BinanceApiSpotRestClient.java | 130 ++++++++++++++++++ .../sync}/BinanceApiSwapRestClient.java | 2 +- .../domain/account/FuturesNewOrder.java | 27 +++- .../client/domain/general/SymbolStatus.java | 21 ++- .../client/exception/BinanceApiException.java | 2 +- .../factory/BinanceAbstractFactory.java | 103 ++++++++++++++ .../api/client/factory/BinanceFactory.java | 20 ++- .../BinanceFuturesApiClientFactory.java | 36 ++--- .../BinanceMarginApiClientFactory.java | 73 ++++++++++ .../factory/BinanceSpotApiClientFactory.java | 41 ++---- .../factory/BinanceSwapApiClientFactory.java | 70 ++++++++++ .../impl/BinanceApiCallbackAdapter.java | 4 +- .../api/client/impl/BinanceApiService.java | 5 - .../impl/BinanceApiServiceGenerator.java | 2 +- .../client/impl/BinanceFuturesApiService.java | 3 - .../BinanceApiAsyncFuturesRestClientImpl.java | 9 +- .../BinanceApiAsyncMarginRestClientImpl.java | 14 +- .../BinanceApiSpotAsyncRestClientImpl.java} | 13 +- .../BinanceApiFuturesRestClientImpl.java | 83 +++++++++-- .../BinanceApiMarginRestClientImpl.java | 11 +- .../BinanceApiSpotRestClientImpl.java} | 10 +- .../BinanceApiSwapRestClientImpl.java | 6 +- .../BinanceApiWebSocketClientImpl.java | 6 +- .../{ => ws}/BinanceApiWebSocketListener.java | 4 +- .../examples/AccountBalanceCacheExample.java | 6 +- .../api/examples/AccountEndpointsExample.java | 4 +- .../AccountEndpointsExampleAsync.java | 4 +- .../api/examples/AggTradesCacheExample.java | 6 +- .../api/examples/AllMarketTickersExample.java | 2 +- .../examples/CandlesticksCacheExample.java | 6 +- .../api/examples/DepthCacheExample.java | 8 +- .../api/examples/GeneralEndpointsExample.java | 4 +- .../GeneralEndpointsExampleAsync.java | 4 +- .../MarginAccountEndpointsExample.java | 22 +-- .../MarginAccountEndpointsExampleAsync.java | 22 +-- ...arginAccountEndpointsLoanQueryExample.java | 8 +- .../api/examples/MarginOrdersExample.java | 8 +- .../examples/MarginOrdersExampleAsync.java | 8 +- .../examples/MarginUserDataStreamExample.java | 6 +- .../examples/MarketDataEndpointsExample.java | 4 +- .../MarketDataEndpointsExampleAsync.java | 4 +- .../api/examples/MarketDataStreamExample.java | 2 +- .../binance/api/examples/OrdersExample.java | 4 +- .../api/examples/OrdersExampleAsync.java | 4 +- .../api/examples/SwapEndpointExample.java | 9 +- .../examples/TotalAccountBalanceExample.java | 6 +- .../api/examples/UserDataStreamExample.java | 6 +- .../futures/FuturesAccountExample.java | 4 +- .../futures/FuturesOrdersAsyncExample.java | 2 +- .../futures/FuturesOrdersExample.java | 7 +- .../futures/FuturesUserDataStreamExample.java | 6 +- .../futures/FuturesWebSocketExample.java | 2 +- .../testnet/TestnetAccountExample.java | 4 +- .../testnet/TestnetGeneralExample.java | 47 +++++++ .../testnet/TestnetOrdersAsyncExample.java | 2 +- .../testnet/TestnetOrdersExample.java | 42 ++++-- .../testnet/TestnetWebSocketExample.java | 2 +- 68 files changed, 791 insertions(+), 444 deletions(-) delete mode 100755 src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java rename src/main/java/com/binance/api/client/{ => api}/BinanceApiCallback.java (90%) rename src/main/java/com/binance/api/client/{ => api}/BinanceApiError.java (89%) rename src/main/java/com/binance/api/client/{ => api}/BinanceApiWebSocketClient.java (99%) rename src/main/java/com/binance/api/client/{ => api/async}/BinanceApiAsyncFuturesRestClient.java (89%) rename src/main/java/com/binance/api/client/{ => api/async}/BinanceApiAsyncMarginRestClient.java (89%) rename src/main/java/com/binance/api/client/{BinanceApiAsyncRestClient.java => api/async/BinanceApiSpotAsyncRestClient.java} (98%) create mode 100755 src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java rename src/main/java/com/binance/api/client/{BinanceApiRestClient.java => api/sync/BinanceApiGeneralRestClient.java} (61%) rename src/main/java/com/binance/api/client/{ => api/sync}/BinanceApiMarginRestClient.java (82%) create mode 100755 src/main/java/com/binance/api/client/api/sync/BinanceApiSpotRestClient.java rename src/main/java/com/binance/api/client/{ => api/sync}/BinanceApiSwapRestClient.java (94%) create mode 100755 src/main/java/com/binance/api/client/factory/BinanceMarginApiClientFactory.java create mode 100755 src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java rename src/main/java/com/binance/api/client/impl/{ => async}/BinanceApiAsyncFuturesRestClientImpl.java (89%) rename src/main/java/com/binance/api/client/impl/{ => async}/BinanceApiAsyncMarginRestClientImpl.java (90%) rename src/main/java/com/binance/api/client/impl/{BinanceApiAsyncRestClientImpl.java => async/BinanceApiSpotAsyncRestClientImpl.java} (95%) rename src/main/java/com/binance/api/client/impl/{ => sync}/BinanceApiFuturesRestClientImpl.java (50%) rename src/main/java/com/binance/api/client/impl/{ => sync}/BinanceApiMarginRestClientImpl.java (91%) rename src/main/java/com/binance/api/client/impl/{BinanceApiRestClientImpl.java => sync/BinanceApiSpotRestClientImpl.java} (95%) rename src/main/java/com/binance/api/client/impl/{ => sync}/BinanceApiSwapRestClientImpl.java (92%) rename src/main/java/com/binance/api/client/impl/{ => ws}/BinanceApiWebSocketClientImpl.java (96%) rename src/main/java/com/binance/api/client/impl/{ => ws}/BinanceApiWebSocketListener.java (91%) create mode 100755 src/test/java/com/binance/api/examples/testnet/TestnetGeneralExample.java diff --git a/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java b/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java deleted file mode 100755 index faca20e4f..000000000 --- a/src/main/java/com/binance/api/client/BinanceApiFuturesRestClient.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.binance.api.client; - -import com.binance.api.client.domain.account.FuturesAccount; -import com.binance.api.client.domain.account.FuturesNewOrder; -import com.binance.api.client.domain.account.FuturesNewOrderResponse; -import com.binance.api.client.domain.account.Order; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; - -import java.util.List; - -public interface BinanceApiFuturesRestClient { - /** - * Get current margin account information using default parameters. - */ - FuturesAccount getAccount(); - - /** - * Get all open orders on margin account for a symbol. - * - * @param orderRequest order request parameters - */ - List getOpenOrders(OrderRequest orderRequest); - - /** - * Send in a new margin order. - * - * @param order the new order to submit. - * @return a response containing details about the newly placed order. - */ - FuturesNewOrderResponse newOrder(FuturesNewOrder order); - - /** - * Cancel an active margin order. - * - * @param cancelOrderRequest order status request parameters - */ - CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest); - - /** - * Check margin order's status. - * - * @param orderStatusRequest order status request options/filters - * @return an order - */ - Order getOrderStatus(OrderStatusRequest orderStatusRequest); - - /** - * Start a new user data stream. - * - * @return a listen key that can be used with data streams - */ - String startUserDataStream(); - - /** - * PING a user data stream to prevent a time out. - * - * @param listenKey listen key that identifies a data stream - */ - void keepAliveUserDataStream(String listenKey); - - /** - * Close out a new user data stream. - * - * @param listenKey listen key that identifies a data stream - */ - void closeUserDataStream(String listenKey); -} diff --git a/src/main/java/com/binance/api/client/BinanceEngineType.java b/src/main/java/com/binance/api/client/BinanceEngineType.java index 2a07a9545..3ed096184 100644 --- a/src/main/java/com/binance/api/client/BinanceEngineType.java +++ b/src/main/java/com/binance/api/client/BinanceEngineType.java @@ -5,6 +5,8 @@ */ public enum BinanceEngineType { SPOT, + MARGIN, + SWAP, FUTURES, TESTNET } diff --git a/src/main/java/com/binance/api/client/BinanceApiCallback.java b/src/main/java/com/binance/api/client/api/BinanceApiCallback.java similarity index 90% rename from src/main/java/com/binance/api/client/BinanceApiCallback.java rename to src/main/java/com/binance/api/client/api/BinanceApiCallback.java index 3112bd793..b77f715a4 100755 --- a/src/main/java/com/binance/api/client/BinanceApiCallback.java +++ b/src/main/java/com/binance/api/client/api/BinanceApiCallback.java @@ -1,4 +1,4 @@ -package com.binance.api.client; +package com.binance.api.client.api; /** * BinanceApiCallback is a functional interface used together with the BinanceApiAsyncClient to provide a non-blocking REST client. diff --git a/src/main/java/com/binance/api/client/BinanceApiError.java b/src/main/java/com/binance/api/client/api/BinanceApiError.java similarity index 89% rename from src/main/java/com/binance/api/client/BinanceApiError.java rename to src/main/java/com/binance/api/client/api/BinanceApiError.java index b0d98ab8c..9a89e9ef4 100755 --- a/src/main/java/com/binance/api/client/BinanceApiError.java +++ b/src/main/java/com/binance/api/client/api/BinanceApiError.java @@ -1,4 +1,4 @@ -package com.binance.api.client; +package com.binance.api.client.api; import com.binance.api.client.constant.BinanceApiConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/src/main/java/com/binance/api/client/BinanceApiWebSocketClient.java b/src/main/java/com/binance/api/client/api/BinanceApiWebSocketClient.java similarity index 99% rename from src/main/java/com/binance/api/client/BinanceApiWebSocketClient.java rename to src/main/java/com/binance/api/client/api/BinanceApiWebSocketClient.java index bc048d464..95ed31e06 100755 --- a/src/main/java/com/binance/api/client/BinanceApiWebSocketClient.java +++ b/src/main/java/com/binance/api/client/api/BinanceApiWebSocketClient.java @@ -1,4 +1,4 @@ -package com.binance.api.client; +package com.binance.api.client.api; import com.binance.api.client.domain.event.*; import com.binance.api.client.domain.market.CandlestickInterval; diff --git a/src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java b/src/main/java/com/binance/api/client/api/async/BinanceApiAsyncFuturesRestClient.java similarity index 89% rename from src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java rename to src/main/java/com/binance/api/client/api/async/BinanceApiAsyncFuturesRestClient.java index b932df43d..ecd8dc228 100755 --- a/src/main/java/com/binance/api/client/BinanceApiAsyncFuturesRestClient.java +++ b/src/main/java/com/binance/api/client/api/async/BinanceApiAsyncFuturesRestClient.java @@ -1,5 +1,6 @@ -package com.binance.api.client; +package com.binance.api.client.api.async; +import com.binance.api.client.api.BinanceApiCallback; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.CancelOrderRequest; import com.binance.api.client.domain.account.request.CancelOrderResponse; diff --git a/src/main/java/com/binance/api/client/BinanceApiAsyncMarginRestClient.java b/src/main/java/com/binance/api/client/api/async/BinanceApiAsyncMarginRestClient.java similarity index 89% rename from src/main/java/com/binance/api/client/BinanceApiAsyncMarginRestClient.java rename to src/main/java/com/binance/api/client/api/async/BinanceApiAsyncMarginRestClient.java index 8d1d8486f..f8d3ab715 100755 --- a/src/main/java/com/binance/api/client/BinanceApiAsyncMarginRestClient.java +++ b/src/main/java/com/binance/api/client/api/async/BinanceApiAsyncMarginRestClient.java @@ -1,5 +1,6 @@ -package com.binance.api.client; +package com.binance.api.client.api.async; +import com.binance.api.client.api.BinanceApiCallback; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.CancelOrderRequest; @@ -58,14 +59,6 @@ public interface BinanceApiAsyncMarginRestClient { */ void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback); - /** - * Get margin trades for a specific symbol (async). - * - * @param symbol symbol to get trades from - * @return a list of trades - */ - void getMyTrades(String symbol, BinanceApiCallback> callback); - // User stream endpoints /** diff --git a/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java b/src/main/java/com/binance/api/client/api/async/BinanceApiSpotAsyncRestClient.java similarity index 98% rename from src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java rename to src/main/java/com/binance/api/client/api/async/BinanceApiSpotAsyncRestClient.java index 989562868..509eaebf0 100755 --- a/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java +++ b/src/main/java/com/binance/api/client/api/async/BinanceApiSpotAsyncRestClient.java @@ -1,5 +1,6 @@ -package com.binance.api.client; +package com.binance.api.client.api.async; +import com.binance.api.client.api.BinanceApiCallback; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.*; import com.binance.api.client.domain.event.ListenKey; @@ -12,7 +13,7 @@ /** * Binance API facade, supporting asynchronous/non-blocking access Binance's REST API. */ -public interface BinanceApiAsyncRestClient { +public interface BinanceApiSpotAsyncRestClient { // General endpoints diff --git a/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java new file mode 100755 index 000000000..bedc6b758 --- /dev/null +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java @@ -0,0 +1,21 @@ +package com.binance.api.client.api.sync; + +import com.binance.api.client.domain.account.FuturesAccount; +import com.binance.api.client.domain.account.FuturesNewOrder; +import com.binance.api.client.domain.account.FuturesNewOrderResponse; + +public interface BinanceApiFuturesRestClient extends BinanceApiGeneralRestClient { + + /** + * Get current margin account information using default parameters. + */ + FuturesAccount getAccount(); + + /** + * Send in a new margin order. + * + * @param order the new order to submit. + * @return a response containing details about the newly placed order. + */ + FuturesNewOrderResponse newOrder(FuturesNewOrder order); +} diff --git a/src/main/java/com/binance/api/client/BinanceApiRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java similarity index 61% rename from src/main/java/com/binance/api/client/BinanceApiRestClient.java rename to src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java index 97c6dbe90..594666dbe 100755 --- a/src/main/java/com/binance/api/client/BinanceApiRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java @@ -1,4 +1,4 @@ -package com.binance.api.client; +package com.binance.api.client.api.sync; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.*; @@ -10,7 +10,7 @@ /** * Binance API facade, supporting synchronous/blocking access Binance's REST API. */ -public interface BinanceApiRestClient { +public interface BinanceApiGeneralRestClient { // General endpoints @@ -112,11 +112,6 @@ public interface BinanceApiRestClient { */ List getAll24HrPriceStatistics(); - /** - * Get Latest price for all symbols. - */ - List getAllPrices(); - /** * Get latest price for symbol. * @@ -124,27 +119,6 @@ public interface BinanceApiRestClient { */ TickerPrice getPrice(String symbol); - /** - * Get best price/qty on the order book for all symbols. - */ - List getBookTickers(); - - // Account endpoints - - /** - * Send in a new order. - * - * @param order the new order to submit. - * @return a response containing details about the newly placed order. - */ - NewOrderResponse newOrder(NewOrder order); - - /** - * Test new order creation and signature/recvWindow long. Creates and validates a new order but does not send it into the matching engine. - * - * @param order the new TEST order to submit. - */ - void newOrderTest(NewOrder order); /** * Check an order's status. @@ -169,94 +143,6 @@ public interface BinanceApiRestClient { */ List getOpenOrders(OrderRequest orderRequest); - /** - * Get all account orders; active, canceled, or filled. - * - * @param orderRequest order request parameters - * @return a list of all account orders - */ - List getAllOrders(AllOrdersRequest orderRequest); - - /** - * Get current account information. - */ - Account getAccount(Long recvWindow, Long timestamp); - - /** - * Get current account information using default parameters. - */ - Account getAccount(); - - /** - * Get trades for a specific account and symbol. - * - * @param symbol symbol to get trades from - * @param limit default 500; max 1000 - * @param fromId TradeId to fetch from. Default gets most recent trades. - * @return a list of trades - */ - List getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp); - - /** - * Get trades for a specific account and symbol. - * - * @param symbol symbol to get trades from - * @param limit default 500; max 1000 - * @return a list of trades - */ - List getMyTrades(String symbol, Integer limit); - - /** - * Get trades for a specific account and symbol. - * - * @param symbol symbol to get trades from - * @return a list of trades - */ - List getMyTrades(String symbol); - - List getMyTrades(String symbol, Long fromId); - - /** - * Submit a withdraw request. - *

- * Enable Withdrawals option has to be active in the API settings. - * - * @param asset asset symbol to withdraw - * @param address address to withdraw to - * @param amount amount to withdraw - * @param name description/alias of the address - * @param addressTag Secondary address identifier for coins like XRP,XMR etc. - */ - WithdrawResult withdraw(String asset, String address, String amount, String name, String addressTag); - - /** - * Fetch account deposit history. - * - * @return deposit history, containing a list of deposits - */ - DepositHistory getDepositHistory(String asset); - - /** - * Fetch account withdraw history. - * - * @return withdraw history, containing a list of withdrawals - */ - WithdrawHistory getWithdrawHistory(String asset); - - /** - * Fetch sub-account transfer history. - * - * @return sub-account transfers - */ - List getSubAccountTransfers(); - - /** - * Fetch deposit address. - * - * @return deposit address for a given asset. - */ - DepositAddress getDepositAddress(String asset); - // User stream endpoints /** * Start a new user data stream. diff --git a/src/main/java/com/binance/api/client/BinanceApiMarginRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiMarginRestClient.java similarity index 82% rename from src/main/java/com/binance/api/client/BinanceApiMarginRestClient.java rename to src/main/java/com/binance/api/client/api/sync/BinanceApiMarginRestClient.java index fd051bd6b..bc5ff7c3e 100755 --- a/src/main/java/com/binance/api/client/BinanceApiMarginRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiMarginRestClient.java @@ -1,4 +1,4 @@ -package com.binance.api.client; +package com.binance.api.client.api.sync; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.*; @@ -39,23 +39,16 @@ public interface BinanceApiMarginRestClient { /** * Check margin order's status. - * @param orderStatusRequest order status request options/filters * + * @param orderStatusRequest order status request options/filters * @return an order */ Order getOrderStatus(OrderStatusRequest orderStatusRequest); - /** - * Get margin trades for a specific symbol. - * - * @param symbol symbol to get trades from - * @return a list of trades - */ - List getMyTrades(String symbol); - /** * Execute transfer between spot account and margin account - * @param asset asset to repay + * + * @param asset asset to repay * @param amount amount to repay * @return transaction id */ @@ -63,7 +56,8 @@ public interface BinanceApiMarginRestClient { /** * Apply for a loan - * @param asset asset to repay + * + * @param asset asset to repay * @param amount amount to repay * @return transaction id */ @@ -71,6 +65,7 @@ public interface BinanceApiMarginRestClient { /** * Query loan record + * * @param asset asset to query * @return repay records */ @@ -78,6 +73,7 @@ public interface BinanceApiMarginRestClient { /** * Query max borrowable + * * @param asset asset to query * @return max borrowable */ @@ -85,15 +81,17 @@ public interface BinanceApiMarginRestClient { /** * Query loan record + * * @param asset asset to query - * @param txId the tranId in POST /sapi/v1/margin/repay + * @param txId the tranId in POST /sapi/v1/margin/repay * @return loan records */ RepayQueryResult queryRepay(String asset, String txId); /** * Repay loan for margin account - * @param asset asset to repay + * + * @param asset asset to repay * @param amount amount to repay * @return transaction id */ @@ -101,8 +99,9 @@ public interface BinanceApiMarginRestClient { /** * Query loan record + * * @param asset asset to query - * @param txId the tranId in POST /sapi/v1/margin/loan + * @param txId the tranId in POST /sapi/v1/margin/loan * @return loan records */ LoanQueryResult queryLoan(String asset, String txId); diff --git a/src/main/java/com/binance/api/client/api/sync/BinanceApiSpotRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiSpotRestClient.java new file mode 100755 index 000000000..58e7b1213 --- /dev/null +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiSpotRestClient.java @@ -0,0 +1,130 @@ +package com.binance.api.client.api.sync; + +import com.binance.api.client.domain.account.*; +import com.binance.api.client.domain.account.request.AllOrdersRequest; +import com.binance.api.client.domain.market.BookTicker; +import com.binance.api.client.domain.market.TickerPrice; + +import java.util.List; + +/** + * Binance API facade, supporting synchronous/blocking access Binance's REST API. + */ +public interface BinanceApiSpotRestClient extends BinanceApiGeneralRestClient { + + // Account endpoints + + /** + * Send in a new order. + * + * @param order the new order to submit. + * @return a response containing details about the newly placed order. + */ + NewOrderResponse newOrder(NewOrder order); + + + /** + * Get Latest price for all symbols. + */ + List getAllPrices(); + + /** + * Get best price/qty on the order book for all symbols. + */ + List getBookTickers(); + + /** + * Get all account orders; active, canceled, or filled. + * + * @param orderRequest order request parameters + * @return a list of all account orders + */ + List getAllOrders(AllOrdersRequest orderRequest); + + /** + * Test new order creation and signature/recvWindow long. Creates and validates a new order but does not send it into the matching engine. + * + * @param order the new TEST order to submit. + */ + void newOrderTest(NewOrder order); + + /** + * Get current account information. + */ + Account getAccount(Long recvWindow, Long timestamp); + + /** + * Get current account information using default parameters. + */ + Account getAccount(); + + /** + * Get trades for a specific account and symbol. + * + * @param symbol symbol to get trades from + * @param limit default 500; max 1000 + * @param fromId TradeId to fetch from. Default gets most recent trades. + * @return a list of trades + */ + List getMyTrades(String symbol, Integer limit, Long fromId, Long recvWindow, Long timestamp); + + /** + * Get trades for a specific account and symbol. + * + * @param symbol symbol to get trades from + * @param limit default 500; max 1000 + * @return a list of trades + */ + List getMyTrades(String symbol, Integer limit); + + /** + * Get trades for a specific account and symbol. + * + * @param symbol symbol to get trades from + * @return a list of trades + */ + List getMyTrades(String symbol); + + List getMyTrades(String symbol, Long fromId); + + /** + * Submit a withdraw request. + *

+ * Enable Withdrawals option has to be active in the API settings. + * + * @param asset asset symbol to withdraw + * @param address address to withdraw to + * @param amount amount to withdraw + * @param name description/alias of the address + * @param addressTag Secondary address identifier for coins like XRP,XMR etc. + */ + WithdrawResult withdraw(String asset, String address, String amount, String name, String addressTag); + + /** + * Fetch account deposit history. + * + * @return deposit history, containing a list of deposits + */ + DepositHistory getDepositHistory(String asset); + + /** + * Fetch account withdraw history. + * + * @return withdraw history, containing a list of withdrawals + */ + WithdrawHistory getWithdrawHistory(String asset); + + /** + * Fetch sub-account transfer history. + * + * @return sub-account transfers + */ + List getSubAccountTransfers(); + + /** + * Fetch deposit address. + * + * @return deposit address for a given asset. + */ + DepositAddress getDepositAddress(String asset); +} diff --git a/src/main/java/com/binance/api/client/BinanceApiSwapRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiSwapRestClient.java similarity index 94% rename from src/main/java/com/binance/api/client/BinanceApiSwapRestClient.java rename to src/main/java/com/binance/api/client/api/sync/BinanceApiSwapRestClient.java index f7baf2c2e..f8d5c0623 100755 --- a/src/main/java/com/binance/api/client/BinanceApiSwapRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiSwapRestClient.java @@ -1,4 +1,4 @@ -package com.binance.api.client; +package com.binance.api.client.api.sync; import com.binance.api.client.domain.SwapRemoveType; import com.binance.api.client.domain.account.*; diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java index 5c995f60f..91c6c81d9 100644 --- a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java +++ b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java @@ -129,6 +129,19 @@ public FuturesNewOrder(String symbol, OrderSide side, OrderType type, String qua this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; } + public FuturesNewOrder(String symbol, OrderSide side, OrderType type, TimeInForce timeInForce, String quantity, String price, boolean reduceOnly) { + this.symbol = symbol; + this.side = side; + this.type = type; + this.timeInForce = timeInForce; + this.quantity = quantity; + this.price = price; + this.reduceOnly = reduceOnly; + this.newOrderRespType = NewOrderResponseType.RESULT; + this.timestamp = System.currentTimeMillis(); + this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; + } + public String getSymbol() { return symbol; } @@ -273,12 +286,12 @@ public void setTimestamp(long timestamp) { this.timestamp = timestamp; } - public static FuturesNewOrder limitLong(String symbol, TimeInForce timeInForce, WorkingType workingType, String quantity, String price, boolean reduceOnly) { - return new FuturesNewOrder(symbol, OrderSide.BUY, OrderType.LIMIT, timeInForce, workingType, quantity, price, reduceOnly); + public static FuturesNewOrder limitLong(String symbol, TimeInForce timeInForce, String quantity, String price, boolean reduceOnly) { + return new FuturesNewOrder(symbol, OrderSide.BUY, OrderType.LIMIT, timeInForce, quantity, price, reduceOnly); } - public static FuturesNewOrder limitShort(String symbol, TimeInForce timeInForce, WorkingType workingType, String quantity, String price, boolean reduceOnly) { - return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.LIMIT, timeInForce, workingType, quantity, price, reduceOnly); + public static FuturesNewOrder limitShort(String symbol, TimeInForce timeInForce, String quantity, String price, boolean reduceOnly) { + return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.LIMIT, timeInForce, quantity, price, reduceOnly); } public static FuturesNewOrder MarketLong(String symbol, String quantity, boolean reduceOnly) { @@ -289,6 +302,12 @@ public static FuturesNewOrder MarketShort(String symbol, String quantity, boolea return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.MARKET, quantity, reduceOnly); } + public static FuturesNewOrder stopLimitShort(String symbol, String quantity, String stopPrice, boolean reduceOnly) { + FuturesNewOrder order = new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.STOP_MARKET, quantity, reduceOnly); + order.setStopPrice(stopPrice); + return order; + } + /* public static FuturesNewOrder stopLimitLong(String symbol, String quantity, boolean reduceOnly) { return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.MARKET, quantity); }*/ diff --git a/src/main/java/com/binance/api/client/domain/general/SymbolStatus.java b/src/main/java/com/binance/api/client/domain/general/SymbolStatus.java index 77291ee77..25bfdb38a 100755 --- a/src/main/java/com/binance/api/client/domain/general/SymbolStatus.java +++ b/src/main/java/com/binance/api/client/domain/general/SymbolStatus.java @@ -7,11 +7,18 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) public enum SymbolStatus { - PRE_TRADING, - TRADING, - POST_TRADING, - END_OF_DAY, - HALT, - AUCTION_MATCH, - BREAK; + PRE_TRADING, + TRADING, + POST_TRADING, + END_OF_DAY, + HALT, + AUCTION_MATCH, + BREAK, + SETTLING, + PENDING_TRADING, + DELIVERING, + DELIVERED, + PRE_SETTLE, + CLOSE, + PRE_DELIVERING; } diff --git a/src/main/java/com/binance/api/client/exception/BinanceApiException.java b/src/main/java/com/binance/api/client/exception/BinanceApiException.java index 80430fd8d..7b12cfb2b 100755 --- a/src/main/java/com/binance/api/client/exception/BinanceApiException.java +++ b/src/main/java/com/binance/api/client/exception/BinanceApiException.java @@ -1,6 +1,6 @@ package com.binance.api.client.exception; -import com.binance.api.client.BinanceApiError; +import com.binance.api.client.api.BinanceApiError; /** * An exception which can occur while invoking methods of the Binance API. diff --git a/src/main/java/com/binance/api/client/factory/BinanceAbstractFactory.java b/src/main/java/com/binance/api/client/factory/BinanceAbstractFactory.java index 7e0ba0864..4bfadef27 100644 --- a/src/main/java/com/binance/api/client/factory/BinanceAbstractFactory.java +++ b/src/main/java/com/binance/api/client/factory/BinanceAbstractFactory.java @@ -4,14 +4,33 @@ import com.binance.api.client.config.*; import com.binance.api.client.exception.BinanceIllegalException; +/** + * @author Mahdi Shiekh Hosseini + */ public abstract class BinanceAbstractFactory { + /** + * General binance factory . + * this method create a factory by type of engine you choose . + * + * @param apiKey + * @param secretKey + * @param engineType + * @param apiConfigClass + * @return instance of object extended BinanceFactory + * @see BinanceApiConfig + * @see BinanceEngineType + */ public static BinanceFactory createFactory(String apiKey, String secretKey, BinanceEngineType engineType, Class apiConfigClass) { final String apiUrl = getApiUrl(apiConfigClass); final String websocketUrl = getWebsocketUrl(apiConfigClass); switch (engineType) { case SPOT: return BinanceSpotApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); + case MARGIN: + return BinanceMarginApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); + case SWAP: + return BinanceSwapApiClientFactory.newInstance(apiKey, secretKey, apiUrl); case FUTURES: case TESTNET: return BinanceFuturesApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); @@ -19,10 +38,21 @@ public static BinanceFactory createFactory(String apiKey, String secretKey, Bina throw new IllegalArgumentException(); } + /** + * @param apiKey + * @param secretKey + * @param engineType + * @return instance of object extended BinanceFactory + * @see BinanceEngineType + */ public static BinanceFactory createFactory(String apiKey, String secretKey, BinanceEngineType engineType) { switch (engineType) { case SPOT: return createSpotFactory(apiKey, secretKey); + case MARGIN: + return createMarginFactory(apiKey, secretKey); + case SWAP: + return createSwapFactory(apiKey, secretKey); case FUTURES: return createFuturesFactory(apiKey, secretKey); case TESTNET: @@ -31,44 +61,117 @@ public static BinanceFactory createFactory(String apiKey, String secretKey, Bina throw new IllegalArgumentException(); } + /** + * Basic and simple create spot engine factory . + * + * @param apiKey + * @param secretKey + * @return instance of object extended BinanceFactory + */ public static BinanceSpotApiClientFactory createSpotFactory(String apiKey, String secretKey) { final String apiUrl = getApiUrl(SpotApiConfig.class); final String websocketUrl = getWebsocketUrl(SpotApiConfig.class); return BinanceSpotApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); } + /** + * Basic and simple create margin engine factory . + * + * @param apiKey + * @param secretKey + * @return instance of object extended BinanceFactory + */ + public static BinanceMarginApiClientFactory createMarginFactory(String apiKey, String secretKey) { + final String apiUrl = getApiUrl(SpotApiConfig.class); + final String websocketUrl = getWebsocketUrl(SpotApiConfig.class); + return BinanceMarginApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); + } + + /** + * Basic and simple create margin swap factory . + * + * @param apiKey + * @param secretKey + * @return instance of object extended BinanceFactory + */ + public static BinanceSwapApiClientFactory createSwapFactory(String apiKey, String secretKey) { + final String apiUrl = getApiUrl(SpotApiConfig.class); + return BinanceSwapApiClientFactory.newInstance(apiKey, secretKey, apiUrl); + } + + /** + * Basic and simple create futures engine factory . + * + * @param apiKey + * @param secretKey + * @return instance of object extended BinanceFactory + */ public static BinanceFuturesApiClientFactory createFuturesFactory(String apiKey, String secretKey) { final String apiUrl = getApiUrl(FuturesApiConfig.class); final String websocketUrl = getWebsocketUrl(FuturesApiConfig.class); return BinanceFuturesApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); } + /** + * Basic and simple create testnet engine factory . + * + * @param apiKey + * @param secretKey + * @return instance of object extended BinanceFactory + */ public static BinanceFuturesApiClientFactory createTestnetFactory(String apiKey, String secretKey) { final String apiUrl = getApiUrl(TestnetApiConfig.class); final String websocketUrl = getWebsocketUrl(TestnetApiConfig.class); return BinanceFuturesApiClientFactory.newInstance(apiKey, secretKey, apiUrl, websocketUrl); } + /** + * @return instance of BinanceSpotApiClientFactory + */ public static BinanceSpotApiClientFactory createSpotFactory() { return createSpotFactory(null, null); } + /** + * @return instance of BinanceSpotApiClientFactory + */ public static BinanceFuturesApiClientFactory createFuturesFactory() { return createFuturesFactory(null, null); } + /** + * @return instance of BinanceSpotApiClientFactory + */ public static BinanceFuturesApiClientFactory createTestnetFactory() { return createTestnetFactory(null, null); } + /** + * get apiUrl from ApiConfig annotation + * + * @param apiConfigClass + * @return apiUrl + * @see ApiConfig + */ private static String getApiUrl(Class apiConfigClass) { return getApiConfig(apiConfigClass).apiUrl(); } + /** + * get websocketUrl from ApiConfig annotation + * + * @param apiConfigClass + * @return websocketUrl + * @see ApiConfig + */ private static String getWebsocketUrl(Class apiConfigClass) { return getApiConfig(apiConfigClass).webSocketUrl(); } + /** + * @param apiConfigClass + * @return + */ private static ApiConfig getApiConfig(Class apiConfigClass) { if (apiConfigClass.isAnnotationPresent(ApiConfig.class)) { return apiConfigClass.getAnnotation(ApiConfig.class); diff --git a/src/main/java/com/binance/api/client/factory/BinanceFactory.java b/src/main/java/com/binance/api/client/factory/BinanceFactory.java index 4daa32477..a80ee70e5 100644 --- a/src/main/java/com/binance/api/client/factory/BinanceFactory.java +++ b/src/main/java/com/binance/api/client/factory/BinanceFactory.java @@ -1,10 +1,20 @@ package com.binance.api.client.factory; -public interface BinanceFactory { +/** + * Generic binance factory used for any implementation of new engines + * + * @author Mahdi Shiekh Hosseini + * @see com.binance.api.client.BinanceEngineType + */ +public interface BinanceFactory { - T newAsyncRestClient(); + /** + * @return instance of asynchronous class + */ + ASYNC newAsyncRestClient(); - T newRestClient(); - - T newWebSocketClient(); + /** + * @return instance of synchronous class + */ + SYNC newRestClient(); } diff --git a/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java b/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java index 77c07e02e..8df444537 100755 --- a/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java +++ b/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java @@ -1,20 +1,18 @@ package com.binance.api.client.factory; -import com.binance.api.client.BinanceApiAsyncFuturesRestClient; -import com.binance.api.client.BinanceApiFuturesRestClient; -import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.BinanceApiWebSocketClient; -import com.binance.api.client.impl.BinanceApiAsyncFuturesRestClientImpl; -import com.binance.api.client.impl.BinanceApiFuturesRestClientImpl; -import com.binance.api.client.impl.BinanceApiRestClientImpl; -import com.binance.api.client.impl.BinanceApiWebSocketClientImpl; +import com.binance.api.client.api.BinanceApiWebSocketClient; +import com.binance.api.client.api.async.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; +import com.binance.api.client.impl.async.BinanceApiAsyncFuturesRestClientImpl; +import com.binance.api.client.impl.sync.BinanceApiFuturesRestClientImpl; +import com.binance.api.client.impl.ws.BinanceApiWebSocketClientImpl; import static com.binance.api.client.impl.BinanceApiServiceGenerator.getSharedClient; /** * A factory for creating BinanceApi client objects. */ -public class BinanceFuturesApiClientFactory implements BinanceFactory { +public class BinanceFuturesApiClientFactory implements BinanceFactory { /** * API Key @@ -62,19 +60,18 @@ public static BinanceFuturesApiClientFactory newInstance() { return new BinanceFuturesApiClientFactory(null, null, null, null); } - /** - * Creates a new asynchronous/non-blocking Futures REST client. + * Creates a new synchronous/blocking Futures REST client. */ - public BinanceApiAsyncFuturesRestClient newAsyncRestClient() { - return new BinanceApiAsyncFuturesRestClientImpl(apiKey, secret, apiUrl); + public BinanceApiFuturesRestClient newRestClient() { + return new BinanceApiFuturesRestClientImpl(apiKey, secret, apiUrl); } /** - * Creates a new synchronous/blocking Futures REST client. + * Creates a new asynchronous/non-blocking Futures REST client. */ - public BinanceApiRestClient newRestClient() { - return new BinanceApiRestClientImpl(apiKey, secret, apiUrl); + public BinanceApiAsyncFuturesRestClient newAsyncRestClient() { + return new BinanceApiAsyncFuturesRestClientImpl(apiKey, secret, apiUrl); } /** @@ -83,11 +80,4 @@ public BinanceApiRestClient newRestClient() { public BinanceApiWebSocketClient newWebSocketClient() { return new BinanceApiWebSocketClientImpl(getSharedClient(), websocketUrl); } - - /** - * Creates a new synchronous/blocking Futures REST client. - */ - public BinanceApiFuturesRestClient newFuturesRestClient() { - return new BinanceApiFuturesRestClientImpl(apiKey, secret, apiUrl); - } } diff --git a/src/main/java/com/binance/api/client/factory/BinanceMarginApiClientFactory.java b/src/main/java/com/binance/api/client/factory/BinanceMarginApiClientFactory.java new file mode 100755 index 000000000..37cdff3f0 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceMarginApiClientFactory.java @@ -0,0 +1,73 @@ +package com.binance.api.client.factory; + +import com.binance.api.client.api.async.BinanceApiAsyncMarginRestClient; +import com.binance.api.client.api.sync.BinanceApiMarginRestClient; +import com.binance.api.client.impl.async.BinanceApiAsyncMarginRestClientImpl; +import com.binance.api.client.impl.sync.BinanceApiMarginRestClientImpl; + +/** + * A factory for creating BinanceApi client objects. + */ +public class BinanceMarginApiClientFactory implements BinanceFactory { + + /** + * API Key + */ + private final String apiKey; + + /** + * Secret. + */ + private final String secret; + + private final String apiUrl; + private final String websocketUrl; + + /** + * Instantiates a new binance api client factory. + * + * @param apiKey the API key + * @param secret the Secret + */ + private BinanceMarginApiClientFactory(String apiKey, String secret, String apiUrl, String websocketUrl) { + this.apiKey = apiKey; + this.secret = secret; + this.apiUrl = apiUrl; + this.websocketUrl = websocketUrl; + } + + /** + * New instance. + * + * @param apiKey the API key + * @param secret the Secret + * @return the binance api client factory + */ + public static BinanceMarginApiClientFactory newInstance(String apiKey, String secret, String apiUrl, String websocketUrl) { + return new BinanceMarginApiClientFactory(apiKey, secret, apiUrl, websocketUrl); + } + + /** + * New instance without authentication. + * + * @return the binance api client factory + * @see BinanceAbstractFactory + */ + public static BinanceMarginApiClientFactory newInstance() { + return new BinanceMarginApiClientFactory(null, null, null, null); + } + + /** + * Creates a new asynchronous/non-blocking Margin REST client. + */ + public BinanceApiAsyncMarginRestClient newAsyncRestClient() { + return new BinanceApiAsyncMarginRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new synchronous/blocking Margin REST client. + */ + public BinanceApiMarginRestClient newRestClient() { + return new BinanceApiMarginRestClientImpl(apiKey, secret, apiUrl); + } +} diff --git a/src/main/java/com/binance/api/client/factory/BinanceSpotApiClientFactory.java b/src/main/java/com/binance/api/client/factory/BinanceSpotApiClientFactory.java index 483b79dd6..f7f5b5e8d 100755 --- a/src/main/java/com/binance/api/client/factory/BinanceSpotApiClientFactory.java +++ b/src/main/java/com/binance/api/client/factory/BinanceSpotApiClientFactory.java @@ -1,14 +1,18 @@ package com.binance.api.client.factory; -import com.binance.api.client.*; -import com.binance.api.client.impl.*; +import com.binance.api.client.api.BinanceApiWebSocketClient; +import com.binance.api.client.api.async.BinanceApiSpotAsyncRestClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; +import com.binance.api.client.impl.async.BinanceApiSpotAsyncRestClientImpl; +import com.binance.api.client.impl.sync.BinanceApiSpotRestClientImpl; +import com.binance.api.client.impl.ws.BinanceApiWebSocketClientImpl; import static com.binance.api.client.impl.BinanceApiServiceGenerator.getSharedClient; /** * A factory for creating BinanceApi client objects. */ -public class BinanceSpotApiClientFactory implements BinanceFactory { +public class BinanceSpotApiClientFactory implements BinanceFactory { /** * API Key @@ -52,9 +56,7 @@ public static BinanceSpotApiClientFactory newInstance(String apiKey, String secr * * @return the binance api client factory * @see BinanceAbstractFactory - * @deprecated please use BinanceAbstractFactory.createSpotFactory() */ - @Deprecated public static BinanceSpotApiClientFactory newInstance() { return new BinanceSpotApiClientFactory(null, null, null, null); } @@ -62,29 +64,15 @@ public static BinanceSpotApiClientFactory newInstance() { /** * Creates a new synchronous/blocking REST client. */ - public BinanceApiRestClient newRestClient() { - return new BinanceApiRestClientImpl(apiKey, secret, apiUrl); + public BinanceApiSpotRestClient newRestClient() { + return new BinanceApiSpotRestClientImpl(apiKey, secret, apiUrl); } /** * Creates a new asynchronous/non-blocking REST client. */ - public BinanceApiAsyncRestClient newAsyncRestClient() { - return new BinanceApiAsyncRestClientImpl(apiKey, secret, apiUrl); - } - - /** - * Creates a new asynchronous/non-blocking Margin REST client. - */ - public BinanceApiAsyncMarginRestClient newAsyncMarginRestClient() { - return new BinanceApiAsyncMarginRestClientImpl(apiKey, secret, apiUrl); - } - - /** - * Creates a new synchronous/blocking Margin REST client. - */ - public BinanceApiMarginRestClient newMarginRestClient() { - return new BinanceApiMarginRestClientImpl(apiKey, secret, apiUrl); + public BinanceApiSpotAsyncRestClient newAsyncRestClient() { + return new BinanceApiSpotAsyncRestClientImpl(apiKey, secret, apiUrl); } /** @@ -93,11 +81,4 @@ public BinanceApiMarginRestClient newMarginRestClient() { public BinanceApiWebSocketClient newWebSocketClient() { return new BinanceApiWebSocketClientImpl(getSharedClient(), websocketUrl); } - - /** - * Creates a new synchronous/blocking Swap REST client. - */ - public BinanceApiSwapRestClient newSwapRestClient() { - return new BinanceApiSwapRestClientImpl(apiKey, secret, apiUrl); - } } diff --git a/src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java b/src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java new file mode 100755 index 000000000..68b42f4b9 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java @@ -0,0 +1,70 @@ +package com.binance.api.client.factory; + +import com.binance.api.client.api.sync.BinanceApiSwapRestClient; +import com.binance.api.client.impl.sync.BinanceApiSwapRestClientImpl; + +/** + * A factory for creating BinanceApi client objects. + */ +public class BinanceSwapApiClientFactory implements BinanceFactory { + + /** + * API Key + */ + private final String apiKey; + + /** + * Secret. + */ + private final String secret; + + private final String apiUrl; + + /** + * Instantiates a new binance api client factory. + * + * @param apiKey the API key + * @param secret the Secret + */ + private BinanceSwapApiClientFactory(String apiKey, String secret, String apiUrl) { + this.apiKey = apiKey; + this.secret = secret; + this.apiUrl = apiUrl; + } + + /** + * New instance. + * + * @param apiKey the API key + * @param secret the Secret + * @return the binance api client factory + */ + public static BinanceSwapApiClientFactory newInstance(String apiKey, String secret, String apiUrl) { + return new BinanceSwapApiClientFactory(apiKey, secret, apiUrl); + } + + /** + * New instance without authentication. + * + * @return the binance api client factory + * @see BinanceAbstractFactory + */ + public static BinanceSwapApiClientFactory newInstance() { + return new BinanceSwapApiClientFactory(null, null, null); + } + + /** + * Creates a new synchronous/blocking Swap REST client. + */ + public BinanceApiSwapRestClient newRestClient() { + return new BinanceApiSwapRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new asynchronous/non-blocking REST client. + */ + public T newAsyncRestClient() { + //FIXME: not implemented yet ... + return null; + } +} diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiCallbackAdapter.java b/src/main/java/com/binance/api/client/impl/BinanceApiCallbackAdapter.java index 355fa1348..8cd6859ca 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiCallbackAdapter.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiCallbackAdapter.java @@ -1,7 +1,7 @@ package com.binance.api.client.impl; -import com.binance.api.client.BinanceApiCallback; -import com.binance.api.client.BinanceApiError; +import com.binance.api.client.api.BinanceApiCallback; +import com.binance.api.client.api.BinanceApiError; import com.binance.api.client.exception.BinanceApiException; import retrofit2.Call; import retrofit2.Callback; diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiService.java b/src/main/java/com/binance/api/client/impl/BinanceApiService.java index fd6016c3b..ffad69676 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiService.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiService.java @@ -8,7 +8,6 @@ import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.CancelOrderResponse; import com.binance.api.client.domain.event.ListenKey; -import com.binance.api.client.domain.general.Asset; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.general.ServerTime; import com.binance.api.client.domain.market.*; @@ -33,11 +32,7 @@ public interface BinanceApiService { @GET("/api/v3/exchangeInfo") Call getExchangeInfo(); - @GET - Call> getAllAssets(@Url String url); - // Market data endpoints - @GET("/api/v1/depth") Call getOrderBook(@Query("symbol") String symbol, @Query("limit") Integer limit); diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java b/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java index 9d3e9ac94..58b65e1cb 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java @@ -1,6 +1,6 @@ package com.binance.api.client.impl; -import com.binance.api.client.BinanceApiError; +import com.binance.api.client.api.BinanceApiError; import com.binance.api.client.exception.BinanceApiException; import com.binance.api.client.security.AuthenticationInterceptor; import okhttp3.Dispatcher; diff --git a/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java b/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java index 1867a0f56..a0028e883 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java +++ b/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java @@ -33,9 +33,6 @@ public interface BinanceFuturesApiService { @GET("/fapi/v1/exchangeInfo") Call getExchangeInfo(); - @GET - Call> getAllAssets(@Url String url); - // Market data endpoints @GET("/fapi/v1/depth") diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java similarity index 89% rename from src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java rename to src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java index 321c0167d..44699eaeb 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java @@ -1,7 +1,7 @@ -package com.binance.api.client.impl; +package com.binance.api.client.impl.async; -import com.binance.api.client.BinanceApiAsyncFuturesRestClient; -import com.binance.api.client.BinanceApiCallback; +import com.binance.api.client.api.async.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.api.BinanceApiCallback; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.account.FuturesAccount; import com.binance.api.client.domain.account.FuturesNewOrder; @@ -11,6 +11,9 @@ import com.binance.api.client.domain.account.request.CancelOrderResponse; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; +import com.binance.api.client.impl.BinanceApiCallbackAdapter; +import com.binance.api.client.impl.BinanceApiServiceGenerator; +import com.binance.api.client.impl.BinanceFuturesApiService; import java.util.List; diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncMarginRestClientImpl.java similarity index 90% rename from src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java rename to src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncMarginRestClientImpl.java index 3c2ed5c7f..c7030f872 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncMarginRestClientImpl.java @@ -1,7 +1,7 @@ -package com.binance.api.client.impl; +package com.binance.api.client.impl.async; -import com.binance.api.client.BinanceApiAsyncMarginRestClient; -import com.binance.api.client.BinanceApiCallback; +import com.binance.api.client.api.async.BinanceApiAsyncMarginRestClient; +import com.binance.api.client.api.BinanceApiCallback; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.*; @@ -10,6 +10,9 @@ import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; import com.binance.api.client.domain.event.ListenKey; +import com.binance.api.client.impl.BinanceApiCallbackAdapter; +import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; @@ -65,11 +68,6 @@ public void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCall orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); } - @Override - public void getMyTrades(String symbol, BinanceApiCallback> callback) { - binanceApiService.getMyTrades(symbol, null, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis()).enqueue(new BinanceApiCallbackAdapter<>(callback)); - } - // user stream endpoints @Override diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiSpotAsyncRestClientImpl.java similarity index 95% rename from src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java rename to src/main/java/com/binance/api/client/impl/async/BinanceApiSpotAsyncRestClientImpl.java index 2ae969d8b..886293ab4 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiSpotAsyncRestClientImpl.java @@ -1,7 +1,7 @@ -package com.binance.api.client.impl; +package com.binance.api.client.impl.async; -import com.binance.api.client.BinanceApiAsyncRestClient; -import com.binance.api.client.BinanceApiCallback; +import com.binance.api.client.api.async.BinanceApiSpotAsyncRestClient; +import com.binance.api.client.api.BinanceApiCallback; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.*; @@ -9,6 +9,9 @@ import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.general.ServerTime; import com.binance.api.client.domain.market.*; +import com.binance.api.client.impl.BinanceApiCallbackAdapter; +import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; @@ -16,11 +19,11 @@ /** * Implementation of Binance's REST API using Retrofit with asynchronous/non-blocking method calls. */ -public class BinanceApiAsyncRestClientImpl implements BinanceApiAsyncRestClient { +public class BinanceApiSpotAsyncRestClientImpl implements BinanceApiSpotAsyncRestClient { private final BinanceApiService binanceApiService; - public BinanceApiAsyncRestClientImpl(String apiKey, String secret, String apiUrl) { + public BinanceApiSpotAsyncRestClientImpl(String apiKey, String secret, String apiUrl) { binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); } diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java similarity index 50% rename from src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java rename to src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java index 48e3f6b1e..72e140660 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java @@ -1,15 +1,13 @@ -package com.binance.api.client.impl; +package com.binance.api.client.impl.sync; -import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.constant.BinanceApiConstants; -import com.binance.api.client.domain.account.FuturesAccount; -import com.binance.api.client.domain.account.FuturesNewOrder; -import com.binance.api.client.domain.account.FuturesNewOrderResponse; -import com.binance.api.client.domain.account.Order; -import com.binance.api.client.domain.account.request.CancelOrderRequest; -import com.binance.api.client.domain.account.request.CancelOrderResponse; -import com.binance.api.client.domain.account.request.OrderRequest; -import com.binance.api.client.domain.account.request.OrderStatusRequest; +import com.binance.api.client.domain.account.*; +import com.binance.api.client.domain.account.request.*; +import com.binance.api.client.domain.general.ExchangeInfo; +import com.binance.api.client.domain.market.*; +import com.binance.api.client.impl.BinanceApiServiceGenerator; +import com.binance.api.client.impl.BinanceFuturesApiService; import java.util.List; @@ -26,6 +24,21 @@ public BinanceApiFuturesRestClientImpl(String apiKey, String secret, String apiU binanceApiService = BinanceApiServiceGenerator.createService(BinanceFuturesApiService.class, apiKey, secret, apiUrl); } + @Override + public void ping() { + executeSync(binanceApiService.ping()); + } + + @Override + public Long getServerTime() { + return executeSync(binanceApiService.getServerTime()).getServerTime(); + } + + @Override + public ExchangeInfo getExchangeInfo() { + return executeSync(binanceApiService.getExchangeInfo()); + } + @Override public FuturesAccount getAccount() { long timestamp = System.currentTimeMillis(); @@ -74,4 +87,54 @@ public void keepAliveUserDataStream(String listenKey) { public void closeUserDataStream(String listenKey) { executeSync(binanceApiService.closeAliveUserDataStream(listenKey)); } + + @Override + public OrderBook getOrderBook(String symbol, Integer limit) { + return executeSync(binanceApiService.getOrderBook(symbol, limit)); + } + + @Override + public List getTrades(String symbol, Integer limit) { + return executeSync(binanceApiService.getTrades(symbol, limit)); + } + + @Override + public List getHistoricalTrades(String symbol, Integer limit, Long fromId) { + return executeSync(binanceApiService.getHistoricalTrades(symbol, limit, fromId)); + } + + @Override + public List getAggTrades(String symbol, String fromId, Integer limit, Long startTime, Long endTime) { + return executeSync(binanceApiService.getAggTrades(symbol, fromId, limit, startTime, endTime)); + } + + @Override + public List getAggTrades(String symbol) { + return executeSync(binanceApiService.getAggTrades(symbol, null, null, null, null)); + } + + @Override + public List getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime) { + return executeSync(binanceApiService.getCandlestickBars(symbol, interval.getIntervalId(), limit, startTime, endTime)); + } + + @Override + public List getCandlestickBars(String symbol, CandlestickInterval interval) { + return getCandlestickBars(symbol, interval, null, null, null); + } + + @Override + public TickerStatistics get24HrPriceStatistics(String symbol) { + return executeSync(binanceApiService.get24HrPriceStatistics(symbol)); + } + + @Override + public List getAll24HrPriceStatistics() { + return executeSync(binanceApiService.getAll24HrPriceStatistics()); + } + + @Override + public TickerPrice getPrice(String symbol) { + return executeSync(binanceApiService.getLatestPrice(symbol)); + } } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java similarity index 91% rename from src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java rename to src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java index c00b51043..f2bb10d1f 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java @@ -1,6 +1,6 @@ -package com.binance.api.client.impl; +package com.binance.api.client.impl.sync; -import com.binance.api.client.BinanceApiMarginRestClient; +import com.binance.api.client.api.sync.BinanceApiMarginRestClient; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.*; @@ -8,6 +8,8 @@ import com.binance.api.client.domain.account.request.CancelOrderResponse; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; +import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; @@ -57,11 +59,6 @@ public Order getOrderStatus(OrderStatusRequest orderStatusRequest) { orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp())); } - @Override - public List getMyTrades(String symbol) { - return executeSync(binanceApiService.getMyTrades(symbol, null, null, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, System.currentTimeMillis())); - } - @Override public MarginTransaction transfer(String asset, String amount, TransferType type) { long timestamp = System.currentTimeMillis(); diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java similarity index 95% rename from src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java rename to src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java index d91857286..bdd7fc01c 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java @@ -1,11 +1,13 @@ -package com.binance.api.client.impl; +package com.binance.api.client.impl.sync; -import com.binance.api.client.BinanceApiRestClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.*; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.market.*; +import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.impl.BinanceApiServiceGenerator; import retrofit2.Call; import java.util.List; @@ -16,11 +18,11 @@ * Implementation of Binance's REST API using Retrofit with synchronous/blocking * method calls. */ -public class BinanceApiRestClientImpl implements BinanceApiRestClient { +public class BinanceApiSpotRestClientImpl implements BinanceApiSpotRestClient { private final BinanceApiService binanceApiService; - public BinanceApiRestClientImpl(String apiKey, String secret, String apiUrl) { + public BinanceApiSpotRestClientImpl(String apiKey, String secret, String apiUrl) { binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); } diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSwapRestClientImpl.java similarity index 92% rename from src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java rename to src/main/java/com/binance/api/client/impl/sync/BinanceApiSwapRestClientImpl.java index 71d1e050f..53daaf1dc 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiSwapRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSwapRestClientImpl.java @@ -1,9 +1,11 @@ -package com.binance.api.client.impl; +package com.binance.api.client.impl.sync; -import com.binance.api.client.BinanceApiSwapRestClient; +import com.binance.api.client.api.sync.BinanceApiSwapRestClient; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.SwapRemoveType; import com.binance.api.client.domain.account.*; +import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java b/src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketClientImpl.java similarity index 96% rename from src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java rename to src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketClientImpl.java index 056bd251a..6581e0f32 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketClientImpl.java @@ -1,7 +1,7 @@ -package com.binance.api.client.impl; +package com.binance.api.client.impl.ws; -import com.binance.api.client.BinanceApiCallback; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.BinanceApiCallback; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.*; import com.binance.api.client.domain.market.CandlestickInterval; import com.fasterxml.jackson.core.type.TypeReference; diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketListener.java b/src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketListener.java similarity index 91% rename from src/main/java/com/binance/api/client/impl/BinanceApiWebSocketListener.java rename to src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketListener.java index e2004090e..0278e59b6 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketListener.java +++ b/src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketListener.java @@ -1,6 +1,6 @@ -package com.binance.api.client.impl; +package com.binance.api.client.impl.ws; -import com.binance.api.client.BinanceApiCallback; +import com.binance.api.client.api.BinanceApiCallback; import com.binance.api.client.exception.BinanceApiException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java b/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java index e0d8ede45..3e267cf77 100755 --- a/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java +++ b/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java @@ -1,7 +1,7 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.account.Account; import com.binance.api.client.domain.account.AssetBalance; import com.binance.api.client.factory.BinanceAbstractFactory; @@ -42,7 +42,7 @@ public AccountBalanceCacheExample(String apiKey, String secret) { * @return a listenKey that can be used with the user data streaming API. */ private String initializeAssetBalanceCacheAndStreamSession() { - BinanceApiRestClient client = clientFactory.newRestClient(); + BinanceApiSpotRestClient client = clientFactory.newRestClient(); Account account = client.getAccount(); this.accountBalanceCache = new TreeMap<>(); diff --git a/src/test/java/com/binance/api/examples/AccountEndpointsExample.java b/src/test/java/com/binance/api/examples/AccountEndpointsExample.java index 7e82db9a2..b9f42c9f5 100755 --- a/src/test/java/com/binance/api/examples/AccountEndpointsExample.java +++ b/src/test/java/com/binance/api/examples/AccountEndpointsExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.account.Account; import com.binance.api.client.domain.account.Trade; import com.binance.api.client.factory.BinanceAbstractFactory; @@ -15,7 +15,7 @@ public class AccountEndpointsExample { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiRestClient client = factory.newRestClient(); + BinanceApiSpotRestClient client = factory.newRestClient(); // Get account balances Account account = client.getAccount(60_000L, System.currentTimeMillis()); diff --git a/src/test/java/com/binance/api/examples/AccountEndpointsExampleAsync.java b/src/test/java/com/binance/api/examples/AccountEndpointsExampleAsync.java index 65d6a6ffa..c79fe0de5 100755 --- a/src/test/java/com/binance/api/examples/AccountEndpointsExampleAsync.java +++ b/src/test/java/com/binance/api/examples/AccountEndpointsExampleAsync.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiAsyncRestClient; +import com.binance.api.client.api.async.BinanceApiSpotAsyncRestClient; import com.binance.api.client.domain.account.Account; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceSpotApiClientFactory; @@ -12,7 +12,7 @@ public class AccountEndpointsExampleAsync { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); + BinanceApiSpotAsyncRestClient client = factory.newAsyncRestClient(); // Get account balances (async) client.getAccount((Account response) -> System.out.println(response.getAssetBalance("ETH"))); diff --git a/src/test/java/com/binance/api/examples/AggTradesCacheExample.java b/src/test/java/com/binance/api/examples/AggTradesCacheExample.java index 90fea3bf5..07c27851c 100755 --- a/src/test/java/com/binance/api/examples/AggTradesCacheExample.java +++ b/src/test/java/com/binance/api/examples/AggTradesCacheExample.java @@ -1,7 +1,7 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.market.AggTrade; import com.binance.api.client.factory.BinanceSpotApiClientFactory; @@ -30,7 +30,7 @@ public AggTradesCacheExample(String symbol) { */ private void initializeAggTradesCache(String symbol) { BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); - BinanceApiRestClient client = factory.newRestClient(); + BinanceApiSpotRestClient client = factory.newRestClient(); List aggTrades = client.getAggTrades(symbol.toUpperCase()); this.aggTradesCache = new HashMap<>(); diff --git a/src/test/java/com/binance/api/examples/AllMarketTickersExample.java b/src/test/java/com/binance/api/examples/AllMarketTickersExample.java index 8afc52005..4fa051fc3 100755 --- a/src/test/java/com/binance/api/examples/AllMarketTickersExample.java +++ b/src/test/java/com/binance/api/examples/AllMarketTickersExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** diff --git a/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java b/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java index 0e18faa1c..772b5428b 100755 --- a/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java +++ b/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java @@ -1,7 +1,7 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.market.Candlestick; import com.binance.api.client.domain.market.CandlestickInterval; import com.binance.api.client.factory.BinanceSpotApiClientFactory; @@ -30,7 +30,7 @@ public CandlesticksCacheExample(String symbol, CandlestickInterval interval) { */ private void initializeCandlestickCache(String symbol, CandlestickInterval interval) { BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); - BinanceApiRestClient client = factory.newRestClient(); + BinanceApiSpotRestClient client = factory.newRestClient(); List candlestickBars = client.getCandlestickBars(symbol.toUpperCase(), interval); this.candlesticksCache = new TreeMap<>(); diff --git a/src/test/java/com/binance/api/examples/DepthCacheExample.java b/src/test/java/com/binance/api/examples/DepthCacheExample.java index 2bc4460e4..61d0e0e8f 100755 --- a/src/test/java/com/binance/api/examples/DepthCacheExample.java +++ b/src/test/java/com/binance/api/examples/DepthCacheExample.java @@ -1,8 +1,8 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiCallback; -import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.BinanceApiCallback; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.DepthEvent; import com.binance.api.client.domain.market.OrderBook; import com.binance.api.client.domain.market.OrderBookEntry; @@ -40,7 +40,7 @@ public class DepthCacheExample { private static final String ASKS = "ASKS"; private final String symbol; - private final BinanceApiRestClient restClient; + private final BinanceApiSpotRestClient restClient; private final BinanceApiWebSocketClient wsClient; private final WsCallback wsCallback = new WsCallback(); private final Map> depthCache = new HashMap<>(); diff --git a/src/test/java/com/binance/api/examples/GeneralEndpointsExample.java b/src/test/java/com/binance/api/examples/GeneralEndpointsExample.java index 757c4d283..f696381e8 100755 --- a/src/test/java/com/binance/api/examples/GeneralEndpointsExample.java +++ b/src/test/java/com/binance/api/examples/GeneralEndpointsExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.general.FilterType; import com.binance.api.client.domain.general.SymbolFilter; @@ -14,7 +14,7 @@ public class GeneralEndpointsExample { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); - BinanceApiRestClient client = factory.newRestClient(); + BinanceApiSpotRestClient client = factory.newRestClient(); // Test connectivity client.ping(); diff --git a/src/test/java/com/binance/api/examples/GeneralEndpointsExampleAsync.java b/src/test/java/com/binance/api/examples/GeneralEndpointsExampleAsync.java index 38d86f1e6..6cc60311e 100755 --- a/src/test/java/com/binance/api/examples/GeneralEndpointsExampleAsync.java +++ b/src/test/java/com/binance/api/examples/GeneralEndpointsExampleAsync.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiAsyncRestClient; +import com.binance.api.client.api.async.BinanceApiSpotAsyncRestClient; import com.binance.api.client.domain.general.FilterType; import com.binance.api.client.domain.general.SymbolFilter; import com.binance.api.client.domain.general.SymbolInfo; @@ -13,7 +13,7 @@ public class GeneralEndpointsExampleAsync { public static void main(String[] args) throws InterruptedException { BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); - BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); + BinanceApiSpotAsyncRestClient client = factory.newAsyncRestClient(); // Test connectivity client.ping(response -> System.out.println("Ping succeeded.")); diff --git a/src/test/java/com/binance/api/examples/MarginAccountEndpointsExample.java b/src/test/java/com/binance/api/examples/MarginAccountEndpointsExample.java index b1476b871..e296f726b 100755 --- a/src/test/java/com/binance/api/examples/MarginAccountEndpointsExample.java +++ b/src/test/java/com/binance/api/examples/MarginAccountEndpointsExample.java @@ -1,11 +1,13 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiMarginRestClient; +import com.binance.api.client.api.sync.BinanceApiMarginRestClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.TransferType; import com.binance.api.client.domain.account.MarginAccount; import com.binance.api.client.domain.account.MarginTransaction; import com.binance.api.client.domain.account.Trade; import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceMarginApiClientFactory; import com.binance.api.client.factory.BinanceSpotApiClientFactory; import java.util.List; @@ -16,27 +18,29 @@ public class MarginAccountEndpointsExample { public static void main(String[] args) { - BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiMarginRestClient client = factory.newMarginRestClient(); + BinanceMarginApiClientFactory marginFactory = BinanceAbstractFactory.createMarginFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceSpotApiClientFactory spotFactory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiMarginRestClient marginClient = marginFactory.newRestClient(); + BinanceApiSpotRestClient spotClient = spotFactory.newRestClient(); // Get account balances - MarginAccount marginAccount = client.getAccount(); + MarginAccount marginAccount = marginClient.getAccount(); System.out.println(marginAccount.getUserAssets()); System.out.println(marginAccount.getAssetBalance("ETH")); System.out.println(marginAccount.getMarginLevel()); // Get list of trades - List myTrades = client.getMyTrades("NEOETH"); + List myTrades = spotClient.getMyTrades("NEOETH"); System.out.println(myTrades); // Transfer, borrow, repay - MarginTransaction spotToMargin = client.transfer("USDT", "1", TransferType.SPOT_TO_MARGIN); + MarginTransaction spotToMargin = marginClient.transfer("USDT", "1", TransferType.SPOT_TO_MARGIN); System.out.println(spotToMargin.getTranId()); - MarginTransaction borrowed = client.borrow("USDT", "1"); + MarginTransaction borrowed = marginClient.borrow("USDT", "1"); System.out.println(borrowed.getTranId()); - MarginTransaction repayed = client.repay("USDT", "1"); + MarginTransaction repayed = marginClient.repay("USDT", "1"); System.out.println(repayed.getTranId()); - MarginTransaction marginToSpot = client.transfer("USDT", "1", TransferType.MARGIN_TO_SPOT); + MarginTransaction marginToSpot = marginClient.transfer("USDT", "1", TransferType.MARGIN_TO_SPOT); System.out.println(marginToSpot.getTranId()); } } diff --git a/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java b/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java index 5d342b31b..bbd72e4bc 100755 --- a/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java +++ b/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java @@ -1,8 +1,10 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiAsyncMarginRestClient; +import com.binance.api.client.api.async.BinanceApiAsyncMarginRestClient; +import com.binance.api.client.api.async.BinanceApiSpotAsyncRestClient; import com.binance.api.client.domain.TransferType; import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceMarginApiClientFactory; import com.binance.api.client.factory.BinanceSpotApiClientFactory; /** @@ -11,23 +13,25 @@ public class MarginAccountEndpointsExampleAsync { public static void main(String[] args) { - BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiAsyncMarginRestClient client = factory.newAsyncMarginRestClient(); + BinanceMarginApiClientFactory marginFactory = BinanceAbstractFactory.createMarginFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceSpotApiClientFactory spotFactory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiAsyncMarginRestClient marginClient = marginFactory.newAsyncRestClient(); + BinanceApiSpotAsyncRestClient spotClient = spotFactory.newAsyncRestClient(); // Get account balances - client.getAccount(marginAccount -> { + marginClient.getAccount(marginAccount -> { System.out.println(marginAccount.getUserAssets()); System.out.println(marginAccount.getAssetBalance("ETH")); System.out.println(marginAccount.getMarginLevel()); }); // Get list of trades - client.getMyTrades("NEOETH", System.out::println); + spotClient.getMyTrades("NEOETH", System.out::println); // Transfer, borrow, repay - client.transfer("USDT", "1", TransferType.SPOT_TO_MARGIN, transaction -> System.out.println(transaction.getTranId())); - client.borrow("USDT", "1", transaction -> System.out.println(transaction.getTranId())); - client.repay("USDT", "1", transaction -> System.out.println(transaction.getTranId())); - client.transfer("USDT", "1", TransferType.MARGIN_TO_SPOT, transaction -> System.out.println(transaction.getTranId())); + marginClient.transfer("USDT", "1", TransferType.SPOT_TO_MARGIN, transaction -> System.out.println(transaction.getTranId())); + marginClient.borrow("USDT", "1", transaction -> System.out.println(transaction.getTranId())); + marginClient.repay("USDT", "1", transaction -> System.out.println(transaction.getTranId())); + marginClient.transfer("USDT", "1", TransferType.MARGIN_TO_SPOT, transaction -> System.out.println(transaction.getTranId())); } } diff --git a/src/test/java/com/binance/api/examples/MarginAccountEndpointsLoanQueryExample.java b/src/test/java/com/binance/api/examples/MarginAccountEndpointsLoanQueryExample.java index 967328a79..90d2385b3 100755 --- a/src/test/java/com/binance/api/examples/MarginAccountEndpointsLoanQueryExample.java +++ b/src/test/java/com/binance/api/examples/MarginAccountEndpointsLoanQueryExample.java @@ -1,11 +1,11 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiMarginRestClient; +import com.binance.api.client.api.sync.BinanceApiMarginRestClient; import com.binance.api.client.domain.account.MarginTransaction; import com.binance.api.client.domain.account.MaxBorrowableQueryResult; import com.binance.api.client.domain.account.RepayQueryResult; import com.binance.api.client.factory.BinanceAbstractFactory; -import com.binance.api.client.factory.BinanceSpotApiClientFactory; +import com.binance.api.client.factory.BinanceMarginApiClientFactory; /** * Examples on how to get margin account information. @@ -13,8 +13,8 @@ public class MarginAccountEndpointsLoanQueryExample { public static void main(String[] args) { - BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiMarginRestClient client = factory.newMarginRestClient(); + BinanceMarginApiClientFactory factory = BinanceAbstractFactory.createMarginFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiMarginRestClient client = factory.newRestClient(); MaxBorrowableQueryResult usdt = client.queryMaxBorrowable("USDT"); System.out.println(usdt.getAmount()); MaxBorrowableQueryResult bnb = client.queryMaxBorrowable("BNB"); diff --git a/src/test/java/com/binance/api/examples/MarginOrdersExample.java b/src/test/java/com/binance/api/examples/MarginOrdersExample.java index 59780a64e..f94e523bb 100755 --- a/src/test/java/com/binance/api/examples/MarginOrdersExample.java +++ b/src/test/java/com/binance/api/examples/MarginOrdersExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiMarginRestClient; +import com.binance.api.client.api.sync.BinanceApiMarginRestClient; import com.binance.api.client.domain.TimeInForce; import com.binance.api.client.domain.account.MarginNewOrderResponse; import com.binance.api.client.domain.account.NewOrderResponseType; @@ -11,7 +11,7 @@ import com.binance.api.client.domain.account.request.OrderStatusRequest; import com.binance.api.client.exception.BinanceApiException; import com.binance.api.client.factory.BinanceAbstractFactory; -import com.binance.api.client.factory.BinanceSpotApiClientFactory; +import com.binance.api.client.factory.BinanceMarginApiClientFactory; import java.util.List; @@ -23,8 +23,8 @@ public class MarginOrdersExample { public static void main(String[] args) { - BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiMarginRestClient client = factory.newMarginRestClient(); + BinanceMarginApiClientFactory factory = BinanceAbstractFactory.createMarginFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiMarginRestClient client = factory.newRestClient(); // Getting list of open orders List openOrders = client.getOpenOrders(new OrderRequest("LINKETH")); diff --git a/src/test/java/com/binance/api/examples/MarginOrdersExampleAsync.java b/src/test/java/com/binance/api/examples/MarginOrdersExampleAsync.java index e9a61ab9a..a3ff13666 100755 --- a/src/test/java/com/binance/api/examples/MarginOrdersExampleAsync.java +++ b/src/test/java/com/binance/api/examples/MarginOrdersExampleAsync.java @@ -1,12 +1,12 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiAsyncMarginRestClient; +import com.binance.api.client.api.async.BinanceApiAsyncMarginRestClient; import com.binance.api.client.domain.TimeInForce; import com.binance.api.client.domain.account.request.CancelOrderRequest; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; import com.binance.api.client.factory.BinanceAbstractFactory; -import com.binance.api.client.factory.BinanceSpotApiClientFactory; +import com.binance.api.client.factory.BinanceMarginApiClientFactory; import static com.binance.api.client.domain.account.MarginNewOrder.limitBuy; @@ -16,8 +16,8 @@ public class MarginOrdersExampleAsync { public static void main(String[] args) { - BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiAsyncMarginRestClient client = factory.newAsyncMarginRestClient(); + BinanceMarginApiClientFactory factory = BinanceAbstractFactory.createMarginFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiAsyncMarginRestClient client = factory.newAsyncRestClient(); // Getting list of open orders client.getOpenOrders(new OrderRequest("LINKETH"), System.out::println); diff --git a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java index 120cb0d81..17718af44 100755 --- a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java @@ -1,7 +1,7 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.OrderTradeUpdateEvent; import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; @@ -20,7 +20,7 @@ public class MarginUserDataStreamExample { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory(API_KEY, SECRET_KEY); - BinanceApiRestClient client = factory.newRestClient(); + BinanceApiSpotRestClient client = factory.newRestClient(); // First, we obtain a listenKey which is required to interact with the user data stream String listenKey = client.startUserDataStream(); diff --git a/src/test/java/com/binance/api/examples/MarketDataEndpointsExample.java b/src/test/java/com/binance/api/examples/MarketDataEndpointsExample.java index 8893a42e1..e7456b255 100755 --- a/src/test/java/com/binance/api/examples/MarketDataEndpointsExample.java +++ b/src/test/java/com/binance/api/examples/MarketDataEndpointsExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.market.*; import com.binance.api.client.exception.BinanceApiException; import com.binance.api.client.factory.BinanceSpotApiClientFactory; @@ -14,7 +14,7 @@ public class MarketDataEndpointsExample { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); - BinanceApiRestClient client = factory.newRestClient(); + BinanceApiSpotRestClient client = factory.newRestClient(); // Getting depth of a symbol OrderBook orderBook = client.getOrderBook("NEOETH", 10); diff --git a/src/test/java/com/binance/api/examples/MarketDataEndpointsExampleAsync.java b/src/test/java/com/binance/api/examples/MarketDataEndpointsExampleAsync.java index 2888ac2ae..bd5176bc7 100755 --- a/src/test/java/com/binance/api/examples/MarketDataEndpointsExampleAsync.java +++ b/src/test/java/com/binance/api/examples/MarketDataEndpointsExampleAsync.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiAsyncRestClient; +import com.binance.api.client.api.async.BinanceApiSpotAsyncRestClient; import com.binance.api.client.domain.market.CandlestickInterval; import com.binance.api.client.domain.market.OrderBook; import com.binance.api.client.exception.BinanceApiException; @@ -13,7 +13,7 @@ public class MarketDataEndpointsExampleAsync { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceSpotApiClientFactory.newInstance(); - BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); + BinanceApiSpotAsyncRestClient client = factory.newAsyncRestClient(); // Getting depth of a symbol (async) client.getOrderBook("NEOETH", 10, (OrderBook response) -> { diff --git a/src/test/java/com/binance/api/examples/MarketDataStreamExample.java b/src/test/java/com/binance/api/examples/MarketDataStreamExample.java index fef44d045..441b3c2b5 100755 --- a/src/test/java/com/binance/api/examples/MarketDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/MarketDataStreamExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.market.CandlestickInterval; import com.binance.api.client.factory.BinanceSpotApiClientFactory; diff --git a/src/test/java/com/binance/api/examples/OrdersExample.java b/src/test/java/com/binance/api/examples/OrdersExample.java index 7249cc2af..52bf7e1aa 100755 --- a/src/test/java/com/binance/api/examples/OrdersExample.java +++ b/src/test/java/com/binance/api/examples/OrdersExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.TimeInForce; import com.binance.api.client.domain.account.NewOrderResponse; import com.binance.api.client.domain.account.NewOrderResponseType; @@ -24,7 +24,7 @@ public class OrdersExample { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("MWzDJFwWf4jaCkqEv6NFYZyv2fDhdY3c1FMNN0E639wAlKvvD6oH2QxMlg5Be8jP", "ioIv2eCzPCtKeD6DcN5YYHiOA2X6Wn5Ao5kPbQ184wPZkn9Z7bv2F1apafh2f3Mm"); - BinanceApiRestClient client = factory.newRestClient(); + BinanceApiSpotRestClient client = factory.newRestClient(); // Getting list of open orders List openOrders = client.getOpenOrders(new OrderRequest(SYMBOL)); diff --git a/src/test/java/com/binance/api/examples/OrdersExampleAsync.java b/src/test/java/com/binance/api/examples/OrdersExampleAsync.java index 1b4728b7d..208a613b8 100755 --- a/src/test/java/com/binance/api/examples/OrdersExampleAsync.java +++ b/src/test/java/com/binance/api/examples/OrdersExampleAsync.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiAsyncRestClient; +import com.binance.api.client.api.async.BinanceApiSpotAsyncRestClient; import com.binance.api.client.domain.TimeInForce; import com.binance.api.client.domain.account.request.AllOrdersRequest; import com.binance.api.client.domain.account.request.CancelOrderRequest; @@ -19,7 +19,7 @@ public class OrdersExampleAsync { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiAsyncRestClient client = factory.newAsyncRestClient(); + BinanceApiSpotAsyncRestClient client = factory.newAsyncRestClient(); // Getting list of open orders client.getOpenOrders(new OrderRequest("LINKETH"), System.out::println); diff --git a/src/test/java/com/binance/api/examples/SwapEndpointExample.java b/src/test/java/com/binance/api/examples/SwapEndpointExample.java index b789777fe..eb4bd625d 100755 --- a/src/test/java/com/binance/api/examples/SwapEndpointExample.java +++ b/src/test/java/com/binance/api/examples/SwapEndpointExample.java @@ -1,17 +1,18 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiSwapRestClient; +import com.binance.api.client.api.sync.BinanceApiSwapRestClient; import com.binance.api.client.domain.account.*; import com.binance.api.client.factory.BinanceAbstractFactory; -import com.binance.api.client.factory.BinanceSpotApiClientFactory; +import com.binance.api.client.factory.BinanceSwapApiClientFactory; import java.util.List; public class SwapEndpointExample { public static void main(String[] args) { - BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiSwapRestClient swapClient = factory.newSwapRestClient(); +// BinanceSwapApiClientFactory factory = (BinanceSwapApiClientFactory) BinanceAbstractFactory.createFactory("YOUR_API_KEY", "YOUR_SECRET", BinanceEngineType.SWAP); + BinanceSwapApiClientFactory factory = BinanceAbstractFactory.createSwapFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiSwapRestClient swapClient = factory.newRestClient(); List pools = swapClient.listAllSwapPools(); for (Pool pool : pools) { System.out.println(pool); diff --git a/src/test/java/com/binance/api/examples/TotalAccountBalanceExample.java b/src/test/java/com/binance/api/examples/TotalAccountBalanceExample.java index b82cc7391..5ac55a7dd 100755 --- a/src/test/java/com/binance/api/examples/TotalAccountBalanceExample.java +++ b/src/test/java/com/binance/api/examples/TotalAccountBalanceExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.constant.Util; import com.binance.api.client.domain.account.Account; import com.binance.api.client.domain.account.AssetBalance; @@ -15,7 +15,7 @@ public class TotalAccountBalanceExample { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiRestClient client = factory.newRestClient(); + BinanceApiSpotRestClient client = factory.newRestClient(); // Get account balances Account account = client.getAccount(60_000L, System.currentTimeMillis()); @@ -32,7 +32,7 @@ public static void main(String[] args) { } // Get total account balance in BTC (spot only) - public double getTotalAccountBalance(BinanceApiRestClient client, Account account) { + public double getTotalAccountBalance(BinanceApiSpotRestClient client, Account account) { double totalBalance = 0; for (AssetBalance balance : account.getBalances()) { double free = Double.parseDouble(balance.getFree()); diff --git a/src/test/java/com/binance/api/examples/UserDataStreamExample.java b/src/test/java/com/binance/api/examples/UserDataStreamExample.java index d8dc3c5e0..abbcc4131 100755 --- a/src/test/java/com/binance/api/examples/UserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/UserDataStreamExample.java @@ -1,7 +1,7 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiRestClient; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.OrderTradeUpdateEvent; import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; @@ -18,7 +18,7 @@ public class UserDataStreamExample { public static void main(String[] args) { BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiRestClient client = factory.newRestClient(); + BinanceApiSpotRestClient client = factory.newRestClient(); // First, we obtain a listenKey which is required to interact with the user data stream String listenKey = client.startUserDataStream(); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java b/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java index fc9c514e1..4fc193d71 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples.futures; -import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.domain.account.FuturesAccount; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; @@ -15,7 +15,7 @@ public class FuturesAccountExample { public static void main(String[] args) { BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); - BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); + BinanceApiFuturesRestClient client = factory.newRestClient(); FuturesAccount account = client.getAccount(); System.out.println("Available Balance: " + account.getAvailableBalance()); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java index b48c57bd2..370515eb7 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples.futures; -import com.binance.api.client.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.api.async.BinanceApiAsyncFuturesRestClient; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; diff --git a/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java index 6a9775c2a..584942cee 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java @@ -1,8 +1,7 @@ package com.binance.api.examples.futures; -import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.domain.TimeInForce; -import com.binance.api.client.domain.WorkingType; import com.binance.api.client.domain.account.FuturesNewOrderResponse; import com.binance.api.client.domain.account.request.CancelOrderRequest; import com.binance.api.client.domain.account.request.CancelOrderResponse; @@ -23,9 +22,9 @@ public class FuturesOrdersExample { public static void main(String[] args) { BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); - BinanceApiFuturesRestClient client = futuresApiClientFactory.newFuturesRestClient(); + BinanceApiFuturesRestClient client = futuresApiClientFactory.newRestClient(); - FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, WorkingType.CONTRACT_PRICE, "13", "27", false)); + FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, "13", "27", false)); long orderId = futuresOrderResponse.getOrderId(); System.out.println("OrderID: " + orderId); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java index 37cce47c4..24d292d53 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java @@ -1,7 +1,7 @@ package com.binance.api.examples.futures; -import com.binance.api.client.BinanceApiFuturesRestClient; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.OrderTradeUpdateEvent; import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; @@ -20,7 +20,7 @@ public class FuturesUserDataStreamExample { public static void main(String[] args) { BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); - BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); + BinanceApiFuturesRestClient client = factory.newRestClient(); // First, we obtain a listenKey which is required to interact with the user data stream String listenKey = client.startUserDataStream(); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesWebSocketExample.java b/src/test/java/com/binance/api/examples/futures/FuturesWebSocketExample.java index 6ce47c016..a7a85ed15 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesWebSocketExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesWebSocketExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples.futures; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.market.CandlestickInterval; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java index 6b1cdd9e1..0c1ef8b9d 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetAccountExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples.testnet; -import com.binance.api.client.BinanceApiFuturesRestClient; +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.domain.account.FuturesAccount; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; @@ -14,7 +14,7 @@ public class TestnetAccountExample { public static void main(String[] args) { BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); - BinanceApiFuturesRestClient client = factory.newFuturesRestClient(); + BinanceApiFuturesRestClient client = factory.newRestClient(); FuturesAccount account = client.getAccount(); System.out.println("Available Balance: " + account.getAvailableBalance()); diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetGeneralExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetGeneralExample.java new file mode 100755 index 000000000..125e44902 --- /dev/null +++ b/src/test/java/com/binance/api/examples/testnet/TestnetGeneralExample.java @@ -0,0 +1,47 @@ +package com.binance.api.examples.testnet; + +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; +import com.binance.api.client.domain.market.CandlestickInterval; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +/** + * Examples on how to place orders, cancel them. + * + * @author Mahdi Sheikh Hosseini + */ +public class TestnetGeneralExample { + private static final String SYMBOL = "BTCUSDT"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; + + + public static void main(String[] args) throws InterruptedException { + BinanceFuturesApiClientFactory testnetFactory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); + BinanceApiFuturesRestClient futureClient = testnetFactory.newRestClient(); + + // Get account information + System.out.println(futureClient.getAccount()); + + // Test ping + futureClient.ping(); + + // Get 24h price statistics + System.out.println(futureClient.get24HrPriceStatistics(SYMBOL)); + + // Get Exchange Info + System.out.println(futureClient.getExchangeInfo()); + + // Get symbol aggregate trades + System.out.println("aggTrade size : " + futureClient.getAggTrades(SYMBOL).size()); + + // Get symbol candle bars + System.out.println("Candles bars size : " + futureClient.getCandlestickBars(SYMBOL, CandlestickInterval.ONE_MINUTE).size()); + + // Get listen key + System.out.println(futureClient.startUserDataStream()); + + // Get price + System.out.println("Price " + futureClient.getPrice(SYMBOL)); + } +} diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersAsyncExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersAsyncExample.java index 011236d5f..05fefc350 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersAsyncExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersAsyncExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples.testnet; -import com.binance.api.client.BinanceApiAsyncFuturesRestClient; +import com.binance.api.client.api.async.BinanceApiAsyncFuturesRestClient; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java index 8518aaec0..e44e4d58c 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java @@ -1,7 +1,6 @@ package com.binance.api.examples.testnet; -import com.binance.api.client.BinanceApiFuturesRestClient; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.domain.account.FuturesNewOrder; import com.binance.api.client.domain.account.FuturesNewOrderResponse; import com.binance.api.client.factory.BinanceAbstractFactory; @@ -20,24 +19,41 @@ public class TestnetOrdersExample { public static void main(String[] args) throws InterruptedException { BinanceFuturesApiClientFactory testnetFactory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); - BinanceApiWebSocketClient streamClient = testnetFactory.newWebSocketClient(); - BinanceApiFuturesRestClient restClient = testnetFactory.newFuturesRestClient(); + BinanceApiFuturesRestClient futureClient = testnetFactory.newRestClient(); - String listenKey = restClient.startUserDataStream(); + // Market Long Order +// FuturesNewOrderResponse longResponse = futureClient.newOrder(FuturesNewOrder.MarketLong(SYMBOL, "1", false)); +// System.out.println(longResponse); - streamClient.onUserDataUpdateEvent(listenKey, System.out::println); - System.out.println("Waiting for events..."); + // Market Short Order +// FuturesNewOrderResponse shortResponse = futureClient.newOrder(FuturesNewOrder.MarketShort(SYMBOL, "0.5", false)); +// System.out.println(shortResponse); + // Get open orders +// List openOrders = futureClient.getOpenOrders(new OrderRequest(SYMBOL)); +// if (!openOrders.isEmpty()) { +// openOrders.forEach(System.out::println); +// } else { +// System.out.println("You have not any open order"); +// } - BinanceApiFuturesRestClient futureClient = testnetFactory.newFuturesRestClient(); - FuturesNewOrderResponse response1 = futureClient.newOrder(FuturesNewOrder.MarketLong(SYMBOL, "1", false)); - System.out.println(response1.getStatus()); + // Cancel Order +// CancelOrderResponse cancelOrderResponse = futureClient.cancelOrder(new CancelOrderRequest(SYMBOL, longLimit.getOrderId())); +// System.out.println(cancelOrderResponse); + + // Long Limit Order +// FuturesNewOrderResponse longLimit = futureClient.newOrder(FuturesNewOrder.limitLong(SYMBOL, TimeInForce.GTC, "1", "58000", false)); +// System.out.println(longLimit); + + // Short Limit Order +// FuturesNewOrderResponse shortLimit = futureClient.newOrder(FuturesNewOrder.limitShort(SYMBOL, TimeInForce.GTC, "1.5", "59050", false)); +// System.out.println(shortLimit); + + FuturesNewOrderResponse stopLimitShort = futureClient.newOrder(FuturesNewOrder.stopLimitShort(SYMBOL, "1", "58814", false)); + System.out.println(stopLimitShort); - Thread.sleep(5000); - FuturesNewOrderResponse response2 = futureClient.newOrder(FuturesNewOrder.MarketShort(SYMBOL, "1", false)); - System.out.println(response2); } } diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java index 671832905..2e795cb3e 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java @@ -1,6 +1,6 @@ package com.binance.api.examples.testnet; -import com.binance.api.client.BinanceApiWebSocketClient; +import com.binance.api.client.api.BinanceApiWebSocketClient; import com.binance.api.client.domain.market.CandlestickInterval; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; From 00aa240af873eaaede6b5a1422de63da8c703b16 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Fri, 2 Apr 2021 16:51:23 +0430 Subject: [PATCH 09/18] Implemented BinanceApiSwapAsyncRestClientImpl --- .../async/BinanceApiSwapAsyncRestClient.java | 101 ++++++++++++++++++ .../factory/BinanceSwapApiClientFactory.java | 9 +- .../BinanceApiSwapAsyncRestClientImpl.java | 89 +++++++++++++++ .../api/examples/SwapEndpointExample.java | 1 + 4 files changed, 196 insertions(+), 4 deletions(-) create mode 100755 src/main/java/com/binance/api/client/api/async/BinanceApiSwapAsyncRestClient.java create mode 100755 src/main/java/com/binance/api/client/impl/async/BinanceApiSwapAsyncRestClientImpl.java diff --git a/src/main/java/com/binance/api/client/api/async/BinanceApiSwapAsyncRestClient.java b/src/main/java/com/binance/api/client/api/async/BinanceApiSwapAsyncRestClient.java new file mode 100755 index 000000000..dfa9aef96 --- /dev/null +++ b/src/main/java/com/binance/api/client/api/async/BinanceApiSwapAsyncRestClient.java @@ -0,0 +1,101 @@ +package com.binance.api.client.api.async; + +import com.binance.api.client.api.BinanceApiCallback; +import com.binance.api.client.domain.SwapRemoveType; +import com.binance.api.client.domain.account.*; + +import java.util.List; + +/** + * Binance API facade, supporting asynchronous/non-blocking access Binance's REST API. + */ +public interface BinanceApiSwapAsyncRestClient { + + /** + * Get metadata about all swap pools. + * + * @return + */ + void listAllSwapPools(BinanceApiCallback> callback); + + /** + * Get liquidity information and user share of a pool. + * + * @param poolId + * @return + */ + void getPoolLiquidityInfo(String poolId, BinanceApiCallback callback); + + /** + * Add liquidity to a pool. + * + * @param poolId + * @param asset + * @param quantity + * @return + */ + void addLiquidity(String poolId, + String asset, + String quantity, + BinanceApiCallback callback); + + /** + * Remove liquidity from a pool, type include SINGLE and COMBINATION, asset is mandatory for single asset removal + * + * @param poolId + * @param type + * @param asset + * @param shareAmount + * @return + */ + void removeLiquidity(String poolId, + SwapRemoveType type, + List asset, + String shareAmount, + BinanceApiCallback callback); + + /** + * Get liquidity operation (add/remove) records of a pool + * + * @param poolId + * @param limit + * @return + */ + void getPoolLiquidityOperationRecords(String poolId, + Integer limit, + BinanceApiCallback> callback); + + /** + * Get liquidity operation (add/remove) record. + * + * @param operationId + * @return + */ + void getLiquidityOperationRecord(String operationId, BinanceApiCallback callback); + + /** + * Request a quote for swap quote asset (selling asset) for base asset (buying asset), essentially price/exchange rates. + * + * @param quoteAsset + * @param baseAsset + * @param quoteQty + * @return + */ + void requestQuote(String quoteAsset, + String baseAsset, + String quoteQty, BinanceApiCallback callback); + + /** + * Swap quoteAsset for baseAsset + * + * @param quoteAsset + * @param baseAsset + * @param quoteQty + * @return + */ + void swap(String quoteAsset, + String baseAsset, + String quoteQty, BinanceApiCallback callback); + + void getSwapHistory(String swapId, BinanceApiCallback callback); +} \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java b/src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java index 68b42f4b9..ee6671e57 100755 --- a/src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java +++ b/src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java @@ -1,12 +1,14 @@ package com.binance.api.client.factory; +import com.binance.api.client.api.async.BinanceApiSwapAsyncRestClient; import com.binance.api.client.api.sync.BinanceApiSwapRestClient; +import com.binance.api.client.impl.async.BinanceApiSwapAsyncRestClientImpl; import com.binance.api.client.impl.sync.BinanceApiSwapRestClientImpl; /** * A factory for creating BinanceApi client objects. */ -public class BinanceSwapApiClientFactory implements BinanceFactory { +public class BinanceSwapApiClientFactory implements BinanceFactory { /** * API Key @@ -63,8 +65,7 @@ public BinanceApiSwapRestClient newRestClient() { /** * Creates a new asynchronous/non-blocking REST client. */ - public T newAsyncRestClient() { - //FIXME: not implemented yet ... - return null; + public BinanceApiSwapAsyncRestClient newAsyncRestClient() { + return new BinanceApiSwapAsyncRestClientImpl(apiKey, secret, apiUrl); } } diff --git a/src/main/java/com/binance/api/client/impl/async/BinanceApiSwapAsyncRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiSwapAsyncRestClientImpl.java new file mode 100755 index 000000000..ee1e6d264 --- /dev/null +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiSwapAsyncRestClientImpl.java @@ -0,0 +1,89 @@ +package com.binance.api.client.impl.async; + +import com.binance.api.client.api.BinanceApiCallback; +import com.binance.api.client.api.async.BinanceApiSwapAsyncRestClient; +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.SwapRemoveType; +import com.binance.api.client.domain.account.*; +import com.binance.api.client.impl.BinanceApiCallbackAdapter; +import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.impl.BinanceApiServiceGenerator; + +import java.util.List; + + +/** + * Implementation of Binance's REST API using Retrofit with asynchronous/non-blocking method calls. + */ +public class BinanceApiSwapAsyncRestClientImpl implements BinanceApiSwapAsyncRestClient { + + private final BinanceApiService binanceApiService; + + public BinanceApiSwapAsyncRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); + } + + + @Override + public void listAllSwapPools(BinanceApiCallback> callback) { + binanceApiService.listAllSwapPools().enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getPoolLiquidityInfo(String poolId, BinanceApiCallback callback) { + //TODO: not implemented yet ... + } + + @Override + public void addLiquidity(String poolId, String asset, String quantity, BinanceApiCallback callback) { + long timestamp = System.currentTimeMillis(); + binanceApiService.addLiquidity(poolId, + asset, + quantity, + BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, + timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void removeLiquidity(String poolId, SwapRemoveType type, List assetList, String shareAmount, BinanceApiCallback callback) { + long timestamp = System.currentTimeMillis(); + binanceApiService.removeLiquidity(poolId, + type, + assetList, + shareAmount, + BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, + timestamp).enqueue(new BinanceApiCallbackAdapter<>(callback)); + + } + + @Override + public void getPoolLiquidityOperationRecords(String poolId, Integer limit, BinanceApiCallback> callback) { + long timestamp = System.currentTimeMillis(); + binanceApiService.getPoolLiquidityOperationRecords(poolId, limit, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp) + .enqueue(new BinanceApiCallbackAdapter<>(callback)); + } + + @Override + public void getLiquidityOperationRecord(String operationId, BinanceApiCallback callback) { + long timestamp = System.currentTimeMillis(); + binanceApiService.getLiquidityOperationRecord(operationId, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp); + } + + @Override + public void requestQuote(String quoteAsset, String baseAsset, String quoteQty, BinanceApiCallback callback) { + long timestamp = System.currentTimeMillis(); + binanceApiService.requestQuote(quoteAsset, baseAsset, quoteQty, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp); + } + + @Override + public void swap(String quoteAsset, String baseAsset, String quoteQty, BinanceApiCallback callback) { + long timestamp = System.currentTimeMillis(); + binanceApiService.swap(quoteAsset, baseAsset, quoteQty, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp); + } + + @Override + public void getSwapHistory(String swapId, BinanceApiCallback callback) { + long timestamp = System.currentTimeMillis(); + binanceApiService.getSwapHistory(swapId, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp); + } +} diff --git a/src/test/java/com/binance/api/examples/SwapEndpointExample.java b/src/test/java/com/binance/api/examples/SwapEndpointExample.java index eb4bd625d..378e8877d 100755 --- a/src/test/java/com/binance/api/examples/SwapEndpointExample.java +++ b/src/test/java/com/binance/api/examples/SwapEndpointExample.java @@ -1,5 +1,6 @@ package com.binance.api.examples; +import com.binance.api.client.BinanceEngineType; import com.binance.api.client.api.sync.BinanceApiSwapRestClient; import com.binance.api.client.domain.account.*; import com.binance.api.client.factory.BinanceAbstractFactory; From 751820c77ca3c0a8bbd0385df5fea53689527976 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Fri, 2 Apr 2021 17:37:17 +0430 Subject: [PATCH 10/18] implemented /fapi/v1/leverage and /fapi/v1/marginType --- .../{impl => api}/BinanceApiService.java | 2 +- .../BinanceFuturesApiService.java | 37 ++++++++-- .../api/sync/BinanceApiFuturesRestClient.java | 16 +++- .../binance/api/client/domain/MarginType.java | 13 ++++ .../client/domain/account/FuturesAccount.java | 7 ++ .../domain/account/LeverageRequest.java | 68 +++++++++++++++++ .../domain/account/LeverageResponse.java | 46 ++++++++++++ .../domain/account/MarginTypeRequest.java | 73 +++++++++++++++++++ .../impl/BinanceApiServiceGenerator.java | 1 + .../BinanceApiAsyncFuturesRestClientImpl.java | 2 +- .../BinanceApiAsyncMarginRestClientImpl.java | 2 +- .../BinanceApiSpotAsyncRestClientImpl.java | 2 +- .../BinanceApiSwapAsyncRestClientImpl.java | 2 +- .../sync/BinanceApiFuturesRestClientImpl.java | 23 +++++- .../sync/BinanceApiMarginRestClientImpl.java | 2 +- .../sync/BinanceApiSpotRestClientImpl.java | 2 +- .../sync/BinanceApiSwapRestClientImpl.java | 2 +- .../testnet/TestnetLeverageMarginChange.java | 27 +++++++ 18 files changed, 306 insertions(+), 21 deletions(-) rename src/main/java/com/binance/api/client/{impl => api}/BinanceApiService.java (99%) rename src/main/java/com/binance/api/client/{impl => api}/BinanceFuturesApiService.java (77%) create mode 100644 src/main/java/com/binance/api/client/domain/MarginType.java create mode 100644 src/main/java/com/binance/api/client/domain/account/LeverageRequest.java create mode 100644 src/main/java/com/binance/api/client/domain/account/LeverageResponse.java create mode 100644 src/main/java/com/binance/api/client/domain/account/MarginTypeRequest.java create mode 100755 src/test/java/com/binance/api/examples/testnet/TestnetLeverageMarginChange.java diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiService.java b/src/main/java/com/binance/api/client/api/BinanceApiService.java similarity index 99% rename from src/main/java/com/binance/api/client/impl/BinanceApiService.java rename to src/main/java/com/binance/api/client/api/BinanceApiService.java index ffad69676..805cbd44f 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiService.java +++ b/src/main/java/com/binance/api/client/api/BinanceApiService.java @@ -1,4 +1,4 @@ -package com.binance.api.client.impl; +package com.binance.api.client.api; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.OrderSide; diff --git a/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java b/src/main/java/com/binance/api/client/api/BinanceFuturesApiService.java similarity index 77% rename from src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java rename to src/main/java/com/binance/api/client/api/BinanceFuturesApiService.java index a0028e883..bf5c3b926 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceFuturesApiService.java +++ b/src/main/java/com/binance/api/client/api/BinanceFuturesApiService.java @@ -1,11 +1,10 @@ -package com.binance.api.client.impl; +package com.binance.api.client.api; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.*; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.CancelOrderResponse; import com.binance.api.client.domain.event.ListenKey; -import com.binance.api.client.domain.general.Asset; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.general.ServerTime; import com.binance.api.client.domain.market.*; @@ -81,18 +80,26 @@ Call getOrderStatus(@Query("symbol") String symbol, @Query("orderId") Lon @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) @DELETE("/fapi/v1/order") - Call cancelOrder(@Query("symbol") String symbol, @Query("orderId") Long orderId, - @Query("origClientOrderId") String origClientOrderId, @Query("newClientOrderId") String newClientOrderId, - @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + Call cancelOrder(@Query("symbol") String symbol, + @Query("orderId") Long orderId, + @Query("origClientOrderId") String origClientOrderId, + @Query("newClientOrderId") String newClientOrderId, + @Query("recvWindow") Long recvWindow, + @Query("timestamp") Long timestamp); @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) @GET("/fapi/v1/openOrders") - Call> getOpenOrders(@Query("symbol") String symbol, @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + Call> getOpenOrders(@Query("symbol") String symbol, + @Query("recvWindow") Long recvWindow, + @Query("timestamp") Long timestamp); @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) @GET("/fapi/v1/allOrders") - Call> getAllOrders(@Query("symbol") String symbol, @Query("orderId") Long orderId, - @Query("limit") Integer limit, @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + Call> getAllOrders(@Query("symbol") String symbol, + @Query("orderId") Long orderId, + @Query("limit") Integer limit, + @Query("recvWindow") Long recvWindow, + @Query("timestamp") Long timestamp); @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) @GET("/fapi/v2/account") @@ -111,4 +118,18 @@ Call> getAllOrders(@Query("symbol") String symbol, @Query("orderId") @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) @DELETE("/fapi/v1/listenKey") Call closeAliveUserDataStream(@Query("listenKey") String listenKey); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @POST("/fapi/v1/leverage") + Call changeInitialLeverage(@Query("symbol") String symbol, + @Query("leverage") Integer leverage, + @Query("recvWindow") Long recvWindow, + @Query("timestamp") Long timestamp); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @POST("/fapi/v1/marginType") + Call changeMarginType(@Query("symbol") String symbol, + @Query("marginType") MarginType marginType, + @Query("recvWindow") Long recvWindow, + @Query("timestamp") Long timestamp); } diff --git a/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java index bedc6b758..dfe646581 100755 --- a/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java @@ -1,8 +1,6 @@ package com.binance.api.client.api.sync; -import com.binance.api.client.domain.account.FuturesAccount; -import com.binance.api.client.domain.account.FuturesNewOrder; -import com.binance.api.client.domain.account.FuturesNewOrderResponse; +import com.binance.api.client.domain.account.*; public interface BinanceApiFuturesRestClient extends BinanceApiGeneralRestClient { @@ -18,4 +16,16 @@ public interface BinanceApiFuturesRestClient extends BinanceApiGeneralRestClient * @return a response containing details about the newly placed order. */ FuturesNewOrderResponse newOrder(FuturesNewOrder order); + + + /** + * Change leverage + * + * @param leverageRequest + * @return LeverageResponse + */ + LeverageResponse changeInitialLeverage(LeverageRequest leverageRequest); + + void changeMarginType(MarginTypeRequest marginTypeRequest); + } diff --git a/src/main/java/com/binance/api/client/domain/MarginType.java b/src/main/java/com/binance/api/client/domain/MarginType.java new file mode 100644 index 000000000..c5f6b572c --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/MarginType.java @@ -0,0 +1,13 @@ +package com.binance.api.client.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * Binance futures margin types + * + * @author Mahdi Sheikh Hosseini + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public enum MarginType { + ISOLATED, CROSSED; +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java b/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java index af1b6a474..831424c88 100755 --- a/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java +++ b/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java @@ -182,6 +182,13 @@ public FuturesAssetBalance getAssetBalance(final String symbol) { .orElse(FuturesAssetBalance.of(symbol)); } + public FuturesPosition getPosition(final String symbol) { + return positions.stream() + .filter(e -> e.getSymbol().equals(symbol)) + .findFirst() + .orElse(null); + } + @Override public String toString() { return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) diff --git a/src/main/java/com/binance/api/client/domain/account/LeverageRequest.java b/src/main/java/com/binance/api/client/domain/account/LeverageRequest.java new file mode 100644 index 000000000..1e59e0eba --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/LeverageRequest.java @@ -0,0 +1,68 @@ +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class LeverageRequest { + + private String symbol; + private int leverage; + private long recvWindow; + private long timestamp; + + public LeverageRequest() { + this.timestamp = System.currentTimeMillis(); + this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; + } + + public LeverageRequest(String symbol, int leverage) { + this.symbol = symbol; + this.leverage = leverage; + this.timestamp = System.currentTimeMillis(); + this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public int getLeverage() { + return leverage; + } + + public void setLeverage(int leverage) { + this.leverage = leverage; + } + + public long getRecvWindow() { + return recvWindow; + } + + public void setRecvWindow(long recvWindow) { + this.recvWindow = recvWindow; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("symbol", symbol) + .append("leverage", leverage) + .append("recvWindow", recvWindow) + .append("timestamp", timestamp) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/domain/account/LeverageResponse.java b/src/main/java/com/binance/api/client/domain/account/LeverageResponse.java new file mode 100644 index 000000000..2271aa9ed --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/LeverageResponse.java @@ -0,0 +1,46 @@ +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class LeverageResponse { + + private String symbol; + private int leverage; + private String maxNotionalValue; + + public int getLeverage() { + return leverage; + } + + public void setLeverage(int leverage) { + this.leverage = leverage; + } + + public String getMaxNotionalValue() { + return maxNotionalValue; + } + + public void setMaxNotionalValue(String maxNotionalValue) { + this.maxNotionalValue = maxNotionalValue; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("symbol", symbol) + .append("leverage", leverage) + .append("maxNotionalValue", maxNotionalValue) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/domain/account/MarginTypeRequest.java b/src/main/java/com/binance/api/client/domain/account/MarginTypeRequest.java new file mode 100644 index 000000000..d4615e0b1 --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/MarginTypeRequest.java @@ -0,0 +1,73 @@ +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.MarginType; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * @author Mahdi Sheikh Hosseini + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class MarginTypeRequest { + + private String symbol; + private MarginType marginType; + private long recvWindow; + private long timestamp; + + public MarginTypeRequest() { + this.timestamp = System.currentTimeMillis(); + this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; + } + + public MarginTypeRequest(String symbol, MarginType marginType) { + this.symbol = symbol; + this.marginType = marginType; + this.timestamp = System.currentTimeMillis(); + this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public MarginType getMarginType() { + return marginType; + } + + public void setMarginType(MarginType marginType) { + this.marginType = marginType; + } + + public long getRecvWindow() { + return recvWindow; + } + + public void setRecvWindow(long recvWindow) { + this.recvWindow = recvWindow; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("symbol", symbol) + .append("marginType", marginType) + .append("recvWindow", recvWindow) + .append("timestamp", timestamp) + .toString(); + } + +} diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java b/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java index 58b65e1cb..8c1785f22 100755 --- a/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java +++ b/src/main/java/com/binance/api/client/impl/BinanceApiServiceGenerator.java @@ -1,6 +1,7 @@ package com.binance.api.client.impl; import com.binance.api.client.api.BinanceApiError; +import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.exception.BinanceApiException; import com.binance.api.client.security.AuthenticationInterceptor; import okhttp3.Dispatcher; diff --git a/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java index 44699eaeb..b13ac6709 100755 --- a/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java @@ -13,7 +13,7 @@ import com.binance.api.client.domain.account.request.OrderStatusRequest; import com.binance.api.client.impl.BinanceApiCallbackAdapter; import com.binance.api.client.impl.BinanceApiServiceGenerator; -import com.binance.api.client.impl.BinanceFuturesApiService; +import com.binance.api.client.api.BinanceFuturesApiService; import java.util.List; diff --git a/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncMarginRestClientImpl.java index c7030f872..2207966bc 100755 --- a/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncMarginRestClientImpl.java @@ -11,7 +11,7 @@ import com.binance.api.client.domain.account.request.OrderStatusRequest; import com.binance.api.client.domain.event.ListenKey; import com.binance.api.client.impl.BinanceApiCallbackAdapter; -import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; diff --git a/src/main/java/com/binance/api/client/impl/async/BinanceApiSpotAsyncRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiSpotAsyncRestClientImpl.java index 886293ab4..d13d02a00 100755 --- a/src/main/java/com/binance/api/client/impl/async/BinanceApiSpotAsyncRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiSpotAsyncRestClientImpl.java @@ -10,7 +10,7 @@ import com.binance.api.client.domain.general.ServerTime; import com.binance.api.client.domain.market.*; import com.binance.api.client.impl.BinanceApiCallbackAdapter; -import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; diff --git a/src/main/java/com/binance/api/client/impl/async/BinanceApiSwapAsyncRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiSwapAsyncRestClientImpl.java index ee1e6d264..c7743f805 100755 --- a/src/main/java/com/binance/api/client/impl/async/BinanceApiSwapAsyncRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiSwapAsyncRestClientImpl.java @@ -6,7 +6,7 @@ import com.binance.api.client.domain.SwapRemoveType; import com.binance.api.client.domain.account.*; import com.binance.api.client.impl.BinanceApiCallbackAdapter; -import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; diff --git a/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java index 72e140660..eeda622fe 100755 --- a/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java @@ -1,13 +1,16 @@ package com.binance.api.client.impl.sync; +import com.binance.api.client.api.BinanceFuturesApiService; import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.account.*; -import com.binance.api.client.domain.account.request.*; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.market.*; import com.binance.api.client.impl.BinanceApiServiceGenerator; -import com.binance.api.client.impl.BinanceFuturesApiService; import java.util.List; @@ -59,6 +62,22 @@ public FuturesNewOrderResponse newOrder(FuturesNewOrder order) { order.getNewOrderRespType(), order.getRecvWindow(), order.getTimestamp())); } + @Override + public LeverageResponse changeInitialLeverage(LeverageRequest leverageRequest) { + return executeSync(binanceApiService.changeInitialLeverage(leverageRequest.getSymbol(), + leverageRequest.getLeverage(), + leverageRequest.getRecvWindow(), + leverageRequest.getTimestamp())); + } + + @Override + public void changeMarginType(MarginTypeRequest marginTypeRequest) { + executeSync(binanceApiService.changeMarginType(marginTypeRequest.getSymbol(), + marginTypeRequest.getMarginType(), + marginTypeRequest.getRecvWindow(), + marginTypeRequest.getTimestamp())); + } + @Override public CancelOrderResponse cancelOrder(CancelOrderRequest cancelOrderRequest) { return executeSync(binanceApiService.cancelOrder(cancelOrderRequest.getSymbol(), diff --git a/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java index f2bb10d1f..3a156280a 100755 --- a/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java @@ -8,7 +8,7 @@ import com.binance.api.client.domain.account.request.CancelOrderResponse; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; -import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; diff --git a/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java index bdd7fc01c..68b0606f4 100755 --- a/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java @@ -6,7 +6,7 @@ import com.binance.api.client.domain.account.request.*; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.market.*; -import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.impl.BinanceApiServiceGenerator; import retrofit2.Call; diff --git a/src/main/java/com/binance/api/client/impl/sync/BinanceApiSwapRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSwapRestClientImpl.java index 53daaf1dc..42501c1cc 100755 --- a/src/main/java/com/binance/api/client/impl/sync/BinanceApiSwapRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSwapRestClientImpl.java @@ -4,7 +4,7 @@ import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.SwapRemoveType; import com.binance.api.client.domain.account.*; -import com.binance.api.client.impl.BinanceApiService; +import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetLeverageMarginChange.java b/src/test/java/com/binance/api/examples/testnet/TestnetLeverageMarginChange.java new file mode 100755 index 000000000..0f1dfc4a9 --- /dev/null +++ b/src/test/java/com/binance/api/examples/testnet/TestnetLeverageMarginChange.java @@ -0,0 +1,27 @@ +package com.binance.api.examples.testnet; + +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; +import com.binance.api.client.domain.account.LeverageRequest; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +/** + * Examples binance futures account information + */ +public class TestnetLeverageMarginChange { + private static final String SYMBOL = "BTCUSDT"; + private static final String API_KEY = "c8be940e7d3ebbfe79842236d6110b88e8350059ca48593a4809bc02794b837b"; + private static final String SECRET_KEY = "44090bdaf2e1b4d9f46bb772bc630ace9c3a00c3294ab61315f1c0e817ba29d6"; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); + BinanceApiFuturesRestClient client = factory.newRestClient(); + + System.out.println("Current leverage : " + client.getAccount().getPosition(SYMBOL).getLeverage()); + + client.changeInitialLeverage(new LeverageRequest(SYMBOL, 25)); + + System.out.println("New leverage : " + client.getAccount().getPosition(SYMBOL).getLeverage()); + } + +} From cb01952eec92eab0754e81288998bee3866a3448 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Sat, 3 Apr 2021 19:43:20 +0430 Subject: [PATCH 11/18] Fix UserDataStream --- README.md | 8 +- .../api/client/api/BinanceApiService.java | 3 + .../api/sync/BinanceApiFuturesRestClient.java | 28 ++ .../api/sync/BinanceApiGeneralRestClient.java | 22 - .../api/sync/BinanceApiMarginRestClient.java | 22 + .../api/sync/BinanceApiSpotRestClient.java | 22 + .../api/client/config/SpotApiConfig.java | 2 +- .../binance/api/client/domain/OrderType.java | 2 +- ...eUpdateEvent.java => ExecutionReport.java} | 2 +- .../client/domain/event/OrderTradeUpdate.java | 437 ++++++++++++++++++ .../domain/event/UserDataUpdateEvent.java | 175 ++++--- .../UserDataUpdateEventDeserializer.java | 91 ++-- .../sync/BinanceApiMarginRestClientImpl.java | 18 +- .../sync/BinanceApiSpotRestClientImpl.java | 4 +- .../impl/ws/BinanceApiWebSocketListener.java | 2 +- .../UserDataUpdateEventDeserializerTest.java | 127 ++--- .../examples/MarginUserDataStreamExample.java | 12 +- .../api/examples/UserDataStreamExample.java | 12 +- .../futures/FuturesUserDataStreamExample.java | 12 +- .../testnet/TestnetLeverageMarginChange.java | 4 +- .../testnet/TestnetWebSocketExample.java | 15 +- 21 files changed, 796 insertions(+), 224 deletions(-) rename src/main/java/com/binance/api/client/domain/event/{OrderTradeUpdateEvent.java => ExecutionReport.java} (99%) create mode 100755 src/main/java/com/binance/api/client/domain/event/OrderTradeUpdate.java diff --git a/README.md b/README.md index bf74d5d02..4cb3add6a 100755 --- a/README.md +++ b/README.md @@ -420,16 +420,16 @@ client.onUserDataUpdateEvent(listenKey, response -> { // Print new balances of every available asset System.out.println(accountUpdateEvent.getBalances()); } else { - OrderTradeUpdateEvent orderTradeUpdateEvent = response.getOrderTradeUpdateEvent(); + OrderTradeUpdateEvent executionReport = response.getOrderTradeUpdateEvent(); // Print details about an order/trade - System.out.println(orderTradeUpdateEvent); + System.out.println(executionReport); // Print original quantity - System.out.println(orderTradeUpdateEvent.getOriginalQuantity()); + System.out.println(executionReport.getOriginalQuantity()); // Or price - System.out.println(orderTradeUpdateEvent.getPrice()); + System.out.println(executionReport.getPrice()); } }); ``` diff --git a/src/main/java/com/binance/api/client/api/BinanceApiService.java b/src/main/java/com/binance/api/client/api/BinanceApiService.java index 805cbd44f..d247ff7ad 100755 --- a/src/main/java/com/binance/api/client/api/BinanceApiService.java +++ b/src/main/java/com/binance/api/client/api/BinanceApiService.java @@ -228,6 +228,9 @@ Call> getMyMarginTrades(@Query("symbol") String symbol, @Query("limi @PUT("/sapi/v1/userDataStream") Call keepAliveMarginUserDataStream(@Query("listenKey") String listenKey); + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) + @DELETE("/sapi/v1/userDataStream") + Call closeAliveMarginUserDataStream(@Query("listenKey") String listenKey); // Binance Liquidity Swap Pool endpoints @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_APIKEY_HEADER) diff --git a/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java index dfe646581..161fb421d 100755 --- a/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java @@ -26,6 +26,34 @@ public interface BinanceApiFuturesRestClient extends BinanceApiGeneralRestClient */ LeverageResponse changeInitialLeverage(LeverageRequest leverageRequest); + /** + * Change type of margin CROSSED/ISOLATED + * + * @param marginTypeRequest + */ void changeMarginType(MarginTypeRequest marginTypeRequest); + // User stream endpoints + + /** + * Start a new user data stream. + * + * @return a listen key that can be used with data streams + */ + String startUserDataStream(); + + /** + * PING a user data stream to prevent a time out. + * + * @param listenKey listen key that identifies a data stream + */ + void keepAliveUserDataStream(String listenKey); + + /** + * Close out a new user data stream. + * + * @param listenKey listen key that identifies a data stream + */ + void closeUserDataStream(String listenKey); + } diff --git a/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java index 594666dbe..292a5b339 100755 --- a/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java @@ -142,26 +142,4 @@ public interface BinanceApiGeneralRestClient { * @return a list of all account open orders on a symbol. */ List getOpenOrders(OrderRequest orderRequest); - - // User stream endpoints - /** - * Start a new user data stream. - * - * @return a listen key that can be used with data streams - */ - String startUserDataStream(); - - /** - * PING a user data stream to prevent a time out. - * - * @param listenKey listen key that identifies a data stream - */ - void keepAliveUserDataStream(String listenKey); - - /** - * Close out a new user data stream. - * - * @param listenKey listen key that identifies a data stream - */ - void closeUserDataStream(String listenKey); } diff --git a/src/main/java/com/binance/api/client/api/sync/BinanceApiMarginRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiMarginRestClient.java index bc5ff7c3e..650aaa447 100755 --- a/src/main/java/com/binance/api/client/api/sync/BinanceApiMarginRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiMarginRestClient.java @@ -105,4 +105,26 @@ public interface BinanceApiMarginRestClient { * @return loan records */ LoanQueryResult queryLoan(String asset, String txId); + + // User stream endpoints + /** + * Start a new user data stream. + * + * @return a listen key that can be used with data streams + */ + String startUserDataStream(); + + /** + * PING a user data stream to prevent a time out. + * + * @param listenKey listen key that identifies a data stream + */ + void keepAliveUserDataStream(String listenKey); + + /** + * Close out a new user data stream. + * + * @param listenKey listen key that identifies a data stream + */ + void closeUserDataStream(String listenKey); } diff --git a/src/main/java/com/binance/api/client/api/sync/BinanceApiSpotRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiSpotRestClient.java index 58e7b1213..69f66aaa9 100755 --- a/src/main/java/com/binance/api/client/api/sync/BinanceApiSpotRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiSpotRestClient.java @@ -127,4 +127,26 @@ public interface BinanceApiSpotRestClient extends BinanceApiGeneralRestClient { * @return deposit address for a given asset. */ DepositAddress getDepositAddress(String asset); + + // User stream endpoints + /** + * Start a new user data stream. + * + * @return a listen key that can be used with data streams + */ + String startUserDataStream(); + + /** + * PING a user data stream to prevent a time out. + * + * @param listenKey listen key that identifies a data stream + */ + void keepAliveUserDataStream(String listenKey); + + /** + * Close out a new user data stream. + * + * @param listenKey listen key that identifies a data stream + */ + void closeUserDataStream(String listenKey); } diff --git a/src/main/java/com/binance/api/client/config/SpotApiConfig.java b/src/main/java/com/binance/api/client/config/SpotApiConfig.java index 439caa5fd..2fd4c94cd 100755 --- a/src/main/java/com/binance/api/client/config/SpotApiConfig.java +++ b/src/main/java/com/binance/api/client/config/SpotApiConfig.java @@ -4,7 +4,7 @@ * Configuration used for Binance operations. */ -@ApiConfig(apiUrl = "https://api.binance.com", webSocketUrl = "wss://stream.binance.com:9443/ws") +@ApiConfig(apiUrl = "https://api.binance.com", webSocketUrl = "wss://stream.binance.com/ws") public class SpotApiConfig implements BinanceApiConfig { } diff --git a/src/main/java/com/binance/api/client/domain/OrderType.java b/src/main/java/com/binance/api/client/domain/OrderType.java index 7cde1db0b..558610e44 100755 --- a/src/main/java/com/binance/api/client/domain/OrderType.java +++ b/src/main/java/com/binance/api/client/domain/OrderType.java @@ -17,5 +17,5 @@ public enum OrderType { LIMIT_MAKER, STOP_MARKET, TRAILING_STOP_MARKET, - TAKE_PROFIT_MARKET, + TAKE_PROFIT_MARKET; } diff --git a/src/main/java/com/binance/api/client/domain/event/OrderTradeUpdateEvent.java b/src/main/java/com/binance/api/client/domain/event/ExecutionReport.java similarity index 99% rename from src/main/java/com/binance/api/client/domain/event/OrderTradeUpdateEvent.java rename to src/main/java/com/binance/api/client/domain/event/ExecutionReport.java index d2bf6fc84..d74676c09 100755 --- a/src/main/java/com/binance/api/client/domain/event/OrderTradeUpdateEvent.java +++ b/src/main/java/com/binance/api/client/domain/event/ExecutionReport.java @@ -14,7 +14,7 @@ * @see UserDataUpdateEvent */ @JsonIgnoreProperties(ignoreUnknown = true) -public class OrderTradeUpdateEvent { +public class ExecutionReport { @JsonProperty("e") private String eventType; diff --git a/src/main/java/com/binance/api/client/domain/event/OrderTradeUpdate.java b/src/main/java/com/binance/api/client/domain/event/OrderTradeUpdate.java new file mode 100755 index 000000000..26f927abc --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/event/OrderTradeUpdate.java @@ -0,0 +1,437 @@ +package com.binance.api.client.domain.event; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.*; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * Order or trade report update event. + *

+ * This event is embedded as part of a user data update event. + * + * @see UserDataUpdateEvent + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class OrderTradeUpdate { + + @JsonProperty("e") + private String eventType; + + /** + * Order/trade time. + */ + @JsonProperty("T") + private Long orderTradeTime; + + @JsonProperty("E") + private Long eventTime; + + @JsonProperty("s") + private String symbol; + + @JsonProperty("c") + private String newClientOrderId; + + /** + * Buy/Sell order side. + */ + @JsonProperty("S") + private OrderSide side; + + /** + * Type of order. + */ + @JsonProperty("o") + private OrderType type; + + /** + * Time in force to indicate how long will the order remain active. + */ + @JsonProperty("f") + private TimeInForce timeInForce; + + /** + * Original quantity in the order. + */ + @JsonProperty("q") + private String originalQuantity; + + /** + * Price. + */ + @JsonProperty("p") + private String price; + + @JsonProperty("ap") + private String averagePrice; + + @JsonProperty("sp") + private String stopPrice; + + /** + * Type of execution. + */ + @JsonProperty("x") + private ExecutionType executionType; + + /** + * Status of the order. + */ + @JsonProperty("X") + private OrderStatus orderStatus; + + /** + * Order id. + */ + @JsonProperty("i") + private Long orderId; + + /** + * Quantity of the last filled trade. + */ + @JsonProperty("l") + private String quantityLastFilledTrade; + + /** + * Accumulated quantity of filled trades on this order. + */ + @JsonProperty("z") + private String accumulatedQuantity; + + /** + * Price of last filled trade. + */ + @JsonProperty("L") + private String priceOfLastFilledTrade; + + /** + * Trade id. + */ + @JsonProperty("t") + private Long tradeId; + + @JsonProperty("b") + private Long bidsNational; + + @JsonProperty("a") + private Long askNational; + + @JsonProperty("m") + private Boolean tradeMaker; + + @JsonProperty("R") + private Boolean reduceOnly; + + @JsonProperty("wt") + private WorkingType workingType; + + @JsonProperty("ot") + private OrderType orderType; + + @JsonProperty("ps") + private PositionSide positionSide; + + @JsonProperty("cp") + private Boolean closedAllPositions; + + @JsonProperty("rp") + private String realizedProfit; + + @JsonProperty("pP") + private Boolean protectedOrder; + + //fixme: Unknown field name + @JsonProperty("si") + private Long si; + + //fixme: Unknown field name + @JsonProperty("ss") + private Long ss; + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public Long getOrderTradeTime() { + return orderTradeTime; + } + + public void setOrderTradeTime(Long orderTradeTime) { + this.orderTradeTime = orderTradeTime; + } + + public Long getEventTime() { + return eventTime; + } + + public void setEventTime(Long eventTime) { + this.eventTime = eventTime; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getNewClientOrderId() { + return newClientOrderId; + } + + public void setNewClientOrderId(String newClientOrderId) { + this.newClientOrderId = newClientOrderId; + } + + public OrderSide getSide() { + return side; + } + + public void setSide(OrderSide side) { + this.side = side; + } + + public OrderType getType() { + return type; + } + + public void setType(OrderType type) { + this.type = type; + } + + public TimeInForce getTimeInForce() { + return timeInForce; + } + + public void setTimeInForce(TimeInForce timeInForce) { + this.timeInForce = timeInForce; + } + + public String getOriginalQuantity() { + return originalQuantity; + } + + public void setOriginalQuantity(String originalQuantity) { + this.originalQuantity = originalQuantity; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getAveragePrice() { + return averagePrice; + } + + public void setAveragePrice(String averagePrice) { + this.averagePrice = averagePrice; + } + + public String getStopPrice() { + return stopPrice; + } + + public void setStopPrice(String stopPrice) { + this.stopPrice = stopPrice; + } + + public ExecutionType getExecutionType() { + return executionType; + } + + public void setExecutionType(ExecutionType executionType) { + this.executionType = executionType; + } + + public OrderStatus getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(OrderStatus orderStatus) { + this.orderStatus = orderStatus; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public String getQuantityLastFilledTrade() { + return quantityLastFilledTrade; + } + + public void setQuantityLastFilledTrade(String quantityLastFilledTrade) { + this.quantityLastFilledTrade = quantityLastFilledTrade; + } + + public String getAccumulatedQuantity() { + return accumulatedQuantity; + } + + public void setAccumulatedQuantity(String accumulatedQuantity) { + this.accumulatedQuantity = accumulatedQuantity; + } + + public String getPriceOfLastFilledTrade() { + return priceOfLastFilledTrade; + } + + public void setPriceOfLastFilledTrade(String priceOfLastFilledTrade) { + this.priceOfLastFilledTrade = priceOfLastFilledTrade; + } + + public Long getTradeId() { + return tradeId; + } + + public void setTradeId(Long tradeId) { + this.tradeId = tradeId; + } + + public Long getBidsNational() { + return bidsNational; + } + + public void setBidsNational(Long bidsNational) { + this.bidsNational = bidsNational; + } + + public Long getAskNational() { + return askNational; + } + + public void setAskNational(Long askNational) { + this.askNational = askNational; + } + + public Boolean getTradeMaker() { + return tradeMaker; + } + + public void setTradeMaker(Boolean tradeMaker) { + this.tradeMaker = tradeMaker; + } + + public Boolean getReduceOnly() { + return reduceOnly; + } + + public void setReduceOnly(Boolean reduceOnly) { + this.reduceOnly = reduceOnly; + } + + public WorkingType getWorkingType() { + return workingType; + } + + public void setWorkingType(WorkingType workingType) { + this.workingType = workingType; + } + + public OrderType getOrderType() { + return orderType; + } + + public void setOrderType(OrderType orderType) { + this.orderType = orderType; + } + + public PositionSide getPositionSide() { + return positionSide; + } + + public void setPositionSide(PositionSide positionSide) { + this.positionSide = positionSide; + } + + public Boolean getClosedAllPositions() { + return closedAllPositions; + } + + public void setClosedAllPositions(Boolean closedAllPositions) { + this.closedAllPositions = closedAllPositions; + } + + public String getRealizedProfit() { + return realizedProfit; + } + + public void setRealizedProfit(String realizedProfit) { + this.realizedProfit = realizedProfit; + } + + public Boolean getProtectedOrder() { + return protectedOrder; + } + + public void setProtectedOrder(Boolean protectedOrder) { + this.protectedOrder = protectedOrder; + } + + public Long getSi() { + return si; + } + + public void setSi(Long si) { + this.si = si; + } + + public Long getSs() { + return ss; + } + + public void setSs(Long ss) { + this.ss = ss; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("eventType", eventType) + .append("orderTradeTime", orderTradeTime) + .append("eventTime", eventTime) + .append("symbol", symbol) + .append("newClientOrderId", newClientOrderId) + .append("side", side) + .append("type", type) + .append("timeInForce", timeInForce) + .append("originalQuantity", originalQuantity) + .append("price", price) + .append("averagePrice", averagePrice) + .append("stopPrice", stopPrice) + .append("executionType", executionType) + .append("orderStatus", orderStatus) + .append("orderId", orderId) + .append("quantityLastFilledTrade", quantityLastFilledTrade) + .append("accumulatedQuantity", accumulatedQuantity) + .append("priceOfLastFilledTrade", priceOfLastFilledTrade) + .append("tradeId", tradeId) + .append("bidsNational", bidsNational) + .append("askNational", askNational) + .append("tradeMaker", tradeMaker) + .append("reduceOnly", reduceOnly) + .append("workingType", workingType) + .append("orderType", orderType) + .append("positionSide", positionSide) + .append("closedAllPositions", closedAllPositions) + .append("realizedProfit", realizedProfit) + .append("protectedOrder", protectedOrder) + .append("si", si) + .append("ss", ss) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEvent.java b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEvent.java index d95662df1..a64037e98 100755 --- a/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEvent.java +++ b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEvent.java @@ -1,7 +1,6 @@ package com.binance.api.client.domain.event; import com.binance.api.client.constant.BinanceApiConstants; -import com.binance.api.client.exception.UnsupportedEventException; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -20,101 +19,125 @@ @JsonDeserialize(using = UserDataUpdateEventDeserializer.class) public class UserDataUpdateEvent { - private UserDataUpdateEventType eventType; + private UserDataUpdateEventType eventType; - private long eventTime; + private long eventTime; - private AccountUpdateEvent accountUpdateEvent; + private AccountUpdateEvent accountUpdateEvent; - private BalanceUpdateEvent balanceUpdateEvent; + private BalanceUpdateEvent balanceUpdateEvent; - private OrderTradeUpdateEvent orderTradeUpdateEvent; + private ExecutionReport executionReport; + private OrderTradeUpdate orderTradeUpdate; - public UserDataUpdateEventType getEventType() { - return eventType; - } - - public void setEventType(UserDataUpdateEventType eventType) { - this.eventType = eventType; - } - - public long getEventTime() { - return eventTime; - } + public UserDataUpdateEventType getEventType() { + return eventType; + } - public void setEventTime(long eventTime) { - this.eventTime = eventTime; - } + public void setEventType(UserDataUpdateEventType eventType) { + this.eventType = eventType; + } - public AccountUpdateEvent getAccountUpdateEvent() { - return accountUpdateEvent; - } + public long getEventTime() { + return eventTime; + } - public void setAccountUpdateEvent(AccountUpdateEvent accountUpdateEvent) { - this.accountUpdateEvent = accountUpdateEvent; - } + public void setEventTime(long eventTime) { + this.eventTime = eventTime; + } - public BalanceUpdateEvent getBalanceUpdateEvent() { - return balanceUpdateEvent; - } + public AccountUpdateEvent getAccountUpdateEvent() { + return accountUpdateEvent; + } - public void setBalanceUpdateEvent(BalanceUpdateEvent balanceUpdateEvent) { - this.balanceUpdateEvent = balanceUpdateEvent; - } + public void setAccountUpdateEvent(AccountUpdateEvent accountUpdateEvent) { + this.accountUpdateEvent = accountUpdateEvent; + } - public OrderTradeUpdateEvent getOrderTradeUpdateEvent() { - return orderTradeUpdateEvent; - } + public BalanceUpdateEvent getBalanceUpdateEvent() { + return balanceUpdateEvent; + } - public void setOrderTradeUpdateEvent(OrderTradeUpdateEvent orderTradeUpdateEvent) { - this.orderTradeUpdateEvent = orderTradeUpdateEvent; - } + public void setBalanceUpdateEvent(BalanceUpdateEvent balanceUpdateEvent) { + this.balanceUpdateEvent = balanceUpdateEvent; + } - @Override - public String toString() { - ToStringBuilder sb = new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) - .append("eventType", eventType) - .append("eventTime", eventTime); - if (eventType == UserDataUpdateEventType.ACCOUNT_UPDATE) { - sb.append("accountUpdateEvent", accountUpdateEvent); - } else if (eventType == UserDataUpdateEventType.ACCOUNT_POSITION_UPDATE) { - sb.append("accountPositionUpdateEvent", accountUpdateEvent); - } else if (eventType == UserDataUpdateEventType.BALANCE_UPDATE) { - sb.append("balanceUpdateEvent", balanceUpdateEvent); - } else { - sb.append("orderTradeUpdateEvent", orderTradeUpdateEvent); + public ExecutionReport getExecutionReport() { + return executionReport; } - return sb.toString(); - } - public enum UserDataUpdateEventType { - ACCOUNT_UPDATE("outboundAccountInfo"), - ACCOUNT_POSITION_UPDATE("outboundAccountPosition"), - BALANCE_UPDATE("balanceUpdate"), - ORDER_TRADE_UPDATE("executionReport"), - ; + public void setExecutionReport(ExecutionReport executionReport) { + this.executionReport = executionReport; + } - private final String eventTypeId; + public OrderTradeUpdate getOrderTradeUpdate() { + return orderTradeUpdate; + } - UserDataUpdateEventType(String eventTypeId) { - this.eventTypeId = eventTypeId; + public void setOrderTradeUpdate(OrderTradeUpdate orderTradeUpdate) { + this.orderTradeUpdate = orderTradeUpdate; } - public String getEventTypeId() { - return eventTypeId; + @Override + public String toString() { + ToStringBuilder sb = new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("eventType", eventType) + .append("eventTime", eventTime); + if (eventType == UserDataUpdateEventType.ACCOUNT_UPDATE) { + sb.append("accountUpdateEvent", accountUpdateEvent); + } else if (eventType == UserDataUpdateEventType.ACCOUNT_POSITION_UPDATE) { + sb.append("accountPositionUpdateEvent", accountUpdateEvent); + } else if (eventType == UserDataUpdateEventType.BALANCE_UPDATE) { + sb.append("balanceUpdateEvent", balanceUpdateEvent); + } else if (eventType == UserDataUpdateEventType.ORDER_TRADE_UPDATE) { + sb.append("orderTradeUpdate", orderTradeUpdate); + } else { + sb.append("executionReport", executionReport); + } + return sb.toString(); } - public static UserDataUpdateEventType fromEventTypeId(String eventTypeId) { - if (ACCOUNT_UPDATE.eventTypeId.equals(eventTypeId)) { - return ACCOUNT_UPDATE; - } else if (ORDER_TRADE_UPDATE.eventTypeId.equals(eventTypeId)) { - return ORDER_TRADE_UPDATE; - } else if (ACCOUNT_POSITION_UPDATE.eventTypeId.equals(eventTypeId)) { - return ACCOUNT_POSITION_UPDATE; - } else if (BALANCE_UPDATE.eventTypeId.equals(eventTypeId)) { - return BALANCE_UPDATE; - } - throw new UnsupportedEventException("Unrecognized user data update event type id: " + eventTypeId); + public enum UserDataUpdateEventType { + ACCOUNT_POSITION_UPDATE("outboundAccountPosition"), + BALANCE_UPDATE("balanceUpdate"), + EXECUTION_REPORT("executionReport"), + ACCOUNT_UPDATE("ACCOUNT_UPDATE"), //Binance futures & testnet + ACCOUNT_CONFIG_UPDATE("ACCOUNT_CONFIG_UPDATE"), //Binance futures & testnet //TODO: Implement this type. + ORDER_TRADE_UPDATE("ORDER_TRADE_UPDATE"); //Binance futures & testnet + + private final String eventTypeId; + + UserDataUpdateEventType(String eventTypeId) { + this.eventTypeId = eventTypeId; + } + + public String getEventTypeId() { + return eventTypeId; + } + + public static UserDataUpdateEventType fromEventTypeId(String eventTypeId) { + UserDataUpdateEventType et = null; + switch (eventTypeId) { + case "outboundAccountPosition": + et = UserDataUpdateEventType.ACCOUNT_POSITION_UPDATE; + break; + case "balanceUpdate": + et = UserDataUpdateEventType.BALANCE_UPDATE; + break; + case "executionReport": + et = UserDataUpdateEventType.EXECUTION_REPORT; + break; + case "ACCOUNT_UPDATE": + et = UserDataUpdateEventType.ACCOUNT_UPDATE; + break; + case "ACCOUNT_CONFIG_UPDATE": + et = UserDataUpdateEventType.ACCOUNT_CONFIG_UPDATE; + break; + case "ORDER_TRADE_UPDATE": + et = UserDataUpdateEventType.ORDER_TRADE_UPDATE; + break; + } + return et; + } } - } } diff --git a/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventDeserializer.java b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventDeserializer.java index 8888bb624..e9c5e7ce5 100755 --- a/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventDeserializer.java +++ b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventDeserializer.java @@ -18,47 +18,70 @@ */ public class UserDataUpdateEventDeserializer extends JsonDeserializer { - private ObjectMapper mapper; + private ObjectMapper mapper; - @Override - public UserDataUpdateEvent deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + @Override + public UserDataUpdateEvent deserialize(JsonParser jp, DeserializationContext ctx) { + UserDataUpdateEvent userDataUpdateEvent = new UserDataUpdateEvent(); + try { + if (mapper == null) { + mapper = new ObjectMapper(); + } - if (mapper == null) { - mapper = new ObjectMapper(); - } + ObjectCodec oc = jp.getCodec(); + JsonNode node = oc.readTree(jp); + String json = node.toString(); - ObjectCodec oc = jp.getCodec(); - JsonNode node = oc.readTree(jp); - String json = node.toString(); + final String eventTypeId = node.get("e").asText(); + final long eventTime = node.get("E").asLong(); + UserDataUpdateEventType type = UserDataUpdateEventType.fromEventTypeId(eventTypeId); + if (type == null) { + throw new BinanceApiException("Unknown user data event type [" + eventTypeId + "]"); + /* + * TODO: need to throws exception on unknown types . + * or ... !? + * */ + } else { + userDataUpdateEvent.setEventType(type); + userDataUpdateEvent.setEventTime(eventTime); - final String eventTypeId = node.get("e").asText(); - final Long eventTime = node.get("E").asLong(); - UserDataUpdateEventType userDataUpdateEventType = UserDataUpdateEventType.fromEventTypeId(eventTypeId); + switch (type) { + case ACCOUNT_UPDATE: + case ACCOUNT_POSITION_UPDATE: + AccountUpdateEvent accountUpdateEvent = getUserDataUpdateEventDetail(json, AccountUpdateEvent.class, mapper); + userDataUpdateEvent.setAccountUpdateEvent(accountUpdateEvent); + break; + case BALANCE_UPDATE: + BalanceUpdateEvent balanceUpdateEvent = getUserDataUpdateEventDetail(json, BalanceUpdateEvent.class, mapper); + userDataUpdateEvent.setBalanceUpdateEvent(balanceUpdateEvent); + break; + case EXECUTION_REPORT: + ExecutionReport executionReport = getUserDataUpdateEventDetail(json, ExecutionReport.class, mapper); + userDataUpdateEvent.setExecutionReport(executionReport); + break; + case ORDER_TRADE_UPDATE: + JsonNode o = node.get("o"); + OrderTradeUpdate orderTradeUpdate = getUserDataUpdateEventDetail(o.toString(), OrderTradeUpdate.class, mapper); + userDataUpdateEvent.setOrderTradeUpdate(orderTradeUpdate); + break; + } - UserDataUpdateEvent userDataUpdateEvent = new UserDataUpdateEvent(); - userDataUpdateEvent.setEventType(userDataUpdateEventType); - userDataUpdateEvent.setEventTime(eventTime); + } - if (userDataUpdateEventType == UserDataUpdateEventType.ACCOUNT_UPDATE || - userDataUpdateEventType == UserDataUpdateEventType.ACCOUNT_POSITION_UPDATE) { - AccountUpdateEvent accountUpdateEvent = getUserDataUpdateEventDetail(json, AccountUpdateEvent.class, mapper); - userDataUpdateEvent.setAccountUpdateEvent(accountUpdateEvent); - } else if (userDataUpdateEventType == UserDataUpdateEventType.BALANCE_UPDATE) { - BalanceUpdateEvent balanceUpdateEvent = getUserDataUpdateEventDetail(json, BalanceUpdateEvent.class, mapper); - userDataUpdateEvent.setBalanceUpdateEvent(balanceUpdateEvent); - } else { // userDataUpdateEventType == UserDataUpdateEventType.ORDER_TRADE_UPDATE - OrderTradeUpdateEvent orderTradeUpdateEvent = getUserDataUpdateEventDetail(json, OrderTradeUpdateEvent.class, mapper); - userDataUpdateEvent.setOrderTradeUpdateEvent(orderTradeUpdateEvent); - } + } catch (Exception ignore) { + /* + * NOTE : Do not throws method signature exception . + * */ + } - return userDataUpdateEvent; - } + return userDataUpdateEvent; + } - public T getUserDataUpdateEventDetail(String json, Class clazz, ObjectMapper mapper) { - try { - return mapper.readValue(json, clazz); - } catch (IOException e) { - throw new BinanceApiException(e); + public T getUserDataUpdateEventDetail(String json, Class clazz, ObjectMapper mapper) { + try { + return mapper.readValue(json, clazz); + } catch (IOException e) { + throw new BinanceApiException(e); + } } - } } diff --git a/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java index 3a156280a..ccca65fcd 100755 --- a/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiMarginRestClientImpl.java @@ -1,5 +1,6 @@ package com.binance.api.client.impl.sync; +import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.api.sync.BinanceApiMarginRestClient; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.TransferType; @@ -8,7 +9,6 @@ import com.binance.api.client.domain.account.request.CancelOrderResponse; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; -import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; @@ -101,4 +101,20 @@ public MarginTransaction repay(String asset, String amount) { return executeSync(binanceApiService.repay(asset, amount, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp)); } + // user stream endpoints + @Override + public String startUserDataStream() { + return executeSync(binanceApiService.startMarginUserDataStream()).toString(); + } + + @Override + public void keepAliveUserDataStream(String listenKey) { + executeSync(binanceApiService.keepAliveMarginUserDataStream(listenKey)); + } + + @Override + public void closeUserDataStream(String listenKey) { + executeSync(binanceApiService.closeAliveMarginUserDataStream(listenKey)); + } + } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java index 68b0606f4..f282b8d6a 100755 --- a/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java @@ -226,12 +226,12 @@ public DepositAddress getDepositAddress(String asset) { // user stream endpoints @Override public String startUserDataStream() { - return executeSync(binanceApiService.startMarginUserDataStream()).toString(); + return executeSync(binanceApiService.startUserDataStream()).toString(); } @Override public void keepAliveUserDataStream(String listenKey) { - executeSync(binanceApiService.keepAliveMarginUserDataStream(listenKey)); + executeSync(binanceApiService.keepAliveUserDataStream(listenKey)); } @Override diff --git a/src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketListener.java b/src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketListener.java index 0278e59b6..b52dd55e8 100755 --- a/src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketListener.java +++ b/src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketListener.java @@ -39,7 +39,7 @@ public void onMessage(WebSocket webSocket, String text) { try { T event = objectReader.readValue(text); callback.onResponse(event); - } catch (IOException e) { + } catch (Exception e) { throw new BinanceApiException(e); } } diff --git a/src/test/java/com/binance/api/domain/event/UserDataUpdateEventDeserializerTest.java b/src/test/java/com/binance/api/domain/event/UserDataUpdateEventDeserializerTest.java index a50d31221..5bbdfdad4 100755 --- a/src/test/java/com/binance/api/domain/event/UserDataUpdateEventDeserializerTest.java +++ b/src/test/java/com/binance/api/domain/event/UserDataUpdateEventDeserializerTest.java @@ -1,15 +1,11 @@ package com.binance.api.domain.event; +import com.binance.api.client.domain.*; import com.binance.api.client.domain.account.AssetBalance; -import com.binance.api.client.domain.ExecutionType; -import com.binance.api.client.domain.OrderRejectReason; -import com.binance.api.client.domain.OrderSide; -import com.binance.api.client.domain.OrderStatus; -import com.binance.api.client.domain.OrderType; -import com.binance.api.client.domain.TimeInForce; import com.binance.api.client.domain.event.AccountUpdateEvent; -import com.binance.api.client.domain.event.OrderTradeUpdateEvent; +import com.binance.api.client.domain.event.ExecutionReport; +import com.binance.api.client.domain.event.OrderTradeUpdate; import com.binance.api.client.domain.event.UserDataUpdateEvent; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; @@ -24,58 +20,77 @@ */ public class UserDataUpdateEventDeserializerTest { - @Test - public void testAccountUpdateEventDeserializer() { - final String accountUpdateJson = "{\"e\":\"outboundAccountInfo\",\"E\":1,\"m\":10,\"t\":10,\"b\":0,\"s\":0,\"T\":true,\"W\":true,\"D\":true,\"B\":[{\"a\":\"BTC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LTC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ETH\",\"f\":\"0.10000000\",\"l\":\"0.00000000\"},{\"a\":\"BNC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ICO\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"NEO\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BNB\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"123\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"456\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"QTUM\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"EOS\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SNT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BNT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"GAS\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BCC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BTM\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"USDT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"HCC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"HSR\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"OAX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"DNT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"MCO\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ICN\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ELC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"PAY\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ZRX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"OMG\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"WTC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LRX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"YOYO\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LRC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LLT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"TRX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"FID\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SNGLS\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"STRAT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BQX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"FUN\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"KNC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"CDT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"XVG\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"IOTA\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SNM\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LINK\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"CVC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"TNT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"REP\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"CTR\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"MDA\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"MTL\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SALT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"NULS\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SUB\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"STX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"MTH\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"CAT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ADX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"PIX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ETC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ENG\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ZEC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"}]}"; - ObjectMapper mapper = new ObjectMapper(); - try { - UserDataUpdateEvent userDataUpdateEvent = mapper.readValue(accountUpdateJson, UserDataUpdateEvent.class); - assertEquals(userDataUpdateEvent.getEventType().getEventTypeId(), "outboundAccountInfo"); - assertEquals(userDataUpdateEvent.getEventTime(), 1L); - AccountUpdateEvent accountUpdateEvent = userDataUpdateEvent.getAccountUpdateEvent(); - for (AssetBalance assetBalance : accountUpdateEvent.getBalances()) { - if ("ETH".equals(assetBalance.getAsset())) { - assertEquals(assetBalance.getFree(), "0.10000000"); - } else { - assertEquals(assetBalance.getFree(), "0.00000000"); + /*@Test + public void testAccountUpdateEventDeserializer() { + final String accountUpdateJson = "{\"e\":\"outboundAccountInfo\",\"E\":1,\"m\":10,\"t\":10,\"b\":0,\"s\":0,\"T\":true,\"W\":true,\"D\":true,\"B\":[{\"a\":\"BTC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LTC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ETH\",\"f\":\"0.10000000\",\"l\":\"0.00000000\"},{\"a\":\"BNC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ICO\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"NEO\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BNB\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"123\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"456\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"QTUM\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"EOS\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SNT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BNT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"GAS\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BCC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BTM\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"USDT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"HCC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"HSR\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"OAX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"DNT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"MCO\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ICN\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ELC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"PAY\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ZRX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"OMG\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"WTC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LRX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"YOYO\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LRC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LLT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"TRX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"FID\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SNGLS\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"STRAT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"BQX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"FUN\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"KNC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"CDT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"XVG\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"IOTA\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SNM\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"LINK\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"CVC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"TNT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"REP\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"CTR\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"MDA\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"MTL\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SALT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"NULS\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"SUB\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"STX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"MTH\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"CAT\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ADX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"PIX\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ETC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ENG\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"},{\"a\":\"ZEC\",\"f\":\"0.00000000\",\"l\":\"0.00000000\"}]}"; + ObjectMapper mapper = new ObjectMapper(); + try { + UserDataUpdateEvent executionReport = mapper.readValue(accountUpdateJson, UserDataUpdateEvent.class); + assertEquals(executionReport.getEventType().getEventTypeId(), "outboundAccountInfo"); + assertEquals(executionReport.getEventTime(), 1L); + AccountUpdateEvent accountUpdateEvent = executionReport.getAccountUpdateEvent(); + for (AssetBalance assetBalance : accountUpdateEvent.getBalances()) { + if ("ETH".equals(assetBalance.getAsset())) { + assertEquals(assetBalance.getFree(), "0.10000000"); + } else { + assertEquals(assetBalance.getFree(), "0.00000000"); + } + assertEquals(assetBalance.getLocked(), "0.00000000"); + } + } catch (IOException e) { + fail(); + } + }*/ + + @Test + public void testExecutionReportEventDeserializer() { + final String executionReportEventJson = "{\"e\":\"executionReport\",\"E\":1,\"s\":\"NEOETH\",\"c\":\"XXX\",\"S\":\"BUY\",\"o\":\"LIMIT\",\"f\":\"GTC\",\"q\":\"1000.00000000\",\"p\":\"0.00010000\",\"P\":\"0.00000000\",\"F\":\"0.00000000\",\"g\":-1,\"C\":\"5yairWLqfzbusOUdPyG712\",\"x\":\"CANCELED\",\"X\":\"CANCELED\",\"r\":\"NONE\",\"i\":123456,\"l\":\"0.00000000\",\"z\":\"0.00000000\",\"L\":\"0.00000000\",\"n\":\"0\",\"N\":null,\"T\":1,\"t\":-1,\"I\":1,\"w\":false,\"m\":false,\"M\":false}"; + ObjectMapper mapper = new ObjectMapper(); + try { + UserDataUpdateEvent userDataUpdateEvent = mapper.readValue(executionReportEventJson, UserDataUpdateEvent.class); + assertEquals(userDataUpdateEvent.getEventType().getEventTypeId(), "executionReport"); + assertEquals(userDataUpdateEvent.getEventTime(), 1L); + + ExecutionReport report = userDataUpdateEvent.getExecutionReport(); + assertEquals(report.getSymbol(), "NEOETH"); + assertEquals(report.getNewClientOrderId(), "XXX"); + + assertEquals(report.getSide(), OrderSide.BUY); + assertEquals(report.getType(), OrderType.LIMIT); + assertEquals(report.getTimeInForce(), TimeInForce.GTC); + + assertEquals(report.getOriginalQuantity(), "1000.00000000"); + assertEquals(report.getPrice(), "0.00010000"); + + assertEquals(report.getExecutionType(), ExecutionType.CANCELED); + assertEquals(report.getOrderStatus(), OrderStatus.CANCELED); + assertEquals(report.getOrderRejectReason(), OrderRejectReason.NONE); + + assertEquals(report.getOrderId(), new Long(123456)); + assertEquals(report.getOrderTradeTime(), new Long(1)); + } catch (IOException e) { + fail(); } - assertEquals(assetBalance.getLocked(), "0.00000000"); - } - } catch (IOException e) { - fail(); } - } - - @Test - public void testOrderUpdateEventDeserializer() { - final String orderUpdateEventJson = "{\"e\":\"executionReport\",\"E\":1,\"s\":\"NEOETH\",\"c\":\"XXX\",\"S\":\"BUY\",\"o\":\"LIMIT\",\"f\":\"GTC\",\"q\":\"1000.00000000\",\"p\":\"0.00010000\",\"P\":\"0.00000000\",\"F\":\"0.00000000\",\"g\":-1,\"C\":\"5yairWLqfzbusOUdPyG712\",\"x\":\"CANCELED\",\"X\":\"CANCELED\",\"r\":\"NONE\",\"i\":123456,\"l\":\"0.00000000\",\"z\":\"0.00000000\",\"L\":\"0.00000000\",\"n\":\"0\",\"N\":null,\"T\":1,\"t\":-1,\"I\":1,\"w\":false,\"m\":false,\"M\":false}"; - ObjectMapper mapper = new ObjectMapper(); - try { - UserDataUpdateEvent userDataUpdateEvent = mapper.readValue(orderUpdateEventJson, UserDataUpdateEvent.class); - assertEquals(userDataUpdateEvent.getEventType().getEventTypeId(), "executionReport"); - assertEquals(userDataUpdateEvent.getEventTime(), 1L); - - OrderTradeUpdateEvent orderTradeUpdateEvent = userDataUpdateEvent.getOrderTradeUpdateEvent(); - assertEquals(orderTradeUpdateEvent.getSymbol(), "NEOETH"); - assertEquals(orderTradeUpdateEvent.getNewClientOrderId(), "XXX"); - - assertEquals(orderTradeUpdateEvent.getSide(), OrderSide.BUY); - assertEquals(orderTradeUpdateEvent.getType(), OrderType.LIMIT); - assertEquals(orderTradeUpdateEvent.getTimeInForce(), TimeInForce.GTC); - - assertEquals(orderTradeUpdateEvent.getOriginalQuantity(), "1000.00000000"); - assertEquals(orderTradeUpdateEvent.getPrice(), "0.00010000"); - - assertEquals(orderTradeUpdateEvent.getExecutionType(), ExecutionType.CANCELED); - assertEquals(orderTradeUpdateEvent.getOrderStatus(), OrderStatus.CANCELED); - assertEquals(orderTradeUpdateEvent.getOrderRejectReason(), OrderRejectReason.NONE); - - assertEquals(orderTradeUpdateEvent.getOrderId(), new Long(123456)); - assertEquals(orderTradeUpdateEvent.getOrderTradeTime(), new Long(1)); - } catch (IOException e) { - fail(); + + @Test + public void testOrderUpdateEventDeserializer() { + final String orderUpdateEventJson = "{\"e\":\"ORDER_TRADE_UPDATE\",\"T\":1617397293374,\"E\":1617397293376,\"o\":{\"s\":\"BTCUSDT\",\"c\":\"web_0x77fLbc9gfvwAGjHlGw\",\"S\":\"BUY\",\"o\":\"STOP\",\"f\":\"GTC\",\"q\":\"2.263\",\"p\":\"59220\",\"ap\":\"0\",\"sp\":\"59200\",\"x\":\"CANCELED\",\"X\":\"CANCELED\",\"i\":2675448941,\"l\":\"0\",\"z\":\"0\",\"L\":\"0\",\"T\":1617397293374,\"t\":0,\"b\":\"0\",\"a\":\"0\",\"m\":false,\"R\":false,\"wt\":\"MARK_PRICE\",\"ot\":\"STOP\",\"ps\":\"BOTH\",\"cp\":false,\"rp\":\"0\",\"pP\":true,\"si\":0,\"ss\":0}}"; + ObjectMapper mapper = new ObjectMapper(); + try { + UserDataUpdateEvent event = mapper.readValue(orderUpdateEventJson, UserDataUpdateEvent.class); + assertEquals(event.getEventType().getEventTypeId(), "ORDER_TRADE_UPDATE"); + assertEquals(event.getEventTime(), 1617397293376L); + + OrderTradeUpdate orderTradeUpdate = event.getOrderTradeUpdate(); + assertEquals(orderTradeUpdate.getTimeInForce().toString(), "GTC"); + assertEquals(orderTradeUpdate.getOrderStatus().toString(), "CANCELED"); + + } catch (IOException e) { + fail(); + } } - } + } diff --git a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java index 17718af44..b134db0e6 100755 --- a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java @@ -1,9 +1,9 @@ package com.binance.api.examples; -import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.api.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.event.AccountUpdateEvent; -import com.binance.api.client.domain.event.OrderTradeUpdateEvent; +import com.binance.api.client.domain.event.ExecutionReport; import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceSpotApiClientFactory; @@ -35,15 +35,15 @@ public static void main(String[] args) { // Print new balances of every available asset System.out.println(accountUpdateEvent.getBalances()); } else { - OrderTradeUpdateEvent orderTradeUpdateEvent = response.getOrderTradeUpdateEvent(); + ExecutionReport executionReport = response.getExecutionReport(); // Print details about an order/trade - System.out.println(orderTradeUpdateEvent); + System.out.println(executionReport); // Print original quantity - System.out.println(orderTradeUpdateEvent.getOriginalQuantity()); + System.out.println(executionReport.getOriginalQuantity()); // Or price - System.out.println(orderTradeUpdateEvent.getPrice()); + System.out.println(executionReport.getPrice()); } }); System.out.println("Waiting for events..."); diff --git a/src/test/java/com/binance/api/examples/UserDataStreamExample.java b/src/test/java/com/binance/api/examples/UserDataStreamExample.java index abbcc4131..e9d265172 100755 --- a/src/test/java/com/binance/api/examples/UserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/UserDataStreamExample.java @@ -1,9 +1,9 @@ package com.binance.api.examples; -import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.api.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.event.AccountUpdateEvent; -import com.binance.api.client.domain.event.OrderTradeUpdateEvent; +import com.binance.api.client.domain.event.ExecutionReport; import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceSpotApiClientFactory; @@ -33,15 +33,15 @@ public static void main(String[] args) { // Print new balances of every available asset System.out.println(accountUpdateEvent.getBalances()); } else { - OrderTradeUpdateEvent orderTradeUpdateEvent = response.getOrderTradeUpdateEvent(); + ExecutionReport executionReport = response.getExecutionReport(); // Print details about an order/trade - System.out.println(orderTradeUpdateEvent); + System.out.println(executionReport); // Print original quantity - System.out.println(orderTradeUpdateEvent.getOriginalQuantity()); + System.out.println(executionReport.getOriginalQuantity()); // Or price - System.out.println(orderTradeUpdateEvent.getPrice()); + System.out.println(executionReport.getPrice()); } }); System.out.println("Waiting for events..."); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java index 24d292d53..67106c2e1 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java @@ -1,9 +1,9 @@ package com.binance.api.examples.futures; -import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.api.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.domain.event.AccountUpdateEvent; -import com.binance.api.client.domain.event.OrderTradeUpdateEvent; +import com.binance.api.client.domain.event.ExecutionReport; import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; @@ -35,15 +35,15 @@ public static void main(String[] args) { // Print new balances of every available asset System.out.println(accountUpdateEvent.getBalances()); } else { - OrderTradeUpdateEvent orderTradeUpdateEvent = response.getOrderTradeUpdateEvent(); + ExecutionReport executionReport = response.getExecutionReport(); // Print details about an order/trade - System.out.println(orderTradeUpdateEvent); + System.out.println(executionReport); // Print original quantity - System.out.println(orderTradeUpdateEvent.getOriginalQuantity()); + System.out.println(executionReport.getOriginalQuantity()); // Or price - System.out.println(orderTradeUpdateEvent.getPrice()); + System.out.println(executionReport.getPrice()); } }); System.out.println("Waiting for events..."); diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetLeverageMarginChange.java b/src/test/java/com/binance/api/examples/testnet/TestnetLeverageMarginChange.java index 0f1dfc4a9..b27069077 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetLeverageMarginChange.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetLeverageMarginChange.java @@ -10,8 +10,8 @@ */ public class TestnetLeverageMarginChange { private static final String SYMBOL = "BTCUSDT"; - private static final String API_KEY = "c8be940e7d3ebbfe79842236d6110b88e8350059ca48593a4809bc02794b837b"; - private static final String SECRET_KEY = "44090bdaf2e1b4d9f46bb772bc630ace9c3a00c3294ab61315f1c0e817ba29d6"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; public static void main(String[] args) { BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java index 2e795cb3e..c79f61309 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java @@ -1,6 +1,7 @@ package com.binance.api.examples.testnet; import com.binance.api.client.api.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.domain.market.CandlestickInterval; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; @@ -11,14 +12,18 @@ * @author Mahdi Sheikh Hosseini */ public class TestnetWebSocketExample { - private static final String SYMBOL = "LTCUSDT"; + private static final String SYMBOL = "BTCUSDT"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; public static void main(String[] args) { - BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createTestnetFactory(); - BinanceApiWebSocketClient webSocketClient = factory.newWebSocketClient(); + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createTestnetFactory(API_KEY, SECRET_KEY); + BinanceApiFuturesRestClient client = factory.newRestClient(); + BinanceApiWebSocketClient streamClient = factory.newWebSocketClient(); -// webSocketClient.onTickerEvent(SYMBOL, System.out::println); - webSocketClient.onCandlestickEvent(SYMBOL, CandlestickInterval.ONE_MINUTE, System.out::println); + + String listenKey = client.startUserDataStream(); + streamClient.onUserDataUpdateEvent(listenKey, System.out::println); } } From 0ab25cfea598f9fb47f81c78b45ae4a8b01a8deb Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Sat, 3 Apr 2021 21:59:59 +0430 Subject: [PATCH 12/18] Move UserDataUpdateEventType to separate file --- .../domain/event/UserDataUpdateEvent.java | 44 ------------------ .../UserDataUpdateEventDeserializer.java | 1 - .../domain/event/UserDataUpdateEventType.java | 45 +++++++++++++++++++ .../examples/AccountBalanceCacheExample.java | 4 +- .../examples/MarginUserDataStreamExample.java | 5 ++- .../api/examples/UserDataStreamExample.java | 5 ++- .../futures/FuturesUserDataStreamExample.java | 5 ++- 7 files changed, 56 insertions(+), 53 deletions(-) create mode 100644 src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventType.java diff --git a/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEvent.java b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEvent.java index a64037e98..071b0fe17 100755 --- a/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEvent.java +++ b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEvent.java @@ -96,48 +96,4 @@ public String toString() { } return sb.toString(); } - - public enum UserDataUpdateEventType { - ACCOUNT_POSITION_UPDATE("outboundAccountPosition"), - BALANCE_UPDATE("balanceUpdate"), - EXECUTION_REPORT("executionReport"), - ACCOUNT_UPDATE("ACCOUNT_UPDATE"), //Binance futures & testnet - ACCOUNT_CONFIG_UPDATE("ACCOUNT_CONFIG_UPDATE"), //Binance futures & testnet //TODO: Implement this type. - ORDER_TRADE_UPDATE("ORDER_TRADE_UPDATE"); //Binance futures & testnet - - private final String eventTypeId; - - UserDataUpdateEventType(String eventTypeId) { - this.eventTypeId = eventTypeId; - } - - public String getEventTypeId() { - return eventTypeId; - } - - public static UserDataUpdateEventType fromEventTypeId(String eventTypeId) { - UserDataUpdateEventType et = null; - switch (eventTypeId) { - case "outboundAccountPosition": - et = UserDataUpdateEventType.ACCOUNT_POSITION_UPDATE; - break; - case "balanceUpdate": - et = UserDataUpdateEventType.BALANCE_UPDATE; - break; - case "executionReport": - et = UserDataUpdateEventType.EXECUTION_REPORT; - break; - case "ACCOUNT_UPDATE": - et = UserDataUpdateEventType.ACCOUNT_UPDATE; - break; - case "ACCOUNT_CONFIG_UPDATE": - et = UserDataUpdateEventType.ACCOUNT_CONFIG_UPDATE; - break; - case "ORDER_TRADE_UPDATE": - et = UserDataUpdateEventType.ORDER_TRADE_UPDATE; - break; - } - return et; - } - } } diff --git a/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventDeserializer.java b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventDeserializer.java index e9c5e7ce5..6c311d7c9 100755 --- a/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventDeserializer.java +++ b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventDeserializer.java @@ -1,6 +1,5 @@ package com.binance.api.client.domain.event; -import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; import com.binance.api.client.exception.BinanceApiException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.ObjectCodec; diff --git a/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventType.java b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventType.java new file mode 100644 index 000000000..c8e805789 --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/event/UserDataUpdateEventType.java @@ -0,0 +1,45 @@ +package com.binance.api.client.domain.event; + +public enum UserDataUpdateEventType { + ACCOUNT_POSITION_UPDATE("outboundAccountPosition"), + BALANCE_UPDATE("balanceUpdate"), + EXECUTION_REPORT("executionReport"), + ACCOUNT_UPDATE("ACCOUNT_UPDATE"), //Binance futures & testnet + ACCOUNT_CONFIG_UPDATE("ACCOUNT_CONFIG_UPDATE"), //Binance futures & testnet //TODO: Implement this type. + ORDER_TRADE_UPDATE("ORDER_TRADE_UPDATE"); //Binance futures & testnet + + private final String eventTypeId; + + UserDataUpdateEventType(String eventTypeId) { + this.eventTypeId = eventTypeId; + } + + public String getEventTypeId() { + return eventTypeId; + } + + public static UserDataUpdateEventType fromEventTypeId(String eventTypeId) { + UserDataUpdateEventType et = null; + switch (eventTypeId) { + case "outboundAccountPosition": + et = UserDataUpdateEventType.ACCOUNT_POSITION_UPDATE; + break; + case "balanceUpdate": + et = UserDataUpdateEventType.BALANCE_UPDATE; + break; + case "executionReport": + et = UserDataUpdateEventType.EXECUTION_REPORT; + break; + case "ACCOUNT_UPDATE": + et = UserDataUpdateEventType.ACCOUNT_UPDATE; + break; + case "ACCOUNT_CONFIG_UPDATE": + et = UserDataUpdateEventType.ACCOUNT_CONFIG_UPDATE; + break; + case "ORDER_TRADE_UPDATE": + et = UserDataUpdateEventType.ORDER_TRADE_UPDATE; + break; + } + return et; + } +} \ No newline at end of file diff --git a/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java b/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java index 3e267cf77..466edbfa9 100755 --- a/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java +++ b/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java @@ -1,7 +1,7 @@ package com.binance.api.examples; -import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.api.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.account.Account; import com.binance.api.client.domain.account.AssetBalance; import com.binance.api.client.factory.BinanceAbstractFactory; @@ -10,7 +10,7 @@ import java.util.Map; import java.util.TreeMap; -import static com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType.ACCOUNT_UPDATE; +import static com.binance.api.client.domain.event.UserDataUpdateEventType.ACCOUNT_UPDATE; /** * Illustrates how to use the user data event stream to create a local cache for the balance of an account. diff --git a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java index b134db0e6..faa23a7ec 100755 --- a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java @@ -4,10 +4,11 @@ import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.ExecutionReport; -import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceSpotApiClientFactory; +import static com.binance.api.client.domain.event.UserDataUpdateEventType.ACCOUNT_UPDATE; + /** * User data stream endpoints examples. *

@@ -30,7 +31,7 @@ public static void main(String[] args) { // Listen for changes in the account webSocketClient.onUserDataUpdateEvent(listenKey, response -> { - if (response.getEventType() == UserDataUpdateEventType.ACCOUNT_UPDATE) { + if (response.getEventType() == ACCOUNT_UPDATE) { AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); // Print new balances of every available asset System.out.println(accountUpdateEvent.getBalances()); diff --git a/src/test/java/com/binance/api/examples/UserDataStreamExample.java b/src/test/java/com/binance/api/examples/UserDataStreamExample.java index e9d265172..588f9a870 100755 --- a/src/test/java/com/binance/api/examples/UserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/UserDataStreamExample.java @@ -4,10 +4,11 @@ import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.ExecutionReport; -import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceSpotApiClientFactory; +import static com.binance.api.client.domain.event.UserDataUpdateEventType.ACCOUNT_UPDATE; + /** * User data stream endpoints examples. *

@@ -28,7 +29,7 @@ public static void main(String[] args) { // Listen for changes in the account webSocketClient.onUserDataUpdateEvent(listenKey, response -> { - if (response.getEventType() == UserDataUpdateEventType.ACCOUNT_UPDATE) { + if (response.getEventType() == ACCOUNT_UPDATE) { AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); // Print new balances of every available asset System.out.println(accountUpdateEvent.getBalances()); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java index 67106c2e1..81328dc61 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java @@ -4,10 +4,11 @@ import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.domain.event.AccountUpdateEvent; import com.binance.api.client.domain.event.ExecutionReport; -import com.binance.api.client.domain.event.UserDataUpdateEvent.UserDataUpdateEventType; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; +import static com.binance.api.client.domain.event.UserDataUpdateEventType.ACCOUNT_UPDATE; + /** * User data stream endpoints examples. *

@@ -30,7 +31,7 @@ public static void main(String[] args) { // Listen for changes in the account webSocketClient.onUserDataUpdateEvent(listenKey, response -> { - if (response.getEventType() == UserDataUpdateEventType.ACCOUNT_UPDATE) { + if (response.getEventType() == ACCOUNT_UPDATE) { AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); // Print new balances of every available asset System.out.println(accountUpdateEvent.getBalances()); From 765b21aa7b4c66db9a4f2d4ef665fbebe358f985 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Sat, 3 Apr 2021 22:38:23 +0430 Subject: [PATCH 13/18] Improvement CandlestickInterval --- .../client/domain/event/CandlestickEvent.java | 332 +++++++++--------- .../event/CandlestickEventDeserializer.java | 64 ++-- .../event/CandlestickEventSerializer.java | 58 +-- .../domain/market/CandlestickInterval.java | 90 +++-- .../CandlestickEventDeserializerTest.java | 98 +++--- 5 files changed, 341 insertions(+), 301 deletions(-) diff --git a/src/main/java/com/binance/api/client/domain/event/CandlestickEvent.java b/src/main/java/com/binance/api/client/domain/event/CandlestickEvent.java index f7c04b3df..fc661dd4f 100755 --- a/src/main/java/com/binance/api/client/domain/event/CandlestickEvent.java +++ b/src/main/java/com/binance/api/client/domain/event/CandlestickEvent.java @@ -1,10 +1,10 @@ package com.binance.api.client.domain.event; import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.market.CandlestickInterval; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; - import org.apache.commons.lang3.builder.ToStringBuilder; /** @@ -15,207 +15,207 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class CandlestickEvent { - private String eventType; + private String eventType; - private long eventTime; + private long eventTime; - private String symbol; + private String symbol; - private Long openTime; + private Long openTime; - private String open; + private String open; - private String high; + private String high; - private String low; + private String low; - private String close; + private String close; - private String volume; + private String volume; - private Long closeTime; + private Long closeTime; - private String intervalId; + private CandlestickInterval intervalId; - private Long firstTradeId; + private Long firstTradeId; - private Long lastTradeId; + private Long lastTradeId; - private String quoteAssetVolume; + private String quoteAssetVolume; - private Long numberOfTrades; + private Long numberOfTrades; - private String takerBuyBaseAssetVolume; + private String takerBuyBaseAssetVolume; - private String takerBuyQuoteAssetVolume; + private String takerBuyQuoteAssetVolume; - private Boolean isBarFinal; + private Boolean isBarFinal; - public String getEventType() { - return eventType; - } + public String getEventType() { + return eventType; + } - public void setEventType(String eventType) { - this.eventType = eventType; - } + public void setEventType(String eventType) { + this.eventType = eventType; + } - public long getEventTime() { - return eventTime; - } + public long getEventTime() { + return eventTime; + } - public void setEventTime(long eventTime) { - this.eventTime = eventTime; - } + public void setEventTime(long eventTime) { + this.eventTime = eventTime; + } - public String getSymbol() { - return symbol; - } + public String getSymbol() { + return symbol; + } - public void setSymbol(String symbol) { - this.symbol = symbol; - } + public void setSymbol(String symbol) { + this.symbol = symbol; + } - public Long getOpenTime() { - return openTime; - } + public Long getOpenTime() { + return openTime; + } - public void setOpenTime(Long openTime) { - this.openTime = openTime; - } + public void setOpenTime(Long openTime) { + this.openTime = openTime; + } - public String getOpen() { - return open; - } + public String getOpen() { + return open; + } - public void setOpen(String open) { - this.open = open; - } + public void setOpen(String open) { + this.open = open; + } - public String getHigh() { - return high; - } + public String getHigh() { + return high; + } - public void setHigh(String high) { - this.high = high; - } + public void setHigh(String high) { + this.high = high; + } - public String getLow() { - return low; - } + public String getLow() { + return low; + } - public void setLow(String low) { - this.low = low; - } + public void setLow(String low) { + this.low = low; + } - public String getClose() { - return close; - } + public String getClose() { + return close; + } - public void setClose(String close) { - this.close = close; - } + public void setClose(String close) { + this.close = close; + } - public String getVolume() { - return volume; - } + public String getVolume() { + return volume; + } - public void setVolume(String volume) { - this.volume = volume; - } + public void setVolume(String volume) { + this.volume = volume; + } - public Long getCloseTime() { - return closeTime; - } + public Long getCloseTime() { + return closeTime; + } - public void setCloseTime(Long closeTime) { - this.closeTime = closeTime; - } + public void setCloseTime(Long closeTime) { + this.closeTime = closeTime; + } - public String getIntervalId() { - return intervalId; - } - - public void setIntervalId(String intervalId) { - this.intervalId = intervalId; - } - - public Long getFirstTradeId() { - return firstTradeId; - } - - public void setFirstTradeId(Long firstTradeId) { - this.firstTradeId = firstTradeId; - } - - public Long getLastTradeId() { - return lastTradeId; - } - - public void setLastTradeId(Long lastTradeId) { - this.lastTradeId = lastTradeId; - } - - public String getQuoteAssetVolume() { - return quoteAssetVolume; - } - - public void setQuoteAssetVolume(String quoteAssetVolume) { - this.quoteAssetVolume = quoteAssetVolume; - } - - public Long getNumberOfTrades() { - return numberOfTrades; - } - - public void setNumberOfTrades(Long numberOfTrades) { - this.numberOfTrades = numberOfTrades; - } - - public String getTakerBuyBaseAssetVolume() { - return takerBuyBaseAssetVolume; - } - - public void setTakerBuyBaseAssetVolume(String takerBuyBaseAssetVolume) { - this.takerBuyBaseAssetVolume = takerBuyBaseAssetVolume; - } - - public String getTakerBuyQuoteAssetVolume() { - return takerBuyQuoteAssetVolume; - } - - public void setTakerBuyQuoteAssetVolume(String takerBuyQuoteAssetVolume) { - this.takerBuyQuoteAssetVolume = takerBuyQuoteAssetVolume; - } - - public Boolean getBarFinal() { - return isBarFinal; - } - - public void setBarFinal(Boolean barFinal) { - isBarFinal = barFinal; - } - - @Override - public String toString() { - return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) - .append("eventType", eventType) - .append("eventTime", eventTime) - .append("symbol", symbol) - .append("openTime", openTime) - .append("open", open) - .append("high", high) - .append("low", low) - .append("close", close) - .append("volume", volume) - .append("closeTime", closeTime) - .append("intervalId", intervalId) - .append("firstTradeId", firstTradeId) - .append("lastTradeId", lastTradeId) - .append("quoteAssetVolume", quoteAssetVolume) - .append("numberOfTrades", numberOfTrades) - .append("takerBuyBaseAssetVolume", takerBuyBaseAssetVolume) - .append("takerBuyQuoteAssetVolume", takerBuyQuoteAssetVolume) - .append("isBarFinal", isBarFinal) - .toString(); - } + public CandlestickInterval getIntervalId() { + return intervalId; + } + + public void setIntervalId(CandlestickInterval intervalId) { + this.intervalId = intervalId; + } + + public Long getFirstTradeId() { + return firstTradeId; + } + + public void setFirstTradeId(Long firstTradeId) { + this.firstTradeId = firstTradeId; + } + + public Long getLastTradeId() { + return lastTradeId; + } + + public void setLastTradeId(Long lastTradeId) { + this.lastTradeId = lastTradeId; + } + + public String getQuoteAssetVolume() { + return quoteAssetVolume; + } + + public void setQuoteAssetVolume(String quoteAssetVolume) { + this.quoteAssetVolume = quoteAssetVolume; + } + + public Long getNumberOfTrades() { + return numberOfTrades; + } + + public void setNumberOfTrades(Long numberOfTrades) { + this.numberOfTrades = numberOfTrades; + } + + public String getTakerBuyBaseAssetVolume() { + return takerBuyBaseAssetVolume; + } + + public void setTakerBuyBaseAssetVolume(String takerBuyBaseAssetVolume) { + this.takerBuyBaseAssetVolume = takerBuyBaseAssetVolume; + } + + public String getTakerBuyQuoteAssetVolume() { + return takerBuyQuoteAssetVolume; + } + + public void setTakerBuyQuoteAssetVolume(String takerBuyQuoteAssetVolume) { + this.takerBuyQuoteAssetVolume = takerBuyQuoteAssetVolume; + } + + public Boolean getBarFinal() { + return isBarFinal; + } + + public void setBarFinal(Boolean barFinal) { + isBarFinal = barFinal; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("eventType", eventType) + .append("eventTime", eventTime) + .append("symbol", symbol) + .append("openTime", openTime) + .append("open", open) + .append("high", high) + .append("low", low) + .append("close", close) + .append("volume", volume) + .append("closeTime", closeTime) + .append("intervalId", intervalId) + .append("firstTradeId", firstTradeId) + .append("lastTradeId", lastTradeId) + .append("quoteAssetVolume", quoteAssetVolume) + .append("numberOfTrades", numberOfTrades) + .append("takerBuyBaseAssetVolume", takerBuyBaseAssetVolume) + .append("takerBuyQuoteAssetVolume", takerBuyQuoteAssetVolume) + .append("isBarFinal", isBarFinal) + .toString(); + } } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/domain/event/CandlestickEventDeserializer.java b/src/main/java/com/binance/api/client/domain/event/CandlestickEventDeserializer.java index 7792fc73a..5b3fbe3c9 100755 --- a/src/main/java/com/binance/api/client/domain/event/CandlestickEventDeserializer.java +++ b/src/main/java/com/binance/api/client/domain/event/CandlestickEventDeserializer.java @@ -1,5 +1,6 @@ package com.binance.api.client.domain.event; +import com.binance.api.client.domain.market.CandlestickInterval; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.ObjectCodec; import com.fasterxml.jackson.databind.DeserializationContext; @@ -15,36 +16,35 @@ */ public class CandlestickEventDeserializer extends JsonDeserializer { - @Override - public CandlestickEvent deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { - ObjectCodec oc = jp.getCodec(); - JsonNode node = oc.readTree(jp); - - CandlestickEvent candlestickEvent = new CandlestickEvent(); - - // Parse header - candlestickEvent.setEventType(node.get("e").asText()); - candlestickEvent.setEventTime(node.get("E").asLong()); - candlestickEvent.setSymbol(node.get("s").asText()); - - // Parse candlestick data - JsonNode candlestickNode = node.get("k"); - candlestickEvent.setOpenTime(candlestickNode.get("t").asLong()); - candlestickEvent.setCloseTime(candlestickNode.get("T").asLong()); - candlestickEvent.setIntervalId(candlestickNode.get("i").asText()); - candlestickEvent.setFirstTradeId(candlestickNode.get("f").asLong()); - candlestickEvent.setLastTradeId(candlestickNode.get("L").asLong()); - candlestickEvent.setOpen(candlestickNode.get("o").asText()); - candlestickEvent.setClose(candlestickNode.get("c").asText()); - candlestickEvent.setHigh(candlestickNode.get("h").asText()); - candlestickEvent.setLow(candlestickNode.get("l").asText()); - candlestickEvent.setVolume(candlestickNode.get("v").asText()); - candlestickEvent.setNumberOfTrades(candlestickNode.get("n").asLong()); - candlestickEvent.setBarFinal(candlestickNode.get("x").asBoolean()); - candlestickEvent.setQuoteAssetVolume(candlestickNode.get("q").asText()); - candlestickEvent.setTakerBuyBaseAssetVolume(candlestickNode.get("V").asText()); - candlestickEvent.setTakerBuyQuoteAssetVolume(candlestickNode.get("Q").asText()); - - return candlestickEvent; - } + @Override + public CandlestickEvent deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + ObjectCodec oc = jp.getCodec(); + JsonNode node = oc.readTree(jp); + + CandlestickEvent candlestickEvent = new CandlestickEvent(); + + // Parse header + candlestickEvent.setEventType(node.get("e").asText()); + candlestickEvent.setEventTime(node.get("E").asLong()); + candlestickEvent.setSymbol(node.get("s").asText()); + // Parse candlestick data + JsonNode candlestickNode = node.get("k"); + candlestickEvent.setOpenTime(candlestickNode.get("t").asLong()); + candlestickEvent.setCloseTime(candlestickNode.get("T").asLong()); + candlestickEvent.setIntervalId(CandlestickInterval.getEnum(candlestickNode.get("i").asText())); + candlestickEvent.setFirstTradeId(candlestickNode.get("f").asLong()); + candlestickEvent.setLastTradeId(candlestickNode.get("L").asLong()); + candlestickEvent.setOpen(candlestickNode.get("o").asText()); + candlestickEvent.setClose(candlestickNode.get("c").asText()); + candlestickEvent.setHigh(candlestickNode.get("h").asText()); + candlestickEvent.setLow(candlestickNode.get("l").asText()); + candlestickEvent.setVolume(candlestickNode.get("v").asText()); + candlestickEvent.setNumberOfTrades(candlestickNode.get("n").asLong()); + candlestickEvent.setBarFinal(candlestickNode.get("x").asBoolean()); + candlestickEvent.setQuoteAssetVolume(candlestickNode.get("q").asText()); + candlestickEvent.setTakerBuyBaseAssetVolume(candlestickNode.get("V").asText()); + candlestickEvent.setTakerBuyQuoteAssetVolume(candlestickNode.get("Q").asText()); + + return candlestickEvent; + } } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/domain/event/CandlestickEventSerializer.java b/src/main/java/com/binance/api/client/domain/event/CandlestickEventSerializer.java index 2ceb99956..57c750b15 100755 --- a/src/main/java/com/binance/api/client/domain/event/CandlestickEventSerializer.java +++ b/src/main/java/com/binance/api/client/domain/event/CandlestickEventSerializer.java @@ -1,8 +1,8 @@ package com.binance.api.client.domain.event; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; @@ -13,32 +13,32 @@ */ public class CandlestickEventSerializer extends JsonSerializer { - @Override - public void serialize(CandlestickEvent candlestickEvent, JsonGenerator gen, SerializerProvider serializers) throws IOException { - gen.writeStartObject(); - - // Write header - gen.writeStringField("e", candlestickEvent.getEventType()); - gen.writeNumberField("E", candlestickEvent.getEventTime()); - gen.writeStringField("s", candlestickEvent.getSymbol()); - - // Write candlestick data - gen.writeObjectFieldStart("k"); - gen.writeNumberField("t", candlestickEvent.getOpenTime()); - gen.writeNumberField("T", candlestickEvent.getCloseTime()); - gen.writeStringField("i", candlestickEvent.getIntervalId()); - gen.writeNumberField("f", candlestickEvent.getFirstTradeId()); - gen.writeNumberField("L", candlestickEvent.getLastTradeId()); - gen.writeStringField("o", candlestickEvent.getOpen()); - gen.writeStringField("c", candlestickEvent.getClose()); - gen.writeStringField("h", candlestickEvent.getHigh()); - gen.writeStringField("l", candlestickEvent.getLow()); - gen.writeStringField("v", candlestickEvent.getVolume()); - gen.writeNumberField("n", candlestickEvent.getNumberOfTrades()); - gen.writeBooleanField("x", candlestickEvent.getBarFinal()); - gen.writeStringField("q", candlestickEvent.getQuoteAssetVolume()); - gen.writeStringField("V", candlestickEvent.getTakerBuyBaseAssetVolume()); - gen.writeStringField("Q", candlestickEvent.getTakerBuyQuoteAssetVolume()); - gen.writeEndObject(); - } + @Override + public void serialize(CandlestickEvent candlestickEvent, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeStartObject(); + + // Write header + gen.writeStringField("e", candlestickEvent.getEventType()); + gen.writeNumberField("E", candlestickEvent.getEventTime()); + gen.writeStringField("s", candlestickEvent.getSymbol()); + + // Write candlestick data + gen.writeObjectFieldStart("k"); + gen.writeNumberField("t", candlestickEvent.getOpenTime()); + gen.writeNumberField("T", candlestickEvent.getCloseTime()); + gen.writeStringField("i", candlestickEvent.getIntervalId().getIntervalId()); + gen.writeNumberField("f", candlestickEvent.getFirstTradeId()); + gen.writeNumberField("L", candlestickEvent.getLastTradeId()); + gen.writeStringField("o", candlestickEvent.getOpen()); + gen.writeStringField("c", candlestickEvent.getClose()); + gen.writeStringField("h", candlestickEvent.getHigh()); + gen.writeStringField("l", candlestickEvent.getLow()); + gen.writeStringField("v", candlestickEvent.getVolume()); + gen.writeNumberField("n", candlestickEvent.getNumberOfTrades()); + gen.writeBooleanField("x", candlestickEvent.getBarFinal()); + gen.writeStringField("q", candlestickEvent.getQuoteAssetVolume()); + gen.writeStringField("V", candlestickEvent.getTakerBuyBaseAssetVolume()); + gen.writeStringField("Q", candlestickEvent.getTakerBuyQuoteAssetVolume()); + gen.writeEndObject(); + } } diff --git a/src/main/java/com/binance/api/client/domain/market/CandlestickInterval.java b/src/main/java/com/binance/api/client/domain/market/CandlestickInterval.java index 577287c86..9f1dc01d5 100755 --- a/src/main/java/com/binance/api/client/domain/market/CandlestickInterval.java +++ b/src/main/java/com/binance/api/client/domain/market/CandlestickInterval.java @@ -1,5 +1,6 @@ package com.binance.api.client.domain.market; +import com.binance.api.client.exception.BinanceApiException; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** @@ -8,29 +9,68 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) public enum CandlestickInterval { - ONE_MINUTE("1m"), - THREE_MINUTES("3m"), - FIVE_MINUTES("5m"), - FIFTEEN_MINUTES("15m"), - HALF_HOURLY("30m"), - HOURLY("1h"), - TWO_HOURLY("2h"), - FOUR_HOURLY("4h"), - SIX_HOURLY("6h"), - EIGHT_HOURLY("8h"), - TWELVE_HOURLY("12h"), - DAILY("1d"), - THREE_DAILY("3d"), - WEEKLY("1w"), - MONTHLY("1M"); - - private final String intervalId; - - CandlestickInterval(String intervalId) { - this.intervalId = intervalId; - } - - public String getIntervalId() { - return intervalId; - } + ONE_MINUTE("1m"), + THREE_MINUTES("3m"), + FIVE_MINUTES("5m"), + FIFTEEN_MINUTES("15m"), + HALF_HOURLY("30m"), + HOURLY("1h"), + TWO_HOURLY("2h"), + FOUR_HOURLY("4h"), + SIX_HOURLY("6h"), + EIGHT_HOURLY("8h"), + TWELVE_HOURLY("12h"), + DAILY("1d"), + THREE_DAILY("3d"), + WEEKLY("1w"), + MONTHLY("1M"); + + private final String intervalId; + + CandlestickInterval(String intervalId) { + this.intervalId = intervalId; + } + + public String getIntervalId() { + return intervalId; + } + + public static CandlestickInterval getEnum(String intervalId) { + switch (intervalId) { + case "1m": + return CandlestickInterval.ONE_MINUTE; + case "3m": + return CandlestickInterval.THREE_MINUTES; + case "5m": + return CandlestickInterval.FIVE_MINUTES; + case "15m": + return CandlestickInterval.FIFTEEN_MINUTES; + case "30m": + return CandlestickInterval.HALF_HOURLY; + case "1h": + return CandlestickInterval.HOURLY; + case "2h": + return CandlestickInterval.TWO_HOURLY; + case "4h": + return CandlestickInterval.FOUR_HOURLY; + case "6h": + return CandlestickInterval.SIX_HOURLY; + case "8h": + return CandlestickInterval.EIGHT_HOURLY; + case "12h": + return CandlestickInterval.TWELVE_HOURLY; + case "1d": + return CandlestickInterval.DAILY; + case "3d": + return CandlestickInterval.THREE_DAILY; + case "1w": + return CandlestickInterval.WEEKLY; + case "1M": + return CandlestickInterval.MONTHLY; + default: + throw new BinanceApiException("Time interval not defined"); + } + } + + } diff --git a/src/test/java/com/binance/api/domain/event/CandlestickEventDeserializerTest.java b/src/test/java/com/binance/api/domain/event/CandlestickEventDeserializerTest.java index 8f7e40f43..c5bd9ae1e 100755 --- a/src/test/java/com/binance/api/domain/event/CandlestickEventDeserializerTest.java +++ b/src/test/java/com/binance/api/domain/event/CandlestickEventDeserializerTest.java @@ -14,55 +14,55 @@ */ public class CandlestickEventDeserializerTest { - @Test - public void testCandlestickEventDeserializer() { - String candlestickEventJson = "{\n" + - " \"e\": \"kline\",\n" + - " \"E\": 1,\n" + - " \"s\": \"ETHBTC\",\n" + - " \"k\": {\n" + - " \"t\": 1499404860000,\n" + - " \"T\": 1499404919999,\n" + - " \"s\": \"ETHBTC\", \n" + - " \"i\": \"1m\",\n" + - " \"f\": 77462, \n" + - " \"L\": 77465, \n" + - " \"o\": \"0.10278577\", \n" + - " \"c\": \"0.10278645\", \n" + - " \"h\": \"0.10278712\", \n" + - " \"l\": \"0.10278518\", \n" + - " \"v\": \"17.47929838\", \n" + - " \"n\": 4, \n" + - " \"x\": false, \n" + - " \"q\": \"1.79662878\", \n" + - " \"V\": \"2.34879839\", \n" + - " \"Q\": \"0.24142166\", \n" + - " \"B\": \"13279784.01349473\"\n" + - " }}"; - ObjectMapper mapper = new ObjectMapper(); - try { - CandlestickEvent candlestickEvent = mapper.readValue(candlestickEventJson, CandlestickEvent.class); - assertEquals(candlestickEvent.getEventType(), "kline"); - assertEquals(candlestickEvent.getEventTime(), 1L); - assertEquals(candlestickEvent.getSymbol(), "ETHBTC"); + @Test + public void testCandlestickEventDeserializer() { + String candlestickEventJson = "{\n" + + " \"e\": \"kline\",\n" + + " \"E\": 1,\n" + + " \"s\": \"ETHBTC\",\n" + + " \"k\": {\n" + + " \"t\": 1499404860000,\n" + + " \"T\": 1499404919999,\n" + + " \"s\": \"ETHBTC\", \n" + + " \"i\": \"1m\",\n" + + " \"f\": 77462, \n" + + " \"L\": 77465, \n" + + " \"o\": \"0.10278577\", \n" + + " \"c\": \"0.10278645\", \n" + + " \"h\": \"0.10278712\", \n" + + " \"l\": \"0.10278518\", \n" + + " \"v\": \"17.47929838\", \n" + + " \"n\": 4, \n" + + " \"x\": false, \n" + + " \"q\": \"1.79662878\", \n" + + " \"V\": \"2.34879839\", \n" + + " \"Q\": \"0.24142166\", \n" + + " \"B\": \"13279784.01349473\"\n" + + " }}"; + ObjectMapper mapper = new ObjectMapper(); + try { + CandlestickEvent candlestickEvent = mapper.readValue(candlestickEventJson, CandlestickEvent.class); + assertEquals(candlestickEvent.getEventType(), "kline"); + assertEquals(candlestickEvent.getEventTime(), 1L); + assertEquals(candlestickEvent.getSymbol(), "ETHBTC"); - assertEquals((long)candlestickEvent.getOpenTime(), 1499404860000L); - assertEquals(candlestickEvent.getOpen(), "0.10278577"); - assertEquals(candlestickEvent.getHigh(), "0.10278712"); - assertEquals(candlestickEvent.getLow(), "0.10278518"); - assertEquals(candlestickEvent.getClose(), "0.10278645"); - assertEquals(candlestickEvent.getVolume(), "17.47929838"); - assertEquals((long)candlestickEvent.getCloseTime(), 1499404919999L); - assertEquals(candlestickEvent.getIntervalId(), "1m"); - assertEquals((long)candlestickEvent.getFirstTradeId(), 77462L); - assertEquals((long)candlestickEvent.getLastTradeId(), 77465L); - assertEquals(candlestickEvent.getQuoteAssetVolume(), "1.79662878"); - assertEquals((long)candlestickEvent.getNumberOfTrades(), 4L); - assertEquals(candlestickEvent.getTakerBuyBaseAssetVolume(), "2.34879839"); - assertEquals(candlestickEvent.getTakerBuyQuoteAssetVolume(), "0.24142166"); - assertEquals(candlestickEvent.getBarFinal(), false); - } catch (IOException e) { - fail(e.getMessage()); + assertEquals((long) candlestickEvent.getOpenTime(), 1499404860000L); + assertEquals(candlestickEvent.getOpen(), "0.10278577"); + assertEquals(candlestickEvent.getHigh(), "0.10278712"); + assertEquals(candlestickEvent.getLow(), "0.10278518"); + assertEquals(candlestickEvent.getClose(), "0.10278645"); + assertEquals(candlestickEvent.getVolume(), "17.47929838"); + assertEquals((long) candlestickEvent.getCloseTime(), 1499404919999L); + assertEquals(candlestickEvent.getIntervalId().getIntervalId(), "1m"); + assertEquals((long) candlestickEvent.getFirstTradeId(), 77462L); + assertEquals((long) candlestickEvent.getLastTradeId(), 77465L); + assertEquals(candlestickEvent.getQuoteAssetVolume(), "1.79662878"); + assertEquals((long) candlestickEvent.getNumberOfTrades(), 4L); + assertEquals(candlestickEvent.getTakerBuyBaseAssetVolume(), "2.34879839"); + assertEquals(candlestickEvent.getTakerBuyQuoteAssetVolume(), "0.24142166"); + assertEquals(candlestickEvent.getBarFinal(), false); + } catch (IOException e) { + fail(e.getMessage()); + } } - } } From e56820b83fc5f9551a235b1010fb67b878f86b0c Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Sat, 3 Apr 2021 22:50:07 +0430 Subject: [PATCH 14/18] cleanUp CandlestickEvent --- .../client/domain/event/CandlestickEvent.java | 47 ++++++------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/binance/api/client/domain/event/CandlestickEvent.java b/src/main/java/com/binance/api/client/domain/event/CandlestickEvent.java index fc661dd4f..7620735e4 100755 --- a/src/main/java/com/binance/api/client/domain/event/CandlestickEvent.java +++ b/src/main/java/com/binance/api/client/domain/event/CandlestickEvent.java @@ -16,39 +16,22 @@ public class CandlestickEvent { private String eventType; - private long eventTime; - private String symbol; - - private Long openTime; - + private long openTime; private String open; - private String high; - private String low; - private String close; - private String volume; - - private Long closeTime; - + private long closeTime; private CandlestickInterval intervalId; - - private Long firstTradeId; - - private Long lastTradeId; - + private long firstTradeId; + private long lastTradeId; private String quoteAssetVolume; - - private Long numberOfTrades; - + private long numberOfTrades; private String takerBuyBaseAssetVolume; - private String takerBuyQuoteAssetVolume; - private Boolean isBarFinal; public String getEventType() { @@ -75,11 +58,11 @@ public void setSymbol(String symbol) { this.symbol = symbol; } - public Long getOpenTime() { + public long getOpenTime() { return openTime; } - public void setOpenTime(Long openTime) { + public void setOpenTime(long openTime) { this.openTime = openTime; } @@ -123,11 +106,11 @@ public void setVolume(String volume) { this.volume = volume; } - public Long getCloseTime() { + public long getCloseTime() { return closeTime; } - public void setCloseTime(Long closeTime) { + public void setCloseTime(long closeTime) { this.closeTime = closeTime; } @@ -139,19 +122,19 @@ public void setIntervalId(CandlestickInterval intervalId) { this.intervalId = intervalId; } - public Long getFirstTradeId() { + public long getFirstTradeId() { return firstTradeId; } - public void setFirstTradeId(Long firstTradeId) { + public void setFirstTradeId(long firstTradeId) { this.firstTradeId = firstTradeId; } - public Long getLastTradeId() { + public long getLastTradeId() { return lastTradeId; } - public void setLastTradeId(Long lastTradeId) { + public void setLastTradeId(long lastTradeId) { this.lastTradeId = lastTradeId; } @@ -163,11 +146,11 @@ public void setQuoteAssetVolume(String quoteAssetVolume) { this.quoteAssetVolume = quoteAssetVolume; } - public Long getNumberOfTrades() { + public long getNumberOfTrades() { return numberOfTrades; } - public void setNumberOfTrades(Long numberOfTrades) { + public void setNumberOfTrades(long numberOfTrades) { this.numberOfTrades = numberOfTrades; } From 5f8eba180e7a4fc0bc1e02247b1a5c3401071fad Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Sat, 3 Apr 2021 23:49:38 +0430 Subject: [PATCH 15/18] implement new getCandlestickBars method --- .../api/sync/BinanceApiGeneralRestClient.java | 15 +++++++++++++-- .../sync/BinanceApiFuturesRestClientImpl.java | 5 +++++ .../impl/sync/BinanceApiSpotRestClientImpl.java | 7 ++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java index 292a5b339..c2c58080e 100755 --- a/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java @@ -1,7 +1,11 @@ package com.binance.api.client.api.sync; -import com.binance.api.client.domain.account.*; -import com.binance.api.client.domain.account.request.*; +import com.binance.api.client.domain.account.Order; +import com.binance.api.client.domain.account.TradeHistoryItem; +import com.binance.api.client.domain.account.request.CancelOrderRequest; +import com.binance.api.client.domain.account.request.CancelOrderResponse; +import com.binance.api.client.domain.account.request.OrderRequest; +import com.binance.api.client.domain.account.request.OrderStatusRequest; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.market.*; @@ -100,6 +104,13 @@ public interface BinanceApiGeneralRestClient { */ List getCandlestickBars(String symbol, CandlestickInterval interval); + /** + * Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. + * + * @see #getCandlestickBars(String, CandlestickInterval, Integer, Long, Long) + */ + List getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit); + /** * Get 24 hour price change statistics. * diff --git a/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java index eeda622fe..43070379d 100755 --- a/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java @@ -142,6 +142,11 @@ public List getCandlestickBars(String symbol, CandlestickInterval i return getCandlestickBars(symbol, interval, null, null, null); } + @Override + public List getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit) { + return getCandlestickBars(symbol, interval, limit, null, null); + } + @Override public TickerStatistics get24HrPriceStatistics(String symbol) { return executeSync(binanceApiService.get24HrPriceStatistics(symbol)); diff --git a/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java index f282b8d6a..a16fb71ff 100755 --- a/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java @@ -1,12 +1,12 @@ package com.binance.api.client.impl.sync; +import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.constant.BinanceApiConstants; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.*; import com.binance.api.client.domain.general.ExchangeInfo; import com.binance.api.client.domain.market.*; -import com.binance.api.client.api.BinanceApiService; import com.binance.api.client.impl.BinanceApiServiceGenerator; import retrofit2.Call; @@ -82,6 +82,11 @@ public List getCandlestickBars(String symbol, CandlestickInterval i return getCandlestickBars(symbol, interval, null, null, null); } + @Override + public List getCandlestickBars(String symbol, CandlestickInterval interval, Integer limit) { + return getCandlestickBars(symbol, interval, limit, null, null); + } + @Override public TickerStatistics get24HrPriceStatistics(String symbol) { return executeSync(binanceApiService.get24HrPriceStatistics(symbol)); From 56a484504779ac452d76aa91b0ad3fe2f7e06c02 Mon Sep 17 00:00:00 2001 From: Mahdi Sheikh Hosseini Date: Sun, 4 Apr 2021 00:01:14 +0430 Subject: [PATCH 16/18] implement BinanceUtils --- .../com/binance/api/client/BinanceUtils.java | 23 +++++++++++++++++++ .../examples/CandlesticksCacheExample.java | 18 ++++----------- 2 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/binance/api/client/BinanceUtils.java diff --git a/src/main/java/com/binance/api/client/BinanceUtils.java b/src/main/java/com/binance/api/client/BinanceUtils.java new file mode 100644 index 000000000..8bc634733 --- /dev/null +++ b/src/main/java/com/binance/api/client/BinanceUtils.java @@ -0,0 +1,23 @@ +package com.binance.api.client; + +import com.binance.api.client.domain.event.CandlestickEvent; +import com.binance.api.client.domain.market.Candlestick; + +public interface BinanceUtils { + + static Candlestick mapToCandlestick(CandlestickEvent event) { + Candlestick candlestick = new Candlestick(); + candlestick.setOpenTime(event.getOpenTime()); + candlestick.setOpen(event.getOpen()); + candlestick.setLow(event.getLow()); + candlestick.setHigh(event.getHigh()); + candlestick.setClose(event.getClose()); + candlestick.setCloseTime(event.getCloseTime()); + candlestick.setVolume(event.getVolume()); + candlestick.setNumberOfTrades(event.getNumberOfTrades()); + candlestick.setQuoteAssetVolume(event.getQuoteAssetVolume()); + candlestick.setTakerBuyQuoteAssetVolume(event.getTakerBuyQuoteAssetVolume()); + candlestick.setTakerBuyBaseAssetVolume(event.getTakerBuyQuoteAssetVolume()); + return candlestick; + } +} diff --git a/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java b/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java index 772b5428b..03850fa53 100755 --- a/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java +++ b/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java @@ -1,7 +1,8 @@ package com.binance.api.examples; -import com.binance.api.client.api.sync.BinanceApiSpotRestClient; +import com.binance.api.client.BinanceUtils; import com.binance.api.client.api.BinanceApiWebSocketClient; +import com.binance.api.client.api.sync.BinanceApiSpotRestClient; import com.binance.api.client.domain.market.Candlestick; import com.binance.api.client.domain.market.CandlestickInterval; import com.binance.api.client.factory.BinanceSpotApiClientFactory; @@ -52,19 +53,10 @@ private void startCandlestickEventStreaming(String symbol, CandlestickInterval i if (updateCandlestick == null) { // new candlestick updateCandlestick = new Candlestick(); + } else { + // update candlestick with the stream data + updateCandlestick = BinanceUtils.mapToCandlestick(response); } - // update candlestick with the stream data - updateCandlestick.setOpenTime(response.getOpenTime()); - updateCandlestick.setOpen(response.getOpen()); - updateCandlestick.setLow(response.getLow()); - updateCandlestick.setHigh(response.getHigh()); - updateCandlestick.setClose(response.getClose()); - updateCandlestick.setCloseTime(response.getCloseTime()); - updateCandlestick.setVolume(response.getVolume()); - updateCandlestick.setNumberOfTrades(response.getNumberOfTrades()); - updateCandlestick.setQuoteAssetVolume(response.getQuoteAssetVolume()); - updateCandlestick.setTakerBuyQuoteAssetVolume(response.getTakerBuyQuoteAssetVolume()); - updateCandlestick.setTakerBuyBaseAssetVolume(response.getTakerBuyQuoteAssetVolume()); // Store the updated candlestick in the cache candlesticksCache.put(openTime, updateCandlestick); From 252786996b7d6927022f6798d9a0cd3dd7cb5782 Mon Sep 17 00:00:00 2001 From: Mahdi Date: Thu, 8 Apr 2021 00:02:25 +0430 Subject: [PATCH 17/18] Fix FuturesNewOrder wrong method --- .../api/client/domain/account/FuturesNewOrder.java | 11 ----------- .../api/examples/testnet/TestnetOrdersExample.java | 10 ++-------- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java index 91c6c81d9..300399f7f 100644 --- a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java +++ b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java @@ -301,15 +301,4 @@ public static FuturesNewOrder MarketLong(String symbol, String quantity, boolean public static FuturesNewOrder MarketShort(String symbol, String quantity, boolean reduceOnly) { return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.MARKET, quantity, reduceOnly); } - - public static FuturesNewOrder stopLimitShort(String symbol, String quantity, String stopPrice, boolean reduceOnly) { - FuturesNewOrder order = new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.STOP_MARKET, quantity, reduceOnly); - order.setStopPrice(stopPrice); - return order; - } - - /* public static FuturesNewOrder stopLimitLong(String symbol, String quantity, boolean reduceOnly) { - return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.MARKET, quantity); - }*/ - } diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java index e44e4d58c..73c2a6297 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java @@ -1,8 +1,6 @@ package com.binance.api.examples.testnet; import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; -import com.binance.api.client.domain.account.FuturesNewOrder; -import com.binance.api.client.domain.account.FuturesNewOrderResponse; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; @@ -13,8 +11,8 @@ */ public class TestnetOrdersExample { private static final String SYMBOL = "BTCUSDT"; - private static final String API_KEY = ""; - private static final String SECRET_KEY = ""; + private static final String API_KEY = "c8be940e7d3ebbfe79842236d6110b88e8350059ca48593a4809bc02794b837b"; + private static final String SECRET_KEY = "44090bdaf2e1b4d9f46bb772bc630ace9c3a00c3294ab61315f1c0e817ba29d6"; public static void main(String[] args) throws InterruptedException { @@ -50,10 +48,6 @@ public static void main(String[] args) throws InterruptedException { // Short Limit Order // FuturesNewOrderResponse shortLimit = futureClient.newOrder(FuturesNewOrder.limitShort(SYMBOL, TimeInForce.GTC, "1.5", "59050", false)); // System.out.println(shortLimit); - - FuturesNewOrderResponse stopLimitShort = futureClient.newOrder(FuturesNewOrder.stopLimitShort(SYMBOL, "1", "58814", false)); - System.out.println(stopLimitShort); - } } From d99b82ced07421be4554f9cea3dbba1c8bb012d4 Mon Sep 17 00:00:00 2001 From: Mahdi Date: Fri, 16 Apr 2021 20:57:37 +0430 Subject: [PATCH 18/18] Improvement with new examples --- LICENSE | 0 README.md | 0 pom.xml | 2 +- .../client/api/BinanceFuturesApiService.java | 12 + .../BinanceApiAsyncFuturesRestClient.java | 2 + .../api/sync/BinanceApiFuturesRestClient.java | 12 + .../api/client/domain/PositionSideType.java | 5 + .../api/client/domain/PrecisionFormat.java | 41 +++ .../domain/account/FuturesNewOrder.java | 128 ++++++- .../domain/account/PositionInformation.java | 142 ++++++++ .../api/client/domain/general/SymbolInfo.java | 319 +++++++++--------- .../BinanceApiAsyncFuturesRestClientImpl.java | 16 +- .../sync/BinanceApiFuturesRestClientImpl.java | 14 + .../futures/FuturesOrdersExample.java | 3 +- .../FuturesPositionInformationExample.java | 41 +++ .../testnet/TestnetOrdersExample.java | 30 +- 16 files changed, 593 insertions(+), 174 deletions(-) mode change 100755 => 100644 LICENSE mode change 100755 => 100644 README.md mode change 100755 => 100644 pom.xml create mode 100644 src/main/java/com/binance/api/client/domain/PositionSideType.java create mode 100644 src/main/java/com/binance/api/client/domain/PrecisionFormat.java create mode 100755 src/main/java/com/binance/api/client/domain/account/PositionInformation.java create mode 100755 src/test/java/com/binance/api/examples/futures/FuturesPositionInformationExample.java diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/pom.xml b/pom.xml old mode 100755 new mode 100644 index 863f5c234..89ebaf66d --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.binance.api binance-api-client - 1.0.1 + 1.0.2 The MIT License diff --git a/src/main/java/com/binance/api/client/api/BinanceFuturesApiService.java b/src/main/java/com/binance/api/client/api/BinanceFuturesApiService.java index bf5c3b926..fc2a36029 100755 --- a/src/main/java/com/binance/api/client/api/BinanceFuturesApiService.java +++ b/src/main/java/com/binance/api/client/api/BinanceFuturesApiService.java @@ -132,4 +132,16 @@ Call changeMarginType(@Query("symbol") String symbol, @Query("marginType") MarginType marginType, @Query("recvWindow") Long recvWindow, @Query("timestamp") Long timestamp); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @POST("/fapi/v1/positionSide/dual") + Call changePositionSideMode(@Query("dualSidePosition") boolean dualSidePosition, + @Query("recvWindow") Long recvWindow, + @Query("timestamp") Long timestamp); + + @Headers(BinanceApiConstants.ENDPOINT_SECURITY_TYPE_SIGNED_HEADER) + @GET("/fapi/v2/positionRisk") + Call> getPositionInformation(@Query("symbol") String symbol, + @Query("recvWindow") Long recvWindow, + @Query("timestamp") Long timestamp); } diff --git a/src/main/java/com/binance/api/client/api/async/BinanceApiAsyncFuturesRestClient.java b/src/main/java/com/binance/api/client/api/async/BinanceApiAsyncFuturesRestClient.java index ecd8dc228..3e38d615c 100755 --- a/src/main/java/com/binance/api/client/api/async/BinanceApiAsyncFuturesRestClient.java +++ b/src/main/java/com/binance/api/client/api/async/BinanceApiAsyncFuturesRestClient.java @@ -28,4 +28,6 @@ public interface BinanceApiAsyncFuturesRestClient { void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCallback callback); + void getPositionInformation(String symbol, BinanceApiCallback> callback); + } \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java index 161fb421d..f913a8c61 100755 --- a/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java @@ -1,7 +1,10 @@ package com.binance.api.client.api.sync; +import com.binance.api.client.domain.PositionSideType; import com.binance.api.client.domain.account.*; +import java.util.List; + public interface BinanceApiFuturesRestClient extends BinanceApiGeneralRestClient { /** @@ -56,4 +59,13 @@ public interface BinanceApiFuturesRestClient extends BinanceApiGeneralRestClient */ void closeUserDataStream(String listenKey); + /** + * Change user's position mode (Hedge mode or One-Way mode) + * + * @param positionSideType + */ + void changePositionSideMode(PositionSideType positionSideType); + + List getPositionInformation(String symbol); + } diff --git a/src/main/java/com/binance/api/client/domain/PositionSideType.java b/src/main/java/com/binance/api/client/domain/PositionSideType.java new file mode 100644 index 000000000..a82dec195 --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/PositionSideType.java @@ -0,0 +1,5 @@ +package com.binance.api.client.domain; + +public enum PositionSideType { + HEDGE_MODE, ONE_WAY +} diff --git a/src/main/java/com/binance/api/client/domain/PrecisionFormat.java b/src/main/java/com/binance/api/client/domain/PrecisionFormat.java new file mode 100644 index 000000000..6600f87d0 --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/PrecisionFormat.java @@ -0,0 +1,41 @@ +package com.binance.api.client.domain; + +public enum PrecisionFormat { + ONE(1, "#.#"), + TWO(2, "#.##"), + THREE(3, "#.###"), + FOUR(4, "#.####"), + FIVE(5, "#.#####"), + SIX(6, "#.######"), + SEVEN(7, "#.#######"), + EIGHT(8, "#.########"); + + private final int len; + private final String format; + + PrecisionFormat(int len, String format) { + this.len = len; + this.format = format; + } + + public static String getPrecisionFormat(int len) { + switch (len) { + case 1: + return PrecisionFormat.ONE.format; + case 2: + return PrecisionFormat.TWO.format; + case 3: + return PrecisionFormat.THREE.format; + case 4: + return PrecisionFormat.FOUR.format; + case 5: + return PrecisionFormat.FIVE.format; + case 6: + return PrecisionFormat.SIX.format; + case 7: + return PrecisionFormat.SEVEN.format; + default: + return PrecisionFormat.EIGHT.format; + } + } +} diff --git a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java index 300399f7f..01ec03b0c 100644 --- a/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java +++ b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java @@ -43,7 +43,7 @@ public class FuturesNewOrder { /** * reduceOnly. */ - private boolean reduceOnly; + private Boolean reduceOnly; /** * Price. @@ -100,6 +100,9 @@ public class FuturesNewOrder { */ private long timestamp; + public FuturesNewOrder() { + } + /** * Creates a new order with all required parameters. */ @@ -129,19 +132,33 @@ public FuturesNewOrder(String symbol, OrderSide side, OrderType type, String qua this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; } - public FuturesNewOrder(String symbol, OrderSide side, OrderType type, TimeInForce timeInForce, String quantity, String price, boolean reduceOnly) { + public FuturesNewOrder(String symbol, OrderSide side, OrderType type, TimeInForce timeInForce, String quantity, String price, WorkingType workingType, boolean reduceOnly) { this.symbol = symbol; this.side = side; this.type = type; this.timeInForce = timeInForce; this.quantity = quantity; this.price = price; + this.workingType = workingType; this.reduceOnly = reduceOnly; this.newOrderRespType = NewOrderResponseType.RESULT; this.timestamp = System.currentTimeMillis(); this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; } + public FuturesNewOrder(String symbol, OrderSide side, OrderType type, TimeInForce timeInForce, WorkingType workingType, String quantity, String price) { + this.symbol = symbol; + this.side = side; + this.type = type; + this.timeInForce = timeInForce; + this.workingType = workingType; + this.quantity = quantity; + this.price = price; + this.newOrderRespType = NewOrderResponseType.RESULT; + this.timestamp = System.currentTimeMillis(); + this.recvWindow = BinanceApiConstants.DEFAULT_RECEIVING_WINDOW; + } + public String getSymbol() { return symbol; } @@ -190,11 +207,11 @@ public void setQuantity(String quantity) { this.quantity = quantity; } - public boolean isReduceOnly() { + public Boolean isReduceOnly() { return reduceOnly; } - public void setReduceOnly(boolean reduceOnly) { + public void setReduceOnly(Boolean reduceOnly) { this.reduceOnly = reduceOnly; } @@ -286,12 +303,12 @@ public void setTimestamp(long timestamp) { this.timestamp = timestamp; } - public static FuturesNewOrder limitLong(String symbol, TimeInForce timeInForce, String quantity, String price, boolean reduceOnly) { - return new FuturesNewOrder(symbol, OrderSide.BUY, OrderType.LIMIT, timeInForce, quantity, price, reduceOnly); + public static FuturesNewOrder limitLong(String symbol, TimeInForce timeInForce, String quantity, String price, WorkingType workingType, boolean reduceOnly) { + return new FuturesNewOrder(symbol, OrderSide.BUY, OrderType.LIMIT, timeInForce, quantity, price, workingType, reduceOnly); } - public static FuturesNewOrder limitShort(String symbol, TimeInForce timeInForce, String quantity, String price, boolean reduceOnly) { - return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.LIMIT, timeInForce, quantity, price, reduceOnly); + public static FuturesNewOrder limitShort(String symbol, TimeInForce timeInForce, String quantity, String price, WorkingType workingType, boolean reduceOnly) { + return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.LIMIT, timeInForce, quantity, price, workingType, reduceOnly); } public static FuturesNewOrder MarketLong(String symbol, String quantity, boolean reduceOnly) { @@ -301,4 +318,97 @@ public static FuturesNewOrder MarketLong(String symbol, String quantity, boolean public static FuturesNewOrder MarketShort(String symbol, String quantity, boolean reduceOnly) { return new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.MARKET, quantity, reduceOnly); } -} + + public static FuturesNewOrder stopLimitLong(String symbol, String quantity, String stopPrice, String price, WorkingType workingType, boolean reduceOnly) { + FuturesNewOrder futuresNewOrder = new FuturesNewOrder(symbol, OrderSide.BUY, OrderType.STOP, quantity, reduceOnly); + futuresNewOrder.setStopPrice(stopPrice); + futuresNewOrder.setPrice(price); + futuresNewOrder.workingType = workingType; + return futuresNewOrder; + } + + public static FuturesNewOrder stopLimitShort(String symbol, String quantity, String stopPrice, String price, WorkingType workingType, boolean reduceOnly) { + FuturesNewOrder futuresNewOrder = new FuturesNewOrder(symbol, OrderSide.SELL, OrderType.STOP, quantity, reduceOnly); + futuresNewOrder.setStopPrice(stopPrice); + futuresNewOrder.setPrice(price); + futuresNewOrder.workingType = workingType; + return futuresNewOrder; + } + + public static FuturesNewOrder stopMarket(String symbol, OrderSide orderSide, String stopPrice, WorkingType workingType) { + FuturesNewOrder order = new FuturesNewOrder(); + order.setSymbol(symbol); + order.setSide(orderSide); + order.setStopPrice(stopPrice); + order.setClosePosition(true); + order.setWorkingType(workingType); + order.setType(OrderType.STOP_MARKET); + order.setNewOrderRespType(NewOrderResponseType.RESULT); + order.setTimestamp(System.currentTimeMillis()); + order.setRecvWindow(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW); + return order; + } + + public static FuturesNewOrder takeProfitMarket(String symbol, OrderSide orderSide, String stopPrice, WorkingType workingType) { + FuturesNewOrder order = new FuturesNewOrder(); + order.setSymbol(symbol); + order.setSide(orderSide); + order.setStopPrice(stopPrice); + order.setClosePosition(true); + order.setWorkingType(workingType); + order.setType(OrderType.TAKE_PROFIT_MARKET); + order.setNewOrderRespType(NewOrderResponseType.RESULT); + order.setTimestamp(System.currentTimeMillis()); + order.setRecvWindow(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW); + return order; + } + + public static FuturesNewOrder limitHedgeOrder(String symbol, OrderSide orderSide, PositionSide positionSide, TimeInForce timeInForce, String quantity, String price,WorkingType workingType) { + FuturesNewOrder order = new FuturesNewOrder(); + order.setSymbol(symbol); + order.setType(OrderType.LIMIT); + order.setPositionSide(positionSide); + order.setSide(orderSide); + order.setTimeInForce(timeInForce); + order.setQuantity(quantity); + order.setPrice(price); + order.setWorkingType(workingType); + order.setNewOrderRespType(NewOrderResponseType.RESULT); + order.setTimestamp(System.currentTimeMillis()); + order.setRecvWindow(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW); + return order; + } + + public static FuturesNewOrder stopLimitHedgeOrder(String symbol, OrderSide orderSide, PositionSide positionSide, TimeInForce timeInForce, String quantity, String stopPrice, String price,WorkingType workingType) { + FuturesNewOrder order = new FuturesNewOrder(); + order.setSymbol(symbol); + order.setType(OrderType.STOP); + order.setPositionSide(positionSide); + order.setSide(orderSide); + order.setTimeInForce(timeInForce); + order.setQuantity(quantity); + order.setStopPrice(stopPrice); + order.setPrice(price); + order.setWorkingType(workingType); + order.setNewOrderRespType(NewOrderResponseType.RESULT); + order.setTimestamp(System.currentTimeMillis()); + order.setRecvWindow(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW); + return order; + } + + public static FuturesNewOrder stopLoseHedgeOrder(String symbol, OrderSide orderSide, PositionSide positionSide, String stopPrice, WorkingType workingType) { + FuturesNewOrder order = new FuturesNewOrder(); + order.setSymbol(symbol); + order.setType(OrderType.STOP_MARKET); + order.setPositionSide(positionSide); + order.setSide(orderSide); + order.setStopPrice(stopPrice); + order.setClosePosition(true); + order.setWorkingType(workingType); + order.setNewOrderRespType(NewOrderResponseType.RESULT); + order.setTimestamp(System.currentTimeMillis()); + order.setRecvWindow(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW); + return order; + } + +} \ No newline at end of file diff --git a/src/main/java/com/binance/api/client/domain/account/PositionInformation.java b/src/main/java/com/binance/api/client/domain/account/PositionInformation.java new file mode 100755 index 000000000..bbb8929cd --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/PositionInformation.java @@ -0,0 +1,142 @@ +package com.binance.api.client.domain.account; + +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.MarginType; +import com.binance.api.client.domain.PositionSide; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * An asset balance in an Account. + * + * @see Account + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class PositionInformation { + private String entryPrice; + private String marginType; + private boolean isAutoAddMargin; + private String isolatedMargin; + private int leverage; + private String liquidationPrice; + private String markPrice; + private String maxNotionalValue; + private String positionAmt; + private String symbol; + private String unRealizedProfit; + private PositionSide positionSide; + + public String getEntryPrice() { + return entryPrice; + } + + public void setEntryPrice(String entryPrice) { + this.entryPrice = entryPrice; + } + + public String getMarginType() { + return marginType; + } + + public void setMarginType(String marginType) { + this.marginType = marginType; + } + + public boolean isAutoAddMargin() { + return isAutoAddMargin; + } + + public void setAutoAddMargin(boolean autoAddMargin) { + isAutoAddMargin = autoAddMargin; + } + + public String getIsolatedMargin() { + return isolatedMargin; + } + + public void setIsolatedMargin(String isolatedMargin) { + this.isolatedMargin = isolatedMargin; + } + + public int getLeverage() { + return leverage; + } + + public void setLeverage(int leverage) { + this.leverage = leverage; + } + + public String getLiquidationPrice() { + return liquidationPrice; + } + + public void setLiquidationPrice(String liquidationPrice) { + this.liquidationPrice = liquidationPrice; + } + + public String getMarkPrice() { + return markPrice; + } + + public void setMarkPrice(String markPrice) { + this.markPrice = markPrice; + } + + public String getMaxNotionalValue() { + return maxNotionalValue; + } + + public void setMaxNotionalValue(String maxNotionalValue) { + this.maxNotionalValue = maxNotionalValue; + } + + public String getPositionAmt() { + return positionAmt; + } + + public void setPositionAmt(String positionAmt) { + this.positionAmt = positionAmt; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getUnRealizedProfit() { + return unRealizedProfit; + } + + public void setUnRealizedProfit(String unRealizedProfit) { + this.unRealizedProfit = unRealizedProfit; + } + + public PositionSide getPositionSide() { + return positionSide; + } + + public void setPositionSide(PositionSide positionSide) { + this.positionSide = positionSide; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("entryPrice", entryPrice) + .append("marginType", marginType) + .append("isAutoAddMargin", isAutoAddMargin) + .append("isolatedMargin", isolatedMargin) + .append("leverage", leverage) + .append("liquidationPrice", liquidationPrice) + .append("markPrice", markPrice) + .append("maxNotionalValue", maxNotionalValue) + .append("positionAmt", positionAmt) + .append("symbol", symbol) + .append("unRealizedProfit", unRealizedProfit) + .append("positionSide", positionSide) + .toString(); + } +} diff --git a/src/main/java/com/binance/api/client/domain/general/SymbolInfo.java b/src/main/java/com/binance/api/client/domain/general/SymbolInfo.java index ca2723235..40f292277 100755 --- a/src/main/java/com/binance/api/client/domain/general/SymbolInfo.java +++ b/src/main/java/com/binance/api/client/domain/general/SymbolInfo.java @@ -13,159 +13,168 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class SymbolInfo { - private String symbol; - - private SymbolStatus status; - - private String baseAsset; - - private Integer baseAssetPrecision; - - private String quoteAsset; - - private Integer quotePrecision; - - private List orderTypes; - - private boolean icebergAllowed; - - private boolean ocoAllowed; - - private boolean quoteOrderQtyMarketAllowed; - - private boolean isSpotTradingAllowed; - - private boolean isMarginTradingAllowed; - - private List filters; - - public String getSymbol() { - return symbol; - } - - public void setSymbol(String symbol) { - this.symbol = symbol; - } - - public SymbolStatus getStatus() { - return status; - } - - public void setStatus(SymbolStatus status) { - this.status = status; - } - - public String getBaseAsset() { - return baseAsset; - } - - public void setBaseAsset(String baseAsset) { - this.baseAsset = baseAsset; - } - - public Integer getBaseAssetPrecision() { - return baseAssetPrecision; - } - - public void setBaseAssetPrecision(Integer baseAssetPrecision) { - this.baseAssetPrecision = baseAssetPrecision; - } - - public String getQuoteAsset() { - return quoteAsset; - } - - public void setQuoteAsset(String quoteAsset) { - this.quoteAsset = quoteAsset; - } - - public Integer getQuotePrecision() { - return quotePrecision; - } - - public void setQuotePrecision(Integer quotePrecision) { - this.quotePrecision = quotePrecision; - } - - public List getOrderTypes() { - return orderTypes; - } - - public void setOrderTypes(List orderTypes) { - this.orderTypes = orderTypes; - } - - public boolean isIcebergAllowed() { - return icebergAllowed; - } - - public void setIcebergAllowed(boolean icebergAllowed) { - this.icebergAllowed = icebergAllowed; - } - - public boolean isOcoAllowed() { - return ocoAllowed; - } - - public void setOcoAllowed(boolean ocoAllowed) { - this.ocoAllowed = ocoAllowed; - } - - public boolean isQuoteOrderQtyMarketAllowed() { - return quoteOrderQtyMarketAllowed; - } - - public void setQuoteOrderQtyMarketAllowed(boolean quoteOrderQtyMarketAllowed) { - this.quoteOrderQtyMarketAllowed = quoteOrderQtyMarketAllowed; - } - - public boolean isSpotTradingAllowed() { - return isSpotTradingAllowed; - } - - public void setIsSpotTradingAllowed(boolean isSpotTradingAllowed) { - this.isSpotTradingAllowed = isSpotTradingAllowed; - } - - public boolean isMarginTradingAllowed() { - return isMarginTradingAllowed; - } - - public void setIsMarginTradingAllowed(boolean isMarginTradingAllowed) { - this.isMarginTradingAllowed = isMarginTradingAllowed; - } - - public List getFilters() { - return filters; - } - - public void setFilters(List filters) { - this.filters = filters; - } - - /** - * @param filterType filter type to filter for. - * @return symbol filter information for the provided filter type. - */ - public SymbolFilter getSymbolFilter(FilterType filterType) { - return filters.stream() - .filter(symbolFilter -> symbolFilter.getFilterType() == filterType) - .findFirst() - .get(); - } - - @Override - public String toString() { - return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) - .append("symbol", symbol) - .append("status", status) - .append("baseAsset", baseAsset) - .append("baseAssetPrecision", baseAssetPrecision) - .append("quoteAsset", quoteAsset) - .append("quotePrecision", quotePrecision) - .append("orderTypes", orderTypes) - .append("icebergAllowed", icebergAllowed) - .append("filters", filters) - .toString(); - } + private String symbol; + private SymbolStatus status; + private String baseAsset; + private Integer baseAssetPrecision; + private String quoteAsset; + private Integer quotePrecision; + private List orderTypes; + private boolean icebergAllowed; + private boolean ocoAllowed; + private boolean quoteOrderQtyMarketAllowed; + private boolean isSpotTradingAllowed; + private boolean isMarginTradingAllowed; + private int pricePrecision; + private int quantityPrecision; + + private List filters; + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public SymbolStatus getStatus() { + return status; + } + + public void setStatus(SymbolStatus status) { + this.status = status; + } + + public String getBaseAsset() { + return baseAsset; + } + + public void setBaseAsset(String baseAsset) { + this.baseAsset = baseAsset; + } + + public Integer getBaseAssetPrecision() { + return baseAssetPrecision; + } + + public void setBaseAssetPrecision(Integer baseAssetPrecision) { + this.baseAssetPrecision = baseAssetPrecision; + } + + public String getQuoteAsset() { + return quoteAsset; + } + + public void setQuoteAsset(String quoteAsset) { + this.quoteAsset = quoteAsset; + } + + public Integer getQuotePrecision() { + return quotePrecision; + } + + public void setQuotePrecision(Integer quotePrecision) { + this.quotePrecision = quotePrecision; + } + + public List getOrderTypes() { + return orderTypes; + } + + public void setOrderTypes(List orderTypes) { + this.orderTypes = orderTypes; + } + + public boolean isIcebergAllowed() { + return icebergAllowed; + } + + public void setIcebergAllowed(boolean icebergAllowed) { + this.icebergAllowed = icebergAllowed; + } + + public boolean isOcoAllowed() { + return ocoAllowed; + } + + public void setOcoAllowed(boolean ocoAllowed) { + this.ocoAllowed = ocoAllowed; + } + + public boolean isQuoteOrderQtyMarketAllowed() { + return quoteOrderQtyMarketAllowed; + } + + public void setQuoteOrderQtyMarketAllowed(boolean quoteOrderQtyMarketAllowed) { + this.quoteOrderQtyMarketAllowed = quoteOrderQtyMarketAllowed; + } + + public boolean isSpotTradingAllowed() { + return isSpotTradingAllowed; + } + + public void setIsSpotTradingAllowed(boolean isSpotTradingAllowed) { + this.isSpotTradingAllowed = isSpotTradingAllowed; + } + + public boolean isMarginTradingAllowed() { + return isMarginTradingAllowed; + } + + public void setIsMarginTradingAllowed(boolean isMarginTradingAllowed) { + this.isMarginTradingAllowed = isMarginTradingAllowed; + } + + public List getFilters() { + return filters; + } + + public void setFilters(List filters) { + this.filters = filters; + } + + public int getPricePrecision() { + return pricePrecision; + } + + public void setPricePrecision(int pricePrecision) { + this.pricePrecision = pricePrecision; + } + + public int getQuantityPrecision() { + return quantityPrecision; + } + + public void setQuantityPrecision(int quantityPrecision) { + this.quantityPrecision = quantityPrecision; + } + + /** + * @param filterType filter type to filter for. + * @return symbol filter information for the provided filter type. + */ + public SymbolFilter getSymbolFilter(FilterType filterType) { + return filters.stream() + .filter(symbolFilter -> symbolFilter.getFilterType() == filterType) + .findFirst() + .get(); + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceApiConstants.TO_STRING_BUILDER_STYLE) + .append("symbol", symbol) + .append("status", status) + .append("baseAsset", baseAsset) + .append("baseAssetPrecision", baseAssetPrecision) + .append("quoteAsset", quoteAsset) + .append("quotePrecision", quotePrecision) + .append("orderTypes", orderTypes) + .append("icebergAllowed", icebergAllowed) + .append("filters", filters) + .append("quantityPrecision", quantityPrecision) + .append("pricePrecision", pricePrecision) + .toString(); + } } diff --git a/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java index b13ac6709..348dba3e7 100755 --- a/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java @@ -1,19 +1,16 @@ package com.binance.api.client.impl.async; -import com.binance.api.client.api.async.BinanceApiAsyncFuturesRestClient; import com.binance.api.client.api.BinanceApiCallback; +import com.binance.api.client.api.BinanceFuturesApiService; +import com.binance.api.client.api.async.BinanceApiAsyncFuturesRestClient; import com.binance.api.client.constant.BinanceApiConstants; -import com.binance.api.client.domain.account.FuturesAccount; -import com.binance.api.client.domain.account.FuturesNewOrder; -import com.binance.api.client.domain.account.FuturesNewOrderResponse; -import com.binance.api.client.domain.account.Order; +import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.CancelOrderRequest; import com.binance.api.client.domain.account.request.CancelOrderResponse; import com.binance.api.client.domain.account.request.OrderRequest; import com.binance.api.client.domain.account.request.OrderStatusRequest; import com.binance.api.client.impl.BinanceApiCallbackAdapter; import com.binance.api.client.impl.BinanceApiServiceGenerator; -import com.binance.api.client.api.BinanceFuturesApiService; import java.util.List; @@ -71,4 +68,11 @@ public void getOrderStatus(OrderStatusRequest orderStatusRequest, BinanceApiCall orderStatusRequest.getOrderId(), orderStatusRequest.getOrigClientOrderId(), orderStatusRequest.getRecvWindow(), orderStatusRequest.getTimestamp()).enqueue(new BinanceApiCallbackAdapter<>(callback)); } + + @Override + public void getPositionInformation(String symbol, BinanceApiCallback> callback) { + long timestamp = System.currentTimeMillis(); + long receivingWindow = BinanceApiConstants.DEFAULT_MARGIN_RECEIVING_WINDOW; + binanceFuturesApiService.getPositionInformation(symbol, receivingWindow, timestamp); + } } diff --git a/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java index 43070379d..4ba782af6 100755 --- a/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java @@ -3,6 +3,7 @@ import com.binance.api.client.api.BinanceFuturesApiService; import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.PositionSideType; import com.binance.api.client.domain.account.*; import com.binance.api.client.domain.account.request.CancelOrderRequest; import com.binance.api.client.domain.account.request.CancelOrderResponse; @@ -107,6 +108,19 @@ public void closeUserDataStream(String listenKey) { executeSync(binanceApiService.closeAliveUserDataStream(listenKey)); } + @Override + public void changePositionSideMode(PositionSideType positionSideType) { + long timestamp = System.currentTimeMillis(); + boolean positionSide = positionSideType.equals(PositionSideType.HEDGE_MODE); + executeSync(binanceApiService.changePositionSideMode(positionSide, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp)); + } + + @Override + public List getPositionInformation(String symbol) { + long timestamp = System.currentTimeMillis(); + return executeSync(binanceApiService.getPositionInformation(symbol, BinanceApiConstants.DEFAULT_RECEIVING_WINDOW, timestamp)); + } + @Override public OrderBook getOrderBook(String symbol, Integer limit) { return executeSync(binanceApiService.getOrderBook(symbol, limit)); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java index 584942cee..bde8e0597 100755 --- a/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java @@ -2,6 +2,7 @@ import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; import com.binance.api.client.domain.TimeInForce; +import com.binance.api.client.domain.WorkingType; import com.binance.api.client.domain.account.FuturesNewOrderResponse; import com.binance.api.client.domain.account.request.CancelOrderRequest; import com.binance.api.client.domain.account.request.CancelOrderResponse; @@ -24,7 +25,7 @@ public static void main(String[] args) { BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); BinanceApiFuturesRestClient client = futuresApiClientFactory.newRestClient(); - FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, "13", "27", false)); + FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, "13", "27", WorkingType.CONTRACT_PRICE, false)); long orderId = futuresOrderResponse.getOrderId(); System.out.println("OrderID: " + orderId); diff --git a/src/test/java/com/binance/api/examples/futures/FuturesPositionInformationExample.java b/src/test/java/com/binance/api/examples/futures/FuturesPositionInformationExample.java new file mode 100755 index 000000000..dc6b34001 --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesPositionInformationExample.java @@ -0,0 +1,41 @@ +package com.binance.api.examples.futures; + +import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; +import com.binance.api.client.domain.MarginType; +import com.binance.api.client.domain.account.PositionInformation; +import com.binance.api.client.factory.BinanceAbstractFactory; +import com.binance.api.client.factory.BinanceFuturesApiClientFactory; + +import java.util.List; + +/** + * Examples on how to place orders, cancel them. + * + * @author Mahdi Sheikh Hosseini + */ +public class FuturesPositionInformationExample { + private static final String SYMBOL = "TOMOUSDT"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory futuresApiClientFactory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); + BinanceApiFuturesRestClient client = futuresApiClientFactory.newRestClient(); + + List positionList = client.getPositionInformation(SYMBOL); + + for (PositionInformation positionInformation : positionList) { + System.out.println(positionInformation.getSymbol()); + System.out.println(positionInformation.getEntryPrice()); + System.out.println(positionInformation.getLeverage()); + System.out.println(positionInformation.getPositionSide()); + System.out.println(positionInformation.isAutoAddMargin()); + System.out.println("-----------------------------------"); + } + + System.out.println("FINISHED"); + +// System.out.println(MarginType.valueOf("isolated")); + } + +} diff --git a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java index 73c2a6297..bd686bb56 100755 --- a/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java +++ b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java @@ -1,9 +1,16 @@ package com.binance.api.examples.testnet; import com.binance.api.client.api.sync.BinanceApiFuturesRestClient; +import com.binance.api.client.constant.BinanceApiConstants; +import com.binance.api.client.domain.*; +import com.binance.api.client.domain.account.FuturesNewOrder; +import com.binance.api.client.domain.general.ExchangeInfo; +import com.binance.api.client.domain.general.SymbolInfo; import com.binance.api.client.factory.BinanceAbstractFactory; import com.binance.api.client.factory.BinanceFuturesApiClientFactory; +import java.text.DecimalFormat; + /** * Examples on how to place orders, cancel them. * @@ -11,8 +18,8 @@ */ public class TestnetOrdersExample { private static final String SYMBOL = "BTCUSDT"; - private static final String API_KEY = "c8be940e7d3ebbfe79842236d6110b88e8350059ca48593a4809bc02794b837b"; - private static final String SECRET_KEY = "44090bdaf2e1b4d9f46bb772bc630ace9c3a00c3294ab61315f1c0e817ba29d6"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; public static void main(String[] args) throws InterruptedException { @@ -48,6 +55,25 @@ public static void main(String[] args) throws InterruptedException { // Short Limit Order // FuturesNewOrderResponse shortLimit = futureClient.newOrder(FuturesNewOrder.limitShort(SYMBOL, TimeInForce.GTC, "1.5", "59050", false)); // System.out.println(shortLimit); + + ExchangeInfo exchangeInfo = futureClient.getExchangeInfo(); + SymbolInfo symbolInfo = exchangeInfo.getSymbolInfo(SYMBOL); + int pricePrecision = symbolInfo.getPricePrecision(); + int quantityPrecision = symbolInfo.getQuantityPrecision(); + + String formatQuantity = new DecimalFormat(PrecisionFormat.getPrecisionFormat(quantityPrecision)).format(2); + String formatPrice = new DecimalFormat(PrecisionFormat.getPrecisionFormat(pricePrecision)).format(58200); + + FuturesNewOrder futuresNewOrder = new FuturesNewOrder(); + futuresNewOrder.setSymbol(SYMBOL); + futuresNewOrder.setSide(OrderSide.BUY); + futuresNewOrder.setType(OrderType.STOP_MARKET); + futuresNewOrder.setStopPrice("60000"); + futuresNewOrder.setClosePosition(true); + futuresNewOrder.setTimestamp(System.currentTimeMillis()); + futuresNewOrder.setRecvWindow(BinanceApiConstants.DEFAULT_RECEIVING_WINDOW); + + futureClient.newOrder(futuresNewOrder); } }