Administrator
5 days ago a10ffc2318f2b69fe34eca82829493f86ed8400e
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
package com.xcong.excoin.modules.okxApi.wsHandler;
 
import com.alibaba.fastjson.JSONObject;
import org.java_websocket.client.WebSocketClient;
 
/**
 * OKX WebSocket 频道处理器接口。
 *
 * <h3>定位</h3>
 * 每个 OKX 频道对应一个实现类。新增频道只需实现此接口,
 * 然后通过 {@code OkxKlineWebSocketClient.addPublicHandler()} 或
 * {@code addPrivateHandler()} 注册即可。
 *
 * <h3>与 Gate 版本的区别</h3>
 * OKX 的公开频道和私有频道使用不同的 WebSocket 端点(public/private),
 * 订阅格式为 {@code {"op":"subscribe","args":[{"channel":"candle1m","instId":"ETH-USDT-SWAP"}]}},
 * 与 Gate 的 {@code event/payload} 格式不同。
 *
 * <h3>实现类</h3>
 * <ul>
 *   <li>{@code CandlestickOkxChannelHandler} — 公开频道,K线数据</li>
 *   <li>{@code AbstractOkxPrivateChannelHandler} — 私有频道抽象基类(separate WS + login auth)</li>
 *   <li>{@code PositionsOkxChannelHandler} — 私有频道,仓位更新</li>
 *   <li>{@code OrderAlgoOkxChannelHandler} — 私有频道,条件订单(algo)状态推送</li>
 * </ul>
 *
 * <h3>OKX 订阅确认格式</h3>
 * {@code {"event":"subscribe","arg":{"channel":"candle1m"}}} 表示订阅成功。
 *
 * <h3>OKX 数据推送格式</h3>
 * {@code {"arg":{"channel":"positions","instType":"SWAP"},"data":[...]}}。
 *
 * @author Administrator
 */
public interface OkxChannelHandler {
 
    /**
     * 频道名称,如 {@code "candle1m"}、{@code "positions"}、{@code "orders-algo"}。
     *
     * @return OKX 频道标识字符串
     */
    String getChannelName();
 
    /**
     * 交易对标识,如 {@code "ETH-USDT-SWAP"}。
     * OKX 订阅需要 instId 参数来指定订阅的交易对。
     *
     * @return OKX 格式的交易对标识
     */
    String getInstId();
 
    /**
     * 发送订阅请求到指定的 WebSocket 连接。
     *
     * <h3>公开频道格式</h3>
     * <pre>
     * {"op":"subscribe","args":[{"channel":"candle1m","instId":"ETH-USDT-SWAP"}]}
     * </pre>
     *
     * <h3>私有频道格式</h3>
     * <pre>
     * {"op":"subscribe","args":[{"channel":"positions","instType":"SWAP"}]}
     * </pre>
     *
     * @param ws 目标 WebSocket 客户端(公开或私有端点)
     */
    void subscribe(WebSocketClient ws);
 
    /**
     * 发送取消订阅请求到指定的 WebSocket 连接。
     *
     * @param ws 目标 WebSocket 客户端
     */
    void unsubscribe(WebSocketClient ws);
 
    /**
     * 处理频道推送消息。
     *
     * <h3>路由规则</h3>
     * 如果消息的 {@code arg.channel} 匹配当前处理器的频道名,
     * 则提取 {@code data} 数组并处理业务逻辑,返回 {@code true};
     * 否则返回 {@code false}(让路由器继续遍历其他 handler)。
     *
     * @param response WebSocket 推送的完整 JSON
     * @return true 表示已处理(循环停止),false 表示频道不匹配(继续遍历下一个 handler)
     */
    boolean handleMessage(JSONObject response);
 
    /**
     * 是否已收到订阅成功确认(即收到 {@code event:"subscribe"} 响应)。
     *
     * @return true 表示订阅已确认
     */
    boolean isSubscribed();
 
    /**
     * 标记订阅已确认/未确认。
     *
     * @param subscribed true=已确认,false=未确认
     */
    void setSubscribed(boolean subscribed);
}