1
zj
2025-06-23 dc9bd22833255bc602dd42c7f603ecb50842ab35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package project.data.websocket.service.huobi;
 
import java.util.ArrayList;
import java.util.List;
 
import com.alibaba.fastjson.JSONObject;
 
import project.data.websocket.client.MarketClient;
import project.data.websocket.client.req.market.SubMarketDepthRequest;
import project.data.websocket.client.req.market.SubMarketTickerRequest;
import project.data.websocket.client.req.market.SubMarketTradeRequest;
import project.data.websocket.constant.Options;
import project.data.websocket.constant.enums.DepthStepEnum;
import project.data.websocket.model.market.MarketDepthEvent;
import project.data.websocket.model.market.MarketTickerEvent;
import project.data.websocket.model.market.MarketTradeEvent;
import project.data.websocket.service.huobi.connection.HuobiRestConnection;
import project.data.websocket.service.huobi.connection.HuobiWebSocketConnection;
import project.data.websocket.service.huobi.parser.market.MarketDepthEventParser;
import project.data.websocket.service.huobi.parser.market.MarketTickerEventParser;
import project.data.websocket.service.huobi.parser.market.MarketTradeEventParser;
import project.data.websocket.utils.InputChecker;
import project.data.websocket.utils.ResponseCallback;
import project.data.websocket.utils.SymbolUtils;
 
public class HuobiMarketService implements MarketClient {
 
    private Options options;
 
    private HuobiRestConnection restConnection;
 
    public HuobiMarketService(Options options) {
        this.options = options;
        restConnection = new HuobiRestConnection(options);
    }
 
    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_TICKER_TOPIC = "market.$symbol.ticker";
 
    @Override
    public void subMarketDepth(SubMarketDepthRequest request, ResponseCallback<MarketDepthEvent> callback) {
        // 检查参数
        InputChecker.checker().shouldNotNull(request.getSymbol(), "symbol");
 
        // 格式化symbol为数组
        List<String> symbolList = SymbolUtils.parseSymbols(request.getSymbol());
 
        // 检查数组
        InputChecker.checker().checkSymbolList(symbolList);
 
        String step = request.getStep() == null ? DepthStepEnum.STEP0.getStep() : request.getStep().getStep();
        List<String> commandList = new ArrayList<>(symbolList.size());
        symbolList.forEach(symbol -> {
 
            String topic = WEBSOCKET_MARKET_DEPTH_TOPIC.replace("$symbol", symbol).replace("$type", step);
 
            JSONObject command = new JSONObject();
            command.put("sub", topic);
            command.put("id", System.nanoTime());
            commandList.add(command.toJSONString());
        });
 
        HuobiWebSocketConnection.createMarketConnection(options, commandList, new MarketDepthEventParser(), callback,
                false);
 
    }
 
    @Override
    public void subMarketTrade(SubMarketTradeRequest request, ResponseCallback<MarketTradeEvent> callback) {
 
        // 检查参数
        InputChecker.checker().shouldNotNull(request.getSymbol(), "symbol");
 
        // 格式化symbol为数组
        List<String> symbolList = SymbolUtils.parseSymbols(request.getSymbol());
 
        // 检查数组
        InputChecker.checker().checkSymbolList(symbolList);
 
        List<String> commandList = new ArrayList<>(symbolList.size());
        symbolList.forEach(symbol -> {
 
            String topic = WEBSOCKET_MARKET_TRADE_TOPIC.replace("$symbol", symbol);
 
            JSONObject command = new JSONObject();
            command.put("sub", topic);
            command.put("id", System.nanoTime());
            commandList.add(command.toJSONString());
        });
 
        HuobiWebSocketConnection.createMarketConnection(options, commandList, new MarketTradeEventParser(), callback,
                false);
    }
    
    @Override
    public void subMarketTicker(SubMarketTickerRequest request, ResponseCallback<MarketTickerEvent> callback) {
        // 检查参数
        InputChecker.checker().shouldNotNull(request.getSymbol(), "symbol");
 
        // 格式化symbol为数组
        List<String> symbolList = SymbolUtils.parseSymbols(request.getSymbol());
 
        // 检查数组
        InputChecker.checker().checkSymbolList(symbolList);
 
        List<String> commandList = new ArrayList<>(symbolList.size());
        symbolList.forEach(symbol -> {
 
            String topic = WEBSOCKET_MARKET_TICKER_TOPIC.replace("$symbol", symbol);
 
            JSONObject command = new JSONObject();
            command.put("sub", topic);
            command.put("id", System.nanoTime());
            commandList.add(command.toJSONString());
        });
 
        HuobiWebSocketConnection.createMarketConnection(options, commandList, new MarketTickerEventParser(), callback,
                false);
    }
 
    public Options getOptions() {
        return options;
    }
 
    public void setOptions(Options options) {
        this.options = options;
    }
 
    public HuobiRestConnection getRestConnection() {
        return restConnection;
    }
 
    public void setRestConnection(HuobiRestConnection restConnection) {
        this.restConnection = restConnection;
    }
 
}