mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-06-06 05:51:19 +08:00
fix(stats): fixed the PNL calculation (#963)
This commit is contained in:
@@ -1089,3 +1089,15 @@ func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, aiMode
|
||||
log.Printf("✓ Trader '%s' (%s + %s) 已为用户加载到内存", traderCfg.Name, aiModelCfg.Provider, exchangeCfg.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemoveTrader 从内存中移除指定的trader(不影响数据库)
|
||||
// 用于更新trader配置时强制重新加载
|
||||
func (tm *TraderManager) RemoveTrader(traderID string) {
|
||||
tm.mu.Lock()
|
||||
defer tm.mu.Unlock()
|
||||
|
||||
if _, exists := tm.traders[traderID]; exists {
|
||||
delete(tm.traders, traderID)
|
||||
log.Printf("✓ Trader %s 已从内存中移除", traderID)
|
||||
}
|
||||
}
|
||||
|
||||
87
manager/trader_manager_test.go
Normal file
87
manager/trader_manager_test.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package manager
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
// TestRemoveTrader 测试从内存中移除trader
|
||||
func TestRemoveTrader(t *testing.T) {
|
||||
tm := NewTraderManager()
|
||||
|
||||
// 创建一个模拟的 trader 并添加到 map
|
||||
traderID := "test-trader-123"
|
||||
tm.traders[traderID] = nil // 使用 nil 作为占位符,实际测试中只需验证删除逻辑
|
||||
|
||||
// 验证 trader 存在
|
||||
if _, exists := tm.traders[traderID]; !exists {
|
||||
t.Fatal("trader 应该存在于 map 中")
|
||||
}
|
||||
|
||||
// 调用 RemoveTrader
|
||||
tm.RemoveTrader(traderID)
|
||||
|
||||
// 验证 trader 已被移除
|
||||
if _, exists := tm.traders[traderID]; exists {
|
||||
t.Error("trader 应该已从 map 中移除")
|
||||
}
|
||||
}
|
||||
|
||||
// TestRemoveTrader_NonExistent 测试移除不存在的trader不会报错
|
||||
func TestRemoveTrader_NonExistent(t *testing.T) {
|
||||
tm := NewTraderManager()
|
||||
|
||||
// 尝试移除不存在的 trader,不应该 panic
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
t.Errorf("移除不存在的 trader 不应该 panic: %v", r)
|
||||
}
|
||||
}()
|
||||
|
||||
tm.RemoveTrader("non-existent-trader")
|
||||
}
|
||||
|
||||
// TestRemoveTrader_Concurrent 测试并发移除trader的安全性
|
||||
func TestRemoveTrader_Concurrent(t *testing.T) {
|
||||
tm := NewTraderManager()
|
||||
traderID := "test-trader-concurrent"
|
||||
|
||||
// 添加 trader
|
||||
tm.traders[traderID] = nil
|
||||
|
||||
// 并发调用 RemoveTrader
|
||||
done := make(chan bool, 10)
|
||||
for i := 0; i < 10; i++ {
|
||||
go func() {
|
||||
tm.RemoveTrader(traderID)
|
||||
done <- true
|
||||
}()
|
||||
}
|
||||
|
||||
// 等待所有 goroutine 完成
|
||||
for i := 0; i < 10; i++ {
|
||||
<-done
|
||||
}
|
||||
|
||||
// 验证 trader 已被移除
|
||||
if _, exists := tm.traders[traderID]; exists {
|
||||
t.Error("trader 应该已从 map 中移除")
|
||||
}
|
||||
}
|
||||
|
||||
// TestGetTrader_AfterRemove 测试移除后获取trader返回错误
|
||||
func TestGetTrader_AfterRemove(t *testing.T) {
|
||||
tm := NewTraderManager()
|
||||
traderID := "test-trader-get"
|
||||
|
||||
// 添加 trader
|
||||
tm.traders[traderID] = nil
|
||||
|
||||
// 移除 trader
|
||||
tm.RemoveTrader(traderID)
|
||||
|
||||
// 尝试获取已移除的 trader
|
||||
_, err := tm.GetTrader(traderID)
|
||||
if err == nil {
|
||||
t.Error("获取已移除的 trader 应该返回错误")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user