mirror of
https://github.com/laoxong/nofx.git
synced 2026-06-04 01:48: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
112 lines
3.0 KiB
Go
112 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"nofx/store"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
var dbPath string
|
|
var force bool
|
|
|
|
flag.StringVar(&dbPath, "db", "./data/data.db", "数据库文件路径")
|
|
flag.BoolVar(&force, "force", 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()
|
|
|
|
db := s.DB()
|
|
|
|
// 统计当前数据
|
|
var orderCount, fillCount int
|
|
db.QueryRow(`SELECT COUNT(*) FROM trader_orders`).Scan(&orderCount)
|
|
db.QueryRow(`SELECT COUNT(*) FROM trader_fills`).Scan(&fillCount)
|
|
|
|
fmt.Printf("\n📊 当前数据统计:\n")
|
|
fmt.Printf(" trader_orders: %d 条记录\n", orderCount)
|
|
fmt.Printf(" trader_fills: %d 条记录\n", fillCount)
|
|
|
|
if orderCount == 0 && fillCount == 0 {
|
|
fmt.Println("\n✅ 表已经是空的,无需清空")
|
|
return
|
|
}
|
|
|
|
// 确认删除
|
|
if !force {
|
|
fmt.Println("\n⚠️ 警告: 此操作将删除所有订单和成交记录,无法恢复!")
|
|
fmt.Print("\n确认删除?请输入 'yes' 继续: ")
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
input, _ := reader.ReadString('\n')
|
|
input = strings.TrimSpace(input)
|
|
|
|
if input != "yes" {
|
|
fmt.Println("\n❌ 操作已取消")
|
|
return
|
|
}
|
|
}
|
|
|
|
fmt.Println("\n🗑️ 开始清空表...")
|
|
|
|
// 清空 trader_fills 表(先删除,因为有外键约束)
|
|
result, err := db.Exec(`DELETE FROM trader_fills`)
|
|
if err != nil {
|
|
log.Fatalf("❌ 清空 trader_fills 失败: %v", err)
|
|
}
|
|
fillsDeleted, _ := result.RowsAffected()
|
|
fmt.Printf(" ✅ 删除了 %d 条成交记录\n", fillsDeleted)
|
|
|
|
// 清空 trader_orders 表
|
|
result, err = db.Exec(`DELETE FROM trader_orders`)
|
|
if err != nil {
|
|
log.Fatalf("❌ 清空 trader_orders 失败: %v", err)
|
|
}
|
|
ordersDeleted, _ := result.RowsAffected()
|
|
fmt.Printf(" ✅ 删除了 %d 条订单记录\n", ordersDeleted)
|
|
|
|
// 重置自增ID(可选,让ID从1重新开始)
|
|
_, err = db.Exec(`DELETE FROM sqlite_sequence WHERE name IN ('trader_orders', 'trader_fills')`)
|
|
if err == nil {
|
|
fmt.Println(" ✅ 重置了自增ID计数器")
|
|
}
|
|
|
|
// 验证清空结果
|
|
db.QueryRow(`SELECT COUNT(*) FROM trader_orders`).Scan(&orderCount)
|
|
db.QueryRow(`SELECT COUNT(*) FROM trader_fills`).Scan(&fillCount)
|
|
|
|
fmt.Printf("\n🔍 验证结果:\n")
|
|
fmt.Printf(" trader_orders: %d 条记录\n", orderCount)
|
|
fmt.Printf(" trader_fills: %d 条记录\n", fillCount)
|
|
|
|
if orderCount == 0 && fillCount == 0 {
|
|
fmt.Println("\n✅ 表已成功清空!")
|
|
fmt.Println("\n💡 现在可以重新运行 trader 进行测试")
|
|
fmt.Println(" 新的订单将从 ID=1 开始记录")
|
|
} else {
|
|
fmt.Println("\n⚠️ 清空未完成,请检查数据库")
|
|
}
|
|
}
|