diff --git a/.gitignore b/.gitignore index 008d83b..abb02d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.DS_Store .idea/ logs/ target diff --git a/pom.xml b/pom.xml index e39505b..9555c75 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 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 ba436f4..7092590 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/market/ReqMarketDepthRequest.java b/src/main/java/com/huobi/client/req/market/ReqMarketDepthRequest.java index c822a31..d0a90f9 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/SubMarketDepthRequest.java b/src/main/java/com/huobi/client/req/market/SubMarketDepthRequest.java index 5b07b54..76a3727 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/trade/SubOrderUpdateV2Request.java b/src/main/java/com/huobi/client/req/trade/SubOrderUpdateV2Request.java index 84efab6..722ebbf 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 398bdd1..9a86add 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,8 +14,10 @@ @ToString public class SubTradeClearingRequest { - private String symbols; + private AccountActionEnum accountAction; - private int[] modes; + private String symbols; + + private int[] modes; } 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 0000000..b97ab65 --- /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 38e592e..3a145a5 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/service/huobi/HuobiAccountService.java b/src/main/java/com/huobi/service/huobi/HuobiAccountService.java index caff90c..cf351bb 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiAccountService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiAccountService.java @@ -14,6 +14,7 @@ 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.exception.SDKException; import com.huobi.model.account.*; @@ -29,6 +30,7 @@ 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 { @@ -284,8 +286,9 @@ public void subAccountsUpdate(SubAccountUpdateRequest request, ResponseCallback< 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()); @@ -311,11 +314,12 @@ public void subOrderUpdateV2(SubOrderUpdateV2Request request, ResponseCallback commandList = new ArrayList<>(symbolList.size()); symbolList.forEach(symbol -> { - String topic = WEBSOCKET_ORDER_UPDATE_V2_TOPIC - .replace("${symbol}", 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", WebSocketConstants.ACTION_SUB); + command.put("action", accountActionEnum.getCode()); command.put("ch", topic); command.put("id", System.nanoTime()); commandList.add(command.toJSONString()); @@ -338,13 +342,15 @@ public void subTradeClearing(SubTradeClearingRequest request, ResponseCallback 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", WebSocketConstants.ACTION_SUB); + command.put("action", accountActionEnum.getCode()); command.put("ch", topic); command.put("id", System.nanoTime()); commandList.add(command.toJSONString()); diff --git a/src/main/java/com/huobi/service/huobi/HuobiMarketService.java b/src/main/java/com/huobi/service/huobi/HuobiMarketService.java index 9b68439..75308e2 100644 --- a/src/main/java/com/huobi/service/huobi/HuobiMarketService.java +++ b/src/main/java/com/huobi/service/huobi/HuobiMarketService.java @@ -54,6 +54,8 @@ public HuobiMarketService(Options options) { 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)数据 + + @Override public List getCandlestick(CandlestickRequest request) { @@ -206,7 +208,7 @@ public void subMarketDepth(SubMarketDepthRequest request, ResponseCallback commandList = new ArrayList<>(symbolList.size()); symbolList.forEach(symbol -> { @@ -469,7 +471,7 @@ public void reqMarketDepth(ReqMarketDepthRequest request, ResponseCallback headers) { Options options = this.getOptions(); String url = options.getRestHost() + path + paramsBuilder.buildUrl(); - Request executeRequest = new Request.Builder() + Request.Builder builder = new Request.Builder() .url(url) - .addHeader("Content-Type", "application/x-www-form-urlencoded") - .build(); + .addHeader("Content-Type", "application/x-www-form-urlencoded"); - String resp = ConnectionFactory.execute(executeRequest); + 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 executeRequest = new Request.Builder() + Request.Builder builder = new Request.Builder() .url(realUrl) - .addHeader("Content-Type", "application/x-www-form-urlencoded") - .build(); - String resp = ConnectionFactory.execute(executeRequest); + .addHeader("Content-Type", "application/x-www-form-urlencoded"); + + if (headers != null && !headers.isEmpty()) { + headers.forEach(builder::addHeader); + } + + String resp = ConnectionFactory.execute(builder.build()); return resp; } - public JSONObject executeGetWithSignature(String path, UrlParamsBuilder paramsBuilder) { - + 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; @@ -69,23 +89,38 @@ public JSONObject executeGetWithSignature(String path, UrlParamsBuilder paramsBu requestUrl += paramsBuilder.buildUrl(); System.out.println(requestUrl); - Request executeRequest = new Request.Builder().url(requestUrl) - .addHeader("Content-Type", "application/x-www-form-urlencoded").build(); + Request.Builder builder = new Request.Builder() + .url(requestUrl) + .addHeader("Content-Type", "application/x-www-form-urlencoded"); + + 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); } @@ -185,5 +220,4 @@ JSONObject checkAndGetResponse(String resp) { return json; } - }