Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.DS_Store
.idea/
logs/
target
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.huobi.sdk</groupId>
<artifactId>huobi-client</artifactId>
<version>2.0.3-SNAPSHOT</version>
<version>2.0.5-RELEASE</version>

<properties>
<java.version>1.8</java.version>
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -16,6 +17,8 @@
@ToString
public class SubAccountUpdateRequest {

private AccountUpdateModeEnum accountUpdateMode;
private AccountActionEnum accountAction;

private AccountUpdateModeEnum accountUpdateMode;

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ public class ReqMarketDepthRequest {

private String symbol;

private DepthStepEnum step;
private String step;

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@
public class SubMarketDepthRequest {
private String symbol;

private DepthStepEnum step;
private String step;

}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -13,6 +14,7 @@
@ToString
public class SubOrderUpdateV2Request {

private String symbols;
private AccountActionEnum accountAction;

private String symbols;
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -13,8 +14,10 @@
@ToString
public class SubTradeClearingRequest {

private String symbols;
private AccountActionEnum accountAction;

private int[] modes;
private String symbols;

private int[] modes;

}
18 changes: 18 additions & 0 deletions src/main/java/com/huobi/constant/enums/AccountActionEnum.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
16 changes: 11 additions & 5 deletions src/main/java/com/huobi/service/huobi/HuobiAccountService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -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 {

Expand Down Expand Up @@ -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());
Expand All @@ -311,11 +314,12 @@ public void subOrderUpdateV2(SubOrderUpdateV2Request request, ResponseCallback<O
List<String> 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());
Expand All @@ -338,13 +342,15 @@ public void subTradeClearing(SubTradeClearingRequest request, ResponseCallback<T
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<String> 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());
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/com/huobi/service/huobi/HuobiMarketService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Candlestick> getCandlestick(CandlestickRequest request) {

Expand Down Expand Up @@ -206,7 +208,7 @@ public void subMarketDepth(SubMarketDepthRequest request, ResponseCallback<Marke
InputChecker.checker()
.checkSymbolList(symbolList);

String step = request.getStep() == null ? DepthStepEnum.STEP0.getStep() : request.getStep().getStep();
String step = request.getStep() == null ? DepthStepEnum.STEP0.getStep() : request.getStep();
List<String> commandList = new ArrayList<>(symbolList.size());
symbolList.forEach(symbol -> {

Expand Down Expand Up @@ -469,7 +471,7 @@ public void reqMarketDepth(ReqMarketDepthRequest request, ResponseCallback<Marke

String topic = WEBSOCKET_MARKET_DEPTH_TOPIC
.replace("$symbol", request.getSymbol())
.replace("$type", request.getStep().getStep());
.replace("$type", request.getStep());

JSONObject command = new JSONObject();
command.put(WebSocketConstants.OP_REQ, topic);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

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;
Expand Down Expand Up @@ -35,57 +38,89 @@ public HuobiRestConnection(Options options) {
}

public JSONObject executeGet(String path, UrlParamsBuilder paramsBuilder) {
return executeGet(path, paramsBuilder, null);
}

public JSONObject executeGet(String path, UrlParamsBuilder paramsBuilder, Map<String, String> 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<String, String> 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<String, String> 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 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<String, String> 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);
}

Expand Down Expand Up @@ -185,5 +220,4 @@ JSONObject checkAndGetResponse(String resp) {

return json;
}

}