diff --git a/.gitignore b/.gitignore index 008d83b5..abb02d81 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.DS_Store .idea/ logs/ target diff --git a/README.md b/README.md index e3df23a5..f8acd488 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ [![Build Status](https://travis-ci.com/HuobiRDCenter/huobi_Java.svg?branch=master)](https://travis-ci.com/HuobiRDCenter/huobi_Java) -# Huobi Java SDK v2 +# Huobi Java SDK For Spot v3 -This is Huobi Java SDK v2, you can import to your project and use this SDK to query all market data, trading and manage your account. The SDK supports RESTful API invoking, and subscribing the market, account and order update from the WebSocket connection. +This is Huobi Java SDK v3, you can import to your project and use this SDK to query all market data, trading and manage your account. The SDK supports RESTful API invoking, and subscribing the market, account and order update from the WebSocket connection. -If you already use SDK v1, it is strongly suggested migrate to v2 as we refactor the implementation to make it simpler and easy to maintain. We will stop the maintenance of v1 in the near future. Please refer to the instruction on how to migrate v1 to v2 in section [Migrate from v1](#Migrate-from-v1) +If you already use SDK v1 or v2, it is strongly suggested migrate to v3 as we refactor the implementation to make it simpler and easy to maintain. The SDK v3 is completely consistent with the API documentation of the new HTX open platform. Compared to SDK versions v1 and v2, due to changes in parameters of many interfaces, in order to match the latest interface parameter situation, v3 version has made adjustments to parameters of more than 80 interfaces to ensure that requests can be correctly initiated and accurate response data can be obtained. Meanwhile, the v3 version has added over 130 new interfaces available for use, greatly expanding the number of available interfaces. We will stop the maintenance of v2 in the near future. Please refer to the instruction on how to migrate v1 or v2 to v3 in section [Migrate from v1 or v2](#Migrate-from-v1-or-v2) ## Table of Contents @@ -13,7 +13,7 @@ If you already use SDK v1, it is strongly suggested migrate to v2 as we refactor - [Folder structure](#Folder-structure) - [Run examples](#Run-examples) - [Client](#client) - - [Migrate from v1](#Migrate-from-v1) + - [Migrate from v1 or v2](#Migrate-from-v1-or-v2) - [Request example](#Request-example) - [Reference data](#Reference-data) - [Market data](#Market-data) @@ -31,7 +31,7 @@ If you already use SDK v1, it is strongly suggested migrate to v2 as we refactor *The SDK is compiled by Java8*, you can import the source code in java IDE (idea or eclipse) -The example code are in folder */java/src/test/java/com/huobi/examples* that you can run directly +The example code are in folder */java/src/test/java/com/huobi/examples* that you can run directly If you want to create your own application, you can follow below steps: @@ -108,11 +108,10 @@ All the client is listed in below table. Each client is very small and simple, i | Account | AccountClient | Private | Rest, WebSocket v2 | | Wallet | WalletClient | Private | Rest | | Sub user | SubUserClient | Private | Rest | -| Trade | TradeClient | Private | Rest, WebSocket v2 | +| Trade | TradeClient | Private | Rest | | Algo | AlgoClient | Private | Rest | | Isolated margin | IsolatedMarginClient | Private | Rest | | Cross margin | CrossMarginClient | Private | Rest | -| ETF | ETFClient | Private | Rest | #### Public and Private @@ -157,9 +156,9 @@ There are two protocols of API, Rest and WebSocket - Request method: The method name starts with "req-", it will receive the once-off data after sending the request. - Subscription: The method name starts with "sub-", it will receive update after sending the subscription. -### Migrate from v1 +### Migrate from v1 or v2 -#### Why v2 +#### Why v3 The major difference between v1 and v2 is that the client category. @@ -167,9 +166,11 @@ In SDK v1, the client is categorized as two protocol, request client and subscri The thing is different in SDK v2, the client class is categorized as seven data categories, so that the responsibility for each client is clear. For example, if you only need to access market data, you can use MarketClient without applying API Key, and all the market data can be retrieved from MarketClient. If you want to operate your order, then you know you should use TradeClient and all the order related methods are there. Since the category is exactly same as the API document, so it is easy to find the relationship between API and SDK. In SDK v2, each client is smaller and simpler, which means it is easier to maintain and less bugs. +Compared to SDK versions v1 and v2, due to changes and updates in the out and in parameters of many interfaces, in order to match the latest interface in and out parameter situation, v3 version has made adjustments and updates to the out and in parameters of more than 80 interfaces to ensure that requests can be correctly initiated and accurate response data can be obtained. Meanwhile, the v3 version has added over 130 new interfaces available for use, greatly expanding the number of available interfaces. + #### How to migrate -You don't need to change your business logic, what you need is to find the v1 request client and subscription client, and replace with the proper v2 client. The additional cost is that you need to have additional initialization for each v2 client. +You don't need to change your business logic, what you need is to find the v1 or v2 request client and subscription client, and replace with the proper v3 client. The additional cost is that you need to have additional initialization for each v3 client. ## Request example @@ -186,8 +187,8 @@ Long serverTime = genericService.getTimestamp(); ```java GenericClient genericService = GenericClient.create(new HuobiOptions()); -List symbolList = genericService.getSymbols(); -List currencyList = genericService.getCurrencys(); +List symbolList = genericService.getSymbolsV2(); +List currencyList = genericService.getCurrencyV2(); ``` ### Market data @@ -441,4 +442,4 @@ accountService.subAccountsUpdate(SubAccountUpdateRequest.builder() .accountUpdateMode(AccountUpdateModeEnum.ACCOUNT_CHANGE).build(), event -> { System.out.println(event.toString()); }); -``` +``` \ No newline at end of file diff --git a/pom.xml b/pom.xml index 6df37eef..9555c75b 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.huobi.sdk huobi-client - 2.0.3-SNAPSHOT + 2.0.5-RELEASE 1.8 @@ -37,6 +37,16 @@ 1.7.4 test + + org.bouncycastle + bcpkix-jdk15on + 1.70 + + + org.bouncycastle + bcprov-ext-jdk15on + 1.69 + org.powermock powermock-module-junit4 @@ -68,6 +78,12 @@ googleauth 1.2.0 + + org.junit.jupiter + junit-jupiter + RELEASE + test + diff --git a/src/main/java/com/huobi/client/AccountClient.java b/src/main/java/com/huobi/client/AccountClient.java index 7827991e..08add7a8 100644 --- a/src/main/java/com/huobi/client/AccountClient.java +++ b/src/main/java/com/huobi/client/AccountClient.java @@ -2,29 +2,16 @@ import java.util.List; -import com.huobi.client.req.account.AccountAssetValuationRequest; -import com.huobi.client.req.account.AccountBalanceRequest; -import com.huobi.client.req.account.AccountFuturesTransferRequest; -import com.huobi.client.req.account.AccountHistoryRequest; -import com.huobi.client.req.account.AccountLedgerRequest; -import com.huobi.client.req.account.AccountTransferRequest; -import com.huobi.client.req.account.PointRequest; -import com.huobi.client.req.account.PointTransferRequest; -import com.huobi.client.req.account.SubAccountUpdateRequest; +import com.huobi.client.req.account.*; +import com.huobi.client.req.trade.SubOrderUpdateV2Request; +import com.huobi.client.req.trade.SubTradeClearingRequest; import com.huobi.constant.Options; import com.huobi.constant.enums.ExchangeEnum; import com.huobi.exception.SDKException; -import com.huobi.model.account.Account; -import com.huobi.model.account.AccountAssetValuationResult; -import com.huobi.model.account.AccountBalance; -import com.huobi.model.account.AccountFuturesTransferResult; -import com.huobi.model.account.AccountHistory; -import com.huobi.model.account.AccountLedgerResult; -import com.huobi.model.account.AccountTransferResult; -import com.huobi.model.account.AccountUpdateEvent; -import com.huobi.model.account.Point; -import com.huobi.model.account.PointTransferResult; +import com.huobi.model.account.*; import com.huobi.model.subuser.SubUserState; +import com.huobi.model.trade.OrderUpdateV2Event; +import com.huobi.model.trade.TradeClearingEvent; import com.huobi.service.huobi.HuobiAccountService; import com.huobi.utils.ResponseCallback; @@ -57,8 +44,23 @@ public interface AccountClient { AccountAssetValuationResult accountAssetValuation(AccountAssetValuationRequest request); + AccountValuationResult accountValuation(AccountValuationRequest request); + + AccountTransferV2Result accountTransferV2(AccountTransferV2Request request); + + UserInfo getAccountUserInfo(); + + OverviewInfo getOverviewInfo(); + + void feeSwitch(FeeSwitchRequest request); + void subAccountsUpdate(SubAccountUpdateRequest request, ResponseCallback callback); + void subOrderUpdateV2(SubOrderUpdateV2Request request, ResponseCallback callback); + + void subTradeClearing(SubTradeClearingRequest request, ResponseCallback callback); + + static AccountClient create(Options options) { if (options.getExchange().equals(ExchangeEnum.HUOBI)) { diff --git a/src/main/java/com/huobi/client/AlgoClient.java b/src/main/java/com/huobi/client/AlgoClient.java index ca7ae22f..da684fc9 100644 --- a/src/main/java/com/huobi/client/AlgoClient.java +++ b/src/main/java/com/huobi/client/AlgoClient.java @@ -1,17 +1,10 @@ package com.huobi.client; -import com.huobi.client.req.algo.CancelAlgoOrderRequest; -import com.huobi.client.req.algo.CreateAlgoOrderRequest; -import com.huobi.client.req.algo.GetHistoryAlgoOrdersRequest; -import com.huobi.client.req.algo.GetOpenAlgoOrdersRequest; +import com.huobi.client.req.algo.*; import com.huobi.constant.Options; import com.huobi.constant.enums.ExchangeEnum; import com.huobi.exception.SDKException; -import com.huobi.model.algo.AlgoOrder; -import com.huobi.model.algo.CancelAlgoOrderResult; -import com.huobi.model.algo.CreateAlgoOrderResult; -import com.huobi.model.algo.GetHistoryAlgoOrdersResult; -import com.huobi.model.algo.GetOpenAlgoOrdersResult; +import com.huobi.model.algo.*; import com.huobi.service.huobi.HuobiAlgoService; public interface AlgoClient { @@ -26,6 +19,8 @@ public interface AlgoClient { AlgoOrder getAlgoOrdersSpecific(String clientOrderId); + CancelAlgoAllOrderResult cancelAlgoAllOrder(CancelAlgoAllOrderRequest request); + static AlgoClient create(Options options) { diff --git a/src/main/java/com/huobi/client/CrossMarginClient.java b/src/main/java/com/huobi/client/CrossMarginClient.java index ce40b74e..6e7ba28b 100644 --- a/src/main/java/com/huobi/client/CrossMarginClient.java +++ b/src/main/java/com/huobi/client/CrossMarginClient.java @@ -2,6 +2,7 @@ import java.util.List; +import com.huobi.client.req.account.GetBalanceRequest; import com.huobi.client.req.crossmargin.CrossMarginApplyLoanRequest; import com.huobi.client.req.crossmargin.CrossMarginLoanOrdersRequest; import com.huobi.client.req.crossmargin.CrossMarginRepayLoanRequest; @@ -28,7 +29,7 @@ public interface CrossMarginClient { List getLoanOrders(CrossMarginLoanOrdersRequest request); - CrossMarginAccount getLoanBalance(); + CrossMarginAccount getLoanBalance(GetBalanceRequest request); List getLoanInfo(); diff --git a/src/main/java/com/huobi/client/ETFClient.java b/src/main/java/com/huobi/client/ETFClient.java deleted file mode 100644 index 714c248c..00000000 --- a/src/main/java/com/huobi/client/ETFClient.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.huobi.client; - -import java.util.List; - -import com.huobi.client.req.etf.ETFSwapListRequest; -import com.huobi.client.req.etf.ETFSwapRequest; -import com.huobi.model.etf.ETFConfig; -import com.huobi.model.etf.ETFSwapRecord; - -public interface ETFClient { - - ETFConfig getConfig(String etfName); - - void etfSwap(ETFSwapRequest request); - - List getEtfSwapList(ETFSwapListRequest request); - -} diff --git a/src/main/java/com/huobi/client/GenericClient.java b/src/main/java/com/huobi/client/GenericClient.java index e8275cbc..eec1dedb 100644 --- a/src/main/java/com/huobi/client/GenericClient.java +++ b/src/main/java/com/huobi/client/GenericClient.java @@ -2,13 +2,12 @@ import java.util.List; +import com.huobi.client.req.generic.ChainRequest; import com.huobi.client.req.generic.CurrencyChainsRequest; import com.huobi.constant.Options; import com.huobi.constant.enums.ExchangeEnum; import com.huobi.exception.SDKException; -import com.huobi.model.generic.CurrencyChain; -import com.huobi.model.generic.MarketStatus; -import com.huobi.model.generic.Symbol; +import com.huobi.model.generic.*; import com.huobi.service.huobi.HuobiGenericService; public interface GenericClient { @@ -17,14 +16,22 @@ public interface GenericClient { MarketStatus getMarketStatus(); - List getSymbols(); - - List getCurrencys(); - List getCurrencyChains(CurrencyChainsRequest request); Long getTimestamp(); + List getSymbolsV2(Long ts); + + List getCurrencyV1(Long ts); + + List getCurrencyV2(Long ts); + + List getSymbolsV1(Long ts); + + List getMarketSymbol(String symbols, Long ts); + + List getChain(ChainRequest request); + static GenericClient create(Options options) { if (options.getExchange().equals(ExchangeEnum.HUOBI)) { diff --git a/src/main/java/com/huobi/client/IsolatedMarginClient.java b/src/main/java/com/huobi/client/IsolatedMarginClient.java index 0bcab210..cbca66b5 100644 --- a/src/main/java/com/huobi/client/IsolatedMarginClient.java +++ b/src/main/java/com/huobi/client/IsolatedMarginClient.java @@ -2,18 +2,14 @@ import java.util.List; -import com.huobi.client.req.margin.IsolatedMarginAccountRequest; -import com.huobi.client.req.margin.IsolatedMarginApplyLoanRequest; -import com.huobi.client.req.margin.IsolatedMarginLoanInfoRequest; -import com.huobi.client.req.margin.IsolatedMarginLoanOrdersRequest; -import com.huobi.client.req.margin.IsolatedMarginRepayLoanRequest; -import com.huobi.client.req.margin.IsolatedMarginTransferRequest; +import com.huobi.client.req.margin.*; import com.huobi.constant.Options; import com.huobi.constant.enums.ExchangeEnum; import com.huobi.exception.SDKException; import com.huobi.model.isolatedmargin.IsolatedMarginAccount; import com.huobi.model.isolatedmargin.IsolatedMarginLoadOrder; import com.huobi.model.isolatedmargin.IsolatedMarginSymbolInfo; +import com.huobi.model.isolatedmargin.LeveragePositionLimitResult; import com.huobi.service.huobi.HuobiIsolatedMarginService; public interface IsolatedMarginClient { @@ -30,6 +26,8 @@ public interface IsolatedMarginClient { List getLoanInfo(IsolatedMarginLoanInfoRequest request); + List getLeveragePositionLimit(LeveragePositionLimitRequest request); + static IsolatedMarginClient create(Options options) { if (options.getExchange().equals(ExchangeEnum.HUOBI)) { diff --git a/src/main/java/com/huobi/client/MarketClient.java b/src/main/java/com/huobi/client/MarketClient.java index acc4a0a3..d993bccd 100644 --- a/src/main/java/com/huobi/client/MarketClient.java +++ b/src/main/java/com/huobi/client/MarketClient.java @@ -2,43 +2,11 @@ import java.util.List; -import com.huobi.client.req.market.CandlestickRequest; -import com.huobi.client.req.market.MarketDepthRequest; -import com.huobi.client.req.market.MarketDetailMergedRequest; -import com.huobi.client.req.market.MarketDetailRequest; -import com.huobi.client.req.market.MarketHistoryTradeRequest; -import com.huobi.client.req.market.MarketTradeRequest; -import com.huobi.client.req.market.ReqCandlestickRequest; -import com.huobi.client.req.market.ReqMarketDepthRequest; -import com.huobi.client.req.market.ReqMarketDetailRequest; -import com.huobi.client.req.market.ReqMarketTradeRequest; -import com.huobi.client.req.market.SubCandlestickRequest; -import com.huobi.client.req.market.SubMarketBBORequest; -import com.huobi.client.req.market.SubMarketDepthRequest; -import com.huobi.client.req.market.SubMarketDetailRequest; -import com.huobi.client.req.market.SubMarketTradeRequest; -import com.huobi.client.req.market.SubMbpIncrementalUpdateRequest; -import com.huobi.client.req.market.SubMbpRefreshUpdateRequest; +import com.huobi.client.req.market.*; import com.huobi.constant.Options; import com.huobi.constant.enums.ExchangeEnum; import com.huobi.exception.SDKException; -import com.huobi.model.market.Candlestick; -import com.huobi.model.market.CandlestickEvent; -import com.huobi.model.market.CandlestickReq; -import com.huobi.model.market.MarketBBOEvent; -import com.huobi.model.market.MarketDepth; -import com.huobi.model.market.MarketDepthEvent; -import com.huobi.model.market.MarketDepthReq; -import com.huobi.model.market.MarketDetail; -import com.huobi.model.market.MarketDetailEvent; -import com.huobi.model.market.MarketDetailMerged; -import com.huobi.model.market.MarketDetailReq; -import com.huobi.model.market.MarketTicker; -import com.huobi.model.market.MarketTrade; -import com.huobi.model.market.MarketTradeEvent; -import com.huobi.model.market.MarketTradeReq; -import com.huobi.model.market.MbpIncrementalUpdateEvent; -import com.huobi.model.market.MbpRefreshUpdateEvent; +import com.huobi.model.market.*; import com.huobi.service.huobi.HuobiMarketService; import com.huobi.service.huobi.connection.HuobiWebSocketConnection; import com.huobi.utils.ResponseCallback; @@ -74,6 +42,7 @@ public interface MarketClient { WebSocketConnection subMbpIncrementalUpdate(SubMbpIncrementalUpdateRequest request, ResponseCallback callback); + void subMarketTicker(SubMarketTickerRequest request, ResponseCallback callback); WebSocketConnection reqMbpIncrementalUpdate(SubMbpIncrementalUpdateRequest request, WebSocketConnection connection); void reqCandlestick(ReqCandlestickRequest request, ResponseCallback callback); @@ -82,6 +51,8 @@ public interface MarketClient { void reqMarketTrade(ReqMarketTradeRequest request, ResponseCallback callback); + void reqMarketTicker(ReqMarketTickerRequest request, ResponseCallback callback); + void reqMarketDetail(ReqMarketDetailRequest request, ResponseCallback callback); static MarketClient create(Options options) { diff --git a/src/main/java/com/huobi/client/SubUserClient.java b/src/main/java/com/huobi/client/SubUserClient.java index d8d0341e..0ab890f9 100644 --- a/src/main/java/com/huobi/client/SubUserClient.java +++ b/src/main/java/com/huobi/client/SubUserClient.java @@ -3,17 +3,7 @@ import java.util.List; import com.huobi.client.req.account.TransferSubuserRequest; -import com.huobi.client.req.subuser.GetApiKeyListRequest; -import com.huobi.client.req.subuser.GetSubUserAccountListRequest; -import com.huobi.client.req.subuser.GetSubUserDepositRequest; -import com.huobi.client.req.subuser.GetSubUserListRequest; -import com.huobi.client.req.subuser.SubUserApiKeyDeletionRequest; -import com.huobi.client.req.subuser.SubUserApiKeyGenerationRequest; -import com.huobi.client.req.subuser.SubUserApiKeyModificationRequest; -import com.huobi.client.req.subuser.SubUserCreationRequest; -import com.huobi.client.req.subuser.SubUserManagementRequest; -import com.huobi.client.req.subuser.SubUserTradableMarketRequest; -import com.huobi.client.req.subuser.SubUserTransferabilityRequest; +import com.huobi.client.req.subuser.*; import com.huobi.constant.Options; import com.huobi.constant.enums.ExchangeEnum; import com.huobi.exception.SDKException; @@ -30,6 +20,7 @@ import com.huobi.model.subuser.SubUserState; import com.huobi.model.subuser.SubUserTradableMarketResult; import com.huobi.model.subuser.SubUserTransferabilityResult; +import com.huobi.model.wallet.DeductModeResult; import com.huobi.model.wallet.DepositAddress; import com.huobi.service.huobi.HuobiSubUserService; @@ -82,6 +73,10 @@ public interface SubUserClient { */ List getSubuserAggregateBalance(); + List setDeductMode(DeductModeRequest request); + + public boolean setCredit(CreditRequest request); + static SubUserClient create(Options options) { if (options.getExchange().equals(ExchangeEnum.HUOBI)) { diff --git a/src/main/java/com/huobi/client/TradeClient.java b/src/main/java/com/huobi/client/TradeClient.java index 14e76226..f0d7438d 100644 --- a/src/main/java/com/huobi/client/TradeClient.java +++ b/src/main/java/com/huobi/client/TradeClient.java @@ -2,30 +2,11 @@ import java.util.List; -import com.huobi.client.req.trade.BatchCancelOpenOrdersRequest; -import com.huobi.client.req.trade.CreateOrderRequest; -import com.huobi.client.req.trade.FeeRateRequest; -import com.huobi.client.req.trade.MatchResultRequest; -import com.huobi.client.req.trade.OpenOrdersRequest; -import com.huobi.client.req.trade.OrderHistoryRequest; -import com.huobi.client.req.trade.OrdersRequest; -import com.huobi.client.req.trade.ReqOrderListRequest; -import com.huobi.client.req.trade.SubOrderUpdateRequest; -import com.huobi.client.req.trade.SubOrderUpdateV2Request; -import com.huobi.client.req.trade.SubTradeClearingRequest; +import com.huobi.client.req.trade.*; import com.huobi.constant.Options; import com.huobi.constant.enums.ExchangeEnum; import com.huobi.exception.SDKException; -import com.huobi.model.trade.BatchCancelOpenOrdersResult; -import com.huobi.model.trade.BatchCancelOrderResult; -import com.huobi.model.trade.FeeRate; -import com.huobi.model.trade.MatchResult; -import com.huobi.model.trade.Order; -import com.huobi.model.trade.OrderDetailReq; -import com.huobi.model.trade.OrderListReq; -import com.huobi.model.trade.OrderUpdateEvent; -import com.huobi.model.trade.OrderUpdateV2Event; -import com.huobi.model.trade.TradeClearingEvent; +import com.huobi.model.trade.*; import com.huobi.service.huobi.HuobiTradeService; import com.huobi.utils.ResponseCallback; @@ -33,7 +14,7 @@ public interface TradeClient { Long createOrder(CreateOrderRequest request); - Long cancelOrder(Long orderId); + Long cancelOrder(CancelOrderRequest request); Integer cancelOrder(String clientOrderId); @@ -57,9 +38,9 @@ public interface TradeClient { List getFeeRate(FeeRateRequest request); - void subOrderUpdateV2(SubOrderUpdateV2Request request, ResponseCallback callback); + List batchOrders(List list); - void subTradeClearing(SubTradeClearingRequest request, ResponseCallback callback); + OrderResp marginOrder(MarginOrderRequest request); static TradeClient create(Options options) { diff --git a/src/main/java/com/huobi/client/WalletClient.java b/src/main/java/com/huobi/client/WalletClient.java index e5031362..02ffad34 100644 --- a/src/main/java/com/huobi/client/WalletClient.java +++ b/src/main/java/com/huobi/client/WalletClient.java @@ -10,10 +10,7 @@ import com.huobi.constant.Options; import com.huobi.constant.enums.ExchangeEnum; import com.huobi.exception.SDKException; -import com.huobi.model.wallet.DepositAddress; -import com.huobi.model.wallet.DepositWithdraw; -import com.huobi.model.wallet.WithdrawAddressResult; -import com.huobi.model.wallet.WithdrawQuota; +import com.huobi.model.wallet.*; import com.huobi.service.huobi.HuobiWalletService; public interface WalletClient { @@ -30,6 +27,8 @@ public interface WalletClient { List getDepositWithdraw(DepositWithdrawRequest request); + WithdrawOrderResult getWithdrawOrder(String clientOrderId); + static WalletClient create(Options options) { if (options.getExchange().equals(ExchangeEnum.HUOBI)) { diff --git a/src/main/java/com/huobi/client/req/account/AccountAssetValuationRequest.java b/src/main/java/com/huobi/client/req/account/AccountAssetValuationRequest.java index e61369d6..f5944c04 100644 --- a/src/main/java/com/huobi/client/req/account/AccountAssetValuationRequest.java +++ b/src/main/java/com/huobi/client/req/account/AccountAssetValuationRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.account; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.AccountTypeEnum; @@ -11,6 +8,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountAssetValuationRequest { AccountTypeEnum accountType; diff --git a/src/main/java/com/huobi/client/req/account/AccountFuturesTransferRequest.java b/src/main/java/com/huobi/client/req/account/AccountFuturesTransferRequest.java index e01cf676..3da23672 100644 --- a/src/main/java/com/huobi/client/req/account/AccountFuturesTransferRequest.java +++ b/src/main/java/com/huobi/client/req/account/AccountFuturesTransferRequest.java @@ -2,10 +2,7 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.AccountFuturesTransferTypeEnum; @@ -13,6 +10,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountFuturesTransferRequest { private String currency; diff --git a/src/main/java/com/huobi/client/req/account/AccountHistoryRequest.java b/src/main/java/com/huobi/client/req/account/AccountHistoryRequest.java index b459cc8a..7b0f4ea5 100644 --- a/src/main/java/com/huobi/client/req/account/AccountHistoryRequest.java +++ b/src/main/java/com/huobi/client/req/account/AccountHistoryRequest.java @@ -2,10 +2,7 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import org.apache.commons.lang.StringUtils; import com.huobi.constant.enums.QuerySortEnum; @@ -15,6 +12,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountHistoryRequest { private Long accountId; @@ -31,6 +29,8 @@ public class AccountHistoryRequest { private Integer size; + private Long fromId; + public String getTypesString(){ String typeString = null; if (this.getTypes() != null && this.getTypes().size() > 0) { diff --git a/src/main/java/com/huobi/client/req/account/AccountLedgerRequest.java b/src/main/java/com/huobi/client/req/account/AccountLedgerRequest.java index 845225cc..b5843beb 100644 --- a/src/main/java/com/huobi/client/req/account/AccountLedgerRequest.java +++ b/src/main/java/com/huobi/client/req/account/AccountLedgerRequest.java @@ -2,10 +2,7 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import org.apache.commons.lang.StringUtils; import com.huobi.constant.enums.AccountLedgerTransactTypeEnum; @@ -15,6 +12,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountLedgerRequest { private Long accountId; diff --git a/src/main/java/com/huobi/client/req/account/AccountTransferRequest.java b/src/main/java/com/huobi/client/req/account/AccountTransferRequest.java index 1e32c519..4b70e27a 100644 --- a/src/main/java/com/huobi/client/req/account/AccountTransferRequest.java +++ b/src/main/java/com/huobi/client/req/account/AccountTransferRequest.java @@ -2,10 +2,7 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.AccountTransferAccountTypeEnum; @@ -13,6 +10,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountTransferRequest { private Long fromUser; diff --git a/src/main/java/com/huobi/client/req/account/AccountTransferV2Request.java b/src/main/java/com/huobi/client/req/account/AccountTransferV2Request.java new file mode 100644 index 00000000..634c0291 --- /dev/null +++ b/src/main/java/com/huobi/client/req/account/AccountTransferV2Request.java @@ -0,0 +1,20 @@ +package com.huobi.client.req.account; + +import com.huobi.constant.enums.BusinessLineAccountTypeEnum; +import lombok.*; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class AccountTransferV2Request { + private BusinessLineAccountTypeEnum from; + private BusinessLineAccountTypeEnum to; + private String currency; + private BigDecimal amount; + private String marginAccount; + +} diff --git a/src/main/java/com/huobi/client/req/account/AccountValuationRequest.java b/src/main/java/com/huobi/client/req/account/AccountValuationRequest.java new file mode 100644 index 00000000..3fdf80da --- /dev/null +++ b/src/main/java/com/huobi/client/req/account/AccountValuationRequest.java @@ -0,0 +1,14 @@ +package com.huobi.client.req.account; + +import com.huobi.constant.enums.AccountTypeEnum; +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class AccountValuationRequest { + AccountTypeEnum accountType; + String valuationCurrency; +} diff --git a/src/main/java/com/huobi/client/req/account/FeeSwitchRequest.java b/src/main/java/com/huobi/client/req/account/FeeSwitchRequest.java new file mode 100644 index 00000000..298084a8 --- /dev/null +++ b/src/main/java/com/huobi/client/req/account/FeeSwitchRequest.java @@ -0,0 +1,13 @@ +package com.huobi.client.req.account; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class FeeSwitchRequest { + private Integer switchType; + private String deductionCurrency; +} diff --git a/src/main/java/com/huobi/client/req/account/GetBalanceRequest.java b/src/main/java/com/huobi/client/req/account/GetBalanceRequest.java new file mode 100644 index 00000000..ccf17a6d --- /dev/null +++ b/src/main/java/com/huobi/client/req/account/GetBalanceRequest.java @@ -0,0 +1,12 @@ +package com.huobi.client.req.account; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class GetBalanceRequest { + private Long subUid; +} diff --git a/src/main/java/com/huobi/client/req/account/PointRequest.java b/src/main/java/com/huobi/client/req/account/PointRequest.java index 980998c8..bb94f5f0 100644 --- a/src/main/java/com/huobi/client/req/account/PointRequest.java +++ b/src/main/java/com/huobi/client/req/account/PointRequest.java @@ -1,15 +1,13 @@ package com.huobi.client.req.account; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class PointRequest { Long subUid; diff --git a/src/main/java/com/huobi/client/req/account/PointTransferRequest.java b/src/main/java/com/huobi/client/req/account/PointTransferRequest.java index dc298a7c..0a7b12fd 100644 --- a/src/main/java/com/huobi/client/req/account/PointTransferRequest.java +++ b/src/main/java/com/huobi/client/req/account/PointTransferRequest.java @@ -3,16 +3,14 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class PointTransferRequest { private Long fromUid; diff --git a/src/main/java/com/huobi/client/req/account/SubAccountUpdateRequest.java b/src/main/java/com/huobi/client/req/account/SubAccountUpdateRequest.java index ba436f40..70925903 100644 --- a/src/main/java/com/huobi/client/req/account/SubAccountUpdateRequest.java +++ b/src/main/java/com/huobi/client/req/account/SubAccountUpdateRequest.java @@ -1,5 +1,6 @@ package com.huobi.client.req.account; +import com.huobi.constant.enums.AccountActionEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -16,6 +17,8 @@ @ToString public class SubAccountUpdateRequest { - private AccountUpdateModeEnum accountUpdateMode; + private AccountActionEnum accountAction; + + private AccountUpdateModeEnum accountUpdateMode; } diff --git a/src/main/java/com/huobi/client/req/account/TransferSubuserRequest.java b/src/main/java/com/huobi/client/req/account/TransferSubuserRequest.java index 08743d09..8dd64328 100644 --- a/src/main/java/com/huobi/client/req/account/TransferSubuserRequest.java +++ b/src/main/java/com/huobi/client/req/account/TransferSubuserRequest.java @@ -26,4 +26,6 @@ public class TransferSubuserRequest { private TransferMasterTypeEnum type; + private String clientOrderId; + } diff --git a/src/main/java/com/huobi/client/req/algo/CancelAlgoAllOrderRequest.java b/src/main/java/com/huobi/client/req/algo/CancelAlgoAllOrderRequest.java new file mode 100644 index 00000000..17c2bc7a --- /dev/null +++ b/src/main/java/com/huobi/client/req/algo/CancelAlgoAllOrderRequest.java @@ -0,0 +1,13 @@ +package com.huobi.client.req.algo; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class CancelAlgoAllOrderRequest { + private Integer timeout; + +} diff --git a/src/main/java/com/huobi/client/req/algo/CancelAlgoOrderRequest.java b/src/main/java/com/huobi/client/req/algo/CancelAlgoOrderRequest.java index be6f47f2..71e3b2a8 100644 --- a/src/main/java/com/huobi/client/req/algo/CancelAlgoOrderRequest.java +++ b/src/main/java/com/huobi/client/req/algo/CancelAlgoOrderRequest.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class CancelAlgoOrderRequest { private List clientOrderIds; diff --git a/src/main/java/com/huobi/client/req/algo/CreateAlgoOrderRequest.java b/src/main/java/com/huobi/client/req/algo/CreateAlgoOrderRequest.java index 7e7a4861..3ed7170a 100644 --- a/src/main/java/com/huobi/client/req/algo/CreateAlgoOrderRequest.java +++ b/src/main/java/com/huobi/client/req/algo/CreateAlgoOrderRequest.java @@ -2,10 +2,7 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.algo.AlgoOrderSideEnum; import com.huobi.constant.enums.algo.AlgoOrderTimeInForceEnum; @@ -15,6 +12,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class CreateAlgoOrderRequest { private String clientOrderId; diff --git a/src/main/java/com/huobi/client/req/algo/GetHistoryAlgoOrdersRequest.java b/src/main/java/com/huobi/client/req/algo/GetHistoryAlgoOrdersRequest.java index 5c881c9b..371c1e23 100644 --- a/src/main/java/com/huobi/client/req/algo/GetHistoryAlgoOrdersRequest.java +++ b/src/main/java/com/huobi/client/req/algo/GetHistoryAlgoOrdersRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.algo; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.QuerySortEnum; import com.huobi.constant.enums.algo.AlgoOrderSideEnum; @@ -14,6 +11,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetHistoryAlgoOrdersRequest { private Long accountId; diff --git a/src/main/java/com/huobi/client/req/algo/GetOpenAlgoOrdersRequest.java b/src/main/java/com/huobi/client/req/algo/GetOpenAlgoOrdersRequest.java index 78362409..789e87c8 100644 --- a/src/main/java/com/huobi/client/req/algo/GetOpenAlgoOrdersRequest.java +++ b/src/main/java/com/huobi/client/req/algo/GetOpenAlgoOrdersRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.algo; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.QuerySortEnum; import com.huobi.constant.enums.algo.AlgoOrderSideEnum; @@ -13,6 +10,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetOpenAlgoOrdersRequest { private Long accountId; diff --git a/src/main/java/com/huobi/client/req/crossmargin/CrossMarginLoanOrdersRequest.java b/src/main/java/com/huobi/client/req/crossmargin/CrossMarginLoanOrdersRequest.java index 8cc6a0f4..5244ea98 100644 --- a/src/main/java/com/huobi/client/req/crossmargin/CrossMarginLoanOrdersRequest.java +++ b/src/main/java/com/huobi/client/req/crossmargin/CrossMarginLoanOrdersRequest.java @@ -33,6 +33,8 @@ public class CrossMarginLoanOrdersRequest { private Integer size; + private Long subUid; + public String getStatesString(){ String stateString = null; if (this.getStates() != null && this.getStates().size() > 0) { diff --git a/src/main/java/com/huobi/client/req/etf/ETFSwapListRequest.java b/src/main/java/com/huobi/client/req/etf/ETFSwapListRequest.java deleted file mode 100644 index 5949a5c2..00000000 --- a/src/main/java/com/huobi/client/req/etf/ETFSwapListRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.huobi.client.req.etf; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class ETFSwapListRequest { - - private String etfName; - - private Integer offset; - - private Integer limit; - -} diff --git a/src/main/java/com/huobi/client/req/etf/ETFSwapRequest.java b/src/main/java/com/huobi/client/req/etf/ETFSwapRequest.java deleted file mode 100644 index 9071a122..00000000 --- a/src/main/java/com/huobi/client/req/etf/ETFSwapRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.huobi.client.req.etf; - -import java.math.BigDecimal; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; - -import com.huobi.constant.enums.EtfSwapDirectionEnum; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class ETFSwapRequest { - - private EtfSwapDirectionEnum direction; - - private String etfName; - - private BigDecimal amount; - -} diff --git a/src/main/java/com/huobi/client/req/generic/ChainRequest.java b/src/main/java/com/huobi/client/req/generic/ChainRequest.java new file mode 100644 index 00000000..2fd999e9 --- /dev/null +++ b/src/main/java/com/huobi/client/req/generic/ChainRequest.java @@ -0,0 +1,14 @@ +package com.huobi.client.req.generic; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class ChainRequest { + private String showDesc; + private String currency; + private Long ts; +} diff --git a/src/main/java/com/huobi/client/req/margin/IsolatedMarginLoanInfoRequest.java b/src/main/java/com/huobi/client/req/margin/IsolatedMarginLoanInfoRequest.java index 9886d69e..da5f2dcf 100644 --- a/src/main/java/com/huobi/client/req/margin/IsolatedMarginLoanInfoRequest.java +++ b/src/main/java/com/huobi/client/req/margin/IsolatedMarginLoanInfoRequest.java @@ -1,14 +1,12 @@ package com.huobi.client.req.margin; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class IsolatedMarginLoanInfoRequest { private String symbols; diff --git a/src/main/java/com/huobi/client/req/margin/LeveragePositionLimitRequest.java b/src/main/java/com/huobi/client/req/margin/LeveragePositionLimitRequest.java new file mode 100644 index 00000000..eaea965f --- /dev/null +++ b/src/main/java/com/huobi/client/req/margin/LeveragePositionLimitRequest.java @@ -0,0 +1,12 @@ +package com.huobi.client.req.margin; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class LeveragePositionLimitRequest { + private String currency; +} diff --git a/src/main/java/com/huobi/client/req/market/ReqMarketDepthRequest.java b/src/main/java/com/huobi/client/req/market/ReqMarketDepthRequest.java index c822a316..d0a90f9e 100644 --- a/src/main/java/com/huobi/client/req/market/ReqMarketDepthRequest.java +++ b/src/main/java/com/huobi/client/req/market/ReqMarketDepthRequest.java @@ -17,6 +17,6 @@ public class ReqMarketDepthRequest { private String symbol; - private DepthStepEnum step; + private String step; } diff --git a/src/main/java/com/huobi/client/req/market/ReqMarketTickerRequest.java b/src/main/java/com/huobi/client/req/market/ReqMarketTickerRequest.java new file mode 100644 index 00000000..1b8c7a97 --- /dev/null +++ b/src/main/java/com/huobi/client/req/market/ReqMarketTickerRequest.java @@ -0,0 +1,12 @@ +package com.huobi.client.req.market; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class ReqMarketTickerRequest { + private String symbol; +} diff --git a/src/main/java/com/huobi/client/req/market/SubMarketDepthRequest.java b/src/main/java/com/huobi/client/req/market/SubMarketDepthRequest.java index 5b07b542..76a3727a 100644 --- a/src/main/java/com/huobi/client/req/market/SubMarketDepthRequest.java +++ b/src/main/java/com/huobi/client/req/market/SubMarketDepthRequest.java @@ -16,6 +16,6 @@ public class SubMarketDepthRequest { private String symbol; - private DepthStepEnum step; + private String step; } diff --git a/src/main/java/com/huobi/client/req/market/SubMarketTickerRequest.java b/src/main/java/com/huobi/client/req/market/SubMarketTickerRequest.java new file mode 100644 index 00000000..06eec0e8 --- /dev/null +++ b/src/main/java/com/huobi/client/req/market/SubMarketTickerRequest.java @@ -0,0 +1,12 @@ +package com.huobi.client.req.market; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class SubMarketTickerRequest { + private String symbol; +} diff --git a/src/main/java/com/huobi/client/req/market/SubMbpIncrementalUpdateRequest.java b/src/main/java/com/huobi/client/req/market/SubMbpIncrementalUpdateRequest.java index 10e61a31..3c2d3b93 100644 --- a/src/main/java/com/huobi/client/req/market/SubMbpIncrementalUpdateRequest.java +++ b/src/main/java/com/huobi/client/req/market/SubMbpIncrementalUpdateRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.market; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.DepthLevels; @@ -11,6 +8,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubMbpIncrementalUpdateRequest { private String symbol; diff --git a/src/main/java/com/huobi/client/req/market/SubMbpRefreshUpdateRequest.java b/src/main/java/com/huobi/client/req/market/SubMbpRefreshUpdateRequest.java index 36ef6771..7d045fae 100644 --- a/src/main/java/com/huobi/client/req/market/SubMbpRefreshUpdateRequest.java +++ b/src/main/java/com/huobi/client/req/market/SubMbpRefreshUpdateRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.market; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.DepthLevels; @@ -11,6 +8,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubMbpRefreshUpdateRequest { private String symbols; diff --git a/src/main/java/com/huobi/client/req/subuser/CreditRequest.java b/src/main/java/com/huobi/client/req/subuser/CreditRequest.java new file mode 100644 index 00000000..a0c5eae0 --- /dev/null +++ b/src/main/java/com/huobi/client/req/subuser/CreditRequest.java @@ -0,0 +1,18 @@ +package com.huobi.client.req.subuser; + +import lombok.*; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class CreditRequest { + private Long transactionId; + private String currency; + private BigDecimal amount; + private Long accountId; + private Long userId; +} diff --git a/src/main/java/com/huobi/client/req/subuser/DeductModeRequest.java b/src/main/java/com/huobi/client/req/subuser/DeductModeRequest.java new file mode 100644 index 00000000..952a86af --- /dev/null +++ b/src/main/java/com/huobi/client/req/subuser/DeductModeRequest.java @@ -0,0 +1,13 @@ +package com.huobi.client.req.subuser; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class DeductModeRequest { + private Long subUids; + private String deductMode; +} diff --git a/src/main/java/com/huobi/client/req/subuser/GetApiKeyListRequest.java b/src/main/java/com/huobi/client/req/subuser/GetApiKeyListRequest.java index 65088ed5..cc46b15a 100644 --- a/src/main/java/com/huobi/client/req/subuser/GetApiKeyListRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/GetApiKeyListRequest.java @@ -1,14 +1,12 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetApiKeyListRequest { private Long uid; diff --git a/src/main/java/com/huobi/client/req/subuser/GetSubUserAccountListRequest.java b/src/main/java/com/huobi/client/req/subuser/GetSubUserAccountListRequest.java index 280dd3da..12473b55 100644 --- a/src/main/java/com/huobi/client/req/subuser/GetSubUserAccountListRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/GetSubUserAccountListRequest.java @@ -1,14 +1,12 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetSubUserAccountListRequest { private Long subUid; diff --git a/src/main/java/com/huobi/client/req/subuser/GetSubUserDepositRequest.java b/src/main/java/com/huobi/client/req/subuser/GetSubUserDepositRequest.java index b550487d..df9495b6 100644 --- a/src/main/java/com/huobi/client/req/subuser/GetSubUserDepositRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/GetSubUserDepositRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.QuerySortEnum; @@ -11,6 +8,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetSubUserDepositRequest { private Long subUid; diff --git a/src/main/java/com/huobi/client/req/subuser/GetSubUserListRequest.java b/src/main/java/com/huobi/client/req/subuser/GetSubUserListRequest.java index 6f1fb269..cacbb852 100644 --- a/src/main/java/com/huobi/client/req/subuser/GetSubUserListRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/GetSubUserListRequest.java @@ -1,14 +1,12 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetSubUserListRequest { private Long fromId; diff --git a/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyDeletionRequest.java b/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyDeletionRequest.java index a74c79d4..b7c85098 100644 --- a/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyDeletionRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyDeletionRequest.java @@ -1,14 +1,12 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserApiKeyDeletionRequest { private Long subUid; diff --git a/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyGenerationRequest.java b/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyGenerationRequest.java index 825c8ef3..34c8ea00 100644 --- a/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyGenerationRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyGenerationRequest.java @@ -1,14 +1,12 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserApiKeyGenerationRequest { private String otpToken; diff --git a/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyModificationRequest.java b/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyModificationRequest.java index 32307df3..7a781038 100644 --- a/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyModificationRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/SubUserApiKeyModificationRequest.java @@ -1,14 +1,12 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserApiKeyModificationRequest { private Long subUid; diff --git a/src/main/java/com/huobi/client/req/subuser/SubUserCreationParam.java b/src/main/java/com/huobi/client/req/subuser/SubUserCreationParam.java index 32b28a87..20913e6a 100644 --- a/src/main/java/com/huobi/client/req/subuser/SubUserCreationParam.java +++ b/src/main/java/com/huobi/client/req/subuser/SubUserCreationParam.java @@ -1,14 +1,12 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserCreationParam { private String userName; diff --git a/src/main/java/com/huobi/client/req/subuser/SubUserCreationRequest.java b/src/main/java/com/huobi/client/req/subuser/SubUserCreationRequest.java index 89652d7a..fbb34701 100644 --- a/src/main/java/com/huobi/client/req/subuser/SubUserCreationRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/SubUserCreationRequest.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserCreationRequest { private List userList; diff --git a/src/main/java/com/huobi/client/req/subuser/SubUserManagementRequest.java b/src/main/java/com/huobi/client/req/subuser/SubUserManagementRequest.java index 27e7886e..099b5292 100644 --- a/src/main/java/com/huobi/client/req/subuser/SubUserManagementRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/SubUserManagementRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.SubUserManagementActionEnum; @@ -11,6 +8,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserManagementRequest { private Long subUid; diff --git a/src/main/java/com/huobi/client/req/subuser/SubUserTradableMarketRequest.java b/src/main/java/com/huobi/client/req/subuser/SubUserTradableMarketRequest.java index c869aa67..daa08e4e 100644 --- a/src/main/java/com/huobi/client/req/subuser/SubUserTradableMarketRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/SubUserTradableMarketRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.TradableMarketAccountTypeEnum; import com.huobi.constant.enums.TradableMarketActivationEnums; @@ -12,6 +9,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserTradableMarketRequest { private String subUids; diff --git a/src/main/java/com/huobi/client/req/subuser/SubUserTransferabilityRequest.java b/src/main/java/com/huobi/client/req/subuser/SubUserTransferabilityRequest.java index 04d52b15..32046eba 100644 --- a/src/main/java/com/huobi/client/req/subuser/SubUserTransferabilityRequest.java +++ b/src/main/java/com/huobi/client/req/subuser/SubUserTransferabilityRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.TransferabilityAccountTypeEnum; @@ -11,6 +8,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserTransferabilityRequest { private String subUids; diff --git a/src/main/java/com/huobi/client/req/trade/BatchCancelOpenOrdersRequest.java b/src/main/java/com/huobi/client/req/trade/BatchCancelOpenOrdersRequest.java index 6ff1fcb7..605f4d59 100644 --- a/src/main/java/com/huobi/client/req/trade/BatchCancelOpenOrdersRequest.java +++ b/src/main/java/com/huobi/client/req/trade/BatchCancelOpenOrdersRequest.java @@ -23,4 +23,6 @@ public class BatchCancelOpenOrdersRequest { private Integer size; + private String types; + } diff --git a/src/main/java/com/huobi/client/req/trade/BatchOrdersRequest.java b/src/main/java/com/huobi/client/req/trade/BatchOrdersRequest.java new file mode 100644 index 00000000..a9ed7059 --- /dev/null +++ b/src/main/java/com/huobi/client/req/trade/BatchOrdersRequest.java @@ -0,0 +1,26 @@ +package com.huobi.client.req.trade; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class BatchOrdersRequest { + @JSONField(name = "account-id") + private String accountId; + private String symbol; + private String type; + private String amount; + private String price; + private String source; + @JSONField(name = "client-order-id") + private String clientOrderId; + @JSONField(name = "self-match-prevent") + private Integer selfMatchPrevent; + @JSONField(name = "stop-price") + private String stopPrice; + private String operator; +} diff --git a/src/main/java/com/huobi/client/req/trade/CancelOrderRequest.java b/src/main/java/com/huobi/client/req/trade/CancelOrderRequest.java new file mode 100644 index 00000000..fbdf82e8 --- /dev/null +++ b/src/main/java/com/huobi/client/req/trade/CancelOrderRequest.java @@ -0,0 +1,16 @@ +package com.huobi.client.req.trade; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class CancelOrderRequest { + + private Long orderId; + + private String symbol; + +} diff --git a/src/main/java/com/huobi/client/req/trade/CreateOrderRequest.java b/src/main/java/com/huobi/client/req/trade/CreateOrderRequest.java index 3a2e966f..2ed18d16 100644 --- a/src/main/java/com/huobi/client/req/trade/CreateOrderRequest.java +++ b/src/main/java/com/huobi/client/req/trade/CreateOrderRequest.java @@ -40,6 +40,8 @@ public class CreateOrderRequest { private OrderSourceEnum orderSource; + private Integer selfMatchPrevent; + //------------------------------- Spot ---------------------------------------// public static CreateOrderRequest spotBuyLimit(Long spotAccountId, String symbol, BigDecimal price, BigDecimal amount) { diff --git a/src/main/java/com/huobi/client/req/trade/MarginOrderRequest.java b/src/main/java/com/huobi/client/req/trade/MarginOrderRequest.java new file mode 100644 index 00000000..c5f33b05 --- /dev/null +++ b/src/main/java/com/huobi/client/req/trade/MarginOrderRequest.java @@ -0,0 +1,30 @@ +package com.huobi.client.req.trade; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class MarginOrderRequest { + private String symbol; + @JSONField(name = "account-id") + private String accountId; + private String amount; + @JSONField(name = "market-amount") + private String marketAmount; + @JSONField(name = "borrow-amount") + private String borrowAmount; + private String type; + @JSONField(name = "trade-purpose") + private String tradePurpose; + private String price; + @JSONField(name = "stop-price") + private String stopPrice; + private String operator; + private String source; + + +} diff --git a/src/main/java/com/huobi/client/req/trade/OpenOrdersRequest.java b/src/main/java/com/huobi/client/req/trade/OpenOrdersRequest.java index 49d81003..4fbf1926 100644 --- a/src/main/java/com/huobi/client/req/trade/OpenOrdersRequest.java +++ b/src/main/java/com/huobi/client/req/trade/OpenOrdersRequest.java @@ -1,9 +1,6 @@ package com.huobi.client.req.trade; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.OrderSideEnum; import com.huobi.constant.enums.QueryDirectionEnum; @@ -12,6 +9,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class OpenOrdersRequest { private String symbol; @@ -26,4 +24,6 @@ public class OpenOrdersRequest { private Long from; + private String types; + } diff --git a/src/main/java/com/huobi/client/req/trade/SubOrderUpdateV2Request.java b/src/main/java/com/huobi/client/req/trade/SubOrderUpdateV2Request.java index 84efab62..722ebbfc 100644 --- a/src/main/java/com/huobi/client/req/trade/SubOrderUpdateV2Request.java +++ b/src/main/java/com/huobi/client/req/trade/SubOrderUpdateV2Request.java @@ -1,5 +1,6 @@ package com.huobi.client.req.trade; +import com.huobi.constant.enums.AccountActionEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -13,6 +14,7 @@ @ToString public class SubOrderUpdateV2Request { - private String symbols; + private AccountActionEnum accountAction; + private String symbols; } diff --git a/src/main/java/com/huobi/client/req/trade/SubTradeClearingRequest.java b/src/main/java/com/huobi/client/req/trade/SubTradeClearingRequest.java index 019de0bc..9a86add5 100644 --- a/src/main/java/com/huobi/client/req/trade/SubTradeClearingRequest.java +++ b/src/main/java/com/huobi/client/req/trade/SubTradeClearingRequest.java @@ -1,5 +1,6 @@ package com.huobi.client.req.trade; +import com.huobi.constant.enums.AccountActionEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -13,6 +14,10 @@ @ToString public class SubTradeClearingRequest { - private String symbols; + private AccountActionEnum accountAction; + + private String symbols; + + private int[] modes; } diff --git a/src/main/java/com/huobi/client/req/wallet/CreateWithdrawRequest.java b/src/main/java/com/huobi/client/req/wallet/CreateWithdrawRequest.java index 57fc1a29..ba2c3a03 100644 --- a/src/main/java/com/huobi/client/req/wallet/CreateWithdrawRequest.java +++ b/src/main/java/com/huobi/client/req/wallet/CreateWithdrawRequest.java @@ -27,4 +27,6 @@ public class CreateWithdrawRequest { private String addrTag; + private String clientOrderId; + } diff --git a/src/main/java/com/huobi/client/req/wallet/DepositWithdrawRequest.java b/src/main/java/com/huobi/client/req/wallet/DepositWithdrawRequest.java index dafcaf41..d0048cac 100644 --- a/src/main/java/com/huobi/client/req/wallet/DepositWithdrawRequest.java +++ b/src/main/java/com/huobi/client/req/wallet/DepositWithdrawRequest.java @@ -24,6 +24,6 @@ public class DepositWithdrawRequest { private Integer size; - private QueryDirectionEnum direction; + private QueryDirectionEnum direction = QueryDirectionEnum.NEXT; } diff --git a/src/main/java/com/huobi/client/req/wallet/WithdrawAddressRequest.java b/src/main/java/com/huobi/client/req/wallet/WithdrawAddressRequest.java index a92ee5b9..adfa221e 100644 --- a/src/main/java/com/huobi/client/req/wallet/WithdrawAddressRequest.java +++ b/src/main/java/com/huobi/client/req/wallet/WithdrawAddressRequest.java @@ -1,14 +1,12 @@ package com.huobi.client.req.wallet; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class WithdrawAddressRequest { private String currency; diff --git a/src/main/java/com/huobi/constant/Constants.java b/src/main/java/com/huobi/constant/Constants.java index 7e887c02..ba79ff2c 100644 --- a/src/main/java/com/huobi/constant/Constants.java +++ b/src/main/java/com/huobi/constant/Constants.java @@ -1,8 +1,25 @@ package com.huobi.constant; - +/* +*下面是Hmac256签名方式的变量,SIGN是“256”代表Hmac256签名方式,“25519”代表Ed25519签名方式。 +* API_KEY和SECRET_KEY是Hmac256方式需要的公钥和私钥。PUBLIC_KEY和PRIVATE_KEY是Ed25519的公钥和私钥。 +* +* The following is the variable of the Hmac256 signature mode. +* SIGN indicates the Hmac256 signature mode and 25519 indicates the Ed25519 signature mode. +* API_KEY and SECRET_KEY are the public and private keys required for Hmac256 mode. +* PUBLIC_KEY and PRIVATE_KEY are the public and private keys of Ed25519. +* */ public class Constants { - public static final String API_KEY = "AccessKey"; - public static final String SECRET_KEY = "SecretKey"; + public static final String API_KEY = ""; + public static final String SECRET_KEY = ""; +public static final String SIGN = "256"; + + +public static final String PUBLIC_KEY = ""; + public static final String PRIVATE_KEY = ""; + + + + } diff --git a/src/main/java/com/huobi/constant/HuobiOptions.java b/src/main/java/com/huobi/constant/HuobiOptions.java index 2c90b904..456371f1 100644 --- a/src/main/java/com/huobi/constant/HuobiOptions.java +++ b/src/main/java/com/huobi/constant/HuobiOptions.java @@ -14,7 +14,7 @@ public class HuobiOptions implements Options { @Builder.Default - private String restHost = "https://api.huobi.pro"; + private String restHost = "http://api.huobi.pro"; @Builder.Default private String websocketHost = "wss://api.huobi.pro"; @@ -22,6 +22,7 @@ public class HuobiOptions implements Options { private String apiKey; private String secretKey; + private String sign; @Builder.Default private boolean websocketAutoConnect = true; @@ -31,6 +32,9 @@ public String getApiKey() { return this.apiKey; } + @Override + public String getSign() {return this.sign;} + @Override public String getSecretKey() { return this.secretKey; diff --git a/src/main/java/com/huobi/constant/Options.java b/src/main/java/com/huobi/constant/Options.java index 9a4b1683..13fd516a 100644 --- a/src/main/java/com/huobi/constant/Options.java +++ b/src/main/java/com/huobi/constant/Options.java @@ -7,6 +7,7 @@ public interface Options { String getApiKey(); String getSecretKey(); + String getSign(); ExchangeEnum getExchange(); diff --git a/src/main/java/com/huobi/constant/enums/AccountActionEnum.java b/src/main/java/com/huobi/constant/enums/AccountActionEnum.java new file mode 100644 index 00000000..b97ab65d --- /dev/null +++ b/src/main/java/com/huobi/constant/enums/AccountActionEnum.java @@ -0,0 +1,18 @@ +package com.huobi.constant.enums; + +import lombok.Getter; + +@Getter +public enum AccountActionEnum { + + ACTION_SUB("sub"), + + ACTION_UNSUB("unsub"), + ; + + private final String code; + + AccountActionEnum(String code) { + this.code = code; + } +} diff --git a/src/main/java/com/huobi/constant/enums/AccountUpdateModeEnum.java b/src/main/java/com/huobi/constant/enums/AccountUpdateModeEnum.java index 38e592e6..3a145a57 100644 --- a/src/main/java/com/huobi/constant/enums/AccountUpdateModeEnum.java +++ b/src/main/java/com/huobi/constant/enums/AccountUpdateModeEnum.java @@ -16,7 +16,13 @@ public enum AccountUpdateModeEnum { /** * Subscribe TOTAL balance, total balance is the sum of available and frozen */ - ACCOUNT_CHANGE("1"); + ACCOUNT_CHANGE("1"), + + /** + * 在账户余额发生变动或可用余额发生变动时均推送且一起推送。 + */ + AVAILABLE_OR_CHANGE("2"), + ; private final String code; diff --git a/src/main/java/com/huobi/constant/enums/BusinessLineAccountTypeEnum.java b/src/main/java/com/huobi/constant/enums/BusinessLineAccountTypeEnum.java new file mode 100644 index 00000000..e05fdaaa --- /dev/null +++ b/src/main/java/com/huobi/constant/enums/BusinessLineAccountTypeEnum.java @@ -0,0 +1,28 @@ +package com.huobi.constant.enums; + +import lombok.Getter; + +@Getter +public enum BusinessLineAccountTypeEnum { + SPOT("spot"), + LINEARSWAP("linear-swap"), + FUTURES("futures"), + SWAP("swap") + ; + + + private final String type; + + BusinessLineAccountTypeEnum(String type) { + this.type = type; + } + + public static BusinessLineAccountTypeEnum find(String type) { + for (BusinessLineAccountTypeEnum typeEnum : BusinessLineAccountTypeEnum.values()) { + if (typeEnum.getType().equals(type)) { + return typeEnum; + } + } + return null; + } +} diff --git a/src/main/java/com/huobi/constant/enums/EtfStatusEnum.java b/src/main/java/com/huobi/constant/enums/EtfStatusEnum.java deleted file mode 100644 index 65bccd6e..00000000 --- a/src/main/java/com/huobi/constant/enums/EtfStatusEnum.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.huobi.constant.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum EtfStatusEnum { - NORMAL("1"), - REBALANCING_START("2"), - CREATION_AND_REDEMPTION_SUSPEND("3"), - CREATION_SUSPEND("4"), - REDEMPTION_SUSPEND("5"); - - private final String code; - - public static EtfStatusEnum find(String code) { - for (EtfStatusEnum statusEnum : EtfStatusEnum.values()) { - if (statusEnum.getCode().equals(code)) { - return statusEnum; - } - } - return null; - } -} diff --git a/src/main/java/com/huobi/constant/enums/EtfSwapDirectionEnum.java b/src/main/java/com/huobi/constant/enums/EtfSwapDirectionEnum.java deleted file mode 100644 index 974cf151..00000000 --- a/src/main/java/com/huobi/constant/enums/EtfSwapDirectionEnum.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.huobi.constant.enums; - -public enum EtfSwapDirectionEnum { - - SWAP_IN_ETF, - SWAP_OUT_ETF - ; - -} diff --git a/src/main/java/com/huobi/constant/enums/EtfSwapTypeEnum.java b/src/main/java/com/huobi/constant/enums/EtfSwapTypeEnum.java deleted file mode 100644 index dffa1af8..00000000 --- a/src/main/java/com/huobi/constant/enums/EtfSwapTypeEnum.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.huobi.constant.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum EtfSwapTypeEnum { - ETF_SWAP_IN("1"), - ETF_SWAP_OUT("2"); - - private final String code; - - public static EtfSwapTypeEnum find(String code) { - for (EtfSwapTypeEnum typeEnum : EtfSwapTypeEnum.values()) { - if (typeEnum.getCode().equals(code)) { - return typeEnum; - } - } - return null; - } - -} diff --git a/src/main/java/com/huobi/model/account/AccountFuturesTransferResult.java b/src/main/java/com/huobi/model/account/AccountFuturesTransferResult.java index 2482f80c..da355fee 100644 --- a/src/main/java/com/huobi/model/account/AccountFuturesTransferResult.java +++ b/src/main/java/com/huobi/model/account/AccountFuturesTransferResult.java @@ -1,14 +1,12 @@ package com.huobi.model.account; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountFuturesTransferResult { private Long data; diff --git a/src/main/java/com/huobi/model/account/AccountHistory.java b/src/main/java/com/huobi/model/account/AccountHistory.java index 8a43f282..a947fb0a 100644 --- a/src/main/java/com/huobi/model/account/AccountHistory.java +++ b/src/main/java/com/huobi/model/account/AccountHistory.java @@ -2,15 +2,13 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountHistory { private Long accountId; diff --git a/src/main/java/com/huobi/model/account/AccountLedger.java b/src/main/java/com/huobi/model/account/AccountLedger.java index ca67287d..a93f81c7 100644 --- a/src/main/java/com/huobi/model/account/AccountLedger.java +++ b/src/main/java/com/huobi/model/account/AccountLedger.java @@ -2,15 +2,13 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountLedger { /** diff --git a/src/main/java/com/huobi/model/account/AccountLedgerResult.java b/src/main/java/com/huobi/model/account/AccountLedgerResult.java index 4b611d28..5de7938d 100644 --- a/src/main/java/com/huobi/model/account/AccountLedgerResult.java +++ b/src/main/java/com/huobi/model/account/AccountLedgerResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountLedgerResult { private Long nextId; diff --git a/src/main/java/com/huobi/model/account/AccountTransferResult.java b/src/main/java/com/huobi/model/account/AccountTransferResult.java index 9a7c42f5..cab91062 100644 --- a/src/main/java/com/huobi/model/account/AccountTransferResult.java +++ b/src/main/java/com/huobi/model/account/AccountTransferResult.java @@ -1,14 +1,12 @@ package com.huobi.model.account; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountTransferResult { private Long transactId; diff --git a/src/main/java/com/huobi/model/account/AccountTransferV2Result.java b/src/main/java/com/huobi/model/account/AccountTransferV2Result.java new file mode 100644 index 00000000..2f9bbc95 --- /dev/null +++ b/src/main/java/com/huobi/model/account/AccountTransferV2Result.java @@ -0,0 +1,15 @@ +package com.huobi.model.account; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class AccountTransferV2Result { + private String success; + private Long data; + private Long code; + private String message; +} diff --git a/src/main/java/com/huobi/model/account/AccountUpdate.java b/src/main/java/com/huobi/model/account/AccountUpdate.java index 9ba9a512..21780a7f 100644 --- a/src/main/java/com/huobi/model/account/AccountUpdate.java +++ b/src/main/java/com/huobi/model/account/AccountUpdate.java @@ -2,15 +2,13 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountUpdate { private String currency; diff --git a/src/main/java/com/huobi/model/account/AccountUpdateEvent.java b/src/main/java/com/huobi/model/account/AccountUpdateEvent.java index 9bdec273..e44fced0 100644 --- a/src/main/java/com/huobi/model/account/AccountUpdateEvent.java +++ b/src/main/java/com/huobi/model/account/AccountUpdateEvent.java @@ -1,14 +1,12 @@ package com.huobi.model.account; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AccountUpdateEvent { private String action; diff --git a/src/main/java/com/huobi/model/account/AccountValuationResult.java b/src/main/java/com/huobi/model/account/AccountValuationResult.java new file mode 100644 index 00000000..cd7328d1 --- /dev/null +++ b/src/main/java/com/huobi/model/account/AccountValuationResult.java @@ -0,0 +1,18 @@ +package com.huobi.model.account; + +import lombok.*; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class AccountValuationResult { + private String totalBalance; + private String todayProfit; + private String todayProfitRate; + List profitAccountBalanceList; + Updated updated; +} diff --git a/src/main/java/com/huobi/model/account/Balance.java b/src/main/java/com/huobi/model/account/Balance.java index 2f1957b7..60204beb 100644 --- a/src/main/java/com/huobi/model/account/Balance.java +++ b/src/main/java/com/huobi/model/account/Balance.java @@ -24,4 +24,6 @@ public class Balance { private BigDecimal balance; + private Long seqNum; + } diff --git a/src/main/java/com/huobi/model/account/OverviewInfo.java b/src/main/java/com/huobi/model/account/OverviewInfo.java new file mode 100644 index 00000000..83010962 --- /dev/null +++ b/src/main/java/com/huobi/model/account/OverviewInfo.java @@ -0,0 +1,12 @@ +package com.huobi.model.account; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class OverviewInfo { + private String currency; +} diff --git a/src/main/java/com/huobi/model/account/ProfitAccountBalance.java b/src/main/java/com/huobi/model/account/ProfitAccountBalance.java new file mode 100644 index 00000000..4b7ecc63 --- /dev/null +++ b/src/main/java/com/huobi/model/account/ProfitAccountBalance.java @@ -0,0 +1,15 @@ +package com.huobi.model.account; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class ProfitAccountBalance { + private String distributionType; + private Float balance; + private Boolean success; + private String accountBalance; +} diff --git a/src/main/java/com/huobi/model/account/Updated.java b/src/main/java/com/huobi/model/account/Updated.java new file mode 100644 index 00000000..c9b23f87 --- /dev/null +++ b/src/main/java/com/huobi/model/account/Updated.java @@ -0,0 +1,13 @@ +package com.huobi.model.account; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class Updated { + private Boolean success; + private Long time; +} diff --git a/src/main/java/com/huobi/model/account/UserInfo.java b/src/main/java/com/huobi/model/account/UserInfo.java new file mode 100644 index 00000000..673d5d39 --- /dev/null +++ b/src/main/java/com/huobi/model/account/UserInfo.java @@ -0,0 +1,14 @@ +package com.huobi.model.account; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class UserInfo { + private Integer pointSwitch; + private Integer currencySwitch; + private String deductionCurrency; +} diff --git a/src/main/java/com/huobi/model/algo/AlgoOrder.java b/src/main/java/com/huobi/model/algo/AlgoOrder.java index e4497966..82014d37 100644 --- a/src/main/java/com/huobi/model/algo/AlgoOrder.java +++ b/src/main/java/com/huobi/model/algo/AlgoOrder.java @@ -2,15 +2,13 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class AlgoOrder { private Long accountId; @@ -49,4 +47,6 @@ public class AlgoOrder { private String errMessage; + private String orderSide; + } diff --git a/src/main/java/com/huobi/model/algo/CancelAlgoAllOrderResult.java b/src/main/java/com/huobi/model/algo/CancelAlgoAllOrderResult.java new file mode 100644 index 00000000..a16478d5 --- /dev/null +++ b/src/main/java/com/huobi/model/algo/CancelAlgoAllOrderResult.java @@ -0,0 +1,13 @@ +package com.huobi.model.algo; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class CancelAlgoAllOrderResult { + private Long currentTime; + private Long triggerTime; +} diff --git a/src/main/java/com/huobi/model/algo/CancelAlgoOrderResult.java b/src/main/java/com/huobi/model/algo/CancelAlgoOrderResult.java index 6e3ce501..4f508dbd 100644 --- a/src/main/java/com/huobi/model/algo/CancelAlgoOrderResult.java +++ b/src/main/java/com/huobi/model/algo/CancelAlgoOrderResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class CancelAlgoOrderResult { private List accepted; diff --git a/src/main/java/com/huobi/model/algo/CreateAlgoOrderResult.java b/src/main/java/com/huobi/model/algo/CreateAlgoOrderResult.java index 0c7dea19..cd4f1ef3 100644 --- a/src/main/java/com/huobi/model/algo/CreateAlgoOrderResult.java +++ b/src/main/java/com/huobi/model/algo/CreateAlgoOrderResult.java @@ -1,14 +1,12 @@ package com.huobi.model.algo; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class CreateAlgoOrderResult { private String clientOrderId; diff --git a/src/main/java/com/huobi/model/algo/GetHistoryAlgoOrdersResult.java b/src/main/java/com/huobi/model/algo/GetHistoryAlgoOrdersResult.java index 2a2134a2..b25cace0 100644 --- a/src/main/java/com/huobi/model/algo/GetHistoryAlgoOrdersResult.java +++ b/src/main/java/com/huobi/model/algo/GetHistoryAlgoOrdersResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetHistoryAlgoOrdersResult { private List list; diff --git a/src/main/java/com/huobi/model/algo/GetOpenAlgoOrdersResult.java b/src/main/java/com/huobi/model/algo/GetOpenAlgoOrdersResult.java index 91f9707f..69f37a75 100644 --- a/src/main/java/com/huobi/model/algo/GetOpenAlgoOrdersResult.java +++ b/src/main/java/com/huobi/model/algo/GetOpenAlgoOrdersResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetOpenAlgoOrdersResult { private List list; diff --git a/src/main/java/com/huobi/model/crossmargin/CrossMarginCurrencyInfo.java b/src/main/java/com/huobi/model/crossmargin/CrossMarginCurrencyInfo.java index 469c8f58..a05261e3 100644 --- a/src/main/java/com/huobi/model/crossmargin/CrossMarginCurrencyInfo.java +++ b/src/main/java/com/huobi/model/crossmargin/CrossMarginCurrencyInfo.java @@ -2,15 +2,13 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class CrossMarginCurrencyInfo { private String currency; diff --git a/src/main/java/com/huobi/model/crossmargin/GeneralRepayLoanResult.java b/src/main/java/com/huobi/model/crossmargin/GeneralRepayLoanResult.java index bddbdb8e..b2d2c700 100644 --- a/src/main/java/com/huobi/model/crossmargin/GeneralRepayLoanResult.java +++ b/src/main/java/com/huobi/model/crossmargin/GeneralRepayLoanResult.java @@ -16,5 +16,5 @@ public class GeneralRepayLoanResult { private String repayId; - private long repayTime; + private Long repayTime; } diff --git a/src/main/java/com/huobi/model/etf/ETFConfig.java b/src/main/java/com/huobi/model/etf/ETFConfig.java deleted file mode 100644 index 344c8cca..00000000 --- a/src/main/java/com/huobi/model/etf/ETFConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.huobi.model.etf; - -import java.math.BigDecimal; -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; - -import com.huobi.constant.enums.EtfStatusEnum; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class ETFConfig { - - private int purchaseMinAmount; - private int purchaseMaxAmount; - private int redemptionMinAmount; - private int redemptionMaxAmount; - private BigDecimal purchaseFeeRate; - private BigDecimal redemptionFeeRate; - private EtfStatusEnum status; - private List unitPriceList; - -} diff --git a/src/main/java/com/huobi/model/etf/ETFDetail.java b/src/main/java/com/huobi/model/etf/ETFDetail.java deleted file mode 100644 index 83c48593..00000000 --- a/src/main/java/com/huobi/model/etf/ETFDetail.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.huobi.model.etf; - -import java.math.BigDecimal; -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class ETFDetail { - - private BigDecimal rate; - - private BigDecimal fee; - - private BigDecimal pointCardAmount; - - private List obtainCurrencyList; - - private List usedCurrencyList; - - -} diff --git a/src/main/java/com/huobi/model/etf/ETFSwapRecord.java b/src/main/java/com/huobi/model/etf/ETFSwapRecord.java deleted file mode 100644 index 6a124733..00000000 --- a/src/main/java/com/huobi/model/etf/ETFSwapRecord.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.huobi.model.etf; - -import java.math.BigDecimal; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; - -import com.huobi.constant.enums.EtfSwapTypeEnum; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class ETFSwapRecord { - - private Long id; - - private String currency; - - private BigDecimal amount; - - private EtfSwapTypeEnum type; - - private Integer status; - - private Long gmtCreated; - - private ETFDetail detail; - - -} diff --git a/src/main/java/com/huobi/model/etf/ETFUnitPrice.java b/src/main/java/com/huobi/model/etf/ETFUnitPrice.java deleted file mode 100644 index c8c89ec2..00000000 --- a/src/main/java/com/huobi/model/etf/ETFUnitPrice.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.huobi.model.etf; - -import java.math.BigDecimal; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class ETFUnitPrice { - - private String currency; - private BigDecimal amount; - -} diff --git a/src/main/java/com/huobi/model/generic/ChainV1.java b/src/main/java/com/huobi/model/generic/ChainV1.java new file mode 100644 index 00000000..c44e1bee --- /dev/null +++ b/src/main/java/com/huobi/model/generic/ChainV1.java @@ -0,0 +1,58 @@ +package com.huobi.model.generic; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class ChainV1 { + private Boolean adt; + private String ac; + private Boolean ao; + private Boolean awt; + private String chain; + private String ct; + private String code; + private String currency; + @JSONField(name = "deposit-desc") + private String depositDesc; + private Boolean de; + private String dma; + @JSONField(name = "deposit-tips-desc") + private String depositTipsDesc; + private String dn; + private Integer fc; + private String ft; + @JSONField(name = "default") + private Integer isDefault; + @JSONField(name = "replace-chain-info-desc") + private String replaceChainInfoDesc; + @JSONField(name = "replace-chain-notification-desc") + private String replaceChainNotificationDesc; + @JSONField(name = "replace-chain-popup-desc") + private String replaceChainPopupDesc; + private String ca; + private Integer cct; + private Integer sc; + private String sda; + @JSONField(name = "suspend-deposit-desc") + private String suspendDepositDesc; + private String swa; + @JSONField(name = "suspend-withdraw-desc") + private String suspendWithdrawDesc; + private Boolean v; + @JSONField(name = "withdraw-desc") + private String withdrawDesc; + private Boolean we; + private String wma; + private Integer wp; + private String fn; + @JSONField(name = "withdraw-tips-desc") + private String withdrawTipsDesc; + @JSONField(name = "suspend-visible-desc") + private String suspendVisibleDesc; + +} diff --git a/src/main/java/com/huobi/model/generic/Currency.java b/src/main/java/com/huobi/model/generic/Currency.java new file mode 100644 index 00000000..fb9a4a31 --- /dev/null +++ b/src/main/java/com/huobi/model/generic/Currency.java @@ -0,0 +1,45 @@ +package com.huobi.model.generic; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class Currency { + private String name; + private String dn; + private Long vat; + private Long det; + private Long wet; + private Integer wp; + private String ct; + private String cp; + private String[] ss; + private Integer oe; + private String dma; + private String wma; + private String sp; + private String w; + private Boolean qc; + private String state; + private Boolean v; + private Boolean whe; + private Boolean cd; + private Boolean de; + private Boolean we; + private Boolean cawt; + private Boolean cao; + private Integer fc; + private Integer sc; + private String swd; + private String wd; + private String sdd; + private String dd; + private String svd; + private String tags; + private String fn; + private String bc; + private Boolean iqc; +} diff --git a/src/main/java/com/huobi/model/generic/CurrencyV2.java b/src/main/java/com/huobi/model/generic/CurrencyV2.java new file mode 100644 index 00000000..b5d10be4 --- /dev/null +++ b/src/main/java/com/huobi/model/generic/CurrencyV2.java @@ -0,0 +1,37 @@ +package com.huobi.model.generic; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class CurrencyV2 { + private String cc; + private String dn; + private String fn; + private Integer at; + private Integer wp; + private String ft; + private String dma; + private String wma; + private String sp; + private String w; + private Boolean qc; + private String state; + private Boolean v; + private Boolean whe; + private Boolean cd; + private Boolean de; + private Boolean wed; + private Boolean cawt; + private Integer fc; + private Integer sc; + private String swd; + private String wd; + private String sdd; + private String dd; + private String svd; + private String tags; +} diff --git a/src/main/java/com/huobi/model/generic/MarketSymbol.java b/src/main/java/com/huobi/model/generic/MarketSymbol.java new file mode 100644 index 00000000..7f3fd4fe --- /dev/null +++ b/src/main/java/com/huobi/model/generic/MarketSymbol.java @@ -0,0 +1,49 @@ +package com.huobi.model.generic; + +import lombok.*; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class MarketSymbol { + private String symbol; + private String bc; + private String qc; + private String state; + private String sp; + private String tags; + private BigDecimal lr; + private BigDecimal smlr; + private Integer pp; + private Integer ap; + private Integer vp; + private BigDecimal minoa; + private BigDecimal maxoa; + private BigDecimal minov; + private BigDecimal lominoa; + private BigDecimal lomaxoa; + private BigDecimal lomaxba; + private BigDecimal lomaxsa; + private BigDecimal smminoa; + private BigDecimal smmaxoa; + private BigDecimal bmmaxov; + private BigDecimal blmlt; + private BigDecimal slmgt; + private BigDecimal msormlt; + private BigDecimal mbormlt; + private String at; + private String u; + private BigDecimal mfr; + private String ct; + private String rt; + private BigDecimal rthr; + private BigDecimal in; + private BigDecimal maxov; + private BigDecimal flr; + private String castate; + +} diff --git a/src/main/java/com/huobi/model/generic/Person.java b/src/main/java/com/huobi/model/generic/Person.java new file mode 100644 index 00000000..80ba6b87 --- /dev/null +++ b/src/main/java/com/huobi/model/generic/Person.java @@ -0,0 +1,14 @@ +package com.huobi.model.generic; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class Person { + private Integer id; + private String name; + private Integer weight; +} diff --git a/src/main/java/com/huobi/model/generic/SymbolV1.java b/src/main/java/com/huobi/model/generic/SymbolV1.java new file mode 100644 index 00000000..d9f24e42 --- /dev/null +++ b/src/main/java/com/huobi/model/generic/SymbolV1.java @@ -0,0 +1,47 @@ +package com.huobi.model.generic; + +import lombok.*; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class SymbolV1 { + private String symbol; + private String sn; + private String bc; + private String qc; + private String state; + private Boolean ve; + private Boolean we; + private Boolean dl; + private Boolean cd; + private Boolean te; + private Boolean ce; + private Long tet; + private Long toa; + private Long tca; + private Long voa; + private Long vca; + private String sp; + private String tm; + private Integer w; + private BigDecimal ttp; + private BigDecimal tap; + private BigDecimal tpp; + private BigDecimal fp; + private String tags; + private String d; + private String bcdn; + private String qcdn; + private String elr; + private String castate; + private Long ca1oa; + private Long ca1ca; + private Long ca2oa; + private Long ca2ca; + +} diff --git a/src/main/java/com/huobi/model/generic/SymbolV2.java b/src/main/java/com/huobi/model/generic/SymbolV2.java new file mode 100644 index 00000000..8bcb5d78 --- /dev/null +++ b/src/main/java/com/huobi/model/generic/SymbolV2.java @@ -0,0 +1,46 @@ +package com.huobi.model.generic; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.*; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class SymbolV2 { + private String sc; + private String dn; + private String bc; + private String bcdn; + private String qc; + private String qcdn; + private String state; + private Boolean whe; + private Boolean cd; + private Boolean te; + private Long toa; + private String sp; + private Integer w; + private BigDecimal ttp; + private BigDecimal tap; + private BigDecimal tpp; + private BigDecimal fp; + @JSONField(name = "suspend_desc") + private String suspendDesc; + @JSONField(name = "transfer_board_desc") + private String transferBoardDesc; + private String tags; + private BigDecimal lr; + private BigDecimal smlr; + private String flr; + private String wr; + private Integer d; + private String elr; + private Person p1; + private String castate; + private String ca1oa; + private String ca2oa; +} diff --git a/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginCurrencyInfo.java b/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginCurrencyInfo.java index b594fa08..7b6a9953 100644 --- a/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginCurrencyInfo.java +++ b/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginCurrencyInfo.java @@ -2,15 +2,13 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class IsolatedMarginCurrencyInfo { private String currency; diff --git a/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginLoadOrder.java b/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginLoadOrder.java index 23efbabf..7f3b0e19 100644 --- a/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginLoadOrder.java +++ b/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginLoadOrder.java @@ -53,4 +53,8 @@ public class IsolatedMarginLoadOrder { private Long accruedAt; + private BigDecimal hourInterestRate; + + private BigDecimal dayInterestRate; + } diff --git a/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginSymbolInfo.java b/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginSymbolInfo.java index 43640e03..00659a6c 100644 --- a/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginSymbolInfo.java +++ b/src/main/java/com/huobi/model/isolatedmargin/IsolatedMarginSymbolInfo.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class IsolatedMarginSymbolInfo { private String symbol; diff --git a/src/main/java/com/huobi/model/isolatedmargin/LeveragePositionLimitResult.java b/src/main/java/com/huobi/model/isolatedmargin/LeveragePositionLimitResult.java new file mode 100644 index 00000000..a3a54b7b --- /dev/null +++ b/src/main/java/com/huobi/model/isolatedmargin/LeveragePositionLimitResult.java @@ -0,0 +1,13 @@ +package com.huobi.model.isolatedmargin; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class LeveragePositionLimitResult { + private String currency; + private String maxHoldings; +} diff --git a/src/main/java/com/huobi/model/market/MarketBBO.java b/src/main/java/com/huobi/model/market/MarketBBO.java index 61986e8b..e282acf6 100644 --- a/src/main/java/com/huobi/model/market/MarketBBO.java +++ b/src/main/java/com/huobi/model/market/MarketBBO.java @@ -27,4 +27,6 @@ public class MarketBBO { private BigDecimal askSize; + private Long seqId; + } diff --git a/src/main/java/com/huobi/model/market/MarketTicker.java b/src/main/java/com/huobi/model/market/MarketTicker.java index 6855d808..debcd969 100644 --- a/src/main/java/com/huobi/model/market/MarketTicker.java +++ b/src/main/java/com/huobi/model/market/MarketTicker.java @@ -39,4 +39,8 @@ public class MarketTicker { private BigDecimal askSize; + private BigDecimal lastPrice; + + private BigDecimal lastSize; + } diff --git a/src/main/java/com/huobi/model/market/MarketTickerEvent.java b/src/main/java/com/huobi/model/market/MarketTickerEvent.java new file mode 100644 index 00000000..83a757db --- /dev/null +++ b/src/main/java/com/huobi/model/market/MarketTickerEvent.java @@ -0,0 +1,17 @@ +package com.huobi.model.market; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class MarketTickerEvent { + private String ch; + + private Long ts; + + private MarketTicker ticker; + +} diff --git a/src/main/java/com/huobi/model/market/MarketTickerReq.java b/src/main/java/com/huobi/model/market/MarketTickerReq.java new file mode 100644 index 00000000..d802ceeb --- /dev/null +++ b/src/main/java/com/huobi/model/market/MarketTickerReq.java @@ -0,0 +1,16 @@ +package com.huobi.model.market; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class MarketTickerReq { + private String ch; + + private Long ts; + + private MarketTicker ticker; +} diff --git a/src/main/java/com/huobi/model/market/MbpIncrementalUpdateEvent.java b/src/main/java/com/huobi/model/market/MbpIncrementalUpdateEvent.java index c1e93fd8..286cfe8c 100644 --- a/src/main/java/com/huobi/model/market/MbpIncrementalUpdateEvent.java +++ b/src/main/java/com/huobi/model/market/MbpIncrementalUpdateEvent.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class MbpIncrementalUpdateEvent { private String action; diff --git a/src/main/java/com/huobi/model/market/MbpRefreshUpdateEvent.java b/src/main/java/com/huobi/model/market/MbpRefreshUpdateEvent.java index 125c1fe7..6724d988 100644 --- a/src/main/java/com/huobi/model/market/MbpRefreshUpdateEvent.java +++ b/src/main/java/com/huobi/model/market/MbpRefreshUpdateEvent.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class MbpRefreshUpdateEvent { private String topic; diff --git a/src/main/java/com/huobi/model/subuser/ApiKeyInfo.java b/src/main/java/com/huobi/model/subuser/ApiKeyInfo.java index 6ebede24..d2a0b95e 100644 --- a/src/main/java/com/huobi/model/subuser/ApiKeyInfo.java +++ b/src/main/java/com/huobi/model/subuser/ApiKeyInfo.java @@ -1,14 +1,12 @@ package com.huobi.model.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class ApiKeyInfo { private String accessKey; diff --git a/src/main/java/com/huobi/model/subuser/GetApiKeyListResult.java b/src/main/java/com/huobi/model/subuser/GetApiKeyListResult.java index 0d8da931..7fbb9f7a 100644 --- a/src/main/java/com/huobi/model/subuser/GetApiKeyListResult.java +++ b/src/main/java/com/huobi/model/subuser/GetApiKeyListResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetApiKeyListResult { private List list; diff --git a/src/main/java/com/huobi/model/subuser/GetSubUserAccountListResult.java b/src/main/java/com/huobi/model/subuser/GetSubUserAccountListResult.java index 7f3bd042..48021277 100644 --- a/src/main/java/com/huobi/model/subuser/GetSubUserAccountListResult.java +++ b/src/main/java/com/huobi/model/subuser/GetSubUserAccountListResult.java @@ -2,19 +2,19 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetSubUserAccountListResult { private Long uid; + private String deductMode; + private List list; } diff --git a/src/main/java/com/huobi/model/subuser/GetSubUserDepositResult.java b/src/main/java/com/huobi/model/subuser/GetSubUserDepositResult.java index 62925009..998e080b 100644 --- a/src/main/java/com/huobi/model/subuser/GetSubUserDepositResult.java +++ b/src/main/java/com/huobi/model/subuser/GetSubUserDepositResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetSubUserDepositResult { private List list; diff --git a/src/main/java/com/huobi/model/subuser/GetSubUserListResult.java b/src/main/java/com/huobi/model/subuser/GetSubUserListResult.java index b66e23f1..81a6c40a 100644 --- a/src/main/java/com/huobi/model/subuser/GetSubUserListResult.java +++ b/src/main/java/com/huobi/model/subuser/GetSubUserListResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class GetSubUserListResult { private List userList; diff --git a/src/main/java/com/huobi/model/subuser/SubUserAccount.java b/src/main/java/com/huobi/model/subuser/SubUserAccount.java index b21980ae..8c656854 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserAccount.java +++ b/src/main/java/com/huobi/model/subuser/SubUserAccount.java @@ -1,14 +1,12 @@ package com.huobi.model.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserAccount { private Long accountId; diff --git a/src/main/java/com/huobi/model/subuser/SubUserAccountInfo.java b/src/main/java/com/huobi/model/subuser/SubUserAccountInfo.java index 8ad6383a..c9a6e928 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserAccountInfo.java +++ b/src/main/java/com/huobi/model/subuser/SubUserAccountInfo.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserAccountInfo { private String accountType; diff --git a/src/main/java/com/huobi/model/subuser/SubUserApiKeyGenerationResult.java b/src/main/java/com/huobi/model/subuser/SubUserApiKeyGenerationResult.java index 179a36ff..85da494e 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserApiKeyGenerationResult.java +++ b/src/main/java/com/huobi/model/subuser/SubUserApiKeyGenerationResult.java @@ -1,14 +1,12 @@ package com.huobi.model.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserApiKeyGenerationResult { private String note; diff --git a/src/main/java/com/huobi/model/subuser/SubUserApiKeyModificationResult.java b/src/main/java/com/huobi/model/subuser/SubUserApiKeyModificationResult.java index 80f819a2..7de48032 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserApiKeyModificationResult.java +++ b/src/main/java/com/huobi/model/subuser/SubUserApiKeyModificationResult.java @@ -1,14 +1,12 @@ package com.huobi.model.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserApiKeyModificationResult { private String note; diff --git a/src/main/java/com/huobi/model/subuser/SubUserCreationInfo.java b/src/main/java/com/huobi/model/subuser/SubUserCreationInfo.java index da85a983..1ad90360 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserCreationInfo.java +++ b/src/main/java/com/huobi/model/subuser/SubUserCreationInfo.java @@ -1,21 +1,19 @@ package com.huobi.model.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserCreationInfo { private Long uid; private String userName; - private String node; + private String note; private String errCode; diff --git a/src/main/java/com/huobi/model/subuser/SubUserDeposit.java b/src/main/java/com/huobi/model/subuser/SubUserDeposit.java index f16c63bc..9d162549 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserDeposit.java +++ b/src/main/java/com/huobi/model/subuser/SubUserDeposit.java @@ -2,15 +2,13 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserDeposit { private Long id; diff --git a/src/main/java/com/huobi/model/subuser/SubUserManagementResult.java b/src/main/java/com/huobi/model/subuser/SubUserManagementResult.java index e3c1ca8a..0a1ef2dc 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserManagementResult.java +++ b/src/main/java/com/huobi/model/subuser/SubUserManagementResult.java @@ -1,14 +1,12 @@ package com.huobi.model.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserManagementResult { private Long subUid; diff --git a/src/main/java/com/huobi/model/subuser/SubUserState.java b/src/main/java/com/huobi/model/subuser/SubUserState.java index a8ac1213..08cb1f26 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserState.java +++ b/src/main/java/com/huobi/model/subuser/SubUserState.java @@ -1,18 +1,20 @@ package com.huobi.model.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserState { private Long uid; private String userState; + private String subUserName; + + private String note; + } diff --git a/src/main/java/com/huobi/model/subuser/SubUserTradableMarketResult.java b/src/main/java/com/huobi/model/subuser/SubUserTradableMarketResult.java index a3dbb772..526e9862 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserTradableMarketResult.java +++ b/src/main/java/com/huobi/model/subuser/SubUserTradableMarketResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserTradableMarketResult { private List list; diff --git a/src/main/java/com/huobi/model/subuser/SubUserTradableMarketState.java b/src/main/java/com/huobi/model/subuser/SubUserTradableMarketState.java index a15eacdb..db5774c0 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserTradableMarketState.java +++ b/src/main/java/com/huobi/model/subuser/SubUserTradableMarketState.java @@ -1,14 +1,12 @@ package com.huobi.model.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserTradableMarketState { private Long subUid; diff --git a/src/main/java/com/huobi/model/subuser/SubUserTransferabilityResult.java b/src/main/java/com/huobi/model/subuser/SubUserTransferabilityResult.java index 3534c953..1a3afad5 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserTransferabilityResult.java +++ b/src/main/java/com/huobi/model/subuser/SubUserTransferabilityResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserTransferabilityResult { private List list; diff --git a/src/main/java/com/huobi/model/subuser/SubUserTransferabilityState.java b/src/main/java/com/huobi/model/subuser/SubUserTransferabilityState.java index cf9a7be2..2b14a7b6 100644 --- a/src/main/java/com/huobi/model/subuser/SubUserTransferabilityState.java +++ b/src/main/java/com/huobi/model/subuser/SubUserTransferabilityState.java @@ -1,14 +1,12 @@ package com.huobi.model.subuser; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class SubUserTransferabilityState { private Long subUid; diff --git a/src/main/java/com/huobi/model/trade/BatchCancelOpenOrdersResult.java b/src/main/java/com/huobi/model/trade/BatchCancelOpenOrdersResult.java index bb4ea57e..b162f542 100644 --- a/src/main/java/com/huobi/model/trade/BatchCancelOpenOrdersResult.java +++ b/src/main/java/com/huobi/model/trade/BatchCancelOpenOrdersResult.java @@ -1,14 +1,12 @@ package com.huobi.model.trade; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class BatchCancelOpenOrdersResult { private Integer successCount; diff --git a/src/main/java/com/huobi/model/trade/BatchCancelOrderResult.java b/src/main/java/com/huobi/model/trade/BatchCancelOrderResult.java index 935a8159..e339ecbd 100644 --- a/src/main/java/com/huobi/model/trade/BatchCancelOrderResult.java +++ b/src/main/java/com/huobi/model/trade/BatchCancelOrderResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class BatchCancelOrderResult { private List successList; diff --git a/src/main/java/com/huobi/model/trade/BatchOrdersResult.java b/src/main/java/com/huobi/model/trade/BatchOrdersResult.java new file mode 100644 index 00000000..8a67fb2c --- /dev/null +++ b/src/main/java/com/huobi/model/trade/BatchOrdersResult.java @@ -0,0 +1,21 @@ +package com.huobi.model.trade; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class BatchOrdersResult { + @JSONField(name = "order-id") + private Long orderId; + @JSONField(name = "client-order-id") + private String clientOrderId; + @JSONField(name = "err-code") + private String errCode; + @JSONField(name = "err-msg") + private String errMsg; + +} diff --git a/src/main/java/com/huobi/model/trade/Order.java b/src/main/java/com/huobi/model/trade/Order.java index 20147d7a..aaab5cb4 100644 --- a/src/main/java/com/huobi/model/trade/Order.java +++ b/src/main/java/com/huobi/model/trade/Order.java @@ -3,10 +3,7 @@ import java.math.BigDecimal; import com.alibaba.fastjson.annotation.JSONField; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import com.huobi.constant.enums.StopOrderOperatorEnum; @@ -14,6 +11,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class Order { private Long id; @@ -36,6 +34,9 @@ public class Order { private String source; + @JSONField(name = "canceled-source") + private String canceledSource; + private String state; private Long createdAt; @@ -46,6 +47,8 @@ public class Order { private BigDecimal stopPrice; + private String clientOrderId; + @JSONField(deserialize = false) private StopOrderOperatorEnum operator; diff --git a/src/main/java/com/huobi/model/trade/OrderResp.java b/src/main/java/com/huobi/model/trade/OrderResp.java new file mode 100644 index 00000000..2ed9f0bf --- /dev/null +++ b/src/main/java/com/huobi/model/trade/OrderResp.java @@ -0,0 +1,12 @@ +package com.huobi.model.trade; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class OrderResp { + private Long orderId; +} diff --git a/src/main/java/com/huobi/model/trade/OrderUpdateV2.java b/src/main/java/com/huobi/model/trade/OrderUpdateV2.java index 213e7868..6067f0d5 100644 --- a/src/main/java/com/huobi/model/trade/OrderUpdateV2.java +++ b/src/main/java/com/huobi/model/trade/OrderUpdateV2.java @@ -2,18 +2,16 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class OrderUpdateV2 { - private String eventType; + private String event; private String symbol; @@ -27,6 +25,10 @@ public class OrderUpdateV2 { private BigDecimal remainAmt; + private String orderSource; + + private String execAmt; + /******* creation field ******/ private BigDecimal orderPrice; diff --git a/src/main/java/com/huobi/model/trade/OrderUpdateV2Event.java b/src/main/java/com/huobi/model/trade/OrderUpdateV2Event.java index e5c77a10..11e25b35 100644 --- a/src/main/java/com/huobi/model/trade/OrderUpdateV2Event.java +++ b/src/main/java/com/huobi/model/trade/OrderUpdateV2Event.java @@ -1,14 +1,12 @@ package com.huobi.model.trade; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class OrderUpdateV2Event { private String action; diff --git a/src/main/java/com/huobi/model/trade/TradeClearing.java b/src/main/java/com/huobi/model/trade/TradeClearing.java index 60455cfc..a4bef0f8 100644 --- a/src/main/java/com/huobi/model/trade/TradeClearing.java +++ b/src/main/java/com/huobi/model/trade/TradeClearing.java @@ -2,18 +2,16 @@ import java.math.BigDecimal; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class TradeClearing { - private String eventType; + private String event; private String symbol; diff --git a/src/main/java/com/huobi/model/trade/TradeClearingEvent.java b/src/main/java/com/huobi/model/trade/TradeClearingEvent.java index 8274b6a5..3e07ff27 100644 --- a/src/main/java/com/huobi/model/trade/TradeClearingEvent.java +++ b/src/main/java/com/huobi/model/trade/TradeClearingEvent.java @@ -1,14 +1,12 @@ package com.huobi.model.trade; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class TradeClearingEvent { private String action; diff --git a/src/main/java/com/huobi/model/wallet/DeductModeResult.java b/src/main/java/com/huobi/model/wallet/DeductModeResult.java new file mode 100644 index 00000000..4a5a49ad --- /dev/null +++ b/src/main/java/com/huobi/model/wallet/DeductModeResult.java @@ -0,0 +1,15 @@ +package com.huobi.model.wallet; + +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class DeductModeResult { + private String subUid; + private String deductMode; + private String errCode; + private String errMessage; +} diff --git a/src/main/java/com/huobi/model/wallet/WithdrawAddress.java b/src/main/java/com/huobi/model/wallet/WithdrawAddress.java index 8fbf1a2f..07755c16 100644 --- a/src/main/java/com/huobi/model/wallet/WithdrawAddress.java +++ b/src/main/java/com/huobi/model/wallet/WithdrawAddress.java @@ -1,14 +1,12 @@ package com.huobi.model.wallet; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class WithdrawAddress { private String currency; diff --git a/src/main/java/com/huobi/model/wallet/WithdrawAddressResult.java b/src/main/java/com/huobi/model/wallet/WithdrawAddressResult.java index ea5fd607..f9bf85d4 100644 --- a/src/main/java/com/huobi/model/wallet/WithdrawAddressResult.java +++ b/src/main/java/com/huobi/model/wallet/WithdrawAddressResult.java @@ -2,15 +2,13 @@ import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @AllArgsConstructor @NoArgsConstructor +@ToString public class WithdrawAddressResult { private Long nextId; diff --git a/src/main/java/com/huobi/model/wallet/WithdrawOrderResult.java b/src/main/java/com/huobi/model/wallet/WithdrawOrderResult.java new file mode 100644 index 00000000..cdc2b84b --- /dev/null +++ b/src/main/java/com/huobi/model/wallet/WithdrawOrderResult.java @@ -0,0 +1,48 @@ +package com.huobi.model.wallet; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.*; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class WithdrawOrderResult { + private String address; + @JSONField(name = "client-order-id") + private String clientOrderId; + @JSONField(name = "address-tag") + private String addressTag; + private BigDecimal amount; + @JSONField(name = "blockchain-confirm") + private Integer blockchainConfirm; + private String chain; + @JSONField(name = "created-at") + private Long createdAt; + private String currency; + @JSONField(name = "error-code") + private String errorCode; + @JSONField(name = "error-msg") + private String errorMsg; + private BigDecimal fee; + @JSONField(name = "from-addr-tag") + private String fromAddrTag; + @JSONField(name = "from-address") + private String fromAddress; + private Long id; + @JSONField(name = "request-id") + private String requestId; + private String state; + @JSONField(name = "tx-hash") + private String txHash; + private String type; + @JSONField(name = "updated-at") + private Long updatedAt; + @JSONField(name = "user-id") + private Long userId; + @JSONField(name = "wallet-confirm") + private Integer walletConfirm; +} diff --git a/src/main/java/com/huobi/service/huobi/HuobiAccountService.java b/src/main/java/com/huobi/service/huobi/HuobiAccountService.java index f047ff0a..cf351bb7 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiAccountService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiAccountService.java @@ -9,59 +9,51 @@ import com.alibaba.fastjson.JSONObject; import com.huobi.client.AccountClient; -import com.huobi.client.req.account.AccountAssetValuationRequest; -import com.huobi.client.req.account.AccountBalanceRequest; -import com.huobi.client.req.account.AccountFuturesTransferRequest; -import com.huobi.client.req.account.AccountHistoryRequest; -import com.huobi.client.req.account.AccountLedgerRequest; -import com.huobi.client.req.account.AccountTransferRequest; -import com.huobi.client.req.account.PointRequest; -import com.huobi.client.req.account.PointTransferRequest; -import com.huobi.client.req.account.SubAccountUpdateRequest; +import com.huobi.client.req.account.*; +import com.huobi.client.req.trade.SubOrderUpdateV2Request; +import com.huobi.client.req.trade.SubTradeClearingRequest; import com.huobi.constant.Options; import com.huobi.constant.WebSocketConstants; +import com.huobi.constant.enums.AccountActionEnum; import com.huobi.constant.enums.AccountTypeEnum; -import com.huobi.model.account.Account; -import com.huobi.model.account.AccountAssetValuationResult; -import com.huobi.model.account.AccountBalance; -import com.huobi.model.account.AccountFuturesTransferResult; -import com.huobi.model.account.AccountHistory; -import com.huobi.model.account.AccountLedgerResult; -import com.huobi.model.account.AccountTransferResult; -import com.huobi.model.account.AccountUpdateEvent; -import com.huobi.model.account.Point; -import com.huobi.model.account.PointTransferResult; +import com.huobi.exception.SDKException; +import com.huobi.model.account.*; +import com.huobi.model.trade.OrderUpdateV2Event; +import com.huobi.model.trade.TradeClearingEvent; import com.huobi.service.huobi.connection.HuobiRestConnection; +import com.huobi.service.huobi.connection.HuobiRestConnection25519; import com.huobi.service.huobi.connection.HuobiWebSocketConnection; -import com.huobi.service.huobi.parser.account.AccountAssetValuationResultParser; -import com.huobi.service.huobi.parser.account.AccountBalanceParser; -import com.huobi.service.huobi.parser.account.AccountFuturesTransferResultParser; -import com.huobi.service.huobi.parser.account.AccountHistoryParser; -import com.huobi.service.huobi.parser.account.AccountLedgerParser; -import com.huobi.service.huobi.parser.account.AccountParser; -import com.huobi.service.huobi.parser.account.AccountTransferResultParser; -import com.huobi.service.huobi.parser.account.AccountUpdateEventParser; -import com.huobi.service.huobi.parser.account.PointParser; -import com.huobi.service.huobi.parser.account.PointTransferResultParser; +import com.huobi.service.huobi.parser.account.*; +import com.huobi.service.huobi.parser.trade.OrderUpdateEventV2Parser; +import com.huobi.service.huobi.parser.trade.TradeClearingEventParser; import com.huobi.service.huobi.signature.UrlParamsBuilder; import com.huobi.utils.InputChecker; import com.huobi.utils.ResponseCallback; +import com.huobi.utils.SymbolUtils; +import org.apache.commons.lang.StringUtils; public class HuobiAccountService implements AccountClient { - public static final String GET_ACCOUNTS_PATH = "/v1/account/accounts"; - public static final String GET_ACCOUNT_BALANCE_PATH = "/v1/account/accounts/{account-id}/balance"; - public static final String GET_ACCOUNT_HISTORY_PATH = "/v1/account/history"; - public static final String GET_ACCOUNT_LEDGER_PATH = "/v2/account/ledger"; - public static final String ACCOUNT_TRANSFER_PATH = "/v1/account/transfer"; - public static final String ACCOUNT_FUTURES_TRANSFER_PATH = "/v1/futures/transfer"; - public static final String POINT_ACCOUNT_PATH = "/v2/point/account"; - public static final String POINT_TRANSFER_PATH = "/v2/point/transfer"; - public static final String ACCOUNT_ASSET_VALUATION_PATH = "/v2/account/asset-valuation"; + public static final String GET_ACCOUNTS_PATH = "/v1/account/accounts";//账户信息 + public static final String GET_ACCOUNT_BALANCE_PATH = "/v1/account/accounts/{account-id}/balance";//账户余额 + public static final String GET_ACCOUNT_HISTORY_PATH = "/v1/account/history";//账户流水 + public static final String GET_ACCOUNT_LEDGER_PATH = "/v2/account/ledger";//财务流水 + public static final String ACCOUNT_TRANSFER_PATH = "/v1/account/transfer";//资产划转 + public static final String ACCOUNT_FUTURES_TRANSFER_PATH = "/v1/futures/transfer";//币币现货账户与合约账户划转 + public static final String POINT_ACCOUNT_PATH = "/v2/point/account";//点卡余额查询 + public static final String POINT_TRANSFER_PATH = "/v2/point/transfer";//点卡划转 + public static final String ACCOUNT_ASSET_VALUATION_PATH = "/v2/account/asset-valuation";//获取指定账户资产估值(现货、杠杆、OTC) + public static final String ACCOUNT_VALUATION_PATH = "/v2/account/valuation";//获取平台资产总估值 + public static final String ACCOUNT_TRANSFER_PATH_V2 = "/v2/account/transfer";//【通用】现货-合约账户和OTC账户间进行资金的划转 + public static final String ACCOUNT_USER_INFO_PATH = "/v1/account/switch/user/info";// 用户抵扣信息查询 + public static final String ACCOUNT_OVERVIEW_INFO_PATH = "/v1/account/overview/info";// 可抵扣币种查询信息 + public static final String ACCOUNT_FEE_SWITCH_PATH = "/v1/account/fee/switch";// 设置现货/杠杆抵扣手续费方式 - public static final String SUB_ACCOUNT_UPDATE_TOPIC = "accounts.update#${mode}"; + public static final String SUB_ACCOUNT_UPDATE_TOPIC = "accounts.update#${mode}";//订阅账户变更 + public static final String WEBSOCKET_ORDER_UPDATE_V2_TOPIC = "orders#${symbol}";//订阅订单更新 + public static final String WEBSOCKET_TRADE_CLEARING_TOPIC = "trade.clearing#${symbol}#${mode}";//订阅清算后成交及撤单更新 private Map accountMap = new ConcurrentHashMap<>(); @@ -71,9 +63,15 @@ public class HuobiAccountService implements AccountClient { private HuobiRestConnection restConnection; + public HuobiAccountService(Options options) { this.options = options; - this.restConnection = new HuobiRestConnection(options); + if(options.getSign().equals("256")){ + this.restConnection = new HuobiRestConnection(options); + }else if(options.getSign().equals("25519")){ + this.restConnection = new HuobiRestConnection25519(options); + } + } @Override @@ -109,7 +107,8 @@ public List getAccountHistory(AccountHistoryRequest request) { .putToUrl("start-time", request.getStartTime()) .putToUrl("end-time", request.getEndTime()) .putToUrl("sort", request.getSort() == null ? null : request.getSort().getSort()) - .putToUrl("size", request.getSize()); + .putToUrl("size", request.getSize()) + .putToUrl("from-id", request.getFromId()); JSONObject jsonObject = restConnection.executeGetWithSignature(GET_ACCOUNT_HISTORY_PATH, builder); JSONArray jsonArray = jsonObject.getJSONArray("data"); @@ -196,7 +195,8 @@ public Point getPoint(PointRequest request) { .putToUrl("subUid", request.getSubUid()); JSONObject jsonObject = restConnection.executeGetWithSignature(POINT_ACCOUNT_PATH, builder); - return new PointParser().parse(jsonObject); + JSONObject data = jsonObject.getJSONObject("data"); + return new PointParser().parse(data); } @Override @@ -208,7 +208,8 @@ public PointTransferResult pointTransfer(PointTransferRequest request) { .putToPost("amount", request.getAmount()) ; JSONObject jsonObject = restConnection.executePostWithSignature(POINT_TRANSFER_PATH, builder); - return new PointTransferResultParser().parse(jsonObject); + JSONObject data = jsonObject.getJSONObject("data"); + return new PointTransferResultParser().parse(data); } @Override @@ -219,15 +220,75 @@ public AccountAssetValuationResult accountAssetValuation(AccountAssetValuationRe .putToUrl("subUid", request.getSubUid()) ; JSONObject jsonObject = restConnection.executeGetWithSignature(ACCOUNT_ASSET_VALUATION_PATH, builder); - return new AccountAssetValuationResultParser().parse(jsonObject); + JSONObject data = jsonObject.getJSONObject("data"); + return new AccountAssetValuationResultParser().parse(data); + } + + @Override + public AccountValuationResult accountValuation(AccountValuationRequest request) { + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("accountType", request.getAccountType().getCode()) + .putToUrl("valuationCurrency", request.getValuationCurrency()); + JSONObject jsonObject = restConnection.executeGetWithSignature(ACCOUNT_VALUATION_PATH, builder); + JSONObject data = jsonObject.getJSONObject("data"); + return new AccountValuationResultParser().parse(data); + } + + @Override + public AccountTransferV2Result accountTransferV2(AccountTransferV2Request request) { + InputChecker.checker() + .shouldNotNull(request.getFrom(), "from") + .shouldNotNull(request.getTo(), "to") + .shouldNotNull(request.getCurrency(), "currency") + .shouldNotNull(request.getAmount(), "amount") + .shouldNotNull(request.getMarginAccount(), "margin-account"); + + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToPost("from", request.getFrom().getType()) + .putToPost("to", request.getTo().getType()) + .putToPost("currency", request.getCurrency()) + .putToPost("amount", request.getAmount()) + .putToPost("margin-account", request.getMarginAccount()); + + JSONObject jsonObject = restConnection.executePostWithSignature(ACCOUNT_TRANSFER_PATH_V2, builder); + return new AccountTransferV2ResultParser().parse(jsonObject); + } + + @Override + public UserInfo getAccountUserInfo() { + JSONObject jsonObject = restConnection.executeGetWithSignature(ACCOUNT_USER_INFO_PATH, UrlParamsBuilder.build()); + JSONObject data = jsonObject.getJSONObject("data"); + return new UserInfoParser().parse(data); + } + + @Override + public OverviewInfo getOverviewInfo() { + JSONObject jsonObject = restConnection.executeGetWithSignature(ACCOUNT_OVERVIEW_INFO_PATH, UrlParamsBuilder.build()); + JSONObject data = jsonObject.getJSONObject("data"); + return new OverviewInfoParser().parse(data); + } + + @Override + public void feeSwitch(FeeSwitchRequest request) { + InputChecker.checker() + .shouldNotNull(request.getSwitchType(), "switchType") + .shouldNotNull(request.getDeductionCurrency(), "deductionCurrency"); + + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToPost("switchType", request.getSwitchType()) + .putToPost("deductionCurrency", request.getDeductionCurrency()); + + restConnection.executePostWithSignature(ACCOUNT_FEE_SWITCH_PATH, builder); } + public void subAccountsUpdate(SubAccountUpdateRequest request, ResponseCallback callback) { InputChecker.checker() .shouldNotNull(request.getAccountUpdateMode(), "account update model"); + AccountActionEnum accountActionEnum = request.getAccountAction() != null ? request.getAccountAction() : AccountActionEnum.ACTION_SUB; JSONObject command = new JSONObject(); - command.put("action", WebSocketConstants.ACTION_SUB); + command.put("action", accountActionEnum.getCode()); command.put("cid", System.currentTimeMillis() + ""); command.put("ch", SUB_ACCOUNT_UPDATE_TOPIC.replace("${mode}", request.getAccountUpdateMode().getCode())); command.put("model", request.getAccountUpdateMode().getCode()); @@ -238,4 +299,63 @@ public void subAccountsUpdate(SubAccountUpdateRequest request, ResponseCallback< HuobiWebSocketConnection.createAssetV2Connection(options, commandList, new AccountUpdateEventParser(), callback, false); } + @Override + public void subOrderUpdateV2(SubOrderUpdateV2Request request, ResponseCallback callback) { + // 检查参数 + InputChecker.checker() + .shouldNotNull(request.getSymbols(), "symbols"); + + // 格式化symbol为数组 + List symbolList = SymbolUtils.parseSymbols(request.getSymbols()); + + // 检查数组 + InputChecker.checker().checkSymbolList(symbolList); + + List commandList = new ArrayList<>(symbolList.size()); + symbolList.forEach(symbol -> { + + AccountActionEnum accountActionEnum = request.getAccountAction() != null ? request.getAccountAction() : AccountActionEnum.ACTION_SUB; + + String topic = WEBSOCKET_ORDER_UPDATE_V2_TOPIC.replace("${symbol}", symbol); + + JSONObject command = new JSONObject(); + command.put("action", accountActionEnum.getCode()); + command.put("ch", topic); + command.put("id", System.nanoTime()); + commandList.add(command.toJSONString()); + }); + + HuobiWebSocketConnection.createAssetV2Connection(options, commandList, new OrderUpdateEventV2Parser(), callback, false); + } + + @Override + public void subTradeClearing(SubTradeClearingRequest request, ResponseCallback callback) { + // 检查参数 + InputChecker.checker() + .shouldNotNull(request.getSymbols(), "symbols"); + + // 格式化symbol为数组 + List symbolList = SymbolUtils.parseSymbols(request.getSymbols()); + int[] modeArray = request.getModes(); + // 检查数组 + InputChecker.checker().checkSymbolList(symbolList); + if (symbolList.size() != modeArray.length) { + throw new SDKException(SDKException.INPUT_ERROR, "[Input] The number of symbol and mode must be equal"); + } + + AccountActionEnum accountActionEnum = request.getAccountAction() != null ? request.getAccountAction() : AccountActionEnum.ACTION_SUB; + List commandList = new ArrayList<>(symbolList.size()); + for (int i = 0; i < symbolList.size(); i++) { + String topic = WEBSOCKET_TRADE_CLEARING_TOPIC + .replace("${symbol}", symbolList.get(i)) + .replace("${mode}", String.valueOf(modeArray[i])); + JSONObject command = new JSONObject(); + command.put("action", accountActionEnum.getCode()); + command.put("ch", topic); + command.put("id", System.nanoTime()); + commandList.add(command.toJSONString()); + } + HuobiWebSocketConnection.createAssetV2Connection(options, commandList, new TradeClearingEventParser(), callback, false); + } + } diff --git a/src/main/java/com/huobi/service/huobi/HuobiAlgoService.java b/src/main/java/com/huobi/service/huobi/HuobiAlgoService.java index d7566865..ffe575e1 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiAlgoService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiAlgoService.java @@ -3,34 +3,25 @@ import com.alibaba.fastjson.JSONObject; import com.huobi.client.AlgoClient; -import com.huobi.client.req.algo.CancelAlgoOrderRequest; -import com.huobi.client.req.algo.CreateAlgoOrderRequest; -import com.huobi.client.req.algo.GetHistoryAlgoOrdersRequest; -import com.huobi.client.req.algo.GetOpenAlgoOrdersRequest; +import com.huobi.client.req.algo.*; import com.huobi.constant.Options; import com.huobi.constant.enums.algo.AlgoOrderTypeEnum; -import com.huobi.model.algo.AlgoOrder; -import com.huobi.model.algo.CancelAlgoOrderResult; -import com.huobi.model.algo.CreateAlgoOrderResult; -import com.huobi.model.algo.GetHistoryAlgoOrdersResult; -import com.huobi.model.algo.GetOpenAlgoOrdersResult; +import com.huobi.model.algo.*; import com.huobi.service.huobi.connection.HuobiRestConnection; -import com.huobi.service.huobi.parser.algo.AlgoOrderParser; -import com.huobi.service.huobi.parser.algo.CancelAlgoOrderResultParser; -import com.huobi.service.huobi.parser.algo.CreateAlgoOrderResultParser; -import com.huobi.service.huobi.parser.algo.GetHistoryAlgoOrdersResultParser; -import com.huobi.service.huobi.parser.algo.GetOpenAlgoOrdersResultParser; +import com.huobi.service.huobi.connection.HuobiRestConnection25519; +import com.huobi.service.huobi.parser.algo.*; import com.huobi.service.huobi.signature.UrlParamsBuilder; import com.huobi.utils.InputChecker; public class HuobiAlgoService implements AlgoClient { - private static final String GET_ALGO_ORDERS_SPECIFIC_PATH = "/v2/algo-orders/specific"; - private static final String GET_OPEN_ALGO_ORDERS_PATH = "/v2/algo-orders/opening"; - private static final String GET_HISTORY_ALGO_ORDERS_PATH = "/v2/algo-orders/history"; - private static final String CREATE_ALGO_ORDER_PATH = "/v2/algo-orders"; - private static final String CANCEL_ALGO_ORDER_PATH = "/v2/algo-orders/cancellation"; + private static final String GET_ALGO_ORDERS_SPECIFIC_PATH = "/v2/algo-orders/specific";//查询特定策略委托 + private static final String GET_OPEN_ALGO_ORDERS_PATH = "/v2/algo-orders/opening";//查询未触发OPEN策略委托 + private static final String GET_HISTORY_ALGO_ORDERS_PATH = "/v2/algo-orders/history";//查询策略委托历史 + private static final String CREATE_ALGO_ORDER_PATH = "/v2/algo-orders";//策略委托下单 + private static final String CANCEL_ALGO_ORDER_PATH = "/v2/algo-orders/cancellation";//策略委托(触发前)撤单 + private static final String CANCEL_ALGO_ALL_ORDER_PATH = "/v2/algo-orders/cancel-all-after";//自动撤销订单 private Options options; @@ -39,7 +30,11 @@ public class HuobiAlgoService implements AlgoClient { public HuobiAlgoService(Options options) { this.options = options; - this.restConnection = new HuobiRestConnection(options); + if(options.getSign().equals("256")){ + this.restConnection = new HuobiRestConnection(options); + }else if(options.getSign().equals("25519")){ + this.restConnection = new HuobiRestConnection25519(options); + } } @@ -142,4 +137,15 @@ public AlgoOrder getAlgoOrdersSpecific(String clientOrderId) { JSONObject jsonObject = restConnection.executeGetWithSignature(GET_ALGO_ORDERS_SPECIFIC_PATH, builder); return new AlgoOrderParser().parse(jsonObject.getJSONObject("data")); } + + @Override + public CancelAlgoAllOrderResult cancelAlgoAllOrder(CancelAlgoAllOrderRequest request) { + InputChecker.checker().shouldNotNull(request.getTimeout(), "timeout"); + + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToPost("timeout", request.getTimeout()); + + JSONObject jsonObject = restConnection.executePostWithSignature(CANCEL_ALGO_ALL_ORDER_PATH, builder); + return new CancelAlgoAllOrderResultParser().parse(jsonObject.getJSONObject("data")); + } } diff --git a/src/main/java/com/huobi/service/huobi/HuobiCrossMarginService.java b/src/main/java/com/huobi/service/huobi/HuobiCrossMarginService.java index 567fc6b4..9fa850b0 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiCrossMarginService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiCrossMarginService.java @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.huobi.client.req.account.GetBalanceRequest; +import com.huobi.service.huobi.connection.HuobiRestConnection25519; import org.apache.commons.lang.StringUtils; import com.huobi.client.CrossMarginClient; @@ -31,16 +33,16 @@ public class HuobiCrossMarginService implements CrossMarginClient { - public static final String TRANSFER_TO_MARGIN_PATH = "/v1/cross-margin/transfer-in"; - public static final String TRANSFER_TO_SPOT_PATH = "/v1/cross-margin/transfer-out"; - public static final String APPLY_LOAN_PATH = "/v1/cross-margin/orders"; - public static final String REPAY_LOAN_PATH = "/v1/cross-margin/orders/{order-id}/repay"; + public static final String TRANSFER_TO_MARGIN_PATH = "/v1/cross-margin/transfer-in";//资产划入(全仓) + public static final String TRANSFER_TO_SPOT_PATH = "/v1/cross-margin/transfer-out";//资产划出(全仓) + public static final String APPLY_LOAN_PATH = "/v1/cross-margin/orders";//申请借币(全仓) + public static final String REPAY_LOAN_PATH = "/v1/cross-margin/orders/{order-id}/repay";//归还借币(全仓) - public static final String GET_BALANCE_PATH = "/v1/cross-margin/accounts/balance"; - public static final String GET_LOAN_INFO_PATH = "/v1/cross-margin/loan-info"; - public static final String GET_LOAN_ORDER_PATH = "/v1/cross-margin/loan-orders"; - public static final String GENERAL_REPAY_LOAN_PATH = "/v2/account/repayment"; - public static final String GENERAL_GET_REPAYMENT_LOAN_RECORDS_PATH = "/v2/account/repayment"; + public static final String GET_BALANCE_PATH = "/v1/cross-margin/accounts/balance";//借币账户详情(全仓) + public static final String GET_LOAN_INFO_PATH = "/v1/cross-margin/loan-info";//查询借币币息率及额度(全仓) + public static final String GET_LOAN_ORDER_PATH = "/v1/cross-margin/loan-orders";//查询借币订单(全仓) + public static final String GENERAL_REPAY_LOAN_PATH = "/v2/account/repayment";//归还借币(全仓逐仓通用) + public static final String GENERAL_GET_REPAYMENT_LOAN_RECORDS_PATH = "/v2/account/repayment";//还币交易记录查询 private Options options; @@ -49,7 +51,11 @@ public class HuobiCrossMarginService implements CrossMarginClient { public HuobiCrossMarginService(Options options) { this.options = options; - this.restConnection = new HuobiRestConnection(options); + if(options.getSign().equals("256")){ + this.restConnection = new HuobiRestConnection(options); + }else if(options.getSign().equals("25519")){ + this.restConnection = new HuobiRestConnection25519(options); + } } @Override @@ -112,7 +118,8 @@ public List getLoanOrders(CrossMarginLoanOrdersRequest req .putToUrl("states", request.getStatesString()) .putToUrl("from", request.getFrom()) .putToUrl("size", request.getSize()) - .putToUrl("direct", request.getDirection() == null ? null : request.getDirection().getCode()); + .putToUrl("direct", request.getDirection() == null ? null : request.getDirection().getCode()) + .putToUrl("sub-uid", request.getSubUid()); JSONObject jsonObject = restConnection.executeGetWithSignature(GET_LOAN_ORDER_PATH, builder); JSONArray data = jsonObject.getJSONArray("data"); @@ -120,13 +127,15 @@ public List getLoanOrders(CrossMarginLoanOrdersRequest req } @Override - public CrossMarginAccount getLoanBalance() { - - JSONObject jsonObject = restConnection.executeGetWithSignature(GET_BALANCE_PATH, UrlParamsBuilder.build()); + public CrossMarginAccount getLoanBalance(GetBalanceRequest request) { + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("sub-uid", request.getSubUid()); + JSONObject jsonObject = restConnection.executeGetWithSignature(GET_BALANCE_PATH, builder); JSONObject data = jsonObject.getJSONObject("data"); return new CrossMarginAccountParser().parse(data); } + @Override public List getLoanInfo() { JSONObject jsonObject = restConnection.executeGetWithSignature(GET_LOAN_INFO_PATH, UrlParamsBuilder.build()); JSONArray data = jsonObject.getJSONArray("data"); diff --git a/src/main/java/com/huobi/service/huobi/HuobiETFService.java b/src/main/java/com/huobi/service/huobi/HuobiETFService.java deleted file mode 100644 index 394d65a7..00000000 --- a/src/main/java/com/huobi/service/huobi/HuobiETFService.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.huobi.service.huobi; - -import java.math.BigDecimal; -import java.util.List; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -import com.huobi.client.ETFClient; -import com.huobi.client.req.etf.ETFSwapListRequest; -import com.huobi.client.req.etf.ETFSwapRequest; -import com.huobi.constant.Constants; -import com.huobi.constant.HuobiOptions; -import com.huobi.constant.Options; -import com.huobi.constant.enums.EtfSwapDirectionEnum; -import com.huobi.model.etf.ETFConfig; -import com.huobi.model.etf.ETFSwapRecord; -import com.huobi.service.huobi.connection.HuobiRestConnection; -import com.huobi.service.huobi.parser.etf.ETFConfigParser; -import com.huobi.service.huobi.parser.etf.ETFSwapRecordParser; -import com.huobi.service.huobi.signature.UrlParamsBuilder; -import com.huobi.utils.InputChecker; - -public class HuobiETFService implements ETFClient { - - public static final String GET_SWAP_CONFIG_PATH = "/etf/swap/config"; - - public static final String ETF_SWAP_IN_PATH = "/etf/swap/in"; - public static final String ETF_SWAP_OUT_PATH = "/etf/swap/out"; - public static final String GET_SWAP_LIST_PATH = "/etf/swap/list"; - - - private Options options; - - private HuobiRestConnection restConnection; - - public HuobiETFService(Options options) { - this.options = options; - this.restConnection = new HuobiRestConnection(options); - } - - - @Override - public ETFConfig getConfig(String etfName) { - - InputChecker.checker() - .shouldNotNull(etfName, "etf_name"); - - UrlParamsBuilder builder = UrlParamsBuilder.build() - .putToUrl("etf_name", etfName); - - JSONObject jsonObject = restConnection.executeGetWithSignature(GET_SWAP_CONFIG_PATH, builder); - JSONObject data = jsonObject.getJSONObject("data"); - return new ETFConfigParser().parse(data); - } - - @Override - public void etfSwap(ETFSwapRequest request) { - - InputChecker.checker() - .shouldNotNull(request.getDirection(), "direction") - .shouldNotNull(request.getAmount(), "amount"); - - UrlParamsBuilder builder = UrlParamsBuilder.build() - .putToPost("etf_name", request.getEtfName()) - .putToPost("amount", request.getAmount()); - - String path = null; - if (request.getDirection() == EtfSwapDirectionEnum.SWAP_IN_ETF) { - path = ETF_SWAP_IN_PATH; - } else { - path = ETF_SWAP_OUT_PATH; - } - - restConnection.executePostWithSignature(path, builder); - } - - @Override - public List getEtfSwapList(ETFSwapListRequest request) { - - InputChecker.checker() - .shouldNotNull(request.getEtfName(), "etf_name") - .shouldNotNull(request.getOffset(), "offset") - .shouldNotNull(request.getLimit(), "limit") - .checkRange(request.getLimit(), 1, 100, "limit"); - - UrlParamsBuilder builder = UrlParamsBuilder.build() - .putToUrl("etf_name", request.getEtfName()) - .putToUrl("offset", request.getOffset()) - .putToUrl("limit", request.getLimit()); - - JSONObject jsonObject = restConnection.executeGetWithSignature(GET_SWAP_LIST_PATH,builder); - JSONArray data = jsonObject.getJSONArray("data"); - return new ETFSwapRecordParser().parseArray(data); - } - - - - -} diff --git a/src/main/java/com/huobi/service/huobi/HuobiGenericService.java b/src/main/java/com/huobi/service/huobi/HuobiGenericService.java index 7783fc13..11c4ce0b 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiGenericService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiGenericService.java @@ -6,27 +6,27 @@ import com.alibaba.fastjson.JSONObject; import com.huobi.client.GenericClient; +import com.huobi.client.req.generic.ChainRequest; import com.huobi.client.req.generic.CurrencyChainsRequest; import com.huobi.constant.HuobiOptions; import com.huobi.constant.Options; -import com.huobi.model.generic.CurrencyChain; -import com.huobi.model.generic.MarketStatus; -import com.huobi.model.generic.Symbol; +import com.huobi.model.generic.*; import com.huobi.service.huobi.connection.HuobiRestConnection; -import com.huobi.service.huobi.parser.generic.CurrencyChainParser; -import com.huobi.service.huobi.parser.generic.MarketStatusParser; -import com.huobi.service.huobi.parser.generic.SymbolParser; +import com.huobi.service.huobi.parser.generic.*; import com.huobi.service.huobi.signature.UrlParamsBuilder; public class HuobiGenericService implements GenericClient { - public static final String GET_SYSTEM_STATUS_URL = "https://status.huobigroup.com/api/v2/summary.json"; - - public static final String GET_MARKET_STATUS_PATH = "/v2/market-status"; - public static final String GET_SYMBOLS_PATH = "/v1/common/symbols"; - public static final String GET_CURRENCY_PATH = "/v1/common/currencys"; - public static final String GET_CURRENCY_CHAINS_PATH = "/v2/reference/currencies"; - public static final String GET_TIMESTAMP = "/v1/common/timestamp"; + public static final String GET_SYSTEM_STATUS_URL = "https://status.huobigroup.com/api/v2/summary.json";//获取当前系统状态 + public static final String GET_MARKET_STATUS_PATH = "/v2/market-status";//获取当前市场状态 + public static final String GET_CURRENCY_CHAINS_PATH = "/v2/reference/currencies";//APIv2币链参考信息 + public static final String GET_TIMESTAMP = "/v1/common/timestamp";//获取当前系统时间戳 + public static final String GET_SYMBOLS_PATH_V2 = "/v2/settings/common/symbols";//获取所有交易对(V2) + public static final String GET_CURRENCY_PATH_V2 = "/v2/settings/common/currencies";//获取所有币种(V2) + public static final String GET_CURRENCY_PATH_V1 = "/v1/settings/common/currencys";//获取币种配置 + public static final String GET_SYMBOLS_PATH_V1 = "/v1/settings/common/symbols";//获取交易对配置 + public static final String GET_MARKET_SYMBOLS_PATH = "/v1/settings/common/market-symbols";//获取市场交易对配置 + public static final String GET_CHAIN_PATH = "/v1/settings/common/chains";//查询链信息 private Options options; @@ -51,38 +51,79 @@ public MarketStatus getMarketStatus() { } @Override - public List getSymbols() { + public List getCurrencyChains(CurrencyChainsRequest request) { + + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("currency",request.getCurrency()) + .putToUrl("authorizedUser",request.isAuthorizedUser()+""); - JSONObject jsonObject = restConnection.executeGet(GET_SYMBOLS_PATH, UrlParamsBuilder.build()); + JSONObject jsonObject = restConnection.executeGet(GET_CURRENCY_CHAINS_PATH,builder); JSONArray data = jsonObject.getJSONArray("data"); - return new SymbolParser().parseArray(data); + return new CurrencyChainParser().parseArray(data); } @Override - public List getCurrencys() { + public Long getTimestamp() { + JSONObject jsonObject = restConnection.executeGet(GET_TIMESTAMP, UrlParamsBuilder.build()); + return jsonObject.getLong("data"); + } - JSONObject jsonObject = restConnection.executeGet(GET_CURRENCY_PATH, UrlParamsBuilder.build()); + @Override + public List getSymbolsV2(Long ts) { + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("ts", ts); + JSONObject jsonObject = restConnection.executeGet(GET_SYMBOLS_PATH_V2, builder); JSONArray data = jsonObject.getJSONArray("data"); - return data.toJavaList(String.class); + return new SymbolV2Parser().parseArray(data); + } + @Override + public List getCurrencyV1(Long ts) { + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("ts", ts); + JSONObject jsonObject = restConnection.executeGet(GET_CURRENCY_PATH_V1, builder); + JSONArray data = jsonObject.getJSONArray("data"); + return new CurrencyParser().parseArray(data); } @Override - public List getCurrencyChains(CurrencyChainsRequest request) { + public List getCurrencyV2(Long ts) { + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("ts", ts); + JSONObject jsonObject = restConnection.executeGet(GET_CURRENCY_PATH_V2, builder); + JSONArray data = jsonObject.getJSONArray("data"); + return new CurrencyV2Parser().parseArray(data); + } + @Override + public List getSymbolsV1(Long ts) { UrlParamsBuilder builder = UrlParamsBuilder.build() - .putToUrl("currency",request.getCurrency()) - .putToUrl("authorizedUser",request.isAuthorizedUser()+""); + .putToUrl("ts", ts); + JSONObject jsonObject = restConnection.executeGet(GET_SYMBOLS_PATH_V1, builder); + JSONArray data = jsonObject.getJSONArray("data"); + return new SymbolV1Parser().parseArray(data); + } - JSONObject jsonObject = restConnection.executeGet(GET_CURRENCY_CHAINS_PATH,builder); + @Override + public List getMarketSymbol(String symbols, Long ts) { + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("symbols", symbols) + .putToUrl("ts", ts); + JSONObject jsonObject = restConnection.executeGet(GET_MARKET_SYMBOLS_PATH, builder); JSONArray data = jsonObject.getJSONArray("data"); - return new CurrencyChainParser().parseArray(data); + return new MarketSymbolParser().parseArray(data); } @Override - public Long getTimestamp() { - JSONObject jsonObject = restConnection.executeGet(GET_TIMESTAMP, UrlParamsBuilder.build()); - return jsonObject.getLong("data"); + public List getChain(ChainRequest request) { + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("show-desc", request.getShowDesc()) + .putToUrl("currency", request.getCurrency()) + .putToUrl("ts", request.getTs()); + JSONObject jsonObject = restConnection.executeGet(GET_CHAIN_PATH, builder); + JSONArray data = jsonObject.getJSONArray("data"); + return new ChainV1Parser().parseArray(data); } + } diff --git a/src/main/java/com/huobi/service/huobi/HuobiIsolatedMarginService.java b/src/main/java/com/huobi/service/huobi/HuobiIsolatedMarginService.java index de489b5e..14304d34 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiIsolatedMarginService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiIsolatedMarginService.java @@ -6,36 +6,33 @@ import com.alibaba.fastjson.JSONObject; import com.huobi.client.IsolatedMarginClient; -import com.huobi.client.req.margin.IsolatedMarginAccountRequest; -import com.huobi.client.req.margin.IsolatedMarginApplyLoanRequest; -import com.huobi.client.req.margin.IsolatedMarginLoanInfoRequest; -import com.huobi.client.req.margin.IsolatedMarginLoanOrdersRequest; -import com.huobi.client.req.margin.IsolatedMarginRepayLoanRequest; -import com.huobi.client.req.margin.IsolatedMarginTransferRequest; -import com.huobi.constant.Constants; -import com.huobi.constant.HuobiOptions; +import com.huobi.client.req.margin.*; + import com.huobi.constant.Options; import com.huobi.constant.enums.MarginTransferDirectionEnum; import com.huobi.model.isolatedmargin.IsolatedMarginAccount; import com.huobi.model.isolatedmargin.IsolatedMarginLoadOrder; import com.huobi.model.isolatedmargin.IsolatedMarginSymbolInfo; +import com.huobi.model.isolatedmargin.LeveragePositionLimitResult; import com.huobi.service.huobi.connection.HuobiRestConnection; +import com.huobi.service.huobi.connection.HuobiRestConnection25519; import com.huobi.service.huobi.parser.isolatedmargin.IsolatedMarginAccountParser; import com.huobi.service.huobi.parser.isolatedmargin.IsolatedMarginLoadOrderParser; import com.huobi.service.huobi.parser.isolatedmargin.IsolatedMarginSymbolInfoParser; +import com.huobi.service.huobi.parser.isolatedmargin.LeveragePositionLimitResultParser; import com.huobi.service.huobi.signature.UrlParamsBuilder; import com.huobi.utils.InputChecker; public class HuobiIsolatedMarginService implements IsolatedMarginClient { - public static final String TRANSFER_TO_MARGIN_PATH = "/v1/dw/transfer-in/margin"; - public static final String TRANSFER_TO_SPOT_PATH = "/v1/dw/transfer-out/margin"; - public static final String GET_BALANCE_PATH = "/v1/margin/accounts/balance"; - public static final String GET_LOAN_ORDER_PATH = "/v1/margin/loan-orders"; - public static final String GET_LOAN_INFO_PATH = "/v1/margin/loan-info"; - - public static final String APPLY_LOAN_PATH = "/v1/margin/orders"; - public static final String REPAY_LOAN_PATH = "/v1/margin/orders/{order-id}/repay"; + public static final String TRANSFER_TO_MARGIN_PATH = "/v1/dw/transfer-in/margin";//资产划入(逐仓) + public static final String TRANSFER_TO_SPOT_PATH = "/v1/dw/transfer-out/margin";//资产划出(逐仓) + public static final String GET_BALANCE_PATH = "/v1/margin/accounts/balance";//借币账户详情(逐仓) + public static final String GET_LOAN_ORDER_PATH = "/v1/margin/loan-orders";//查询借币订单(逐仓) + public static final String GET_LOAN_INFO_PATH = "/v1/margin/loan-info";//查询借币币息率及额度(逐仓) + public static final String APPLY_LOAN_PATH = "/v1/margin/orders";//申请借币(逐仓) + public static final String REPAY_LOAN_PATH = "/v1/margin/orders/{order-id}/repay";//归还借币(逐仓) + public static final String GET_LEVERAGE_POSITION_LIMIT_PATH = "/v2/margin/limit";//获取杠杆持仓限额(全仓) private Options options; @@ -44,7 +41,11 @@ public class HuobiIsolatedMarginService implements IsolatedMarginClient { public HuobiIsolatedMarginService(Options options) { this.options = options; - this.restConnection = new HuobiRestConnection(options); + if(options.getSign().equals("256")){ + this.restConnection = new HuobiRestConnection(options); + }else if(options.getSign().equals("25519")){ + this.restConnection = new HuobiRestConnection25519(options); + } } @@ -118,7 +119,8 @@ public List getLoanOrders(IsolatedMarginLoanOrdersReque .putToUrl("states", request.getStatesString()) .putToUrl("from", request.getFrom()) .putToUrl("size", request.getSize()) - .putToUrl("direct", request.getDirection() == null ? null : request.getDirection().getCode()); + .putToUrl("direct", request.getDirection() == null ? null : request.getDirection().getCode()) + .putToUrl("sub-uid", request.getSubUid()); JSONObject jsonObject = restConnection.executeGetWithSignature(GET_LOAN_ORDER_PATH, builder); JSONArray data = jsonObject.getJSONArray("data"); @@ -147,7 +149,17 @@ public List getLoanInfo(IsolatedMarginLoanInfoRequest return new IsolatedMarginSymbolInfoParser().parseArray(data); } + @Override + public List getLeveragePositionLimit(LeveragePositionLimitRequest request) { + InputChecker.checker() + .shouldNotNull(request.getCurrency(), "currency"); + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("currency", request.getCurrency()); + JSONObject jsonObject = restConnection.executeGetWithSignature(GET_LEVERAGE_POSITION_LIMIT_PATH, builder); + JSONArray data = jsonObject.getJSONArray("data"); + return new LeveragePositionLimitResultParser().parseArray(data); + } } diff --git a/src/main/java/com/huobi/service/huobi/HuobiMarketService.java b/src/main/java/com/huobi/service/huobi/HuobiMarketService.java index 895988a2..75308e2f 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiMarketService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiMarketService.java @@ -7,65 +7,17 @@ import com.alibaba.fastjson.JSONObject; import com.huobi.client.MarketClient; -import com.huobi.client.req.market.CandlestickRequest; -import com.huobi.client.req.market.MarketDepthRequest; -import com.huobi.client.req.market.MarketDetailMergedRequest; -import com.huobi.client.req.market.MarketDetailRequest; -import com.huobi.client.req.market.MarketHistoryTradeRequest; -import com.huobi.client.req.market.MarketTradeRequest; -import com.huobi.client.req.market.ReqCandlestickRequest; -import com.huobi.client.req.market.ReqMarketDepthRequest; -import com.huobi.client.req.market.ReqMarketDetailRequest; -import com.huobi.client.req.market.ReqMarketTradeRequest; -import com.huobi.client.req.market.SubCandlestickRequest; -import com.huobi.client.req.market.SubMarketBBORequest; -import com.huobi.client.req.market.SubMarketDepthRequest; -import com.huobi.client.req.market.SubMarketDetailRequest; -import com.huobi.client.req.market.SubMarketTradeRequest; -import com.huobi.client.req.market.SubMbpIncrementalUpdateRequest; -import com.huobi.client.req.market.SubMbpRefreshUpdateRequest; +import com.huobi.client.req.market.*; import com.huobi.constant.Options; import com.huobi.constant.WebSocketConstants; import com.huobi.constant.enums.DepthLevels; import com.huobi.constant.enums.DepthSizeEnum; import com.huobi.constant.enums.DepthStepEnum; import com.huobi.exception.SDKException; -import com.huobi.model.market.Candlestick; -import com.huobi.model.market.CandlestickEvent; -import com.huobi.model.market.CandlestickReq; -import com.huobi.model.market.MarketBBOEvent; -import com.huobi.model.market.MarketDepth; -import com.huobi.model.market.MarketDepthEvent; -import com.huobi.model.market.MarketDepthReq; -import com.huobi.model.market.MarketDetail; -import com.huobi.model.market.MarketDetailEvent; -import com.huobi.model.market.MarketDetailMerged; -import com.huobi.model.market.MarketDetailReq; -import com.huobi.model.market.MarketTicker; -import com.huobi.model.market.MarketTrade; -import com.huobi.model.market.MarketTradeEvent; -import com.huobi.model.market.MarketTradeReq; -import com.huobi.model.market.MbpIncrementalUpdateEvent; -import com.huobi.model.market.MbpRefreshUpdateEvent; +import com.huobi.model.market.*; import com.huobi.service.huobi.connection.HuobiRestConnection; import com.huobi.service.huobi.connection.HuobiWebSocketConnection; -import com.huobi.service.huobi.parser.market.CandlestickEventParser; -import com.huobi.service.huobi.parser.market.CandlestickParser; -import com.huobi.service.huobi.parser.market.CandlestickReqParser; -import com.huobi.service.huobi.parser.market.MarketBBOEventParser; -import com.huobi.service.huobi.parser.market.MarketDepthEventParser; -import com.huobi.service.huobi.parser.market.MarketDepthParser; -import com.huobi.service.huobi.parser.market.MarketDepthReqParser; -import com.huobi.service.huobi.parser.market.MarketDetailEventParser; -import com.huobi.service.huobi.parser.market.MarketDetailMergedParser; -import com.huobi.service.huobi.parser.market.MarketDetailParser; -import com.huobi.service.huobi.parser.market.MarketDetailReqParser; -import com.huobi.service.huobi.parser.market.MarketTickerParser; -import com.huobi.service.huobi.parser.market.MarketTradeEventParser; -import com.huobi.service.huobi.parser.market.MarketTradeParser; -import com.huobi.service.huobi.parser.market.MarketTradeReqParser; -import com.huobi.service.huobi.parser.market.MbpIncrementalUpdateEventParser; -import com.huobi.service.huobi.parser.market.MbpRefreshUpdateEventParser; +import com.huobi.service.huobi.parser.market.*; import com.huobi.service.huobi.signature.UrlParamsBuilder; import com.huobi.utils.InputChecker; import com.huobi.utils.ResponseCallback; @@ -84,22 +36,25 @@ public HuobiMarketService(Options options) { } - public static final String REST_CANDLESTICK_PATH = "/market/history/kline"; - public static final String REST_MARKET_DETAIL_MERGED_PATH = "/market/detail/merged"; - public static final String REST_MARKET_DETAIL_PATH = "/market/detail"; - public static final String REST_MARKET_TICKERS_PATH = "/market/tickers"; - public static final String REST_MARKET_DEPTH_PATH = "/market/depth"; - public static final String REST_MARKET_TRADE_PATH = "/market/trade"; - public static final String REST_MARKET_HISTORY_TRADE_PATH = "/market/history/trade"; + public static final String REST_CANDLESTICK_PATH = "/market/history/kline";//K线数据(蜡烛图) + public static final String REST_MARKET_DETAIL_MERGED_PATH = "/market/detail/merged";//聚合行情(Ticker) + public static final String REST_MARKET_DETAIL_PATH = "/market/detail";//最近24小时行情数据 + public static final String REST_MARKET_TICKERS_PATH = "/market/tickers";//所有交易对的最新Tickers + public static final String REST_MARKET_DEPTH_PATH = "/market/depth";//市场深度数据 + public static final String REST_MARKET_TRADE_PATH = "/market/trade";//最近市场成交记录 + public static final String REST_MARKET_HISTORY_TRADE_PATH = "/market/history/trade";//获得近期交易记录 + + + public static final String WEBSOCKET_CANDLESTICK_TOPIC = "market.$symbol$.kline.$period$";//K线数据 + public static final String WEBSOCKET_MARKET_DETAIL_TOPIC = "market.$symbol.detail";//市场概要 + public static final String WEBSOCKET_MARKET_DEPTH_TOPIC = "market.$symbol.depth.$type";//市场深度行情数据 + public static final String WEBSOCKET_MARKET_TRADE_TOPIC = "market.$symbol.trade.detail";//成交明细 + public static final String WEBSOCKET_MARKET_BBO_TOPIC = "market.$symbol.bbo";//买一卖一逐笔行情 + public static final String WEBSOCKET_MARKET_MBP_REFRESH_TOPIC = "market.$symbol.mbp.refresh.$levels";//市场深度MBP行情数据(全量推送) + public static final String WEBSOCKET_MARKET_MBP_INCREMENT_TOPIC = "market.$symbol.mbp.$levels";//市场深度MBP行情数据(增量推送) + public static final String WEBSOCKET_MARKET_TICKERS_PATH = "market.$symbol.ticker";//聚合行情(Ticker)数据 - public static final String WEBSOCKET_CANDLESTICK_TOPIC = "market.$symbol$.kline.$period$"; - public static final String WEBSOCKET_MARKET_DETAIL_TOPIC = "market.$symbol.detail"; - public static final String WEBSOCKET_MARKET_DEPTH_TOPIC = "market.$symbol.depth.$type"; - public static final String WEBSOCKET_MARKET_TRADE_TOPIC = "market.$symbol.trade.detail"; - public static final String WEBSOCKET_MARKET_BBO_TOPIC = "market.$symbol.bbo"; - public static final String WEBSOCKET_MARKET_MBP_REFRESH_TOPIC = "market.$symbol.mbp.refresh.$levels"; - public static final String WEBSOCKET_MARKET_MBP_INCREMENT_TOPIC = "market.$symbol.mbp.$levels"; @Override public List getCandlestick(CandlestickRequest request) { @@ -253,7 +208,7 @@ public void subMarketDepth(SubMarketDepthRequest request, ResponseCallback commandList = new ArrayList<>(symbolList.size()); symbolList.forEach(symbol -> { @@ -431,6 +386,33 @@ public WebSocketConnection subMbpIncrementalUpdate(SubMbpIncrementalUpdateReques return HuobiWebSocketConnection.createMarketConnection(options, commandList, new MbpIncrementalUpdateEventParser(), callback, false); } + @Override + public void subMarketTicker(SubMarketTickerRequest request, ResponseCallback callback) { + // 检查参数 + InputChecker.checker() + .shouldNotNull(request.getSymbol(), "symbol"); + + // 格式化symbol为数组 + List symbolList = SymbolUtils.parseSymbols(request.getSymbol()); + + // 检查数组 + InputChecker.checker() + .checkSymbolList(symbolList); + + List commandList = new ArrayList<>(symbolList.size()); + symbolList.forEach(symbol -> { + + String topic = WEBSOCKET_MARKET_TICKERS_PATH + .replace("$symbol", symbol); + + JSONObject command = new JSONObject(); + command.put("sub", topic); + commandList.add(command.toJSONString()); + }); + + HuobiWebSocketConnection.createMarketConnection(options, commandList, new MarketTickerEventParser(), callback, false); + } + public WebSocketConnection reqMbpIncrementalUpdate(SubMbpIncrementalUpdateRequest request, WebSocketConnection connection) { // 检查参数 @@ -489,7 +471,7 @@ public void reqMarketDepth(ReqMarketDepthRequest request, ResponseCallback callback) { + // 检查参数 + InputChecker.checker() + .shouldNotNull(request.getSymbol(), "symbol"); + + String topic = WEBSOCKET_MARKET_TICKERS_PATH + .replace("$symbol", request.getSymbol()); + + JSONObject command = new JSONObject(); + command.put(WebSocketConstants.OP_REQ, topic); + + List commandList = new ArrayList<>(1); + commandList.add(command.toJSONString()); + HuobiWebSocketConnection.createMarketConnection(options, commandList, new MarketTickerReqParser(), callback, true); + } + public void reqMarketDetail(ReqMarketDetailRequest request, ResponseCallback callback) { // 检查参数 InputChecker.checker() diff --git a/src/main/java/com/huobi/service/huobi/HuobiSubUserService.java b/src/main/java/com/huobi/service/huobi/HuobiSubUserService.java index 3fa2e13e..3b663fb1 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiSubUserService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiSubUserService.java @@ -7,17 +7,7 @@ import com.huobi.client.SubUserClient; import com.huobi.client.req.account.TransferSubuserRequest; -import com.huobi.client.req.subuser.GetApiKeyListRequest; -import com.huobi.client.req.subuser.GetSubUserAccountListRequest; -import com.huobi.client.req.subuser.GetSubUserDepositRequest; -import com.huobi.client.req.subuser.GetSubUserListRequest; -import com.huobi.client.req.subuser.SubUserApiKeyDeletionRequest; -import com.huobi.client.req.subuser.SubUserApiKeyGenerationRequest; -import com.huobi.client.req.subuser.SubUserApiKeyModificationRequest; -import com.huobi.client.req.subuser.SubUserCreationRequest; -import com.huobi.client.req.subuser.SubUserManagementRequest; -import com.huobi.client.req.subuser.SubUserTradableMarketRequest; -import com.huobi.client.req.subuser.SubUserTransferabilityRequest; +import com.huobi.client.req.subuser.*; import com.huobi.constant.Options; import com.huobi.model.account.AccountBalance; import com.huobi.model.account.SubuserAggregateBalance; @@ -32,45 +22,38 @@ import com.huobi.model.subuser.SubUserState; import com.huobi.model.subuser.SubUserTradableMarketResult; import com.huobi.model.subuser.SubUserTransferabilityResult; +import com.huobi.model.wallet.DeductModeResult; import com.huobi.model.wallet.DepositAddress; import com.huobi.service.huobi.connection.HuobiRestConnection; +import com.huobi.service.huobi.connection.HuobiRestConnection25519; import com.huobi.service.huobi.parser.account.AccountBalanceParser; import com.huobi.service.huobi.parser.account.SubuserAggregateBalanceParser; -import com.huobi.service.huobi.parser.subuser.GetApiKeyListResultParser; -import com.huobi.service.huobi.parser.subuser.GetSubUserAccountListResultParser; -import com.huobi.service.huobi.parser.subuser.GetSubUserDepositResultParser; -import com.huobi.service.huobi.parser.subuser.GetSubUserListResultParser; -import com.huobi.service.huobi.parser.subuser.SubUserApiKeyGenerationResultParser; -import com.huobi.service.huobi.parser.subuser.SubUserApiKeyModificationResultParser; -import com.huobi.service.huobi.parser.subuser.SubUserCreationInfoParser; -import com.huobi.service.huobi.parser.subuser.SubUserManagementResultParser; -import com.huobi.service.huobi.parser.subuser.SubUserStateParser; -import com.huobi.service.huobi.parser.subuser.SubUserTradableMarketResultParser; -import com.huobi.service.huobi.parser.subuser.SubUserTransferabilityResultParser; +import com.huobi.service.huobi.parser.subuser.*; import com.huobi.service.huobi.parser.wallet.DepositAddressParser; import com.huobi.service.huobi.signature.UrlParamsBuilder; import com.huobi.utils.InputChecker; public class HuobiSubUserService implements SubUserClient { - public static final String GET_SUBUSER_ACCOUNT_BALANCE_PATH = "/v1/account/accounts/{sub-uid}"; - public static final String GET_SUBUSER_AGGREGATE_BALANCE_PATH = "/v1/subuser/aggregate-balance"; - public static final String TRANSFER_SUBUSER_PATH = "/v1/subuser/transfer"; - - public static final String SUBUSER_CREATION_PATH = "/v2/sub-user/creation"; - public static final String GET_SUBUSER_LIST_PATH = "/v2/sub-user/user-list"; - public static final String GET_SUBUSER_STATE_PATH = "/v2/sub-user/user-state"; - public static final String SUBUSER_MANAGEMENT_PATH = "/v2/sub-user/management"; - public static final String GET_SUBUSER_ACCOUNT_LIST_PATH = "/v2/sub-user/account-list"; - public static final String SUBUSER_TRANSFERABILITY_PATH = "/v2/sub-user/transferability"; - public static final String SUBUSER_TRADABLE_MARKET_PATH = "/v2/sub-user/tradable-market"; - public static final String SUBUSER_APIKEY_GENERATION_PATH = "/v2/sub-user/api-key-generation"; - public static final String SUBUSER_APIKEY_MODIFICATION_PATH = "/v2/sub-user/api-key-modification"; - public static final String SUBUSER_APIKEY_DELETION_PATH = "/v2/sub-user/api-key-deletion"; - public static final String GET_SUBUSER_APIKEY_PATH = "/v2/user/api-key"; - public static final String GET_SUBUSER_DEPOSIT_ADDRESS_PATH = "/v2/sub-user/deposit-address"; - public static final String GET_SUBUSER_DEPOSIT_PATH = "/v2/sub-user/query-deposit"; - public static final String GET_UID_PATH = "/v2/user/uid"; + public static final String GET_SUBUSER_ACCOUNT_BALANCE_PATH = "/v1/account/accounts/{sub-uid}";//子用户余额 + public static final String GET_SUBUSER_AGGREGATE_BALANCE_PATH = "/v1/subuser/aggregate-balance";//子用户余额(汇总) + public static final String TRANSFER_SUBUSER_PATH = "/v1/subuser/transfer";//资产划转(母子用户之间) + public static final String SUBUSER_CREATION_PATH = "/v2/sub-user/creation";//子用户创建 + public static final String GET_SUBUSER_LIST_PATH = "/v2/sub-user/user-list";//获取子用户列表 + public static final String GET_SUBUSER_STATE_PATH = "/v2/sub-user/user-state";//获取特定子用户的用户状态 + public static final String SUBUSER_MANAGEMENT_PATH = "/v2/sub-user/management";//冻结/解冻子用户 + public static final String GET_SUBUSER_ACCOUNT_LIST_PATH = "/v2/sub-user/account-list";//获取特定子用户的账户列表 + public static final String SUBUSER_TRANSFERABILITY_PATH = "/v2/sub-user/transferability";//设置子用户资产转出权限 + public static final String SUBUSER_TRADABLE_MARKET_PATH = "/v2/sub-user/tradable-market";//设置子用户交易权限 + public static final String SUBUSER_APIKEY_GENERATION_PATH = "/v2/sub-user/api-key-generation";//子用户APIkey创建 + public static final String SUBUSER_APIKEY_MODIFICATION_PATH = "/v2/sub-user/api-key-modification";//修改子用户APIkey + public static final String SUBUSER_APIKEY_DELETION_PATH = "/v2/sub-user/api-key-deletion";//删除子用户APIkey + public static final String GET_SUBUSER_APIKEY_PATH = "/v2/user/api-key";//母子用户APIkey信息查询 + public static final String GET_SUBUSER_DEPOSIT_ADDRESS_PATH = "/v2/sub-user/deposit-address";//子用户充币地址查询 + public static final String GET_SUBUSER_DEPOSIT_PATH = "/v2/sub-user/query-deposit";//子用户充币记录查询 + public static final String GET_UID_PATH = "/v2/user/uid";//母子用户获取用户UID + public static final String SET_DDEDUCT_MODE_PATH = "/v2/sub-user/deduct-mode";//设置子用户手续费抵扣模式 + public static final String SET_CREDIT_PATH = "/v1/trust/user/active/credit";//用户主动授信 private Options options; @@ -79,7 +62,11 @@ public class HuobiSubUserService implements SubUserClient { public HuobiSubUserService(Options options) { this.options = options; - this.restConnection = new HuobiRestConnection(options); + if(options.getSign().equals("256")){ + this.restConnection = new HuobiRestConnection(options); + }else if(options.getSign().equals("25519")){ + this.restConnection = new HuobiRestConnection25519(options); + } } @Override @@ -283,7 +270,8 @@ public long transferSubuser(TransferSubuserRequest request) { .putToPost("sub-uid", request.getSubUid()) .putToPost("currency", request.getCurrency()) .putToPost("amount", request.getAmount().toPlainString()) - .putToPost("type", request.getType().getCode()); + .putToPost("type", request.getType().getCode()) + .putToPost("client-order-id", request.getClientOrderId()); JSONObject jsonObject = restConnection.executePostWithSignature(TRANSFER_SUBUSER_PATH, builder); return jsonObject.getLong("data"); @@ -310,6 +298,19 @@ public List getSubuserAggregateBalance() { } + @Override + public List setDeductMode(DeductModeRequest request) { + InputChecker.checker() + .shouldNotNull(request.getSubUids(), "subUids") + .shouldNotNull(request.getDeductMode(), "deductMode"); + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToPost("subUids", request.getSubUids()) + .putToPost("deductMode", request.getDeductMode()); + JSONObject jsonObject = restConnection.executePostWithSignature(SET_DDEDUCT_MODE_PATH, builder); + JSONArray data = jsonObject.getJSONArray("data"); + return new DeductModeResultParser().parseArray(data); + } + @Override public long getUid() { JSONObject jsonObject = restConnection.executeGetWithSignature(GET_UID_PATH, UrlParamsBuilder.build()); @@ -317,4 +318,23 @@ public long getUid() { return data; } + @Override + public boolean setCredit(CreditRequest request) { + InputChecker.checker() + .shouldNotNull(request.getTransactionId(), "transactionId") + .shouldNotNull(request.getCurrency(), "currency") + .shouldNotNull(request.getAmount(), "amount") + .shouldNotNull(request.getAccountId(), "accountId") + .shouldNotNull(request.getUserId(), "userId"); + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToPost("transactionId", request.getTransactionId()) + .putToPost("currency", request.getCurrency()) + .putToPost("amount", request.getAmount()) + .putToPost("accountId", request.getAccountId()) + .putToPost("userId", request.getUserId()) + ; + JSONObject jsonObject = restConnection.executePostWithSignature(SET_CREDIT_PATH, builder); + return jsonObject.getBoolean("data"); + } + } diff --git a/src/main/java/com/huobi/service/huobi/HuobiTradeService.java b/src/main/java/com/huobi/service/huobi/HuobiTradeService.java index 0989c9a9..93504b08 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiTradeService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiTradeService.java @@ -1,41 +1,21 @@ package com.huobi.service.huobi; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.huobi.client.TradeClient; -import com.huobi.client.req.trade.BatchCancelOpenOrdersRequest; -import com.huobi.client.req.trade.CreateOrderRequest; -import com.huobi.client.req.trade.FeeRateRequest; -import com.huobi.client.req.trade.MatchResultRequest; -import com.huobi.client.req.trade.OpenOrdersRequest; -import com.huobi.client.req.trade.OrderHistoryRequest; -import com.huobi.client.req.trade.OrdersRequest; -import com.huobi.client.req.trade.SubOrderUpdateV2Request; -import com.huobi.client.req.trade.SubTradeClearingRequest; +import com.huobi.client.req.trade.*; import com.huobi.constant.Options; import com.huobi.constant.WebSocketConstants; import com.huobi.constant.enums.OrderTypeEnum; -import com.huobi.model.trade.BatchCancelOpenOrdersResult; -import com.huobi.model.trade.BatchCancelOrderResult; -import com.huobi.model.trade.FeeRate; -import com.huobi.model.trade.MatchResult; -import com.huobi.model.trade.Order; -import com.huobi.model.trade.OrderUpdateV2Event; -import com.huobi.model.trade.TradeClearingEvent; +import com.huobi.exception.SDKException; +import com.huobi.model.trade.*; import com.huobi.service.huobi.connection.HuobiRestConnection; +import com.huobi.service.huobi.connection.HuobiRestConnection25519; import com.huobi.service.huobi.connection.HuobiWebSocketConnection; -import com.huobi.service.huobi.parser.trade.BatchCancelOpenOrdersResultParser; -import com.huobi.service.huobi.parser.trade.BatchCancelOrderResultParser; -import com.huobi.service.huobi.parser.trade.FeeRateParser; -import com.huobi.service.huobi.parser.trade.MatchResultParser; -import com.huobi.service.huobi.parser.trade.OrderParser; -import com.huobi.service.huobi.parser.trade.OrderUpdateEventV2Parser; -import com.huobi.service.huobi.parser.trade.TradeClearingEventParser; +import com.huobi.service.huobi.parser.trade.*; import com.huobi.service.huobi.signature.UrlParamsBuilder; import com.huobi.utils.InputChecker; import com.huobi.utils.ResponseCallback; @@ -44,22 +24,23 @@ public class HuobiTradeService implements TradeClient { - public static final String CREATE_ORDER_PATH = "/v1/order/orders/place"; - public static final String CANCEL_ORDER_PATH = "/v1/order/orders/{order-id}/submitcancel"; - public static final String CANCEL_ORDER_BY_CLIENT_ORDER_ID_PATH = "/v1/order/orders/submitCancelClientOrder"; - public static final String BATCH_CANCEL_OPEN_ORDERS_PATH = "/v1/order/orders/batchCancelOpenOrders"; - public static final String BATCH_CANCEL_ORDERS_PATH = "/v1/order/orders/batchcancel"; - public static final String GET_OPEN_ORDERS_PATH = "/v1/order/openOrders"; - public static final String GET_ORDER_PATH = "/v1/order/orders/{order-id}"; - public static final String GET_ORDERS_PATH = "/v1/order/orders"; - public static final String GET_ORDERS_HISTORY_PATH = "/v1/order/history"; - public static final String GET_ORDER_BY_CLIENT_ORDER_ID_PATH = "/v1/order/orders/getClientOrder"; - public static final String GET_SINGLE_ORDER_MATCH_RESULT_PATH = "/v1/order/orders/{order-id}/matchresults"; - public static final String GET_MATCH_RESULT_PATH = "/v1/order/matchresults"; - public static final String GET_FEE_RATE_PATH = "/v2/reference/transact-fee-rate"; + public static final String CREATE_ORDER_PATH = "/v1/order/orders/place";//下单 + public static final String CANCEL_ORDER_PATH = "/v1/order/orders/{order-id}/submitcancel";//撤销订单 + public static final String CANCEL_ORDER_BY_CLIENT_ORDER_ID_PATH = "/v1/order/orders/submitCancelClientOrder";//撤销订单(基于clientorderID) + public static final String BATCH_CANCEL_OPEN_ORDERS_PATH = "/v1/order/orders/batchCancelOpenOrders";//批量撤销所有订单 + public static final String BATCH_CANCEL_ORDERS_PATH = "/v1/order/orders/batchcancel";//批量撤销指定订单 + public static final String GET_OPEN_ORDERS_PATH = "/v1/order/openOrders";//查询当前未成交订单 + public static final String GET_ORDER_PATH = "/v1/order/orders/{order-id}";//查询订单详情 + public static final String GET_ORDERS_PATH = "/v1/order/orders";//搜索历史订单 + public static final String GET_ORDERS_HISTORY_PATH = "/v1/order/history";//搜索最近48小时内历史订单 + public static final String GET_ORDER_BY_CLIENT_ORDER_ID_PATH = "/v1/order/orders/getClientOrder";//查询订单详情(基于clientorderID) + public static final String GET_SINGLE_ORDER_MATCH_RESULT_PATH = "/v1/order/orders/{order-id}/matchresults";//成交明细 + public static final String GET_MATCH_RESULT_PATH = "/v1/order/matchresults";//当前和历史成交 + public static final String GET_FEE_RATE_PATH = "/v2/reference/transact-fee-rate";//获取用户当前手续费率 + public static final String BATCH_ORDERS_PATH = "/v1/order/batch-orders";//批量下单 + public static final String MARGIN_ORDER_PATH = "/v1/order/auto/place";//杠杆下单 + - public static final String WEBSOCKET_ORDER_UPDATE_V2_TOPIC = "orders#${symbol}"; - public static final String WEBSOCKET_TRADE_CLEARING_TOPIC = "trade.clearing#${symbol}"; private Options options; @@ -70,7 +51,11 @@ public class HuobiTradeService implements TradeClient { public HuobiTradeService(Options options) { this.options = options; - this.restConnection = new HuobiRestConnection(options); + if(options.getSign().equals("256")){ + this.restConnection = new HuobiRestConnection(options); + }else if(options.getSign().equals("25519")){ + this.restConnection = new HuobiRestConnection25519(options); + } this.huobiAccountService = new HuobiAccountService(options); } @@ -104,21 +89,23 @@ public Long createOrder(CreateOrderRequest request) { .putToPost("client-order-id", request.getClientOrderId()) .putToPost("source", request.getOrderSource().getCode()) .putToPost("stop-price", request.getStopPrice()) - .putToPost("operator", request.getOperator() == null ? null : request.getOperator().getOperator()); + .putToPost("operator", request.getOperator() == null ? null : request.getOperator().getOperator()) + .putToPost("self-match-prevent", request.getSelfMatchPrevent()); JSONObject jsonObject = restConnection.executePostWithSignature(CREATE_ORDER_PATH, builder); return jsonObject.getLong("data"); } @Override - public Long cancelOrder(Long orderId) { + public Long cancelOrder(CancelOrderRequest request) { InputChecker.checker() - .shouldNotNull(orderId, "order-id"); - - String path = CANCEL_ORDER_PATH.replace("{order-id}", orderId + ""); + .shouldNotNull(request.getOrderId(), "order-id"); - JSONObject jsonObject = restConnection.executePostWithSignature(path, UrlParamsBuilder.build()); + String path = CANCEL_ORDER_PATH.replace("{order-id}", request.getOrderId() + ""); + UrlParamsBuilder builder = UrlParamsBuilder.build(); + builder.putToPost("symbol", request.getSymbol()); + JSONObject jsonObject = restConnection.executePostWithSignature(path, builder); return jsonObject.getLong("data"); } @@ -149,7 +136,8 @@ public BatchCancelOpenOrdersResult batchCancelOpenOrders(BatchCancelOpenOrdersRe .putToPost("account-id", request.getAccountId()) .putToPost("symbol", request.getSymbol()) .putToPost("side", request.getSide() == null ? null : request.getSide().getCode()) - .putToPost("size", request.getSize()); + .putToPost("size", request.getSize()) + .putToPost("types", request.getTypes()); JSONObject jsonObject = restConnection.executePostWithSignature(BATCH_CANCEL_OPEN_ORDERS_PATH, builder); JSONObject data = jsonObject.getJSONObject("data"); @@ -190,7 +178,8 @@ public List getOpenOrders(OpenOrdersRequest request) { .putToUrl("side", request.getSide() == null ? null : request.getSide().getCode()) .putToUrl("size", request.getSize()) .putToUrl("direct", request.getDirect() == null ? null : request.getDirect().getCode()) - .putToUrl("from", request.getFrom()); + .putToUrl("from", request.getFrom()) + .putToUrl("types", request.getTypes()); JSONObject jsonObject = restConnection.executeGetWithSignature(GET_OPEN_ORDERS_PATH, builder); JSONArray data = jsonObject.getJSONArray("data"); @@ -308,60 +297,60 @@ public List getFeeRate(FeeRateRequest request) { return new FeeRateParser().parseArray(array); } - - public void subOrderUpdateV2(SubOrderUpdateV2Request request, ResponseCallback callback) { - // 检查参数 - InputChecker.checker() - .shouldNotNull(request.getSymbols(), "symbols"); - - // 格式化symbol为数组 - List symbolList = SymbolUtils.parseSymbols(request.getSymbols()); - - // 检查数组 - InputChecker.checker().checkSymbolList(symbolList); - - List commandList = new ArrayList<>(symbolList.size()); - symbolList.forEach(symbol -> { - - String topic = WEBSOCKET_ORDER_UPDATE_V2_TOPIC - .replace("${symbol}", symbol); - - JSONObject command = new JSONObject(); - command.put("action", WebSocketConstants.ACTION_SUB); - command.put("ch", topic); - command.put("id", System.nanoTime()); - commandList.add(command.toJSONString()); - }); - - HuobiWebSocketConnection.createAssetV2Connection(options, commandList, new OrderUpdateEventV2Parser(), callback, false); + @Override + public List batchOrders(List list) { + for (BatchOrdersRequest request : list) { + InputChecker.checker() + .shouldNotNull(request.getAccountId(), "account-id") + .shouldNotNull(request.getSymbol(), "symbol") + .shouldNotNull(request.getType(), "type") + .shouldNotNull(request.getAmount(), "amount"); + } + List> postList = new ArrayList<>(); + for (BatchOrdersRequest request : list) { + HashMap postDataMap = new HashMap(); + postDataMap.put("account-id", request.getAccountId()); + postDataMap.put("symbol", request.getSymbol()); + postDataMap.put("type", request.getType()); + postDataMap.put("amount", request.getAmount()); + postDataMap.put("price", request.getPrice()); + postDataMap.put("source", request.getSource()); + postDataMap.put("client-order-id", request.getClientOrderId()); + postDataMap.put("self-match-prevent", request.getSelfMatchPrevent()); + postDataMap.put("stop-price", request.getStopPrice()); + postDataMap.put("operator", request.getOperator()); + postList.add(postDataMap); + } + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToPost("data", list); + JSONObject jsonObject = restConnection.executePostWithSignature(BATCH_ORDERS_PATH, builder); + JSONArray array = jsonObject.getJSONArray("data"); + return new BatchOrdersResultParser().parseArray(array); } - public void subTradeClearing(SubTradeClearingRequest request, ResponseCallback callback) { - // 检查参数 + @Override + public OrderResp marginOrder(MarginOrderRequest request) { InputChecker.checker() - .shouldNotNull(request.getSymbols(), "symbols"); - - // 格式化symbol为数组 - List symbolList = SymbolUtils.parseSymbols(request.getSymbols()); - - // 检查数组 - InputChecker.checker().checkSymbolList(symbolList); - - List commandList = new ArrayList<>(symbolList.size()); - symbolList.forEach(symbol -> { - - String topic = WEBSOCKET_TRADE_CLEARING_TOPIC - .replace("${symbol}", symbol); - - JSONObject command = new JSONObject(); - command.put("action", WebSocketConstants.ACTION_SUB); - command.put("ch", topic); - command.put("id", System.nanoTime()); - commandList.add(command.toJSONString()); - }); - - HuobiWebSocketConnection.createAssetV2Connection(options, commandList, new TradeClearingEventParser(), callback, false); - + .shouldNotNull(request.getSymbol(), "symbol") + .shouldNotNull(request.getAccountId(), "account-id") + .shouldNotNull(request.getType(), "type") + .shouldNotNull(request.getTradePurpose(), "trade-purpose") + .shouldNotNull(request.getSource(), "source"); + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToPost("symbol", request.getSymbol()) + .putToPost("account-id", request.getAccountId()) + .putToPost("amount", request.getAmount()) + .putToPost("market-amount", request.getMarketAmount()) + .putToPost("borrow-amount", request.getBorrowAmount()) + .putToPost("type", request.getType()) + .putToPost("trade-purpose", request.getTradePurpose()) + .putToPost("price", request.getPrice()) + .putToPost("stop-price", request.getStopPrice()) + .putToPost("operator", request.getOperator()) + .putToPost("source", request.getSource()); + JSONObject jsonObject = restConnection.executePostWithSignature(MARGIN_ORDER_PATH, builder); + JSONObject data = jsonObject.getJSONObject("data"); + return new OrderRespParser().parse(data); } } diff --git a/src/main/java/com/huobi/service/huobi/HuobiWalletService.java b/src/main/java/com/huobi/service/huobi/HuobiWalletService.java index 48b9dcc5..a4de7d58 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiWalletService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiWalletService.java @@ -11,31 +11,26 @@ import com.huobi.client.req.wallet.DepositWithdrawRequest; import com.huobi.client.req.wallet.WithdrawAddressRequest; import com.huobi.client.req.wallet.WithdrawQuotaRequest; -import com.huobi.constant.Constants; -import com.huobi.constant.HuobiOptions; + import com.huobi.constant.Options; import com.huobi.constant.enums.DepositWithdrawTypeEnum; -import com.huobi.model.wallet.DepositAddress; -import com.huobi.model.wallet.DepositWithdraw; -import com.huobi.model.wallet.WithdrawAddressResult; -import com.huobi.model.wallet.WithdrawQuota; +import com.huobi.model.wallet.*; import com.huobi.service.huobi.connection.HuobiRestConnection; -import com.huobi.service.huobi.parser.wallet.DepositAddressParser; -import com.huobi.service.huobi.parser.wallet.DepositWithdrawParser; -import com.huobi.service.huobi.parser.wallet.WithdrawAddressParser; -import com.huobi.service.huobi.parser.wallet.WithdrawQuotaParser; +import com.huobi.service.huobi.connection.HuobiRestConnection25519; +import com.huobi.service.huobi.parser.wallet.*; import com.huobi.service.huobi.signature.UrlParamsBuilder; import com.huobi.utils.InputChecker; public class HuobiWalletService implements WalletClient { - public static final String GET_DEPOSIT_ADDRESS_PATH = "/v2/account/deposit/address"; - public static final String GET_WITHDRAW_ADDRESS_PATH = "/v2/account/withdraw/address"; - public static final String GET_WITHDRAW_QUOTA_PATH = "/v2/account/withdraw/quota"; - public static final String CREATE_WITHDRAW_PATH = "/v1/dw/withdraw/api/create"; - public static final String CANCEL_WITHDRAW_PATH = "/v1/dw/withdraw-virtual/{withdraw-id}/cancel"; - public static final String DEPOSIT_WITHDRAW_PATH = "/v1/query/deposit-withdraw"; + public static final String GET_DEPOSIT_ADDRESS_PATH = "/v2/account/deposit/address";//充币地址查询 + public static final String GET_WITHDRAW_ADDRESS_PATH = "/v2/account/withdraw/address";//提币地址查询 + public static final String GET_WITHDRAW_QUOTA_PATH = "/v2/account/withdraw/quota";//提币额度查询 + public static final String CREATE_WITHDRAW_PATH = "/v1/dw/withdraw/api/create";//虚拟币提币 + public static final String CANCEL_WITHDRAW_PATH = "/v1/dw/withdraw-virtual/{withdraw-id}/cancel";//取消提币 + public static final String DEPOSIT_WITHDRAW_PATH = "/v1/query/deposit-withdraw";//充提记录 + public static final String GET_WITHDRAW_ORDER_PATH = "/v1/query/withdraw/client-order-id";//通过clientOrderId查询提币订单 private Options options; @@ -43,7 +38,11 @@ public class HuobiWalletService implements WalletClient { public HuobiWalletService(Options options) { this.options = options; - this.restConnection = new HuobiRestConnection(options); + if(options.getSign().equals("256")){ + this.restConnection = new HuobiRestConnection(options); + }else if(options.getSign().equals("25519")){ + this.restConnection = new HuobiRestConnection25519(options); + } } @Override @@ -112,7 +111,8 @@ public Long createWithdraw(CreateWithdrawRequest request) { .putToPost("currency", request.getCurrency()) .putToPost("fee", request.getFee()) .putToPost("addr-tag", request.getAddrTag()) - .putToPost("chain", request.getChain()); + .putToPost("chain", request.getChain()) + .putToPost("client-order-id", request.getClientOrderId()); JSONObject jsonObject = restConnection.executePostWithSignature(CREATE_WITHDRAW_PATH, builder); return jsonObject.getLong("data"); @@ -147,5 +147,17 @@ public List getDepositWithdraw(DepositWithdrawRequest request) return new DepositWithdrawParser().parseArray(data); } + @Override + public WithdrawOrderResult getWithdrawOrder(String clientOrderId) { + InputChecker.checker() + .shouldNotNull(clientOrderId, "clientOrderId"); + UrlParamsBuilder builder = UrlParamsBuilder.build() + .putToUrl("clientOrderId", clientOrderId); + + JSONObject jsonObject = restConnection.executeGetWithSignature(GET_WITHDRAW_ORDER_PATH, builder); + JSONObject data = jsonObject.getJSONObject("data"); + return new WithdrawOrderResultParser().parse(data); + } + } diff --git a/src/main/java/com/huobi/service/huobi/connection/HuobiRestConnection.java b/src/main/java/com/huobi/service/huobi/connection/HuobiRestConnection.java index 7abd8956..8c457a53 100644 --- a/src/main/java/com/huobi/service/huobi/connection/HuobiRestConnection.java +++ b/src/main/java/com/huobi/service/huobi/connection/HuobiRestConnection.java @@ -2,133 +2,222 @@ import java.net.MalformedURLException; import java.net.URL; +import java.util.Map; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.sun.org.apache.regexp.internal.RE; +import lombok.val; import okhttp3.Request; import com.huobi.constant.EtfResult; import com.huobi.constant.Options; import com.huobi.exception.SDKException; import com.huobi.service.huobi.signature.ApiSignature; +import com.huobi.service.huobi.signature.ApiSignatureED25519; import com.huobi.service.huobi.signature.UrlParamsBuilder; import com.huobi.utils.ConnectionFactory; public class HuobiRestConnection { - private Options options; + private Options options; - private String host; + String host; - public Options getOptions() { - return options; - } + public Options getOptions() { + return options; + } - public HuobiRestConnection(Options options) { - this.options = options; - try { - this.host = new URL(this.options.getRestHost()).getHost(); - } catch (MalformedURLException e) { - e.printStackTrace(); + public HuobiRestConnection(Options options) { + this.options = options; + try { + this.host = new URL(this.options.getRestHost()).getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } } - } - public JSONObject executeGet(String path, UrlParamsBuilder paramsBuilder){ + public JSONObject executeGet(String path, UrlParamsBuilder paramsBuilder) { + return executeGet(path, paramsBuilder, null); + } - Options options = this.getOptions(); + public JSONObject executeGet(String path, UrlParamsBuilder paramsBuilder, Map headers) { - String url = options.getRestHost() + path + paramsBuilder.buildUrl(); + Options options = this.getOptions(); - Request executeRequest = new Request.Builder() - .url(url) - .addHeader("Content-Type", "application/x-www-form-urlencoded") - .build(); + String url = options.getRestHost() + path + paramsBuilder.buildUrl(); - String resp = ConnectionFactory.execute(executeRequest); - return checkAndGetResponse(resp); - } + Request.Builder builder = new Request.Builder() + .url(url) + .addHeader("Content-Type", "application/x-www-form-urlencoded"); - public String executeGetString(String url, UrlParamsBuilder paramsBuilder){ - String realUrl = url + paramsBuilder.buildUrl(); - Request executeRequest = new Request.Builder() - .url(realUrl) - .addHeader("Content-Type", "application/x-www-form-urlencoded") - .build(); - String resp = ConnectionFactory.execute(executeRequest); - return resp; - } + if (headers != null && !headers.isEmpty()) { + headers.forEach(builder::addHeader); + } + + String resp = ConnectionFactory.execute(builder.build()); + return checkAndGetResponse(resp); + } + + public String executeGetString(String url, UrlParamsBuilder paramsBuilder) { + return executeGetString(url, paramsBuilder, null); + } + + public String executeGetString(String url, UrlParamsBuilder paramsBuilder, Map headers) { + String realUrl = url + paramsBuilder.buildUrl(); + Request.Builder builder = new Request.Builder() + .url(realUrl) + .addHeader("Content-Type", "application/x-www-form-urlencoded"); - public JSONObject executeGetWithSignature(String path, UrlParamsBuilder paramsBuilder) { + if (headers != null && !headers.isEmpty()) { + headers.forEach(builder::addHeader); + } + + String resp = ConnectionFactory.execute(builder.build()); + return resp; + } + public JSONObject executeGetWithSignature(String path, UrlParamsBuilder paramsBuilder) { + return executeGetWithSignature(path, paramsBuilder, null); + } + public JSONObject executeGetWithSignature(String path, UrlParamsBuilder paramsBuilder, Map headers) { Options options = this.getOptions(); String requestUrl = options.getRestHost() + path; new ApiSignature().createSignature(options.getApiKey(), options.getSecretKey(), "GET", host, path, paramsBuilder); requestUrl += paramsBuilder.buildUrl(); + System.out.println(requestUrl); + + Request.Builder builder = new Request.Builder() + .url(requestUrl) + .addHeader("Content-Type", "application/x-www-form-urlencoded"); - Request executeRequest = new Request.Builder().url(requestUrl) - .addHeader("Content-Type", "application/x-www-form-urlencoded").build(); + if (headers != null && !headers.isEmpty()) { + headers.forEach(builder::addHeader); + } - String resp = ConnectionFactory.execute(executeRequest); + String resp = ConnectionFactory.execute(builder.build()); return checkAndGetResponse(resp); } + public JSONObject executePostWithSignature(String path, UrlParamsBuilder paramsBuilder){ + return executePostWithSignature(path, paramsBuilder, null); + } - public JSONObject executePostWithSignature(String path, UrlParamsBuilder paramsBuilder){ - + public JSONObject executePostWithSignature(String path, UrlParamsBuilder paramsBuilder, Map headers){ Options options = this.getOptions(); - String requestUrl = options.getRestHost() + path; new ApiSignature().createSignature(options.getApiKey(), options.getSecretKey(), "POST", host, path, paramsBuilder); requestUrl += paramsBuilder.buildUrl(); - Request executeRequest = new Request.Builder().url(requestUrl).post(paramsBuilder.buildPostBody()) - .addHeader("Content-Type", "application/json").build(); - String resp = ConnectionFactory.execute(executeRequest); + Request.Builder builder = new Request.Builder() + .url(requestUrl) + .post(paramsBuilder.buildPostBody()) + .addHeader("Content-Type", "application/json"); + + if (headers != null && !headers.isEmpty()) { + headers.forEach(builder::addHeader); + } + + String resp = ConnectionFactory.execute(builder.build()); return checkAndGetResponse(resp); } - - private JSONObject checkAndGetResponse(String resp) { - JSONObject json = JSON.parseObject(resp); - try { - if (json.containsKey("status")) { - String status = json.getString("status"); - if ("error".equals(status)) { - String err_code = json.getString("err-code"); - String err_msg = json.getString("err-msg"); - throw new SDKException(SDKException.EXEC_ERROR, "[Executing] " + err_code + ": " + err_msg); - } else if (!"ok".equals(status)) { - throw new SDKException(SDKException.RUNTIME_ERROR, "[Invoking] Response is not expected: " + status); + /* public JSONObject executeGetWithSignature(String path, UrlParamsBuilder paramsBuilder) { + Options options = this.getOptions(); + System.out.println("API Key: " + options.getApiKey()); + System.out.println("Secret Key: " + options.getSecretKey()); +// paramsBuilder.putToUrl("AccessKeyId", options.getApiKey()); +// 创建 ApiSignatureED25519 实例并传递 Base64 编码的私钥和公钥 + ApiSignatureED25519 apiSignature = new ApiSignatureED25519(); + try { + apiSignature.ApiSignature( options.getApiKey(),options.getSecretKey()); // 确保顺序正确 + } catch (Exception e) { + // 抛出 SDKException 只使用 String 参数 + e.printStackTrace(); + throw new SDKException(SDKException.KEY_MISSING, "Invalid API key or secret key: " + e.getMessage()); } - } else if (json.containsKey("success")) { - boolean success = json.getBoolean("success"); - if (!success) { - String err_code = EtfResult.checkResult(json.getInteger("code")); - String err_msg = json.getString("message"); - if ("".equals(err_code)) { - throw new SDKException(SDKException.EXEC_ERROR, "[Executing] " + err_msg); - } else { - throw new SDKException(SDKException.EXEC_ERROR, "[Executing] " + err_code + ": " + err_msg); - } - } - } else if (json.containsKey("code")) { - int code = json.getInteger("code"); - if (code != 200) { - String message = json.getString("message"); - throw new SDKException(SDKException.EXEC_ERROR,"[Executing]" + message); - } - } else { - throw new SDKException(SDKException.RUNTIME_ERROR, "[Invoking] Status cannot be found in response."); - } - } catch (SDKException e) { - throw e; - } catch (Exception e) { - throw new SDKException(SDKException.RUNTIME_ERROR, "[Invoking] Unexpected error: " + e.getMessage()); + String requestUrl = options.getRestHost() + path; + apiSignature.createSignature("GET", host, path, paramsBuilder,options.getApiKey()); + requestUrl += paramsBuilder.buildUrl(); + System.out.println(requestUrl); + + Request executeRequest = new Request.Builder().url(requestUrl) + .addHeader("Content-Type", "application/x-www-form-urlencoded"). + addHeader("x-connecting-ip", "192.2.12.19") + .addHeader("HB-REAL-IP", "192.2.12.19") + .addHeader("X-Forwarded-For", "192.2.12.19") + .addHeader("X-Real-IP", "192.2.12.19") + .build(); + + String resp = ConnectionFactory.execute(executeRequest); + return checkAndGetResponse(resp); } - return json; - } + public JSONObject executePostWithSignature(String path, UrlParamsBuilder paramsBuilder) { + + Options options = this.getOptions(); + ApiSignatureED25519 apiSignature = new ApiSignatureED25519(); + try { + apiSignature.ApiSignature(options.getSecretKey(), options.getApiKey()); // 确保顺序正确 + } catch (Exception e) { + // 抛出 SDKException 只使用 String 参数 + throw new SDKException(SDKException.KEY_MISSING, "Invalid API key or secret key: " + e.getMessage()); + } + String requestUrl = options.getRestHost() + path; + apiSignature.createSignature("POST", host, path, paramsBuilder,options.getApiKey()); + requestUrl += paramsBuilder.buildUrl(); + Request executeRequest = new Request.Builder().url(requestUrl).post(paramsBuilder.buildPostBody()) + .addHeader("Content-Type", "application/json") + .addHeader("x-connecting-ip", "192.2.12.19") + .addHeader("HB-REAL-IP", "192.2.12.19") + .addHeader("X-Forwarded-For", "192.2.12.19") + .addHeader("X-Real-IP", "192.2.12.19").build(); + + String resp = ConnectionFactory.execute(executeRequest); + return checkAndGetResponse(resp); + }*/ + + JSONObject checkAndGetResponse(String resp) { + JSONObject json = JSON.parseObject(resp); + try { + if (json.containsKey("status")) { + String status = json.getString("status"); + if ("error".equals(status)) { + String err_code = json.getString("err-code"); + String err_msg = json.getString("err-msg"); + throw new SDKException(SDKException.EXEC_ERROR, "[Executing] " + err_code + ": " + err_msg); + } else if (!"ok".equals(status)) { + throw new SDKException(SDKException.RUNTIME_ERROR, "[Invoking] Response is not expected: " + status); + } + } else if (json.containsKey("success")) { + boolean success = json.getBoolean("success"); + if (!success) { + String err_code = EtfResult.checkResult(json.getInteger("code")); + String err_msg = json.getString("message"); + if ("".equals(err_code)) { + throw new SDKException(SDKException.EXEC_ERROR, "[Executing] " + err_msg); + } else { + throw new SDKException(SDKException.EXEC_ERROR, "[Executing] " + err_code + ": " + err_msg); + } + } + } else if (json.containsKey("code")) { + int code = json.getInteger("code"); + if (code != 200) { + String message = json.getString("message"); + throw new SDKException(SDKException.EXEC_ERROR, "[Executing]" + message); + } + } else { + throw new SDKException(SDKException.RUNTIME_ERROR, "[Invoking] Status cannot be found in response."); + } + } catch (SDKException e) { + throw e; + } catch (Exception e) { + throw new SDKException(SDKException.RUNTIME_ERROR, "[Invoking] Unexpected error: " + e.getMessage()); + } + + return json; + } } diff --git a/src/main/java/com/huobi/service/huobi/connection/HuobiRestConnection25519.java b/src/main/java/com/huobi/service/huobi/connection/HuobiRestConnection25519.java new file mode 100644 index 00000000..1ec63388 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/connection/HuobiRestConnection25519.java @@ -0,0 +1,80 @@ +package com.huobi.service.huobi.connection; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.huobi.constant.EtfResult; +import com.huobi.constant.Options; +import com.huobi.exception.SDKException; +import com.huobi.service.huobi.signature.ApiSignature; +import com.huobi.service.huobi.signature.ApiSignatureED25519; +import com.huobi.service.huobi.signature.UrlParamsBuilder; +import com.huobi.utils.ConnectionFactory; +import okhttp3.Request; + +import java.net.MalformedURLException; +import java.net.URL; + +public class HuobiRestConnection25519 extends HuobiRestConnection { + + public HuobiRestConnection25519(Options options) { + super(options); + } + + @Override + public JSONObject executeGetWithSignature(String path, UrlParamsBuilder paramsBuilder) { + Options options = this.getOptions(); + System.out.println("API Key: " + options.getApiKey()); + System.out.println("Secret Key: " + options.getSecretKey()); + + // 创建 ApiSignatureED25519 实例 + ApiSignatureED25519 apiSignature = new ApiSignatureED25519(); + try { + apiSignature.ApiSignature(options.getApiKey(), options.getSecretKey()); // 确保顺序正确 + } catch (Exception e) { + e.printStackTrace(); + throw new SDKException(SDKException.KEY_MISSING, "Invalid API key or secret key: " + e.getMessage()); + } + + String requestUrl = options.getRestHost() + path; + apiSignature.createSignature("GET", host, path, paramsBuilder, options.getApiKey()); + requestUrl += paramsBuilder.buildUrl(); + System.out.println(requestUrl); + + Request executeRequest = new Request.Builder() + .url(requestUrl) + .addHeader("Content-Type", "application/x-www-form-urlencoded") + .addHeader("x-connecting-ip", "192.2.12.19") + .addHeader("HB-REAL-IP", "192.2.12.19") + .addHeader("X-Forwarded-For", "192.2.12.19") + .addHeader("X-Real-IP", "192.2.12.19") + .build(); + + String resp = ConnectionFactory.execute(executeRequest); + return checkAndGetResponse(resp); + } + + @Override + public JSONObject executePostWithSignature(String path, UrlParamsBuilder paramsBuilder) { + Options options = this.getOptions(); + ApiSignatureED25519 apiSignature = new ApiSignatureED25519(); + try { + apiSignature.ApiSignature( options.getApiKey(),options.getSecretKey()); // 确保顺序正确 + } catch (Exception e) { + throw new SDKException(SDKException.KEY_MISSING, "Invalid API key or secret key: " + e.getMessage()); + } + + String requestUrl = options.getRestHost() + path; + apiSignature.createSignature("POST", host, path, paramsBuilder, options.getApiKey()); + requestUrl += paramsBuilder.buildUrl(); + + Request executeRequest = new Request.Builder() + .url(requestUrl) + .post(paramsBuilder.buildPostBody()) + .addHeader("Content-Type", "application/json") + .build(); + + String resp = ConnectionFactory.execute(executeRequest); + return checkAndGetResponse(resp); + } + +} diff --git a/src/main/java/com/huobi/service/huobi/connection/HuobiWebSocketConnection.java b/src/main/java/com/huobi/service/huobi/connection/HuobiWebSocketConnection.java index 64381b0a..579b3e0b 100644 --- a/src/main/java/com/huobi/service/huobi/connection/HuobiWebSocketConnection.java +++ b/src/main/java/com/huobi/service/huobi/connection/HuobiWebSocketConnection.java @@ -4,10 +4,11 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.huobi.constant.Constants; +import com.huobi.service.huobi.signature.ApiSignatureED25519; import lombok.Data; import lombok.extern.slf4j.Slf4j; import okhttp3.Request; @@ -35,11 +36,13 @@ public class HuobiWebSocketConnection extends WebSocketListener implements WebSo public static final String HUOBI_TRADING_WEBSOCKET_PATH = "/ws/v1"; public static final String HUOBI_TRADING_WEBSOCKET_V2_PATH = "/ws/v2"; + public static final String HUOBI_MARKET_WEBSOCKET_PATH = "/ws"; public static final String AUTH_VERSION_V1 = "v1"; public static final String AUTH_VERSION_V2 = "v2"; + private long lastReceivedTime; private WebSocket webSocket; @@ -68,6 +71,7 @@ public class HuobiWebSocketConnection extends WebSocketListener implements WebSo private String authVersion = AUTH_VERSION_V1; + private HuobiWebSocketConnection() {} public static HuobiWebSocketConnection createAssetConnection(Options options, @@ -362,10 +366,20 @@ public void onOpen(WebSocket webSocket, Response response) { if (authNeed) { if (AUTH_VERSION_V1.equals(this.getAuthVersion())) { // 老版本验签 - sendAuthV2(); + if(Constants.SIGN.equals("256")){ + sendAuthV2(); + }else{ + sendAuthV2ED(); + } + } else if (AUTH_VERSION_V2.equals(this.getAuthVersion())) { // 新版本2.1验签 - sendAuthV2_1(); + if(Constants.SIGN.equals("256")){ + sendAuthV2_1(); + }else{ + sendAuthV2ED(); + } +// sendAuthV2_1(); } else { onError("Unsupport signature version: " + this.getAuthVersion(), null); close(); @@ -431,4 +445,22 @@ private void sendAuthV2() { .putToUrl("cid", System.currentTimeMillis()); send(builder.buildUrlToJsonString()); } + + private void sendAuthV2ED() { + // 需要验签的部分 + ApiSignatureED25519 as = new ApiSignatureED25519(); + UrlParamsBuilder builder = UrlParamsBuilder.build(); + try { + as.ApiSignature(options.getApiKey(), options.getSecretKey()); // 确保顺序正确 +// as.createSignature("GET", host, path, paramsBuilder, options.getApiKey()); + as.createSignature("GET", this.getHost(), HUOBI_TRADING_WEBSOCKET_PATH, builder,options.getApiKey()); + } catch (Exception e) { + onError("Unexpected error when create the signature: " + e.getMessage(), e); + close(); + return; + } + builder.putToUrl(ApiSignatureED25519.op, ApiSignatureED25519.opValue) + .putToUrl("cid", System.currentTimeMillis()); + send(builder.buildUrlToJsonString()); + } } diff --git a/src/main/java/com/huobi/service/huobi/parser/account/AccountTransferV2ResultParser.java b/src/main/java/com/huobi/service/huobi/parser/account/AccountTransferV2ResultParser.java new file mode 100644 index 00000000..c5e45e8e --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/account/AccountTransferV2ResultParser.java @@ -0,0 +1,31 @@ +package com.huobi.service.huobi.parser.account; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.account.AccountTransferResult; +import com.huobi.model.account.AccountTransferV2Result; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.List; + +public class AccountTransferV2ResultParser implements HuobiModelParser { + @Override + public AccountTransferV2Result parse(JSONObject json) { + return AccountTransferV2Result.builder() + .success(json.getString("success")) + .data(json.getLong("data")) + .code(json.getLong("code")) + .message(json.getString("message")) + .build(); + } + + @Override + public AccountTransferV2Result parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + return null; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/account/AccountValuationResultParser.java b/src/main/java/com/huobi/service/huobi/parser/account/AccountValuationResultParser.java new file mode 100644 index 00000000..f296b7b9 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/account/AccountValuationResultParser.java @@ -0,0 +1,40 @@ +package com.huobi.service.huobi.parser.account; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.account.AccountBalance; +import com.huobi.model.account.AccountValuationResult; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class AccountValuationResultParser implements HuobiModelParser { + @Override + public AccountValuationResult parse(JSONObject json) { + AccountValuationResult accountValuationResult = json.toJavaObject(AccountValuationResult.class); + accountValuationResult.setProfitAccountBalanceList(new ProfitAccountBalanceParser().parseArray(json.getJSONArray("profitAccountBalanceList"))); + return accountValuationResult; + } + + @Override + public AccountValuationResult parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + + if (jsonArray == null || jsonArray.size() <= 0) { + return new ArrayList<>(); + } + + List list = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + list.add(parse(jsonObject)); + } + + return list; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/account/BalanceParser.java b/src/main/java/com/huobi/service/huobi/parser/account/BalanceParser.java index 9be6d50a..f4a88d49 100644 --- a/src/main/java/com/huobi/service/huobi/parser/account/BalanceParser.java +++ b/src/main/java/com/huobi/service/huobi/parser/account/BalanceParser.java @@ -15,6 +15,9 @@ public class BalanceParser implements HuobiModelParser { public Balance parse(JSONObject json) { Balance balance = json.toJavaObject(Balance.class); balance.setType(json.getString("type")); + if (json.containsKey("seq-num")) { + balance.setSeqNum(json.getLong("seq-num")); + } return balance; } diff --git a/src/main/java/com/huobi/service/huobi/parser/account/OverviewInfoParser.java b/src/main/java/com/huobi/service/huobi/parser/account/OverviewInfoParser.java new file mode 100644 index 00000000..b272317f --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/account/OverviewInfoParser.java @@ -0,0 +1,26 @@ +package com.huobi.service.huobi.parser.account; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.account.OverviewInfo; +import com.huobi.model.account.UserInfo; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.List; + +public class OverviewInfoParser implements HuobiModelParser { + @Override + public OverviewInfo parse(JSONObject json) { + return json.toJavaObject(OverviewInfo.class); + } + + @Override + public OverviewInfo parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + return null; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/account/ProfitAccountBalanceParser.java b/src/main/java/com/huobi/service/huobi/parser/account/ProfitAccountBalanceParser.java new file mode 100644 index 00000000..1b47af42 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/account/ProfitAccountBalanceParser.java @@ -0,0 +1,33 @@ +package com.huobi.service.huobi.parser.account; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.account.Balance; +import com.huobi.model.account.ProfitAccountBalance; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class ProfitAccountBalanceParser implements HuobiModelParser { + @Override + public ProfitAccountBalance parse(JSONObject json) { + ProfitAccountBalance profitAccountBalance = json.toJavaObject(ProfitAccountBalance.class); + return profitAccountBalance; + } + + @Override + public ProfitAccountBalance parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + List profitAccountBalanceList = new ArrayList<>(jsonArray.size()); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + profitAccountBalanceList.add(parse(jsonObject)); + } + return profitAccountBalanceList; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/account/UserInfoParser.java b/src/main/java/com/huobi/service/huobi/parser/account/UserInfoParser.java new file mode 100644 index 00000000..a3167aa1 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/account/UserInfoParser.java @@ -0,0 +1,27 @@ +package com.huobi.service.huobi.parser.account; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.account.AccountBalance; +import com.huobi.model.account.UserInfo; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.List; + +public class UserInfoParser implements HuobiModelParser { + + @Override + public UserInfo parse(JSONObject json) { + return json.toJavaObject(UserInfo.class); + } + + @Override + public UserInfo parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + return null; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/algo/CancelAlgoAllOrderResultParser.java b/src/main/java/com/huobi/service/huobi/parser/algo/CancelAlgoAllOrderResultParser.java new file mode 100644 index 00000000..8d73b0d2 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/algo/CancelAlgoAllOrderResultParser.java @@ -0,0 +1,25 @@ +package com.huobi.service.huobi.parser.algo; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.algo.CancelAlgoAllOrderResult; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.List; + +public class CancelAlgoAllOrderResultParser implements HuobiModelParser { + @Override + public CancelAlgoAllOrderResult parse(JSONObject json) { + return json.toJavaObject(CancelAlgoAllOrderResult.class); + } + + @Override + public CancelAlgoAllOrderResult parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + return null; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/etf/ETFConfigParser.java b/src/main/java/com/huobi/service/huobi/parser/etf/ETFConfigParser.java deleted file mode 100644 index ee0d5ce9..00000000 --- a/src/main/java/com/huobi/service/huobi/parser/etf/ETFConfigParser.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.huobi.service.huobi.parser.etf; - -import java.util.List; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -import com.huobi.constant.enums.EtfStatusEnum; -import com.huobi.model.etf.ETFConfig; -import com.huobi.service.huobi.parser.HuobiModelParser; - -public class ETFConfigParser implements HuobiModelParser { - - @Override - public ETFConfig parse(JSONObject json) { - return ETFConfig.builder() - .purchaseMinAmount(json.getInteger("purchase_min_amount")) - .purchaseMaxAmount(json.getInteger("purchase_max_amount")) - .redemptionMinAmount(json.getInteger("redemption_min_amount")) - .purchaseMaxAmount(json.getInteger("redemption_max_amount")) - .purchaseFeeRate(json.getBigDecimal("purchase_fee_rate")) - .redemptionFeeRate(json.getBigDecimal("redemption_fee_rate")) - .status(EtfStatusEnum.find(json.getString("etf_status"))) - .unitPriceList(new ETFUnitPriceParser().parseArray(json.getJSONArray("unit_price"))) - .build(); - } - - @Override - public ETFConfig parse(JSONArray json) { - return null; - } - - @Override - public List parseArray(JSONArray jsonArray) { - return null; - } -} diff --git a/src/main/java/com/huobi/service/huobi/parser/etf/ETFDetailParser.java b/src/main/java/com/huobi/service/huobi/parser/etf/ETFDetailParser.java deleted file mode 100644 index e0ad5df0..00000000 --- a/src/main/java/com/huobi/service/huobi/parser/etf/ETFDetailParser.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.huobi.service.huobi.parser.etf; - -import java.util.List; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -import com.huobi.model.etf.ETFDetail; -import com.huobi.service.huobi.parser.HuobiModelParser; - -public class ETFDetailParser implements HuobiModelParser { - - @Override - public ETFDetail parse(JSONObject json) { - return ETFDetail.builder() - .rate(json.getBigDecimal("rate")) - .fee(json.getBigDecimal("fee")) - .pointCardAmount(json.getBigDecimal("point_card_amount")) - .usedCurrencyList(new ETFUnitPriceParser().parseArray(json.getJSONArray("used_currency_list"))) - .obtainCurrencyList(new ETFUnitPriceParser().parseArray(json.getJSONArray("obtain_currency_list"))) - .build(); - } - - @Override - public ETFDetail parse(JSONArray json) { - return null; - } - - @Override - public List parseArray(JSONArray jsonArray) { - return null; - } -} diff --git a/src/main/java/com/huobi/service/huobi/parser/etf/ETFSwapRecordParser.java b/src/main/java/com/huobi/service/huobi/parser/etf/ETFSwapRecordParser.java deleted file mode 100644 index 85f388d7..00000000 --- a/src/main/java/com/huobi/service/huobi/parser/etf/ETFSwapRecordParser.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.huobi.service.huobi.parser.etf; - -import java.util.ArrayList; -import java.util.List; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -import com.huobi.constant.enums.EtfSwapTypeEnum; -import com.huobi.model.etf.ETFSwapRecord; -import com.huobi.service.huobi.parser.HuobiModelParser; - -public class ETFSwapRecordParser implements HuobiModelParser { - - @Override - public ETFSwapRecord parse(JSONObject json) { - return ETFSwapRecord.builder() - .id(json.getLong("id")) - .gmtCreated(json.getLong("gmt_created")) - .currency(json.getString("currency")) - .amount(json.getBigDecimal("amount")) - .type(EtfSwapTypeEnum.find(json.getString("type"))) - .status(json.getInteger("status")) - .detail(new ETFDetailParser().parse(json.getJSONObject("detail"))) - .build(); - } - - @Override - public ETFSwapRecord parse(JSONArray json) { - return null; - } - - @Override - public List parseArray(JSONArray jsonArray) { - if (jsonArray == null || jsonArray.size() <= 0) { - return new ArrayList<>(); - } - - List list = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - list.add(parse(jsonArray.getJSONObject(i))); - } - return list; - } -} diff --git a/src/main/java/com/huobi/service/huobi/parser/etf/ETFUnitPriceParser.java b/src/main/java/com/huobi/service/huobi/parser/etf/ETFUnitPriceParser.java deleted file mode 100644 index aab01a94..00000000 --- a/src/main/java/com/huobi/service/huobi/parser/etf/ETFUnitPriceParser.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.huobi.service.huobi.parser.etf; - -import java.util.ArrayList; -import java.util.List; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -import com.huobi.model.etf.ETFUnitPrice; -import com.huobi.service.huobi.parser.HuobiModelParser; - -public class ETFUnitPriceParser implements HuobiModelParser { - - @Override - public ETFUnitPrice parse(JSONObject json) { - return json.toJavaObject(ETFUnitPrice.class); - } - - @Override - public ETFUnitPrice parse(JSONArray json) { - return null; - } - - @Override - public List parseArray(JSONArray jsonArray) { - if (jsonArray == null || jsonArray.size() <= 0) { - return new ArrayList<>(); - } - return jsonArray.toJavaList(ETFUnitPrice.class); - } -} diff --git a/src/main/java/com/huobi/service/huobi/parser/generic/ChainV1Parser.java b/src/main/java/com/huobi/service/huobi/parser/generic/ChainV1Parser.java new file mode 100644 index 00000000..d8577ec9 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/generic/ChainV1Parser.java @@ -0,0 +1,35 @@ +package com.huobi.service.huobi.parser.generic; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.generic.ChainV1; +import com.huobi.model.generic.Currency; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class ChainV1Parser implements HuobiModelParser { + @Override + public ChainV1 parse(JSONObject json) { + return json.toJavaObject(ChainV1.class); + } + + @Override + public ChainV1 parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + if (jsonArray == null || jsonArray.size() <= 0) { + return new ArrayList<>(); + } + + List list = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + list.add(parse(jsonArray.getJSONObject(i))); + } + return list; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/generic/CurrencyParser.java b/src/main/java/com/huobi/service/huobi/parser/generic/CurrencyParser.java new file mode 100644 index 00000000..b8c29066 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/generic/CurrencyParser.java @@ -0,0 +1,35 @@ +package com.huobi.service.huobi.parser.generic; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.generic.Currency; + +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class CurrencyParser implements HuobiModelParser { + @Override + public Currency parse(JSONObject json) { + return json.toJavaObject(Currency.class); + } + + @Override + public Currency parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + if (jsonArray == null || jsonArray.size() <= 0) { + return new ArrayList<>(); + } + + List list = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + list.add(parse(jsonArray.getJSONObject(i))); + } + return list; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/generic/CurrencyV2Parser.java b/src/main/java/com/huobi/service/huobi/parser/generic/CurrencyV2Parser.java new file mode 100644 index 00000000..33dd322f --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/generic/CurrencyV2Parser.java @@ -0,0 +1,35 @@ +package com.huobi.service.huobi.parser.generic; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.generic.Currency; +import com.huobi.model.generic.CurrencyV2; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class CurrencyV2Parser implements HuobiModelParser { + @Override + public CurrencyV2 parse(JSONObject json) { + return json.toJavaObject(CurrencyV2.class); + } + + @Override + public CurrencyV2 parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + if (jsonArray == null || jsonArray.size() <= 0) { + return new ArrayList<>(); + } + + List list = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + list.add(parse(jsonArray.getJSONObject(i))); + } + return list; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/generic/MarketSymbolParser.java b/src/main/java/com/huobi/service/huobi/parser/generic/MarketSymbolParser.java new file mode 100644 index 00000000..318f83d5 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/generic/MarketSymbolParser.java @@ -0,0 +1,34 @@ +package com.huobi.service.huobi.parser.generic; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.generic.MarketSymbol; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class MarketSymbolParser implements HuobiModelParser { + @Override + public MarketSymbol parse(JSONObject json) { + return json.toJavaObject(MarketSymbol.class); + } + + @Override + public MarketSymbol parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + if (jsonArray == null || jsonArray.size() <= 0) { + return new ArrayList<>(); + } + + List list = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + list.add(parse(jsonArray.getJSONObject(i))); + } + return list; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/generic/SymbolV1Parser.java b/src/main/java/com/huobi/service/huobi/parser/generic/SymbolV1Parser.java new file mode 100644 index 00000000..f6f37217 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/generic/SymbolV1Parser.java @@ -0,0 +1,35 @@ +package com.huobi.service.huobi.parser.generic; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.generic.SymbolV1; +import com.huobi.model.generic.SymbolV2; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class SymbolV1Parser implements HuobiModelParser { + @Override + public SymbolV1 parse(JSONObject json) { + return json.toJavaObject(SymbolV1.class); + } + + @Override + public SymbolV1 parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + if (jsonArray == null || jsonArray.size() <= 0) { + return new ArrayList<>(); + } + + List list = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + list.add(parse(jsonArray.getJSONObject(i))); + } + return list; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/generic/SymbolV2Parser.java b/src/main/java/com/huobi/service/huobi/parser/generic/SymbolV2Parser.java new file mode 100644 index 00000000..f6299082 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/generic/SymbolV2Parser.java @@ -0,0 +1,36 @@ +package com.huobi.service.huobi.parser.generic; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.generic.Symbol; +import com.huobi.model.generic.SymbolV2; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class SymbolV2Parser implements HuobiModelParser { + + @Override + public SymbolV2 parse(JSONObject json) { + return json.toJavaObject(SymbolV2.class); + } + + @Override + public SymbolV2 parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + if (jsonArray == null || jsonArray.size() <= 0) { + return new ArrayList<>(); + } + + List list = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + list.add(parse(jsonArray.getJSONObject(i))); + } + return list; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/isolatedmargin/IsolatedMarginLoadOrderParser.java b/src/main/java/com/huobi/service/huobi/parser/isolatedmargin/IsolatedMarginLoadOrderParser.java index 6629bc89..70d8aa76 100644 --- a/src/main/java/com/huobi/service/huobi/parser/isolatedmargin/IsolatedMarginLoadOrderParser.java +++ b/src/main/java/com/huobi/service/huobi/parser/isolatedmargin/IsolatedMarginLoadOrderParser.java @@ -33,6 +33,8 @@ public IsolatedMarginLoadOrder parse(JSONObject json) { .accruedAt(json.getLong("accrued-at")) .createdAt(json.getLong("created-at")) .updatedAt(json.getLong("updated-at")) + .hourInterestRate(json.getBigDecimal("hour-interest-rate")) + .dayInterestRate(json.getBigDecimal("day-interest-rate")) .build(); } diff --git a/src/main/java/com/huobi/service/huobi/parser/isolatedmargin/LeveragePositionLimitResultParser.java b/src/main/java/com/huobi/service/huobi/parser/isolatedmargin/LeveragePositionLimitResultParser.java new file mode 100644 index 00000000..b3fba957 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/isolatedmargin/LeveragePositionLimitResultParser.java @@ -0,0 +1,31 @@ +package com.huobi.service.huobi.parser.isolatedmargin; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.isolatedmargin.LeveragePositionLimitResult; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class LeveragePositionLimitResultParser implements HuobiModelParser { + @Override + public LeveragePositionLimitResult parse(JSONObject json) { + return json.toJavaObject(LeveragePositionLimitResult.class); + } + + @Override + public LeveragePositionLimitResult parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + + if (jsonArray == null || jsonArray.size() <= 0) { + return new ArrayList<>(); + } + + return jsonArray.toJavaList(LeveragePositionLimitResult.class); + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/market/MarketTickerEventParser.java b/src/main/java/com/huobi/service/huobi/parser/market/MarketTickerEventParser.java new file mode 100644 index 00000000..6d95917c --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/market/MarketTickerEventParser.java @@ -0,0 +1,35 @@ +package com.huobi.service.huobi.parser.market; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.market.MarketTicker; +import com.huobi.model.market.MarketTickerEvent; +import com.huobi.service.huobi.parser.HuobiModelParser; +import com.huobi.service.huobi.utils.DataUtils; + +import java.util.List; + +public class MarketTickerEventParser implements HuobiModelParser { + @Override + public MarketTickerEvent parse(JSONObject json) { + String dataKey = DataUtils.getDataKey(json); + + JSONObject data = json.getJSONObject(dataKey); + MarketTicker marketTicker = new MarketTickerParser().parse(data); + return MarketTickerEvent.builder() + .ch(json.getString("ch")) + .ts(json.getLong("ts")) + .ticker(marketTicker) + .build(); + } + + @Override + public MarketTickerEvent parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + return null; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/market/MarketTickerReqParser.java b/src/main/java/com/huobi/service/huobi/parser/market/MarketTickerReqParser.java new file mode 100644 index 00000000..e66af929 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/market/MarketTickerReqParser.java @@ -0,0 +1,35 @@ +package com.huobi.service.huobi.parser.market; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.market.MarketTicker; +import com.huobi.model.market.MarketTickerReq; +import com.huobi.service.huobi.parser.HuobiModelParser; +import com.huobi.service.huobi.utils.DataUtils; + +import java.util.List; + +public class MarketTickerReqParser implements HuobiModelParser { + @Override + public MarketTickerReq parse(JSONObject json) { + String dataKey = DataUtils.getDataKey(json); + + JSONObject data = json.getJSONObject(dataKey); + MarketTicker marketTicker = new MarketTickerParser().parse(data); + return MarketTickerReq.builder() + .ch(json.getString("rep")) + .ts(json.getLong("ts")) + .ticker(marketTicker) + .build(); + } + + @Override + public MarketTickerReq parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + return null; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/subuser/DeductModeResultParser.java b/src/main/java/com/huobi/service/huobi/parser/subuser/DeductModeResultParser.java new file mode 100644 index 00000000..7c72b41b --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/subuser/DeductModeResultParser.java @@ -0,0 +1,25 @@ +package com.huobi.service.huobi.parser.subuser; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.wallet.DeductModeResult; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.List; + +public class DeductModeResultParser implements HuobiModelParser { + @Override + public DeductModeResult parse(JSONObject json) { + return null; + } + + @Override + public DeductModeResult parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + return jsonArray.toJavaList(DeductModeResult.class); + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/trade/BatchOrdersResultParser.java b/src/main/java/com/huobi/service/huobi/parser/trade/BatchOrdersResultParser.java new file mode 100644 index 00000000..251d380c --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/trade/BatchOrdersResultParser.java @@ -0,0 +1,32 @@ +package com.huobi.service.huobi.parser.trade; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.trade.BatchOrdersResult; +import com.huobi.model.trade.FeeRate; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.ArrayList; +import java.util.List; + +public class BatchOrdersResultParser implements HuobiModelParser { + @Override + public BatchOrdersResult parse(JSONObject json) { + return json.toJavaObject(BatchOrdersResult.class); + } + + @Override + public BatchOrdersResult parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + + if (jsonArray == null || jsonArray.size() <= 0) { + return new ArrayList<>(); + } + + return jsonArray.toJavaList(BatchOrdersResult.class); + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/trade/OrderParser.java b/src/main/java/com/huobi/service/huobi/parser/trade/OrderParser.java index 32487cd6..f0e79dae 100644 --- a/src/main/java/com/huobi/service/huobi/parser/trade/OrderParser.java +++ b/src/main/java/com/huobi/service/huobi/parser/trade/OrderParser.java @@ -49,6 +49,7 @@ public Order parse(JSONObject json) { order.setCreatedAt(json.getLong("created-at")); order.setCanceledAt(json.getLong("canceled-at")); order.setFinishedAt(json.getLong("finished-at")); + order.setClientOrderId(json.getString("client-order-id")); return order; } diff --git a/src/main/java/com/huobi/service/huobi/parser/trade/OrderRespParser.java b/src/main/java/com/huobi/service/huobi/parser/trade/OrderRespParser.java new file mode 100644 index 00000000..ad5d3c7f --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/trade/OrderRespParser.java @@ -0,0 +1,25 @@ +package com.huobi.service.huobi.parser.trade; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.trade.OrderResp; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.List; + +public class OrderRespParser implements HuobiModelParser { + @Override + public OrderResp parse(JSONObject json) { + return json.toJavaObject(OrderResp.class); + } + + @Override + public OrderResp parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + return null; + } +} diff --git a/src/main/java/com/huobi/service/huobi/parser/wallet/WithdrawOrderResultParser.java b/src/main/java/com/huobi/service/huobi/parser/wallet/WithdrawOrderResultParser.java new file mode 100644 index 00000000..937cd8fd --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/parser/wallet/WithdrawOrderResultParser.java @@ -0,0 +1,26 @@ +package com.huobi.service.huobi.parser.wallet; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.huobi.model.wallet.WithdrawOrderResult; +import com.huobi.model.wallet.WithdrawQuota; +import com.huobi.service.huobi.parser.HuobiModelParser; + +import java.util.List; + +public class WithdrawOrderResultParser implements HuobiModelParser { + @Override + public WithdrawOrderResult parse(JSONObject json) { + return json.toJavaObject(WithdrawOrderResult.class); + } + + @Override + public WithdrawOrderResult parse(JSONArray json) { + return null; + } + + @Override + public List parseArray(JSONArray jsonArray) { + return null; + } +} diff --git a/src/main/java/com/huobi/service/huobi/signature/ApiSignature.java b/src/main/java/com/huobi/service/huobi/signature/ApiSignature.java index 1a072bd9..147caf92 100644 --- a/src/main/java/com/huobi/service/huobi/signature/ApiSignature.java +++ b/src/main/java/com/huobi/service/huobi/signature/ApiSignature.java @@ -50,6 +50,7 @@ public void createSignature(String accessKey, String secretKey, String method, S .putToUrl(timestamp, gmtNow()); sb.append(builder.buildSignature()); + Mac hmacSha256; try { hmacSha256 = Mac.getInstance(signatureMethodValue); @@ -63,6 +64,7 @@ public void createSignature(String accessKey, String secretKey, String method, S throw new SDKException(SDKException.RUNTIME_ERROR, "[Signature] Invalid key: " + e.getMessage()); } + String payload = sb.toString(); byte[] hash = hmacSha256.doFinal(payload.getBytes(StandardCharsets.UTF_8)); diff --git a/src/main/java/com/huobi/service/huobi/signature/ApiSignatureED25519.java b/src/main/java/com/huobi/service/huobi/signature/ApiSignatureED25519.java new file mode 100644 index 00000000..72cc0ea0 --- /dev/null +++ b/src/main/java/com/huobi/service/huobi/signature/ApiSignatureED25519.java @@ -0,0 +1,107 @@ +package com.huobi.service.huobi.signature; + +import java.io.StringReader; +import java.nio.charset.StandardCharsets; +import java.security.PrivateKey; +import java.security.Security; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Base64; + +import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; +import org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters; +import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters; +import org.bouncycastle.crypto.signers.Ed25519Signer; +import org.bouncycastle.crypto.util.PrivateKeyFactory; +import org.bouncycastle.crypto.util.PublicKeyFactory; + +import com.huobi.exception.SDKException; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.openssl.PEMParser; +import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; + +public class ApiSignatureED25519 { + + public static final String op = "op"; + public static final String opValue = "auth"; + private static final String accessKeyId = "AccessKeyId"; + private static final String signatureMethod = "SignatureMethod"; + private static final String signatureMethodValue = "Ed25519"; // 使用 Ed25519 签名 + private static final String signatureVersion = "SignatureVersion"; + private static final String signatureVersionValue = "2"; + private static final String timestamp = "Timestamp"; + private static final String signature = "Signature"; + + private static final DateTimeFormatter DT_FORMAT = DateTimeFormatter + .ofPattern("uuuu-MM-dd'T'HH:mm:ss"); + private static final ZoneId ZONE_GMT = ZoneId.of("Z"); + + private Ed25519PrivateKeyParameters privateKey; + private Ed25519PublicKeyParameters accessKey; + + // 构造函数接收 Base64 编码的私钥和公钥 + public void ApiSignature(String base64PublicKey,String base64PrivateKey) throws Exception { + +// this.privateKey = (Ed25519PrivateKeyParameters) PrivateKeyFactory.createKey(Base64.getDecoder().decode(base64PrivateKey)); + + Security.addProvider(new BouncyCastleProvider()); + // 从 PEM 格式中提取私钥 + try (PEMParser pemParser = new PEMParser(new StringReader(base64PrivateKey))) { + Object object = pemParser.readObject(); + if (object instanceof PrivateKeyInfo) { + PrivateKeyInfo privateKeyInfo = (PrivateKeyInfo) object; + // 使用 JcaPEMKeyConverter 将 PrivateKeyInfo 转换为 Java PrivateKey + JcaPEMKeyConverter converter = new JcaPEMKeyConverter(); + PrivateKey privateKey = converter.getPrivateKey(privateKeyInfo); + // 将 Java PrivateKey 转换为 Ed25519PrivateKeyParameters + this.privateKey = (Ed25519PrivateKeyParameters) PrivateKeyFactory.createKey(privateKey.getEncoded()); + } else { + throw new IllegalArgumentException("Invalid PEM format: not a private key"); + } + } + + } + + public void createSignature(String method, String host, String uri, UrlParamsBuilder builder,String accessKey) { + StringBuilder sb = new StringBuilder(1024); + + // 检查 API 密钥是否为空 + if ( privateKey == null || "".equals(privateKey)) { + throw new SDKException(SDKException.KEY_MISSING, + "API key and secret key are required"); + } + + sb.append(method.toUpperCase()).append('\n') + .append(host.toLowerCase()).append('\n') + .append(uri).append('\n'); + + builder.putToUrl(accessKeyId, String.valueOf(accessKey)) + .putToUrl(signatureVersion,signatureVersionValue) + .putToUrl(timestamp, gmtNow()) + .putToUrl(signatureMethod, signatureMethodValue); + + + sb.append(builder.buildSignature()); + System.out.println(sb.toString()); + System.out.println(sb.toString().length()); + + // 使用 Ed25519 进行签名 + Ed25519Signer signer = new Ed25519Signer(); + signer.init(true, privateKey); + + signer.update(sb.toString().getBytes(StandardCharsets.UTF_8), 0, sb.length()); + byte[] signatureBytes = signer.generateSignature(); + String actualSign = Base64.getEncoder().encodeToString(signatureBytes); + + builder.putToUrl(signature, actualSign); + } + + private static long epochNow() { + return Instant.now().getEpochSecond(); + } + + static String gmtNow() { + return Instant.ofEpochSecond(epochNow()).atZone(ZONE_GMT).format(DT_FORMAT); + } +} \ No newline at end of file diff --git a/src/main/java/com/huobi/service/huobi/signature/UrlParamsBuilder.java b/src/main/java/com/huobi/service/huobi/signature/UrlParamsBuilder.java index 8f267305..93a33181 100644 --- a/src/main/java/com/huobi/service/huobi/signature/UrlParamsBuilder.java +++ b/src/main/java/com/huobi/service/huobi/signature/UrlParamsBuilder.java @@ -65,7 +65,7 @@ public static UrlParamsBuilder build() { return new UrlParamsBuilder(); } - private UrlParamsBuilder() { + public UrlParamsBuilder() { } public UrlParamsBuilder setPostMode(boolean mode) { diff --git a/src/test/java/com/huobi/Constants.java b/src/test/java/com/huobi/Constants.java deleted file mode 100644 index 3004151f..00000000 --- a/src/test/java/com/huobi/Constants.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.huobi; - -public class Constants { - - public static final String API_KEY = "api key"; - public static final String SECRET_KEY = "secret key"; -} diff --git a/src/test/java/com/huobi/ED25519Example/AccountClientExample_ED25519.java b/src/test/java/com/huobi/ED25519Example/AccountClientExample_ED25519.java new file mode 100644 index 00000000..6bcd25c9 --- /dev/null +++ b/src/test/java/com/huobi/ED25519Example/AccountClientExample_ED25519.java @@ -0,0 +1,129 @@ +package com.huobi.ED25519Example; + +import com.huobi.constant.Constants; +import com.huobi.client.AccountClient; +import com.huobi.client.req.account.*; +import com.huobi.client.req.trade.SubOrderUpdateV2Request; +import com.huobi.client.req.trade.SubTradeClearingRequest; +import com.huobi.constant.HuobiOptions; +import com.huobi.constant.enums.*; +import com.huobi.model.account.*; + +import java.math.BigDecimal; +import java.util.List; + +public class AccountClientExample_ED25519 { + + public static void main(String[] args) { + + Long accountId = 31252055L; +// Long accountId = 31278987L; + AccountClient accountService + = AccountClient.create(HuobiOptions.builder() + .apiKey(Constants.PUBLIC_KEY) + .secretKey(Constants.PRIVATE_KEY).sign(Constants.SIGN) + .build()); + +// List accountList = accountService.getAccounts(); +// accountList.forEach(account -> { +// System.out.println(account.toString()); +// }); + + + AccountBalance accountBalance = accountService.getAccountBalance(AccountBalanceRequest.builder() + .accountId(accountId) + .build()); + + System.out.println(accountBalance.getId()); + System.out.println(accountBalance.getType()); + System.out.println(accountBalance.getState()); + accountBalance.getList().forEach(balance -> { + System.out.println(balance.toString()); + }); + + List historyList = accountService.getAccountHistory(AccountHistoryRequest.builder().accountId(accountId).build()); + historyList.forEach(history->{ + System.out.println(history); + }); + + AccountLedgerResult accountLedgerResult = accountService.getAccountLedger(AccountLedgerRequest.builder() + .accountId(accountId) + .limit(2) + .build()); + System.out.println("leger nextId: " + accountLedgerResult.getNextId()); + accountLedgerResult.getLedgerList().forEach(ledger -> { + System.out.println(ledger); + }); + + + accountService.subAccountsUpdate(SubAccountUpdateRequest.builder() + .accountUpdateMode(AccountUpdateModeEnum.ACCOUNT_CHANGE).build(), event -> { + System.out.println(event.toString()); + }); + + + AccountTransferResult accountTransferResult = accountService.accountTransfer(AccountTransferRequest.builder() + .fromUser(123L) + .fromAccount(456L) + .fromAccountType(AccountTransferAccountTypeEnum.SPOT) + .toUser(678L) + .toAccount(789L) + .toAccountType(AccountTransferAccountTypeEnum.MARGIN) + .currency("usdt") + .amount(new BigDecimal("10")) + .build()); + + System.out.println("account transfer result:"+accountTransferResult.toString()); + + AccountFuturesTransferResult accountFuturesTransferResult = accountService.accountFuturesTransfer(AccountFuturesTransferRequest.builder() + .currency("xrp") + .amount(new BigDecimal("5")) + .type(AccountFuturesTransferTypeEnum.PRO_TO_FUTURES) + .build()); + + System.out.println("account futures result:"+accountFuturesTransferResult.toString()); + + Point point = accountService.getPoint(PointRequest.builder().build()); + System.out.println("get point: " + point); + + + PointTransferResult pointTransferResult = accountService.pointTransfer(PointTransferRequest.builder() + .fromUid(123L) + .toUid(123L) + .groupId(123L) + .amount(BigDecimal.ONE) + .build()); + System.out.println(pointTransferResult); + + AccountAssetValuationResult accountAssetValuationResult = accountService.accountAssetValuation(AccountAssetValuationRequest.builder().accountType(AccountTypeEnum.SPOT).build()); + System.out.println(accountAssetValuationResult); + + accountService.subOrderUpdateV2(SubOrderUpdateV2Request.builder().symbols("*").build(), orderUpdateV2Event -> { + + System.out.println(orderUpdateV2Event.toString()); + + }); + + accountService.subTradeClearing(SubTradeClearingRequest.builder().symbols("*").build(), event -> { + System.out.println(event.toString()); + }); + + AccountValuationRequest accountValuationRequest = AccountValuationRequest.builder().build(); + AccountValuationResult accountValuationResult = accountService.accountValuation(accountValuationRequest); + System.out.println(accountValuationResult); + + AccountTransferV2Request accountTransferV2Request = AccountTransferV2Request.builder().from(BusinessLineAccountTypeEnum.SPOT).to(BusinessLineAccountTypeEnum.LINEARSWAP).currency("usdt").amount(new BigDecimal(100)).marginAccount("USDT").build(); + AccountTransferV2Result accountTransferV2Result = accountService.accountTransferV2(accountTransferV2Request); + System.out.println(accountTransferV2Result); + + UserInfo accountUserInfo = accountService.getAccountUserInfo(); + System.out.println(accountUserInfo); + + OverviewInfo overviewInfo = accountService.getOverviewInfo(); + System.out.println(overviewInfo); + + accountService.feeSwitch(FeeSwitchRequest.builder().switchType(1).deductionCurrency("TRX").build()); + + } + +} diff --git a/src/test/java/com/huobi/examples/AccountClientExample.java b/src/test/java/com/huobi/Hmac256examples/AccountClientExample.java similarity index 59% rename from src/test/java/com/huobi/examples/AccountClientExample.java rename to src/test/java/com/huobi/Hmac256examples/AccountClientExample.java index e93a8822..719436f2 100644 --- a/src/test/java/com/huobi/examples/AccountClientExample.java +++ b/src/test/java/com/huobi/Hmac256examples/AccountClientExample.java @@ -1,51 +1,33 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.math.BigDecimal; import java.util.List; -import com.huobi.Constants; +import com.huobi.constant.Constants; import com.huobi.client.AccountClient; -import com.huobi.client.req.account.AccountAssetValuationRequest; -import com.huobi.client.req.account.AccountBalanceRequest; -import com.huobi.client.req.account.AccountFuturesTransferRequest; -import com.huobi.client.req.account.AccountHistoryRequest; -import com.huobi.client.req.account.AccountLedgerRequest; -import com.huobi.client.req.account.AccountTransferRequest; -import com.huobi.client.req.account.PointRequest; -import com.huobi.client.req.account.PointTransferRequest; -import com.huobi.client.req.account.SubAccountUpdateRequest; -import com.huobi.client.req.account.TransferSubuserRequest; +import com.huobi.client.req.account.*; +import com.huobi.client.req.trade.SubOrderUpdateV2Request; +import com.huobi.client.req.trade.SubTradeClearingRequest; import com.huobi.constant.HuobiOptions; -import com.huobi.constant.enums.AccountFuturesTransferTypeEnum; -import com.huobi.constant.enums.AccountTransferAccountTypeEnum; -import com.huobi.constant.enums.AccountTypeEnum; -import com.huobi.constant.enums.AccountUpdateModeEnum; -import com.huobi.constant.enums.TransferMasterTypeEnum; -import com.huobi.model.account.Account; -import com.huobi.model.account.AccountAssetValuationResult; -import com.huobi.model.account.AccountBalance; -import com.huobi.model.account.AccountFuturesTransferResult; -import com.huobi.model.account.AccountHistory; -import com.huobi.model.account.AccountLedgerResult; -import com.huobi.model.account.AccountTransferResult; -import com.huobi.model.account.Point; -import com.huobi.model.account.PointTransferResult; -import com.huobi.model.account.SubuserAggregateBalance; +import com.huobi.constant.enums.*; +import com.huobi.model.account.*; public class AccountClientExample { public static void main(String[] args) { - Long accountId = 123L; - AccountClient accountService = AccountClient.create(HuobiOptions.builder() + Long accountId = 31252055L; +// Long accountId = 31278987L; + AccountClient accountService + = AccountClient.create(HuobiOptions.builder() .apiKey(Constants.API_KEY) - .secretKey(Constants.SECRET_KEY) + .secretKey(Constants.SECRET_KEY).sign(Constants.SIGN) .build()); - List accountList = accountService.getAccounts(); - accountList.forEach(account -> { - System.out.println(account.toString()); - }); +// List accountList = accountService.getAccounts(); +// accountList.forEach(account -> { +// System.out.println(account.toString()); +// }); AccountBalance accountBalance = accountService.getAccountBalance(AccountBalanceRequest.builder() @@ -115,6 +97,33 @@ public static void main(String[] args) { AccountAssetValuationResult accountAssetValuationResult = accountService.accountAssetValuation(AccountAssetValuationRequest.builder().accountType(AccountTypeEnum.SPOT).build()); System.out.println(accountAssetValuationResult); + + accountService.subOrderUpdateV2(SubOrderUpdateV2Request.builder().symbols("*").build(), orderUpdateV2Event -> { + + System.out.println(orderUpdateV2Event.toString()); + + }); + + accountService.subTradeClearing(SubTradeClearingRequest.builder().symbols("*").build(), event -> { + System.out.println(event.toString()); + }); + + AccountValuationRequest accountValuationRequest = AccountValuationRequest.builder().build(); + AccountValuationResult accountValuationResult = accountService.accountValuation(accountValuationRequest); + System.out.println(accountValuationResult); + + AccountTransferV2Request accountTransferV2Request = AccountTransferV2Request.builder().from(BusinessLineAccountTypeEnum.SPOT).to(BusinessLineAccountTypeEnum.LINEARSWAP).currency("usdt").amount(new BigDecimal(100)).marginAccount("USDT").build(); + AccountTransferV2Result accountTransferV2Result = accountService.accountTransferV2(accountTransferV2Request); + System.out.println(accountTransferV2Result); + + UserInfo accountUserInfo = accountService.getAccountUserInfo(); + System.out.println(accountUserInfo); + + OverviewInfo overviewInfo = accountService.getOverviewInfo(); + System.out.println(overviewInfo); + + accountService.feeSwitch(FeeSwitchRequest.builder().switchType(1).deductionCurrency("TRX").build()); + } } diff --git a/src/test/java/com/huobi/examples/AlgoClientExamples.java b/src/test/java/com/huobi/Hmac256examples/AlgoClientExamples.java similarity index 79% rename from src/test/java/com/huobi/examples/AlgoClientExamples.java rename to src/test/java/com/huobi/Hmac256examples/AlgoClientExamples.java index c41d8075..f32193a5 100644 --- a/src/test/java/com/huobi/examples/AlgoClientExamples.java +++ b/src/test/java/com/huobi/Hmac256examples/AlgoClientExamples.java @@ -1,35 +1,29 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import com.huobi.client.req.algo.*; +import com.huobi.model.algo.*; import org.apache.commons.lang.RandomStringUtils; -import com.huobi.Constants; +import com.huobi.constant.Constants; import com.huobi.client.AlgoClient; -import com.huobi.client.req.algo.CancelAlgoOrderRequest; -import com.huobi.client.req.algo.CreateAlgoOrderRequest; -import com.huobi.client.req.algo.GetHistoryAlgoOrdersRequest; -import com.huobi.client.req.algo.GetOpenAlgoOrdersRequest; import com.huobi.constant.HuobiOptions; import com.huobi.constant.enums.algo.AlgoOrderSideEnum; import com.huobi.constant.enums.algo.AlgoOrderStatusEnum; import com.huobi.constant.enums.algo.AlgoOrderTimeInForceEnum; import com.huobi.constant.enums.algo.AlgoOrderTypeEnum; -import com.huobi.model.algo.AlgoOrder; -import com.huobi.model.algo.CancelAlgoOrderResult; -import com.huobi.model.algo.CreateAlgoOrderResult; -import com.huobi.model.algo.GetHistoryAlgoOrdersResult; -import com.huobi.model.algo.GetOpenAlgoOrdersResult; public class AlgoClientExamples { public static void main(String[] args) { String symbol = "htusdt"; - Long accountId = 2982L; - AlgoClient algoClient = AlgoClient.create(HuobiOptions.builder().apiKey(Constants.API_KEY).secretKey(Constants.SECRET_KEY).build()); + Long accountId = 59373420L; + AlgoClient algoClient = AlgoClient.create(HuobiOptions.builder().apiKey(Constants.API_KEY) + .secretKey(Constants.SECRET_KEY).sign(Constants.SIGN).build()); CreateAlgoOrderResult createAlgoOrderResult = algoClient.createAlgoOrder(CreateAlgoOrderRequest.builder() .clientOrderId(getRandomClientOrderId()) @@ -68,6 +62,10 @@ public static void main(String[] args) { System.out.println(order); }); + CancelAlgoAllOrderRequest cancelAlgoAllOrderRequest = CancelAlgoAllOrderRequest.builder().timeout(10).build(); + CancelAlgoAllOrderResult cancelAlgoAllOrderResult = algoClient.cancelAlgoAllOrder(cancelAlgoAllOrderRequest); + System.out.println(cancelAlgoAllOrderResult); + } public static String getRandomClientOrderId() { diff --git a/src/test/java/com/huobi/examples/CrossMarginClientExample.java b/src/test/java/com/huobi/Hmac256examples/CrossMarginClientExample.java similarity index 92% rename from src/test/java/com/huobi/examples/CrossMarginClientExample.java rename to src/test/java/com/huobi/Hmac256examples/CrossMarginClientExample.java index c72dba90..08e61d63 100644 --- a/src/test/java/com/huobi/examples/CrossMarginClientExample.java +++ b/src/test/java/com/huobi/Hmac256examples/CrossMarginClientExample.java @@ -1,10 +1,11 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.math.BigDecimal; import java.util.List; -import com.huobi.Constants; +import com.huobi.constant.Constants; import com.huobi.client.CrossMarginClient; +import com.huobi.client.req.account.GetBalanceRequest; import com.huobi.client.req.crossmargin.CrossMarginApplyLoanRequest; import com.huobi.client.req.crossmargin.CrossMarginLoanOrdersRequest; import com.huobi.client.req.crossmargin.CrossMarginRepayLoanRequest; @@ -25,7 +26,7 @@ public class CrossMarginClientExample { public static void main(String[] args) { CrossMarginClient marginService = CrossMarginClient.create(HuobiOptions.builder() .apiKey(Constants.API_KEY) - .secretKey(Constants.SECRET_KEY) + .secretKey(Constants.SECRET_KEY).sign(Constants.SIGN) .build()); String currency = "usdt"; @@ -37,9 +38,9 @@ public static void main(String[] args) { .amount(new BigDecimal("50")) .build()); System.out.println(" transfer to margin: " + transferInId); - + GetBalanceRequest getBalanceRequest = new GetBalanceRequest(); // 查询余额 - CrossMarginAccount crossMarginAccount = marginService.getLoanBalance(); + CrossMarginAccount crossMarginAccount = marginService.getLoanBalance(getBalanceRequest); System.out.println("account:" + crossMarginAccount.toString()); crossMarginAccount.getBalanceList().forEach(balance -> { @@ -59,7 +60,7 @@ public static void main(String[] args) { System.out.println(" apply id:" + applyId); // 查询余额 - CrossMarginAccount crossMarginAccount1 = marginService.getLoanBalance(); + CrossMarginAccount crossMarginAccount1 = marginService.getLoanBalance(getBalanceRequest); System.out.println("account:" + crossMarginAccount1.toString()); crossMarginAccount1.getBalanceList().forEach(balance -> { System.out.println("======>" + balance.toString()); @@ -77,7 +78,7 @@ public static void main(String[] args) { System.out.println(" repay finish:"); // 查询余额 - CrossMarginAccount crossMarginAccount2 = marginService.getLoanBalance(); + CrossMarginAccount crossMarginAccount2 = marginService.getLoanBalance(getBalanceRequest); System.out.println("account:" + crossMarginAccount2.toString()); crossMarginAccount2.getBalanceList().forEach(balance -> { System.out.println("======>" + balance.toString()); diff --git a/src/test/java/com/huobi/examples/GenericClientExample.java b/src/test/java/com/huobi/Hmac256examples/GenericClientExample.java similarity index 54% rename from src/test/java/com/huobi/examples/GenericClientExample.java rename to src/test/java/com/huobi/Hmac256examples/GenericClientExample.java index 4fcac80e..396d65d9 100644 --- a/src/test/java/com/huobi/examples/GenericClientExample.java +++ b/src/test/java/com/huobi/Hmac256examples/GenericClientExample.java @@ -1,8 +1,9 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.util.List; import com.huobi.client.GenericClient; +import com.huobi.client.req.generic.ChainRequest; import com.huobi.client.req.generic.CurrencyChainsRequest; import com.huobi.constant.HuobiOptions; import com.huobi.model.generic.*; @@ -21,19 +22,6 @@ public static void main(String[] args) { MarketStatus marketStatus = genericService.getMarketStatus(); System.out.println("market status :: "+marketStatus.getMarketStatus()); - System.out.println("----------------------------------------------------"); - - List symbolList = genericService.getSymbols(); - symbolList.forEach(symbol -> { - System.out.println(symbol.toString()); - }); - - System.out.println("----------------------------------------------------"); - - List currencyList = genericService.getCurrencys(); - currencyList.forEach(currency -> { - System.out.println(currency); - }); System.out.println("----------------------------------------------------"); @@ -51,6 +39,43 @@ public static void main(String[] args) { System.out.println("chain:::"+chain.toString()); }); }); + + System.out.println("----------------------------------------------------"); + + Long timeStamp = genericService.getTimestamp(); + System.out.println(timeStamp); + + System.out.println("----------------------------------------------------"); + + List symbolsV2 = genericService.getSymbolsV2(null); + System.out.println(symbolsV2); + + System.out.println("----------------------------------------------------"); + + List currencyV1 = genericService.getCurrencyV1(null); + System.out.println(currencyV1); + + System.out.println("----------------------------------------------------"); + + List currencyV2 = genericService.getCurrencyV2(null); + System.out.println(currencyV2); + + System.out.println("----------------------------------------------------"); + + List symbolsV1 = genericService.getSymbolsV1(null); + System.out.println(symbolsV1); + + System.out.println("----------------------------------------------------"); + + List marketSymbol = genericService.getMarketSymbol(null, null); + System.out.println(marketSymbol); + + System.out.println("----------------------------------------------------"); + + ChainRequest request = ChainRequest.builder().build(); + List chain = genericService.getChain(request); + System.out.println(chain); + } } diff --git a/src/test/java/com/huobi/examples/IsolatedMarginClientExample.java b/src/test/java/com/huobi/Hmac256examples/IsolatedMarginClientExample.java similarity index 87% rename from src/test/java/com/huobi/examples/IsolatedMarginClientExample.java rename to src/test/java/com/huobi/Hmac256examples/IsolatedMarginClientExample.java index 7351b174..ecfd8fce 100644 --- a/src/test/java/com/huobi/examples/IsolatedMarginClientExample.java +++ b/src/test/java/com/huobi/Hmac256examples/IsolatedMarginClientExample.java @@ -1,21 +1,17 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.math.BigDecimal; import java.util.List; -import com.huobi.Constants; +import com.huobi.constant.Constants; import com.huobi.client.IsolatedMarginClient; -import com.huobi.client.req.margin.IsolatedMarginAccountRequest; -import com.huobi.client.req.margin.IsolatedMarginApplyLoanRequest; -import com.huobi.client.req.margin.IsolatedMarginLoanInfoRequest; -import com.huobi.client.req.margin.IsolatedMarginLoanOrdersRequest; -import com.huobi.client.req.margin.IsolatedMarginRepayLoanRequest; -import com.huobi.client.req.margin.IsolatedMarginTransferRequest; +import com.huobi.client.req.margin.*; import com.huobi.constant.HuobiOptions; import com.huobi.constant.enums.MarginTransferDirectionEnum; import com.huobi.model.isolatedmargin.IsolatedMarginAccount; import com.huobi.model.isolatedmargin.IsolatedMarginLoadOrder; import com.huobi.model.isolatedmargin.IsolatedMarginSymbolInfo; +import com.huobi.model.isolatedmargin.LeveragePositionLimitResult; import com.huobi.service.huobi.utils.DataUtils; public class IsolatedMarginClientExample { @@ -24,12 +20,13 @@ public static void main(String[] args) { IsolatedMarginClient marginService = IsolatedMarginClient.create(HuobiOptions.builder() .apiKey(Constants.API_KEY) - .secretKey(Constants.SECRET_KEY) + .secretKey(Constants.SECRET_KEY).sign(Constants.SIGN) .build()); String symbol = "xrpusdt"; String currency = "usdt"; + // 划转至margin Long transferInId = marginService.transfer(IsolatedMarginTransferRequest.builder() .direction(MarginTransferDirectionEnum.SPOT_TO_MARGIN) @@ -112,6 +109,9 @@ public static void main(String[] args) { System.out.println(info); }); + LeveragePositionLimitRequest leveragePositionLimitRequest = LeveragePositionLimitRequest.builder().currency("").build(); + List leveragePositionLimit = marginService.getLeveragePositionLimit(leveragePositionLimitRequest); + System.out.println(leveragePositionLimit); } diff --git a/src/test/java/com/huobi/examples/MarketClientExample.java b/src/test/java/com/huobi/Hmac256examples/MarketClientExample.java similarity index 83% rename from src/test/java/com/huobi/examples/MarketClientExample.java rename to src/test/java/com/huobi/Hmac256examples/MarketClientExample.java index c7a0c54e..492adcda 100644 --- a/src/test/java/com/huobi/examples/MarketClientExample.java +++ b/src/test/java/com/huobi/Hmac256examples/MarketClientExample.java @@ -1,25 +1,9 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.util.List; import com.huobi.client.MarketClient; -import com.huobi.client.req.market.CandlestickRequest; -import com.huobi.client.req.market.MarketDepthRequest; -import com.huobi.client.req.market.MarketDetailMergedRequest; -import com.huobi.client.req.market.MarketDetailRequest; -import com.huobi.client.req.market.MarketHistoryTradeRequest; -import com.huobi.client.req.market.MarketTradeRequest; -import com.huobi.client.req.market.ReqCandlestickRequest; -import com.huobi.client.req.market.ReqMarketDepthRequest; -import com.huobi.client.req.market.ReqMarketDetailRequest; -import com.huobi.client.req.market.ReqMarketTradeRequest; -import com.huobi.client.req.market.SubCandlestickRequest; -import com.huobi.client.req.market.SubMarketBBORequest; -import com.huobi.client.req.market.SubMarketDepthRequest; -import com.huobi.client.req.market.SubMarketDetailRequest; -import com.huobi.client.req.market.SubMarketTradeRequest; -import com.huobi.client.req.market.SubMbpIncrementalUpdateRequest; -import com.huobi.client.req.market.SubMbpRefreshUpdateRequest; +import com.huobi.client.req.market.*; import com.huobi.constant.HuobiOptions; import com.huobi.constant.enums.CandlestickIntervalEnum; import com.huobi.constant.enums.DepthLevels; @@ -160,6 +144,13 @@ public static void main(String[] args) { System.out.println(event.toString()); }); + marketClient.subMarketTicker(SubMarketTickerRequest.builder().symbol(symbol).build(), event->{ + System.out.println(event.toString()); + }); + + marketClient.reqMarketTicker(ReqMarketTickerRequest.builder().symbol(symbol).build(), event->{ + System.out.println(event.toString()); + }); } diff --git a/src/test/java/com/huobi/examples/OrderBookExamples.java b/src/test/java/com/huobi/Hmac256examples/OrderBookExamples.java similarity index 99% rename from src/test/java/com/huobi/examples/OrderBookExamples.java rename to src/test/java/com/huobi/Hmac256examples/OrderBookExamples.java index e9ec8eb2..d1b626c1 100644 --- a/src/test/java/com/huobi/examples/OrderBookExamples.java +++ b/src/test/java/com/huobi/Hmac256examples/OrderBookExamples.java @@ -1,4 +1,4 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.math.BigDecimal; import java.util.ArrayList; diff --git a/src/test/java/com/huobi/examples/SubUserClientExample.java b/src/test/java/com/huobi/Hmac256examples/SubUserClientExample.java similarity index 89% rename from src/test/java/com/huobi/examples/SubUserClientExample.java rename to src/test/java/com/huobi/Hmac256examples/SubUserClientExample.java index c9dcde4c..3a92efbb 100644 --- a/src/test/java/com/huobi/examples/SubUserClientExample.java +++ b/src/test/java/com/huobi/Hmac256examples/SubUserClientExample.java @@ -1,39 +1,22 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; -import java.util.UUID; import com.alibaba.fastjson.JSON; -import com.huobi.Constants; -import com.huobi.client.AccountClient; +import com.huobi.constant.Constants; import com.huobi.client.SubUserClient; -import com.huobi.client.req.account.AccountBalanceRequest; -import com.huobi.client.req.account.SubAccountUpdateRequest; import com.huobi.client.req.account.TransferSubuserRequest; -import com.huobi.client.req.subuser.GetApiKeyListRequest; -import com.huobi.client.req.subuser.GetSubUserAccountListRequest; -import com.huobi.client.req.subuser.GetSubUserDepositRequest; -import com.huobi.client.req.subuser.GetSubUserListRequest; -import com.huobi.client.req.subuser.SubUserApiKeyDeletionRequest; -import com.huobi.client.req.subuser.SubUserApiKeyGenerationRequest; -import com.huobi.client.req.subuser.SubUserApiKeyModificationRequest; -import com.huobi.client.req.subuser.SubUserCreationParam; -import com.huobi.client.req.subuser.SubUserCreationRequest; -import com.huobi.client.req.subuser.SubUserManagementRequest; -import com.huobi.client.req.subuser.SubUserTradableMarketRequest; -import com.huobi.client.req.subuser.SubUserTransferabilityRequest; +import com.huobi.client.req.subuser.*; import com.huobi.constant.HuobiOptions; -import com.huobi.constant.enums.AccountUpdateModeEnum; import com.huobi.constant.enums.SubUserApiKeyPermissionEnums; import com.huobi.constant.enums.SubUserManagementActionEnum; import com.huobi.constant.enums.TradableMarketAccountTypeEnum; import com.huobi.constant.enums.TradableMarketActivationEnums; import com.huobi.constant.enums.TransferMasterTypeEnum; import com.huobi.constant.enums.TransferabilityAccountTypeEnum; -import com.huobi.model.account.Account; import com.huobi.model.account.AccountBalance; import com.huobi.model.account.SubuserAggregateBalance; import com.huobi.model.subuser.GetApiKeyListResult; @@ -49,6 +32,7 @@ import com.huobi.model.subuser.SubUserTradableMarketState; import com.huobi.model.subuser.SubUserTransferabilityResult; import com.huobi.model.subuser.SubUserTransferabilityState; +import com.huobi.model.wallet.DeductModeResult; import com.huobi.model.wallet.DepositAddress; import com.huobi.service.huobi.utils.GoogleAuthHelper; @@ -59,7 +43,7 @@ public static void main(String[] args) { Long subUid = 120491258L; SubUserClient subUserClient = SubUserClient.create(HuobiOptions.builder() .apiKey(Constants.API_KEY) - .secretKey(Constants.SECRET_KEY) + .secretKey(Constants.SECRET_KEY).sign(Constants.SIGN) .build()); System.out.println("===========transfer to subuser ==============="); @@ -221,6 +205,12 @@ public static void main(String[] args) { System.out.println(deposit); }); + List deductModeResults = subUserClient.setDeductMode(DeductModeRequest.builder().subUids(178211L).deductMode("master").build()); + System.out.println(deductModeResults); + + boolean setCreditResults = subUserClient.setCredit(CreditRequest.builder().userId(41262769L).accountId(31260495L).currency("usdt").amount(new BigDecimal(10)).transactionId(17L).build()); + System.out.println(setCreditResults); + long uid = subUserClient.getUid(); System.out.println("===========uid:" + uid + "==============="); diff --git a/src/test/java/com/huobi/examples/TradeClientExample.java b/src/test/java/com/huobi/Hmac256examples/TradeClientExample.java similarity index 88% rename from src/test/java/com/huobi/examples/TradeClientExample.java rename to src/test/java/com/huobi/Hmac256examples/TradeClientExample.java index 3111a8a0..c8e4fa43 100644 --- a/src/test/java/com/huobi/examples/TradeClientExample.java +++ b/src/test/java/com/huobi/Hmac256examples/TradeClientExample.java @@ -1,4 +1,4 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.math.BigDecimal; import java.math.RoundingMode; @@ -6,23 +6,14 @@ import java.util.Date; import java.util.List; +import com.huobi.client.req.trade.*; +import com.huobi.model.trade.*; import org.apache.commons.lang.RandomStringUtils; -import com.huobi.Constants; +import com.huobi.constant.Constants; import com.huobi.client.MarketClient; import com.huobi.client.TradeClient; import com.huobi.client.req.market.MarketDetailMergedRequest; -import com.huobi.client.req.trade.BatchCancelOpenOrdersRequest; -import com.huobi.client.req.trade.CreateOrderRequest; -import com.huobi.client.req.trade.FeeRateRequest; -import com.huobi.client.req.trade.MatchResultRequest; -import com.huobi.client.req.trade.OpenOrdersRequest; -import com.huobi.client.req.trade.OrderHistoryRequest; -import com.huobi.client.req.trade.OrdersRequest; -import com.huobi.client.req.trade.ReqOrderListRequest; -import com.huobi.client.req.trade.SubOrderUpdateRequest; -import com.huobi.client.req.trade.SubOrderUpdateV2Request; -import com.huobi.client.req.trade.SubTradeClearingRequest; import com.huobi.constant.HuobiOptions; import com.huobi.constant.enums.OrderSourceEnum; import com.huobi.constant.enums.OrderStateEnum; @@ -30,11 +21,6 @@ import com.huobi.constant.enums.QueryDirectionEnum; import com.huobi.constant.enums.StopOrderOperatorEnum; import com.huobi.model.market.MarketDetailMerged; -import com.huobi.model.trade.BatchCancelOpenOrdersResult; -import com.huobi.model.trade.BatchCancelOrderResult; -import com.huobi.model.trade.FeeRate; -import com.huobi.model.trade.MatchResult; -import com.huobi.model.trade.Order; public class TradeClientExample { @@ -50,7 +36,7 @@ public static void main(String[] args) { TradeClient tradeService = TradeClient.create(HuobiOptions.builder() .apiKey(Constants.API_KEY) - .secretKey(Constants.SECRET_KEY) + .secretKey(Constants.SECRET_KEY).sign(Constants.SIGN) .build()); String clientOrderId = "T" + System.nanoTime() + "_" + RandomStringUtils.randomAlphanumeric(4); @@ -157,7 +143,9 @@ public static void main(String[] args) { orderList.forEach(order -> { System.out.println(order.toString()); openOrderList.add(order.getId()); - Long res = tradeService.cancelOrder(order.getId()); + CancelOrderRequest cancelOrderRequest = new CancelOrderRequest(); + cancelOrderRequest.setOrderId(order.getId()); + Long res = tradeService.cancelOrder(cancelOrderRequest); System.out.println("--------cancel order res:" + res + "-----------"); }); @@ -230,15 +218,16 @@ public static void main(String[] args) { }); - tradeService.subOrderUpdateV2(SubOrderUpdateV2Request.builder().symbols("*").build(), orderUpdateV2Event -> { + List list = new ArrayList<>(); + BatchOrdersRequest batchOrdersRequest1 = BatchOrdersRequest.builder().accountId("13496526").symbol("adausdt").type("buy-limit-maker").amount("5").price("1").source("spot-api").clientOrderId("2345").build(); + BatchOrdersRequest batchOrdersRequest2 = BatchOrdersRequest.builder().accountId("13496526").symbol("adausdt").type("buy-limit-maker").amount("4").price("1").source("spot-api").clientOrderId("23456").build(); + list.add(batchOrdersRequest1); + list.add(batchOrdersRequest2); + List batchOrdersResults = tradeService.batchOrders(list); + System.out.println(batchOrdersResults); - System.out.println(orderUpdateV2Event.toString()); - - }); - - tradeService.subTradeClearing(SubTradeClearingRequest.builder().symbols("*").build(), event -> { - System.out.println(event.toString()); - }); + OrderResp orderResp = tradeService.marginOrder(MarginOrderRequest.builder().marketAmount("10").accountId("31253990").source("super-margin-web").type("buy-market").symbol("btcusdt").tradePurpose("2").build()); + System.out.println(orderResp); } } diff --git a/src/test/java/com/huobi/examples/WalletClientExample.java b/src/test/java/com/huobi/Hmac256examples/WalletClientExample.java similarity index 89% rename from src/test/java/com/huobi/examples/WalletClientExample.java rename to src/test/java/com/huobi/Hmac256examples/WalletClientExample.java index 5b5c5ed6..36a3c1a2 100644 --- a/src/test/java/com/huobi/examples/WalletClientExample.java +++ b/src/test/java/com/huobi/Hmac256examples/WalletClientExample.java @@ -1,9 +1,9 @@ -package com.huobi.examples; +package com.huobi.Hmac256examples; import java.math.BigDecimal; import java.util.List; -import com.huobi.Constants; +import com.huobi.constant.Constants; import com.huobi.client.req.wallet.CreateWithdrawRequest; import com.huobi.client.req.wallet.DepositAddressRequest; import com.huobi.client.req.wallet.DepositWithdrawRequest; @@ -11,10 +11,7 @@ import com.huobi.client.req.wallet.WithdrawQuotaRequest; import com.huobi.constant.HuobiOptions; import com.huobi.constant.enums.DepositWithdrawTypeEnum; -import com.huobi.model.wallet.DepositAddress; -import com.huobi.model.wallet.DepositWithdraw; -import com.huobi.model.wallet.WithdrawAddressResult; -import com.huobi.model.wallet.WithdrawQuota; +import com.huobi.model.wallet.*; import com.huobi.service.huobi.HuobiWalletService; public class WalletClientExample { @@ -26,7 +23,7 @@ public static void main(String[] args) { HuobiWalletService walletService = new HuobiWalletService(HuobiOptions.builder() .apiKey(Constants.API_KEY) - .secretKey(Constants.SECRET_KEY) + .secretKey(Constants.SECRET_KEY).sign(Constants.SIGN) .build()); List addressList = walletService.getDepositAddress(DepositAddressRequest.builder().currency("usdt").build()); @@ -72,5 +69,8 @@ public static void main(String[] args) { System.out.println(add); }); + WithdrawOrderResult withdrawOrder = walletService.getWithdrawOrder("1113"); + System.out.println(withdrawOrder); + } } diff --git a/src/test/java/com/huobi/examples/ETFClientExample.java b/src/test/java/com/huobi/examples/ETFClientExample.java deleted file mode 100644 index 2364a659..00000000 --- a/src/test/java/com/huobi/examples/ETFClientExample.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.huobi.examples; - -import java.math.BigDecimal; -import java.util.List; - -import com.huobi.client.req.etf.ETFSwapListRequest; -import com.huobi.client.req.etf.ETFSwapRequest; -import com.huobi.constant.Constants; -import com.huobi.constant.HuobiOptions; -import com.huobi.constant.enums.EtfSwapDirectionEnum; -import com.huobi.model.etf.ETFConfig; -import com.huobi.model.etf.ETFSwapRecord; -import com.huobi.service.huobi.HuobiETFService; - -public class ETFClientExample { - - public static void main(String[] args) { - HuobiETFService etfService = new HuobiETFService(HuobiOptions.builder() - .apiKey(Constants.API_KEY) - .secretKey(Constants.SECRET_KEY) - .build()); - - String etfName = "hb10"; - - ETFConfig etfConfig = etfService.getConfig(etfName); - System.out.println(etfConfig.toString()); - etfConfig.getUnitPriceList().forEach(etfUnitPrice -> { - System.out.println("unit pirce:" + etfUnitPrice.toString()); - }); - - etfService.etfSwap(ETFSwapRequest.builder() - .direction(EtfSwapDirectionEnum.SWAP_IN_ETF) - .etfName(etfName) - .amount(new BigDecimal(1000)) - .build()); - - etfService.etfSwap(ETFSwapRequest.builder() - .direction(EtfSwapDirectionEnum.SWAP_OUT_ETF) - .etfName(etfName) - .amount(new BigDecimal(1000)) - .build()); - - List recordList = etfService.getEtfSwapList(ETFSwapListRequest.builder() - .etfName(etfName) - .offset(0) - .limit(100) - .build()); - recordList.forEach(record->{ - System.out.println(record.toString()); - }); - - - - } - -} diff --git a/src/test/java/com/huobi/service/huobi/signature/ApiSignatureTest.java b/src/test/java/com/huobi/service/huobi/signature/ApiSignatureTest.java index 0f109eb7..06610c1b 100644 --- a/src/test/java/com/huobi/service/huobi/signature/ApiSignatureTest.java +++ b/src/test/java/com/huobi/service/huobi/signature/ApiSignatureTest.java @@ -1,5 +1,12 @@ package com.huobi.service.huobi.signature; +import com.alibaba.fastjson.JSONObject; +import org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters; +import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters; +import org.bouncycastle.crypto.signers.Ed25519Signer; +import org.bouncycastle.crypto.util.PrivateKeyFactory; + +import org.bouncycastle.crypto.util.PublicKeyFactory; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; @@ -7,6 +14,15 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Base64; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; + import static org.junit.Assert.assertEquals; @RunWith(PowerMockRunner.class) @@ -14,7 +30,6 @@ @PowerMockIgnore({"javax.crypto.*"}) public class ApiSignatureTest { - @Test public void testSignature() { PowerMockito.mockStatic(ApiSignature.class); @@ -29,4 +44,34 @@ public void testSignature() { + "&Timestamp=123", builder.buildSignature()); } + + @Test + public void testVerifySign() throws Exception { + Ed25519PrivateKeyParameters privateKey = (Ed25519PrivateKeyParameters) PrivateKeyFactory.createKey(Base64.getDecoder().decode("")); + + Ed25519PublicKeyParameters publicKey = (Ed25519PublicKeyParameters) PublicKeyFactory.createKey(Base64.getDecoder().decode("")); + + String data = "{\"method\":\"GET\",\"requestUrl\":\"/v2/settings/common/symbols11\",\"serverName\":\"dawn-broker-common-pro.global-base.tc-jp1.huobiapps11.com\",\"privilege\":\"WRITE\",\"params\":{\"SignatureVersion\":[\"2\"],\"AccessKeyId\":[\"ghxertfvbf-946bcb5b-689d6d30-73277\"],\"Signature\":[\"YFcOXnxeLTxZnM0ONUqaBc2NYJ6PdD26Ik+o9yzUZAU=\"],\"SignatureMethod\":[\"HmacSHA256\"],\"Timestamp\":[\"2024-06-26T06:35:16\"]}}"; + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + + Ed25519Signer signer = new Ed25519Signer(); + signer.init(true, privateKey); + signer.update(dataBytes, 0, dataBytes.length); + byte[] signatureBytes = signer.generateSignature(); + String signature = Base64.getEncoder().encodeToString(signatureBytes); + + System.out.println(signature + " " + signature.length()); + System.out.println(verifySign(publicKey, data, signature)); + } + + private boolean verifySign(Ed25519PublicKeyParameters publicKey, String data, String signature) { + //初始化签名器 + Ed25519Signer verifier = new Ed25519Signer(); + verifier.init(false, publicKey); + //执行验签 + byte[] bytesMsg = data.getBytes(StandardCharsets.UTF_8); + verifier.update(bytesMsg, 0, bytesMsg.length); + return verifier.verifySignature(Base64.getDecoder().decode(signature)); + } + } diff --git a/src/test/java/com/huobi/test/PerformanceTest.java b/src/test/java/com/huobi/test/PerformanceTest.java index f7b92933..673ab671 100644 --- a/src/test/java/com/huobi/test/PerformanceTest.java +++ b/src/test/java/com/huobi/test/PerformanceTest.java @@ -2,7 +2,7 @@ import java.math.BigDecimal; -import com.huobi.Constants; +import com.huobi.constant.Constants; import com.huobi.client.AccountClient; import com.huobi.client.GenericClient; import com.huobi.client.MarketClient; @@ -14,6 +14,7 @@ import com.huobi.client.req.market.MarketDepthRequest; import com.huobi.client.req.market.MarketDetailRequest; import com.huobi.client.req.market.MarketTradeRequest; +import com.huobi.client.req.trade.CancelOrderRequest; import com.huobi.client.req.trade.CreateOrderRequest; import com.huobi.client.req.trade.FeeRateRequest; import com.huobi.client.req.wallet.DepositAddressRequest; @@ -42,14 +43,14 @@ public static void main(String[] args) { public static void testCase() { - String symbol = "htusdt"; + String symbol = "btcusdt"; String currency = "usdt"; Long accountId = 290082L; GenericClient genericClient = GenericClient.create(new HuobiOptions()); MarketClient marketClient = MarketClient.create(new HuobiOptions()); - AccountClient accountClient = AccountClient.create(HuobiOptions.builder().apiKey(Constants.API_KEY).secretKey(Constants.SECRET_KEY).build()); - WalletClient walletClient = WalletClient.create(HuobiOptions.builder().apiKey(Constants.API_KEY).secretKey(Constants.SECRET_KEY).build()); - TradeClient tradeClient = TradeClient.create(HuobiOptions.builder().apiKey(Constants.API_KEY).secretKey(Constants.SECRET_KEY).build()); + AccountClient accountClient = AccountClient.create(HuobiOptions.builder().apiKey(Constants.API_KEY).secretKey(Constants.SECRET_KEY).sign(Constants.SIGN).build()); + WalletClient walletClient = WalletClient.create(HuobiOptions.builder().apiKey(Constants.API_KEY).secretKey(Constants.SECRET_KEY).sign(Constants.SIGN).build()); + TradeClient tradeClient = TradeClient.create(HuobiOptions.builder().apiKey(Constants.API_KEY).secretKey(Constants.SECRET_KEY).sign(Constants.SIGN).build()); Long startNano = null; Long endNano = null; NetworkLatency networkLatency = null; @@ -134,7 +135,9 @@ public static void testCase() { // 撤单 startNano = System.nanoTime(); - tradeClient.cancelOrder(orderId); + CancelOrderRequest cancelOrderRequest = new CancelOrderRequest(); + cancelOrderRequest.setOrderId(orderId); + tradeClient.cancelOrder(cancelOrderRequest); endNano = System.nanoTime(); networkLatency = ConnectionFactory.getLatencyDebugQueue().poll(); print(networkLatency, startNano, endNano);