From bee4e5dd415e9917f9bc949cf39a98d26ee9bf60 Mon Sep 17 00:00:00 2001 From: tinkle-community Date: Sun, 7 Dec 2025 17:13:17 +0800 Subject: [PATCH] fix: add OKX support to order/position sync and fix WebSocket concurrent write - Add OKX trader support in order_sync.go and position_sync.go - Change exchange.Type to exchange.ID for correct exchange identification - Add writeMu mutex to prevent concurrent WebSocket writes in combined_streams.go and websocket_client.go --- trader/order_sync.go | 8 ++++++-- trader/position_sync.go | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/trader/order_sync.go b/trader/order_sync.go index 2562d0ed..159983dd 100644 --- a/trader/order_sync.go +++ b/trader/order_sync.go @@ -270,13 +270,17 @@ func (m *OrderSyncManager) getTraderConfig(traderID string) (*store.TraderFullCo func (m *OrderSyncManager) createTrader(config *store.TraderFullConfig) (Trader, error) { exchange := config.Exchange - switch exchange.Type { + // 使用 exchange.ID 判断具体的交易所,而不是 exchange.Type (cex/dex) + switch exchange.ID { case "binance": return NewFuturesTrader(exchange.APIKey, exchange.SecretKey, config.Trader.UserID), nil case "bybit": return NewBybitTrader(exchange.APIKey, exchange.SecretKey), nil + case "okx": + return NewOKXTrader(exchange.APIKey, exchange.SecretKey, exchange.Passphrase), nil + case "hyperliquid": return NewHyperliquidTrader(exchange.SecretKey, exchange.HyperliquidWalletAddr, exchange.Testnet) @@ -295,7 +299,7 @@ func (m *OrderSyncManager) createTrader(config *store.TraderFullConfig) (Trader, return NewLighterTrader(exchange.LighterPrivateKey, exchange.LighterWalletAddr, exchange.Testnet) default: - return nil, fmt.Errorf("不支持的交易所类型: %s", exchange.Type) + return nil, fmt.Errorf("不支持的交易所: %s", exchange.ID) } } diff --git a/trader/position_sync.go b/trader/position_sync.go index a7d270d5..05b586e0 100644 --- a/trader/position_sync.go +++ b/trader/position_sync.go @@ -268,6 +268,9 @@ func (m *PositionSyncManager) createTrader(config *store.TraderFullConfig) (Trad case "bybit": return NewBybitTrader(exchange.APIKey, exchange.SecretKey), nil + case "okx": + return NewOKXTrader(exchange.APIKey, exchange.SecretKey, exchange.Passphrase), nil + case "hyperliquid": return NewHyperliquidTrader(exchange.SecretKey, exchange.HyperliquidWalletAddr, exchange.Testnet)