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 index bf74d5d02..4cb3add6a --- 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/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/BinanceApiAsyncRestClient.java b/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java deleted file mode 100755 index d0e3b1c01..000000000 --- a/src/main/java/com/binance/api/client/BinanceApiAsyncRestClient.java +++ /dev/null @@ -1,314 +0,0 @@ -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.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 java.util.List; - -/** - * Binance API facade, supporting asynchronous/non-blocking access Binance's REST API. - */ -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.) - * @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/BinanceApiClientFactory.java b/src/main/java/com/binance/api/client/BinanceApiClientFactory.java deleted file mode 100755 index 842ad20d5..000000000 --- a/src/main/java/com/binance/api/client/BinanceApiClientFactory.java +++ /dev/null @@ -1,95 +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 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); - } -} diff --git a/src/main/java/com/binance/api/client/BinanceApiRestClient.java b/src/main/java/com/binance/api/client/BinanceApiRestClient.java deleted file mode 100755 index bfc4797c4..000000000 --- a/src/main/java/com/binance/api/client/BinanceApiRestClient.java +++ /dev/null @@ -1,298 +0,0 @@ -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.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 java.util.List; - -/** - * Binance API facade, supporting synchronous/blocking access Binance's REST API. - */ -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); -} 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..3ed096184 --- /dev/null +++ b/src/main/java/com/binance/api/client/BinanceEngineType.java @@ -0,0 +1,12 @@ +package com.binance.api.client; + +/** + * @author Mahdi Sheikh Hosseini + */ +public enum BinanceEngineType { + SPOT, + MARGIN, + SWAP, + FUTURES, + TESTNET +} 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/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/impl/BinanceApiService.java b/src/main/java/com/binance/api/client/api/BinanceApiService.java similarity index 98% 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 35e21de0c..d247ff7ad 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; @@ -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); @@ -152,15 +147,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 @@ -233,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/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/api/BinanceFuturesApiService.java b/src/main/java/com/binance/api/client/api/BinanceFuturesApiService.java new file mode 100755 index 000000000..fc2a36029 --- /dev/null +++ b/src/main/java/com/binance/api/client/api/BinanceFuturesApiService.java @@ -0,0 +1,147 @@ +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.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(); + + // 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); + + // 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); + + @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); + + @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 new file mode 100755 index 000000000..3e38d615c --- /dev/null +++ b/src/main/java/com/binance/api/client/api/async/BinanceApiAsyncFuturesRestClient.java @@ -0,0 +1,33 @@ +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; +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); + + void getPositionInformation(String symbol, BinanceApiCallback> callback); + +} \ No newline at end of file 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/api/async/BinanceApiSpotAsyncRestClient.java b/src/main/java/com/binance/api/client/api/async/BinanceApiSpotAsyncRestClient.java new file mode 100755 index 000000000..509eaebf0 --- /dev/null +++ b/src/main/java/com/binance/api/client/api/async/BinanceApiSpotAsyncRestClient.java @@ -0,0 +1,290 @@ +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; +import com.binance.api.client.domain.general.ExchangeInfo; +import com.binance.api.client.domain.general.ServerTime; +import com.binance.api.client.domain.market.*; + +import java.util.List; + +/** + * Binance API facade, supporting asynchronous/non-blocking access Binance's REST API. + */ +public interface BinanceApiSpotAsyncRestClient { + + // 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/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/api/sync/BinanceApiFuturesRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java new file mode 100755 index 000000000..f913a8c61 --- /dev/null +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiFuturesRestClient.java @@ -0,0 +1,71 @@ +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 { + + /** + * 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); + + + /** + * Change leverage + * + * @param leverageRequest + * @return LeverageResponse + */ + 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); + + /** + * 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/api/sync/BinanceApiGeneralRestClient.java b/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java new file mode 100755 index 000000000..c2c58080e --- /dev/null +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiGeneralRestClient.java @@ -0,0 +1,156 @@ +package com.binance.api.client.api.sync; + +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.*; + +import java.util.List; + +/** + * Binance API facade, supporting synchronous/blocking access Binance's REST API. + */ +public interface BinanceApiGeneralRestClient { + + // 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); + + /** + * 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. + * + * @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 symbol. + * + * @param symbol ticker symbol (e.g. ETHBTC) + */ + TickerPrice getPrice(String symbol); + + + /** + * 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); +} 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 83% 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 6f100a365..650aaa447 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,39 +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); - - // 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 + * + * @param asset asset to repay * @param amount amount to repay * @return transaction id */ @@ -79,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 */ @@ -87,6 +65,7 @@ public interface BinanceApiMarginRestClient { /** * Query loan record + * * @param asset asset to query * @return repay records */ @@ -94,6 +73,7 @@ public interface BinanceApiMarginRestClient { /** * Query max borrowable + * * @param asset asset to query * @return max borrowable */ @@ -101,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 */ @@ -117,11 +99,32 @@ 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); + // 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 new file mode 100755 index 000000000..69f66aaa9 --- /dev/null +++ b/src/main/java/com/binance/api/client/api/sync/BinanceApiSpotRestClient.java @@ -0,0 +1,152 @@ +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); + + // 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/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/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 d05538efb..0384771ab --- a/src/main/java/com/binance/api/client/config/BinanceApiConfig.java +++ b/src/main/java/com/binance/api/client/config/BinanceApiConfig.java @@ -1,52 +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()); - } - +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..2fd4c94cd --- /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/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/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/OrderType.java b/src/main/java/com/binance/api/client/domain/OrderType.java index 78ee6b6fe..558610e44 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,15 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) public enum OrderType { - LIMIT, - MARKET, - STOP_LOSS, - STOP_LOSS_LIMIT, - TAKE_PROFIT, - TAKE_PROFIT_LIMIT, - LIMIT_MAKER + LIMIT, + MARKET, + STOP, + STOP_LOSS, + STOP_LOSS_LIMIT, + TAKE_PROFIT, + TAKE_PROFIT_LIMIT, + LIMIT_MAKER, + STOP_MARKET, + TRAILING_STOP_MARKET, + TAKE_PROFIT_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..2aed098d2 --- /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/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/WorkingType.java b/src/main/java/com/binance/api/client/domain/WorkingType.java new file mode 100755 index 000000000..a04d70303 --- /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..831424c88 --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/FuturesAccount.java @@ -0,0 +1,210 @@ +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)); + } + + 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) + .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..6998b6c2c --- /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 100644 index 000000000..01ec03b0c --- /dev/null +++ b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrder.java @@ -0,0 +1,414 @@ +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; + + public FuturesNewOrder() { + } + + /** + * 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 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; + } + + 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, 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, 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) { + 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, 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/FuturesNewOrderResponse.java b/src/main/java/com/binance/api/client/domain/account/FuturesNewOrderResponse.java new file mode 100644 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..0ba301247 --- /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/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/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/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/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/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/event/CandlestickEvent.java b/src/main/java/com/binance/api/client/domain/event/CandlestickEvent.java index f7c04b3df..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 @@ -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,190 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class CandlestickEvent { - private String eventType; - - private long eventTime; - - private String symbol; - - private Long openTime; - - private String open; - - private String high; - - private String low; - - private String close; - - private String volume; - - private Long closeTime; - - private String intervalId; - - private Long firstTradeId; - - private Long lastTradeId; - - private String quoteAssetVolume; - - private Long numberOfTrades; - - private String takerBuyBaseAssetVolume; - - private String takerBuyQuoteAssetVolume; - - private Boolean isBarFinal; - - public String getEventType() { - return eventType; - } - - public void setEventType(String eventType) { - this.eventType = eventType; - } - - 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 Long getOpenTime() { - return openTime; - } - - public void setOpenTime(Long openTime) { - this.openTime = openTime; - } - - public String getOpen() { - return open; - } - - public void setOpen(String open) { - this.open = open; - } - - public String getHigh() { - return high; - } - - public void setHigh(String high) { - this.high = high; - } - - public String getLow() { - return low; - } - - public void setLow(String low) { - this.low = low; - } - - public String getClose() { - return close; - } - - public void setClose(String close) { - this.close = close; - } - - public String getVolume() { - return volume; - } - - public void setVolume(String volume) { - this.volume = volume; - } - - public Long getCloseTime() { - return 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(); - } + private String eventType; + private long eventTime; + private String symbol; + private long openTime; + private String open; + private String high; + private String low; + private String close; + private String volume; + private long closeTime; + private CandlestickInterval intervalId; + private long firstTradeId; + private long lastTradeId; + private String quoteAssetVolume; + private long numberOfTrades; + private String takerBuyBaseAssetVolume; + private String takerBuyQuoteAssetVolume; + private Boolean isBarFinal; + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + 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 long getOpenTime() { + return openTime; + } + + public void setOpenTime(long openTime) { + this.openTime = openTime; + } + + public String getOpen() { + return open; + } + + public void setOpen(String open) { + this.open = open; + } + + public String getHigh() { + return high; + } + + public void setHigh(String high) { + this.high = high; + } + + public String getLow() { + return low; + } + + public void setLow(String low) { + this.low = low; + } + + public String getClose() { + return close; + } + + public void setClose(String close) { + this.close = close; + } + + public String getVolume() { + return volume; + } + + public void setVolume(String volume) { + this.volume = volume; + } + + public long getCloseTime() { + return closeTime; + } + + public void setCloseTime(long closeTime) { + this.closeTime = closeTime; + } + + 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/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..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 @@ -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,81 @@ @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 void setEventTime(long eventTime) { - this.eventTime = eventTime; - } + public UserDataUpdateEventType getEventType() { + return eventType; + } - public AccountUpdateEvent getAccountUpdateEvent() { - return accountUpdateEvent; - } + public void setEventType(UserDataUpdateEventType eventType) { + this.eventType = eventType; + } - public void setAccountUpdateEvent(AccountUpdateEvent accountUpdateEvent) { - this.accountUpdateEvent = accountUpdateEvent; - } + public long getEventTime() { + return eventTime; + } - public BalanceUpdateEvent getBalanceUpdateEvent() { - return balanceUpdateEvent; - } + public void setEventTime(long eventTime) { + this.eventTime = eventTime; + } - public void setBalanceUpdateEvent(BalanceUpdateEvent balanceUpdateEvent) { - this.balanceUpdateEvent = balanceUpdateEvent; - } + public AccountUpdateEvent getAccountUpdateEvent() { + return accountUpdateEvent; + } - public OrderTradeUpdateEvent getOrderTradeUpdateEvent() { - return orderTradeUpdateEvent; - } + public void setAccountUpdateEvent(AccountUpdateEvent accountUpdateEvent) { + this.accountUpdateEvent = accountUpdateEvent; + } - public void setOrderTradeUpdateEvent(OrderTradeUpdateEvent orderTradeUpdateEvent) { - this.orderTradeUpdateEvent = orderTradeUpdateEvent; - } + public BalanceUpdateEvent getBalanceUpdateEvent() { + return 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 void setBalanceUpdateEvent(BalanceUpdateEvent balanceUpdateEvent) { + this.balanceUpdateEvent = balanceUpdateEvent; } - return sb.toString(); - } - public enum UserDataUpdateEventType { - ACCOUNT_UPDATE("outboundAccountInfo"), - ACCOUNT_POSITION_UPDATE("outboundAccountPosition"), - BALANCE_UPDATE("balanceUpdate"), - ORDER_TRADE_UPDATE("executionReport"), - ; + public ExecutionReport getExecutionReport() { + return executionReport; + } - private final String eventTypeId; + public void setExecutionReport(ExecutionReport executionReport) { + this.executionReport = executionReport; + } - UserDataUpdateEventType(String eventTypeId) { - this.eventTypeId = eventTypeId; + public OrderTradeUpdate getOrderTradeUpdate() { + return orderTradeUpdate; } - public String getEventTypeId() { - return eventTypeId; + public void setOrderTradeUpdate(OrderTradeUpdate orderTradeUpdate) { + this.orderTradeUpdate = orderTradeUpdate; } - 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); + @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(); } - } } 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..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; @@ -18,47 +17,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/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/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/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/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/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/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..4bfadef27 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceAbstractFactory.java @@ -0,0 +1,183 @@ +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; + +/** + * @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); + } + 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: + return createTestnetFactory(apiKey, secretKey); + } + 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); + } 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..a80ee70e5 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceFactory.java @@ -0,0 +1,20 @@ +package com.binance.api.client.factory; + +/** + * Generic binance factory used for any implementation of new engines + * + * @author Mahdi Shiekh Hosseini + * @see com.binance.api.client.BinanceEngineType + */ +public interface BinanceFactory { + + /** + * @return instance of asynchronous class + */ + ASYNC newAsyncRestClient(); + + /** + * @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 new file mode 100755 index 000000000..8df444537 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceFuturesApiClientFactory.java @@ -0,0 +1,83 @@ +package com.binance.api.client.factory; + +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 { + + /** + * 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 synchronous/blocking Futures REST client. + */ + public BinanceApiFuturesRestClient newRestClient() { + return new BinanceApiFuturesRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new asynchronous/non-blocking Futures REST client. + */ + public BinanceApiAsyncFuturesRestClient newAsyncRestClient() { + return new BinanceApiAsyncFuturesRestClientImpl(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/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 new file mode 100755 index 000000000..f7f5b5e8d --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceSpotApiClientFactory.java @@ -0,0 +1,84 @@ +package com.binance.api.client.factory; + +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 { + + /** + * 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 + */ + public static BinanceSpotApiClientFactory newInstance() { + return new BinanceSpotApiClientFactory(null, null, null, null); + } + + /** + * Creates a new synchronous/blocking REST client. + */ + public BinanceApiSpotRestClient newRestClient() { + return new BinanceApiSpotRestClientImpl(apiKey, secret, apiUrl); + } + + /** + * Creates a new asynchronous/non-blocking REST client. + */ + public BinanceApiSpotAsyncRestClient newAsyncRestClient() { + return new BinanceApiSpotAsyncRestClientImpl(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/BinanceSwapApiClientFactory.java b/src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java new file mode 100755 index 000000000..ee6671e57 --- /dev/null +++ b/src/main/java/com/binance/api/client/factory/BinanceSwapApiClientFactory.java @@ -0,0 +1,71 @@ +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 { + + /** + * 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 BinanceApiSwapAsyncRestClient newAsyncRestClient() { + return new BinanceApiSwapAsyncRestClientImpl(apiKey, secret, apiUrl); + } +} diff --git a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java deleted file mode 100755 index e6ea387b9..000000000 --- a/src/main/java/com/binance/api/client/impl/BinanceApiAsyncRestClientImpl.java +++ /dev/null @@ -1,251 +0,0 @@ -package com.binance.api.client.impl; - -import com.binance.api.client.BinanceApiAsyncRestClient; -import com.binance.api.client.BinanceApiCallback; -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.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 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); - } - - // 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)); - } -} 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/BinanceApiRestClientImpl.java b/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java deleted file mode 100755 index dd647166d..000000000 --- a/src/main/java/com/binance/api/client/impl/BinanceApiRestClientImpl.java +++ /dev/null @@ -1,249 +0,0 @@ -package com.binance.api.client.impl; - -import com.binance.api.client.BinanceApiRestClient; -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; - -/** - * Implementation of Binance's REST API using Retrofit with synchronous/blocking - * method calls. - */ -public class BinanceApiRestClientImpl implements BinanceApiRestClient { - - private final BinanceApiService binanceApiService; - - public BinanceApiRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret); - } - - // 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)); - } -} 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..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,7 +1,7 @@ package com.binance.api.client.impl; -import com.binance.api.client.BinanceApiError; -import com.binance.api.client.config.BinanceApiConfig; +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; @@ -38,16 +38,12 @@ 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); - } - - public static S createService(Class serviceClass, String apiKey, String secret) { + public static S createService(Class serviceClass, String apiKey, String secret, String apiUrl) { Retrofit.Builder retrofitBuilder = new Retrofit.Builder() - .baseUrl(BinanceApiConfig.getApiBaseUrl()) + .baseUrl(apiUrl) .addConverterFactory(converterFactory); if (StringUtils.isEmpty(apiKey) || StringUtils.isEmpty(secret)) { 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 new file mode 100755 index 000000000..348dba3e7 --- /dev/null +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncFuturesRestClientImpl.java @@ -0,0 +1,78 @@ +package com.binance.api.client.impl.async; + +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.*; +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 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)); + } + + @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/BinanceApiAsyncMarginRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiAsyncMarginRestClientImpl.java similarity index 86% 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 d3e5c22f6..2207966bc 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,10 +10,12 @@ 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.api.BinanceApiService; +import com.binance.api.client.impl.BinanceApiServiceGenerator; 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. @@ -22,8 +24,8 @@ public class BinanceApiAsyncMarginRestClientImpl implements BinanceApiAsyncMargi private final BinanceApiService binanceApiService; - public BinanceApiAsyncMarginRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret); + public BinanceApiAsyncMarginRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); } // Margin Account endpoints @@ -66,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/async/BinanceApiSpotAsyncRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiSpotAsyncRestClientImpl.java new file mode 100755 index 000000000..d13d02a00 --- /dev/null +++ b/src/main/java/com/binance/api/client/impl/async/BinanceApiSpotAsyncRestClientImpl.java @@ -0,0 +1,226 @@ +package com.binance.api.client.impl.async; + +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.*; +import com.binance.api.client.domain.event.ListenKey; +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.api.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 BinanceApiSpotAsyncRestClientImpl implements BinanceApiSpotAsyncRestClient { + + private final BinanceApiService binanceApiService; + + public BinanceApiSpotAsyncRestClientImpl(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/async/BinanceApiSwapAsyncRestClientImpl.java b/src/main/java/com/binance/api/client/impl/async/BinanceApiSwapAsyncRestClientImpl.java new file mode 100755 index 000000000..c7743f805 --- /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.api.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/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java new file mode 100755 index 000000000..4ba782af6 --- /dev/null +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiFuturesRestClientImpl.java @@ -0,0 +1,178 @@ +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.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; +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 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 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(); + 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 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(), + 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())); + } + + @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)); + } + + @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)); + } + + @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 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)); + } + + @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 88% 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 959fa2a5f..ccca65fcd 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,7 @@ -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.BinanceApiService; +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,10 +9,10 @@ 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.BinanceApiServiceGenerator; import java.util.List; -import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; import static com.binance.api.client.impl.BinanceApiServiceGenerator.executeSync; /** @@ -21,8 +22,8 @@ public class BinanceApiMarginRestClientImpl implements BinanceApiMarginRestClien private final BinanceApiService binanceApiService; - public BinanceApiMarginRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret); + public BinanceApiMarginRestClientImpl(String apiKey, String secret, String apiUrl) { + binanceApiService = BinanceApiServiceGenerator.createService(BinanceApiService.class, apiKey, secret, apiUrl); } @Override @@ -58,23 +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())); - } - - // 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(); @@ -116,4 +100,21 @@ public MarginTransaction repay(String asset, String amount) { long timestamp = System.currentTimeMillis(); 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 new file mode 100755 index 000000000..a16fb71ff --- /dev/null +++ b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSpotRestClientImpl.java @@ -0,0 +1,246 @@ +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.impl.BinanceApiServiceGenerator; +import retrofit2.Call; + +import java.util.List; + +import static com.binance.api.client.impl.BinanceApiServiceGenerator.executeSync; + +/** + * Implementation of Binance's REST API using Retrofit with synchronous/blocking + * method calls. + */ +public class BinanceApiSpotRestClientImpl implements BinanceApiSpotRestClient { + + private final BinanceApiService binanceApiService; + + public BinanceApiSpotRestClientImpl(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 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)); + } + + @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/BinanceApiSwapRestClientImpl.java b/src/main/java/com/binance/api/client/impl/sync/BinanceApiSwapRestClientImpl.java similarity index 89% 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 4f1a18bc4..42501c1cc 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,13 +1,14 @@ -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.api.BinanceApiService; +import com.binance.api.client.impl.BinanceApiServiceGenerator; import java.util.List; -import static com.binance.api.client.impl.BinanceApiServiceGenerator.createService; import static com.binance.api.client.impl.BinanceApiServiceGenerator.executeSync; /** @@ -17,8 +18,8 @@ public class BinanceApiSwapRestClientImpl implements BinanceApiSwapRestClient { private final BinanceApiService binanceApiService; - public BinanceApiSwapRestClientImpl(String apiKey, String secret) { - binanceApiService = createService(BinanceApiService.class, apiKey, secret); + 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/ws/BinanceApiWebSocketClientImpl.java similarity index 83% 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 be0dcf518..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,8 +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.config.BinanceApiConfig; +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; @@ -21,14 +20,16 @@ public class BinanceApiWebSocketClientImpl implements BinanceApiWebSocketClient, Closeable { private final OkHttpClient client; + private final String websocketUrl; - public BinanceApiWebSocketClientImpl(OkHttpClient client) { + public BinanceApiWebSocketClientImpl(OkHttpClient client, String websocketUrl) { this.client = client; + this.websocketUrl = websocketUrl; } @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 +38,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 +46,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 +59,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 +74,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 +94,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", websocketUrl, 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/BinanceApiWebSocketListener.java b/src/main/java/com/binance/api/client/impl/ws/BinanceApiWebSocketListener.java similarity index 89% 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..b52dd55e8 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; @@ -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/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/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()); + } } - } } 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/AccountBalanceCacheExample.java b/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java index 8fcd51118..466edbfa9 100755 --- a/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java +++ b/src/test/java/com/binance/api/examples/AccountBalanceCacheExample.java @@ -1,81 +1,83 @@ 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.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; +import com.binance.api.client.factory.BinanceSpotApiClientFactory; 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. */ 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() { + BinanceApiSpotRestClient 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..b9f42c9f5 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.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; +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"); + BinanceApiSpotRestClient 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..c79fe0de5 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.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; /** * 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"); + BinanceApiSpotAsyncRestClient 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..07c27851c 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.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; 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(); + BinanceApiSpotRestClient 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..4fa051fc3 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.api.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..03850fa53 100755 --- a/src/test/java/com/binance/api/examples/CandlesticksCacheExample.java +++ b/src/test/java/com/binance/api/examples/CandlesticksCacheExample.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.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; import java.util.List; import java.util.Map; @@ -15,72 +16,63 @@ */ 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(); + BinanceApiSpotRestClient 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(); + } else { + // update candlestick with the stream data + updateCandlestick = BinanceUtils.mapToCandlestick(response); + } - // 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..61d0e0e8f 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.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; +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 BinanceApiSpotRestClient 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..f696381e8 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.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; 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(); + BinanceApiSpotRestClient 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..6cc60311e 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.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; - -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(); + BinanceApiSpotAsyncRestClient 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..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,14 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; -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; @@ -14,28 +17,30 @@ */ 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) { + 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(); - System.out.println(marginAccount.getUserAssets()); - System.out.println(marginAccount.getAssetBalance("ETH")); - System.out.println(marginAccount.getMarginLevel()); + // Get account balances + 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"); - System.out.println(myTrades); + // Get list of trades + List myTrades = spotClient.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 = marginClient.transfer("USDT", "1", TransferType.SPOT_TO_MARGIN); + System.out.println(spotToMargin.getTranId()); + MarginTransaction borrowed = marginClient.borrow("USDT", "1"); + System.out.println(borrowed.getTranId()); + MarginTransaction repayed = marginClient.repay("USDT", "1"); + System.out.println(repayed.getTranId()); + 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 07c3507be..bbd72e4bc 100755 --- a/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java +++ b/src/test/java/com/binance/api/examples/MarginAccountEndpointsExampleAsync.java @@ -1,36 +1,37 @@ 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.api.async.BinanceApiAsyncMarginRestClient; +import com.binance.api.client.api.async.BinanceApiSpotAsyncRestClient; 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.BinanceMarginApiClientFactory; +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) { + 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 -> { - System.out.println(marginAccount.getUserAssets()); - System.out.println(marginAccount.getAssetBalance("ETH")); - System.out.println(marginAccount.getMarginLevel()); - }); + // Get account balances + 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", myTrades -> { - System.out.println(myTrades); - }); + // Get list of trades + 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())); - } + // Transfer, borrow, repay + 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 4cc4bf01f..90d2385b3 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.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.BinanceMarginApiClientFactory; /** * Examples on how to get margin account information. @@ -12,8 +13,8 @@ public class MarginAccountEndpointsLoanQueryExample { public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("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 969ca784f..f94e523bb 100755 --- a/src/test/java/com/binance/api/examples/MarginOrdersExample.java +++ b/src/test/java/com/binance/api/examples/MarginOrdersExample.java @@ -1,7 +1,6 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; -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,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.BinanceMarginApiClientFactory; import java.util.List; @@ -22,8 +23,8 @@ public class MarginOrdersExample { public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("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 b07a01792..a3ff13666 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.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.BinanceMarginApiClientFactory; 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"); - 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"), 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..faa23a7ec 100755 --- a/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/MarginUserDataStreamExample.java @@ -1,55 +1,58 @@ 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.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.UserDataUpdateEvent.UserDataUpdateEventType; +import com.binance.api.client.domain.event.ExecutionReport; +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. - * + *

* 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); - } + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; + + public static void main(String[] args) { + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory(API_KEY, SECRET_KEY); + BinanceApiSpotRestClient 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() == ACCOUNT_UPDATE) { + AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); + // Print new balances of every available asset + System.out.println(accountUpdateEvent.getBalances()); + } else { + ExecutionReport executionReport = response.getExecutionReport(); + // Print details about an order/trade + System.out.println(executionReport); + + // Print original quantity + System.out.println(executionReport.getOriginalQuantity()); + + // Or price + System.out.println(executionReport.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..e7456b255 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.api.sync.BinanceApiSpotRestClient; +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(); + BinanceApiSpotRestClient 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..bd5176bc7 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.api.async.BinanceApiSpotAsyncRestClient; 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(); + BinanceApiSpotAsyncRestClient 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..441b3c2b5 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.api.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..52bf7e1aa 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.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; 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"); + BinanceApiSpotRestClient 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 776e694a6..208a613b8 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.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; 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; @@ -16,33 +17,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) { + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiSpotAsyncRestClient 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); + } } diff --git a/src/test/java/com/binance/api/examples/SwapEndpointExample.java b/src/test/java/com/binance/api/examples/SwapEndpointExample.java index c4c32d98d..378e8877d 100755 --- a/src/test/java/com/binance/api/examples/SwapEndpointExample.java +++ b/src/test/java/com/binance/api/examples/SwapEndpointExample.java @@ -1,22 +1,21 @@ package com.binance.api.examples; -import com.binance.api.client.BinanceApiClientFactory; -import com.binance.api.client.BinanceApiSwapRestClient; +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; +import com.binance.api.client.factory.BinanceSwapApiClientFactory; 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(); +// 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) { + for (Pool pool : pools) { System.out.println(pool); Liquidity poolLiquidityInfo = swapClient.getPoolLiquidityInfo(pool.getPoolId()); System.out.println(poolLiquidityInfo); @@ -27,6 +26,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..5ac55a7dd 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.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; +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,27 +14,25 @@ public class TotalAccountBalanceExample { public static void main(String[] args) { - BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance("YOUR_API_KEY", "YOUR_SECRET"); - BinanceApiRestClient client = factory.newRestClient(); + BinanceSpotApiClientFactory factory = BinanceAbstractFactory.createSpotFactory("YOUR_API_KEY", "YOUR_SECRET"); + BinanceApiSpotRestClient client = factory.newRestClient(); // Get account balances Account account = client.getAccount(60_000L, System.currentTimeMillis()); // 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) - 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()); @@ -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..588f9a870 100755 --- a/src/test/java/com/binance/api/examples/UserDataStreamExample.java +++ b/src/test/java/com/binance/api/examples/UserDataStreamExample.java @@ -1,54 +1,56 @@ 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.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.UserDataUpdateEvent.UserDataUpdateEventType; +import com.binance.api.client.domain.event.ExecutionReport; +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. - * + *

* 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"); + BinanceApiSpotRestClient 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() == ACCOUNT_UPDATE) { + AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); + // Print new balances of every available asset + System.out.println(accountUpdateEvent.getBalances()); + } else { + ExecutionReport executionReport = response.getExecutionReport(); + // Print details about an order/trade + System.out.println(executionReport); + + // Print original quantity + System.out.println(executionReport.getOriginalQuantity()); + + // Or price + System.out.println(executionReport.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..4fc193d71 --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesAccountExample.java @@ -0,0 +1,24 @@ +package com.binance.api.examples.futures; + +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; + +/** + * Examples binance futures account information + */ +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(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/futures/FuturesOrdersAsyncExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java new file mode 100755 index 000000000..370515eb7 --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersAsyncExample.java @@ -0,0 +1,37 @@ +package com.binance.api.examples.futures; + +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; + +/** + * 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"; + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory(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/futures/FuturesOrdersExample.java b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java new file mode 100755 index 000000000..bde8e0597 --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesOrdersExample.java @@ -0,0 +1,36 @@ +package com.binance.api.examples.futures; + +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; +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"; + 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(); + + FuturesNewOrderResponse futuresOrderResponse = client.newOrder(limitLong(SYMBOL, TimeInForce.GTC, "13", "27", WorkingType.CONTRACT_PRICE, 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/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/futures/FuturesUserDataStreamExample.java b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java new file mode 100755 index 000000000..81328dc61 --- /dev/null +++ b/src/test/java/com/binance/api/examples/futures/FuturesUserDataStreamExample.java @@ -0,0 +1,58 @@ +package com.binance.api.examples.futures; + +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.ExecutionReport; +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. + *

+ * 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 { + private static final String API_KEY = ""; + private static final String SECRET_KEY = ""; + + public static void main(String[] args) { + BinanceFuturesApiClientFactory factory = BinanceAbstractFactory.createFuturesFactory(API_KEY, SECRET_KEY); + BinanceApiFuturesRestClient 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() == ACCOUNT_UPDATE) { + AccountUpdateEvent accountUpdateEvent = response.getAccountUpdateEvent(); + // Print new balances of every available asset + System.out.println(accountUpdateEvent.getBalances()); + } else { + ExecutionReport executionReport = response.getExecutionReport(); + // Print details about an order/trade + System.out.println(executionReport); + + // Print original quantity + System.out.println(executionReport.getOriginalQuantity()); + + // Or price + System.out.println(executionReport.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/FuturesWebSocketExample.java b/src/test/java/com/binance/api/examples/futures/FuturesWebSocketExample.java new file mode 100755 index 000000000..a7a85ed15 --- /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.api.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..0c1ef8b9d --- /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.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; + +/** + * 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/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/TestnetLeverageMarginChange.java b/src/test/java/com/binance/api/examples/testnet/TestnetLeverageMarginChange.java new file mode 100755 index 000000000..b27069077 --- /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 = ""; + private static final String SECRET_KEY = ""; + + 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()); + } + +} 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..05fefc350 --- /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.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; + +/** + * 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..bd686bb56 --- /dev/null +++ b/src/test/java/com/binance/api/examples/testnet/TestnetOrdersExample.java @@ -0,0 +1,79 @@ +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. + * + * @author Mahdi Sheikh Hosseini + */ +public class TestnetOrdersExample { + 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(); + + + // Market Long Order +// FuturesNewOrderResponse longResponse = futureClient.newOrder(FuturesNewOrder.MarketLong(SYMBOL, "1", false)); +// System.out.println(longResponse); + + // 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"); +// } + + + // 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); + + 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); + } + +} 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..c79f61309 --- /dev/null +++ b/src/test/java/com/binance/api/examples/testnet/TestnetWebSocketExample.java @@ -0,0 +1,29 @@ +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; + +/** + * Example binance futures websocket connection + * + * @author Mahdi Sheikh Hosseini + */ +public class TestnetWebSocketExample { + 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(API_KEY, SECRET_KEY); + BinanceApiFuturesRestClient client = factory.newRestClient(); + BinanceApiWebSocketClient streamClient = factory.newWebSocketClient(); + + + String listenKey = client.startUserDataStream(); + streamClient.onUserDataUpdateEvent(listenKey, System.out::println); + } + +}