mirror of
https://github.com/laoxong/nofx.git
synced 2026-06-04 09:58:22 +08:00
1744e7f38e
- Chart improvements: professional styling, popular symbols quick selection, simplified B/S legend - Data source migration: use CoinAnk API exclusively for all kline data - Code cleanup: remove Binance WebSocket cache and related code (websocket_client.go, combined_streams.go, monitor.go) - Log optimization: reduce hook spam, suppress 404 errors, increase P&L diff threshold - Lighter integration: add order sync functionality, fix market order precision - Remove ticker merge logic for simplicity
99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"nofx/store"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
func main() {
|
|
var dbPath string
|
|
var dryRun bool
|
|
|
|
flag.StringVar(&dbPath, "db", "./data/data.db", "数据库文件路径")
|
|
flag.BoolVar(&dryRun, "dry-run", false, "只检查不删除(预览模式)")
|
|
flag.Parse()
|
|
|
|
// 确保数据库文件存在
|
|
absPath, err := filepath.Abs(dbPath)
|
|
if err != nil {
|
|
log.Fatalf("❌ 无效的数据库路径: %v", err)
|
|
}
|
|
|
|
if _, err := os.Stat(absPath); os.IsNotExist(err) {
|
|
log.Fatalf("❌ 数据库文件不存在: %s", absPath)
|
|
}
|
|
|
|
fmt.Printf("📂 数据库路径: %s\n", absPath)
|
|
|
|
// 打开数据库
|
|
s, err := store.New(absPath)
|
|
if err != nil {
|
|
log.Fatalf("❌ 无法打开数据库: %v", err)
|
|
}
|
|
defer s.Close()
|
|
|
|
orderStore := s.Order()
|
|
|
|
// 1. 检查重复订单数量
|
|
fmt.Println("\n🔍 检查重复数据...")
|
|
dupOrders, err := orderStore.GetDuplicateOrdersCount()
|
|
if err != nil {
|
|
log.Fatalf("❌ 检查重复订单失败: %v", err)
|
|
}
|
|
fmt.Printf(" 📋 重复订单: %d 条\n", dupOrders)
|
|
|
|
dupFills, err := orderStore.GetDuplicateFillsCount()
|
|
if err != nil {
|
|
log.Fatalf("❌ 检查重复成交失败: %v", err)
|
|
}
|
|
fmt.Printf(" 📊 重复成交: %d 条\n", dupFills)
|
|
|
|
if dupOrders == 0 && dupFills == 0 {
|
|
fmt.Println("\n✅ 数据库没有重复记录,无需清理")
|
|
return
|
|
}
|
|
|
|
if dryRun {
|
|
fmt.Println("\n⚠️ 预览模式(--dry-run),不会删除数据")
|
|
fmt.Println(" 运行 'go run scripts/cleanup_duplicates.go' 来执行实际清理")
|
|
return
|
|
}
|
|
|
|
// 2. 清理重复订单
|
|
if dupOrders > 0 {
|
|
fmt.Println("\n🧹 清理重复订单...")
|
|
deleted, err := orderStore.CleanupDuplicateOrders()
|
|
if err != nil {
|
|
log.Fatalf("❌ 清理失败: %v", err)
|
|
}
|
|
fmt.Printf(" ✅ 删除了 %d 条重复订单\n", deleted)
|
|
}
|
|
|
|
// 3. 清理重复成交
|
|
if dupFills > 0 {
|
|
fmt.Println("\n🧹 清理重复成交...")
|
|
deleted, err := orderStore.CleanupDuplicateFills()
|
|
if err != nil {
|
|
log.Fatalf("❌ 清理失败: %v", err)
|
|
}
|
|
fmt.Printf(" ✅ 删除了 %d 条重复成交\n", deleted)
|
|
}
|
|
|
|
// 4. 验证清理结果
|
|
fmt.Println("\n🔍 验证清理结果...")
|
|
dupOrdersAfter, _ := orderStore.GetDuplicateOrdersCount()
|
|
dupFillsAfter, _ := orderStore.GetDuplicateFillsCount()
|
|
fmt.Printf(" 📋 剩余重复订单: %d 条\n", dupOrdersAfter)
|
|
fmt.Printf(" 📊 剩余重复成交: %d 条\n", dupFillsAfter)
|
|
|
|
if dupOrdersAfter == 0 && dupFillsAfter == 0 {
|
|
fmt.Println("\n✅ 清理完成!数据库已去重")
|
|
} else {
|
|
fmt.Println("\n⚠️ 仍有重复数据,可能需要手动检查")
|
|
}
|
|
}
|