| 文件 | 类型 | 说明 |
|---|---|---|
| GateWebSocketClientManager | @Component |
Spring 启动入口,组装组件 + 生命周期 |
| GateConfig | 配置 | Builder 模式:API 密钥、合约、策略参数、环境切换 |
| GateKlineWebSocketClient | WS 连接管理 | 连接/心跳/重连/消息路由 |
| GateGridTradeService | 交易服务 | 网格策略状态机 + 盈亏管理 + 补仓重试 |
| GateTradeExecutor | 异步执行器 | 独立线程池执行 REST 下单,成功/失败双回调 |
| GateWebSocketClientMain | main 入口 | 独立测试启动 |
| Example.java | 示例 | Gate SDK 用法参考 |
| 文件 | 类型 | 说明 |
|---|---|---|
wsHandler/GateChannelHandler.java |
接口 | subscribe / unsubscribe / handleMessage / getChannelName |
wsHandler/AbstractPrivateChannelHandler.java |
抽象类 | 私有频道基类:HMAC-SHA512 签名 + 认证请求 |
wsHandler/handler/CandlestickChannelHandler.java |
公开频道 | K 线解析 → onKline() |
wsHandler/handler/PositionsChannelHandler.java |
私有频道 | 仓位推送 → onPositionUpdate()(传 Position.ModeEnum) |
wsHandler/handler/PositionClosesChannelHandler.java |
私有频道 | 平仓推送 → onPositionClose() |
┌──────────────────────────────────────────────────────────────────┐
│ GateWebSocketClientManager │
│ (Spring @Component) │
│ │
│ GateConfig.builder() → GateGridTradeService + WS Client │
│ │ │ │ │
│ │ REST BasePath │ GateTradeExecutor │ WS URL │
│ ▼ ▼ ▼ │
│ Gate API (REST) 独立线程池 (async) Gate WebSocket │
│ onSuccess/onFailure双回调 ┌──────────────┐ │
│ │Candlestick H │ │
│ │Positions H │ │
│ │PosCloses H │ │
│ └──────────────┘ │
└──────────────────────────────────────────────────────────────────┘
WebSocket → GateKlineWebSocketClient.handleMessage → 路由 dispatch
│
├─ futures.pong → cancelPongTimeout
├─ subscribe / unsubscribe / error → log
│
├─ futures.candlesticks (公开)
│ └─ CandlestickChannelHandler
│ └─ gridTradeService.onKline(closePx)
│ ├─ state=WAITING_KLINE → 异步双开 + 止盈单
│ └─ 后续 → 仅缓存 lastKlinePrice
│
├─ futures.positions (私有, HMAC-SHA512)
│ └─ PositionsChannelHandler
│ ├─ 解析 mode → Position.ModeEnum(DUAL_LONG / DUAL_SHORT)
│ └─ gridTradeService.onPositionUpdate(mode, size, entryPrice)
│ ├─ DUAL_LONG, size=0 && longActive → tryReopenLong()
│ └─ DUAL_SHORT, size=0 && shortActive → tryReopenShort()
│
├─ futures.position_closes (私有, HMAC-SHA512)
│ └─ PositionClosesChannelHandler
│ └─ gridTradeService.onPositionClose(side, pnl)
│ └─ cumulativePnl += pnl → checkStopConditions()
│
└─ 所有下单操作
└─ GateTradeExecutor (单线程 + 64队列 + CallerRunsPolicy)
├─ openLong/Short(qty, onSuccess, onFailure)
│ └─ 失败回调 → tryReopenXxx() 递归重试
└─ placeTakeProfit → 条件单 (REST)
GateChannelHandler (接口)
├── CandlestickChannelHandler (公开频道)
└── AbstractPrivateChannelHandler (私有频道基类: HMAC-SHA512)
├── PositionsChannelHandler (解析 mode → Position.ModeEnum)
└── PositionClosesChannelHandler
Position.ModeEnum.fromValue() 转为枚举,避免调用方用字符串匹配WAITING_KLINE ──onKline──→ OPENING ──双开成功──→ ACTIVE
│ │ │
│ 双开失败 ├─ size=0 → REOPENING_L/S
│ │ ├─ 补仓成功 → ACTIVE
│ │ └─ 补仓失败 → 递归重试
│ │ └─ 超 reopenMaxRetries → STOPPED
│ └─ cumPnl≥TP 或 ≤-maxLoss → STOPPED
▼
STOPPED ←─────────────────────────────────────────┘
| 状态 | 含义 |
|---|---|
WAITING_KLINE |
等待首次K线价格 |
OPENING |
正在异步双开(开多+开空已提交到GateTradeExecutor) |
ACTIVE |
网格运行中,等待止盈触发 |
REOPENING_LONG |
正在补开多头 |
REOPENING_SHORT |
正在补开空头 |
STOPPED |
停止(盈利达标 / 亏损超限 / 补仓重试耗尽 / 异常退出) |
Spring @PostConstruct
→ GateConfig.builder()...build()
→ GateGridTradeService(config)
→ init():
1. 查用户ID
2. 查账户 → 如需要切持仓模式
3. 清除旧止盈止损条件单
4. 查当前合约所有仓位 → 逐个市价平仓(reduce_only, IOC)
- 单向持仓: size=相反数平仓
- 双向持仓: size=0, close=false, autoSize=LONG/SHORT
5. 设杠杆
→ GateKlineWebSocketClient(config.getWsUrl())
→ addChannelHandler x3 → init() → connect()
→ onOpen: handlers依次subscribe → sendPing
→ gridTradeService.startGrid() → state=WAITING_KLINE
K线推送 → onKline(closePrice) → state=OPENING
→ GateTradeExecutor.openLong(qty, onSuccess, null)
→ 市价开多 → onSuccess: longActive=true, placeTakeProfit(多头TP)
→ GateTradeExecutor.openShort(-qty, onSuccess, null)
→ 市价开空 → onSuccess: shortActive=true, placeTakeProfit(空头TP)
→ 双开均完成 → state=ACTIVE
仓位推送: mode=DUAL_LONG, size=0 → longActive且无仓位 → tryReopenLong()
┌─ longReopenFails++ → 超 reopenMaxRetries → STOPPED
└─ GateTradeExecutor.openLong(qty,
onSuccess: failCount=0, ACTIVE, 下新TP单,
onFailure: → 递归调用 tryReopenLong() 再试
)
仓位推送: mode=DUAL_SHORT, size=0 → 同理 tryReopenShort()
止盈由 Gate 服务端条件单自动执行。只补被平掉的单方向,另一方不受影响。
补仓失败通过 onFailure 回调递归重试,连续失败超过reopenMaxRetries(默认3次)则停止策略。
平仓推送: pnl=+0.6 → cumulativePnl=0.6 ≥ overallTp → state=STOPPED
平仓推送: pnl=-8.0 → cumulativePnl=-8.0 ≤ -maxLoss → state=STOPPED
补仓连续失败 4 次 → 超过 reopenMaxRetries=3 → state=STOPPED
角色: 统一配置中心。Builder模式管理所有参数,提供 REST/WS URL 环境自动切换。
核心方法:
- getRestBasePath(): isProduction ? 生产网 : 测试网
- getWsUrl(): 同上
配置项(含默认值):
| 参数 | 默认值 | 说明 |
|---|---|---|
| contract | BTC_USDT | 合约 |
| leverage | 10 | 倍数 |
| marginMode | cross | 全仓 |
| positionMode | dual | 双向持仓 |
| gridRate | 0.0035 | 网格间距 0.35% |
| overallTp | 0.5 USDT | 整体止盈 |
| maxLoss | 7.5 USDT | 最大亏损 |
| quantity | 1 | 下单张数 |
| reopenMaxRetries | 3 | 补仓最大重试次数 |
角色: 独立线程池执行 REST API 下单。采用成功/失败双回调模式支持补仓重试。
线程模型:
- ThreadPoolExecutor(1, 1, 60s, LinkedBlockingQueue(64), CallerRunsPolicy)
- 单线程保序 + 有界队列防堆积 + CallerRuns背压
回调设计:
- 每个下单方法接受 onSuccess 和 onFailure 两个 Runnable
- REST 调用成功 → 执行 onSuccess(更新状态、下止盈单、重置失败计数)
- REST 调用失败 → 执行 onFailure(递归重试入口)
| 方法 | 说明 |
|---|---|
openLong(qty, onSuccess, onFailure) |
异步 IOC 市价开多,双回调 |
openShort(qty, onSuccess, onFailure) |
异步 IOC 市价开空,双回调 |
placeTakeProfit(trigger, rule, type, auto) |
异步条件单。已存在则清除旧单重试 |
cancelAllPriceTriggeredOrders() |
清除所有条件单 |
shutdown() |
等待10秒,超时强制关闭 |
角色: 策略核心,使用 Gate SDK 管理状态和执行下单。
状态: StrategyState enum + longActive/shortActive boolean
关键常量(替代字面字符串):java private static final String AUTO_SIZE_LONG = "close_long"; private static final String AUTO_SIZE_SHORT = "close_short"; private static final String ORDER_TYPE_CLOSE_LONG = "close-long-position"; private static final String ORDER_TYPE_CLOSE_SHORT = "close-short-position";
回调方法:
- onKline(closePrice): 缓存价格,WAITING_KLINE状态下首次触发双开
- onPositionUpdate(Position.ModeEnum mode, size, entryPrice): == DUAL_LONG/DUAL_SHORT 枚举比较,size=0且方向活跃 → 补仓重试
- onPositionClose(side, pnl): 累加盈亏,检查停止条件
补仓重试逻辑: tryReopenLong(): 1. longReopenFails++(失败计数递增) 2. 超过 reopenMaxRetries → STOPPED 3. openLong(qty, onSuccess → failCount=0, ACTIVE, 下新TP单, onFailure → 递归 tryReopenLong() 重试 )
止盈计算:
| 方向 | 公式 | order_type | auto_size |
|---|---|---|---|
| 多头 TP | entry × (1+gridRate) | close-long-position |
close_long |
| 空头 TP | entry × (1-gridRate) | close-short-position |
close_short |
REST API 调用:
| 操作 | API | 方法 | 说明 |
|---|---|---|---|
| 获取用户ID | GET /account/detail |
AccountApi.getAccountDetail() |
|
| 切持仓模式 | POST /futures/usdt/set_position_mode |
FuturesApi.setPositionMode() |
|
| 查仓位 | GET /futures/usdt/positions |
FuturesApi.listPositions() |
遍历所有仓位,按合约过滤 |
| 市价平仓 | POST /futures/usdt/orders |
FuturesApi.createFuturesOrder() |
reduce_only, IOC。双向: size=0+close=false+autoSize |
| 设杠杆 | POST /futures/usdt/positions/{contract}/leverage |
FuturesApi.updateContractPositionLeverageCall() |
|
| 查账户 | GET /futures/usdt/accounts |
FuturesApi.listFuturesAccounts() |
|
| 清除条件单 | DELETE /futures/usdt/price_orders |
FuturesApi.cancelPriceTriggeredOrderList() |
|
| 市价单 | POST /futures/usdt/orders |
FuturesApi.createFuturesOrder() |
price=0, tif=IOC |
| 条件单 | POST /futures/usdt/price_orders |
FuturesApi.createPriceTriggeredOrder() |
strategy=0, price_type=0, expiration=0 |
初始化顺序 (init()): 1. 获取用户 ID 2. 查账户 → 如需要切持仓模式 3. 清除旧的止盈止损条件单 4. 查当前合约所有仓位 → 逐个市价平仓 - 单向持仓(single): size=相反数, reduce_only=true - 双向持仓(dual): size=0, close=false, autoSize=LONG/SHORT, reduce_only=true 5. 设杠杆 6. 打印账户余额
独立 main() 方法入口,通过 Spring XML 上下文启动,运行后手动关闭。
Gate SDK 使用示例,展示 FuturesApi 的基本用法。仅作参考。