From 616c3508352f236b84ea9a72e281f3b61406fdbc Mon Sep 17 00:00:00 2001 From: sue <177699783@qq.com> Date: Tue, 4 Nov 2025 18:42:21 +0800 Subject: [PATCH] =?UTF-8?q?fix(trader):=20add=20missing=20HyperliquidTestn?= =?UTF-8?q?et=20configuration=20in=20loadSingleTrader=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BA=86=20loadSingleTrader=20=E5=87=BD=E6=95=B0=E4=B8=AD?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E7=9A=84=20HyperliquidTestnet=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B9=EF=BC=8C=20=E7=A1=AE=E4=BF=9D=20Hyperliquid?= =?UTF-8?q?=20=E4=BA=A4=E6=98=93=E6=89=80=E7=9A=84=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=BD=91=E9=85=8D=E7=BD=AE=E8=83=BD=E5=A4=9F=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E4=BC=A0=E9=80=92=E5=88=B0=20trader=20=E5=AE=9E=E4=BE=8B?= =?UTF-8?q?=E3=80=82=20Changes:=20-=20=E5=9C=A8=20loadSingleTrader=20?= =?UTF-8?q?=E4=B8=AD=E6=B7=BB=E5=8A=A0=20HyperliquidTestnet=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E9=85=8D=E7=BD=AE=20-=20=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BC=98=E5=8C=96=EF=BC=88=E7=A9=BA=E6=A0=BC=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=EF=BC=89=20Co-Authored-By:=20tinkle-community=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manager/trader_manager.go | 41 ++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/manager/trader_manager.go b/manager/trader_manager.go index 4ebcf20b..0fce9249 100644 --- a/manager/trader_manager.go +++ b/manager/trader_manager.go @@ -23,9 +23,9 @@ type CompetitionCache struct { // TraderManager 管理多个trader实例 type TraderManager struct { - traders map[string]*trader.AutoTrader // key: trader ID + traders map[string]*trader.AutoTrader // key: trader ID competitionCache *CompetitionCache - mu sync.RWMutex + mu sync.RWMutex } // NewTraderManager 创建trader管理器 @@ -506,19 +506,19 @@ func (tm *TraderManager) GetCompetitionData() (map[string]interface{}, error) { tm.competitionCache.mu.RUnlock() tm.mu.RLock() - + // 获取所有交易员列表 allTraders := make([]*trader.AutoTrader, 0, len(tm.traders)) for _, t := range tm.traders { allTraders = append(allTraders, t) } tm.mu.RUnlock() - + log.Printf("🔄 重新获取竞赛数据,交易员数量: %d", len(allTraders)) - + // 并发获取交易员数据 traders := tm.getConcurrentTraderData(allTraders) - + // 按收益率排序(降序) sort.Slice(traders, func(i, j int) bool { pnlPctI, okI := traders[i]["total_pnl_pct"].(float64) @@ -531,14 +531,14 @@ func (tm *TraderManager) GetCompetitionData() (map[string]interface{}, error) { } return pnlPctI > pnlPctJ }) - + // 限制返回前50名 totalCount := len(traders) limit := 50 if len(traders) > limit { traders = traders[:limit] } - + comparison := make(map[string]interface{}) comparison["traders"] = traders comparison["count"] = len(traders) @@ -559,21 +559,21 @@ func (tm *TraderManager) getConcurrentTraderData(traders []*trader.AutoTrader) [ index int data map[string]interface{} } - + // 创建结果通道 resultChan := make(chan traderResult, len(traders)) - + // 并发获取每个交易员的数据 for i, t := range traders { go func(index int, trader *trader.AutoTrader) { // 设置单个交易员的超时时间为3秒 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() - + // 使用通道来实现超时控制 accountChan := make(chan map[string]interface{}, 1) errorChan := make(chan error, 1) - + go func() { account, err := trader.GetAccountInfo() if err != nil { @@ -582,10 +582,10 @@ func (tm *TraderManager) getConcurrentTraderData(traders []*trader.AutoTrader) [ accountChan <- account } }() - + status := trader.GetStatus() var traderData map[string]interface{} - + select { case account := <-accountChan: // 成功获取账户信息 @@ -634,18 +634,18 @@ func (tm *TraderManager) getConcurrentTraderData(traders []*trader.AutoTrader) [ "error": "获取超时", } } - + resultChan <- traderResult{index: index, data: traderData} }(i, t) } - + // 收集所有结果 results := make([]map[string]interface{}, len(traders)) for i := 0; i < len(traders); i++ { result := <-resultChan results[result.index] = result.data } - + return results } @@ -656,20 +656,20 @@ func (tm *TraderManager) GetTopTradersData() (map[string]interface{}, error) { if err != nil { return nil, err } - + // 从竞赛数据中提取前5名 allTraders, ok := competitionData["traders"].([]map[string]interface{}) if !ok { return nil, fmt.Errorf("竞赛数据格式错误") } - + // 限制返回前5名 limit := 5 topTraders := allTraders if len(allTraders) > limit { topTraders = allTraders[:limit] } - + result := map[string]interface{}{ "traders": topTraders, "count": len(topTraders), @@ -889,6 +889,7 @@ func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, aiMode DefaultCoins: defaultCoins, TradingCoins: tradingCoins, SystemPromptTemplate: traderCfg.SystemPromptTemplate, // 系统提示词模板 + HyperliquidTestnet: exchangeCfg.Testnet, // Hyperliquid测试网 } // 根据交易所类型设置API密钥