package logic import ( "fmt" "log" "os" "os/signal" "syscall" "time" "git.apinb.com/quant/collector/internal/conf" "github.com/robfig/cron/v3" ) var ( COLLECTOR_URL = "http://localhost:5000/status" COLLECTION_INTERVAL = 30 ) func Boot(cfg *conf.Config) { log.Println("=== QMT数据采集器启动 ===") log.Printf("采集地址: %s", COLLECTOR_URL) log.Printf("采集间隔: %d秒", COLLECTION_INTERVAL) if cfg == nil { log.Println("配置为空") return } log.Printf("账户: %s", cfg.Account) log.Printf("账户ID: %s", cfg.AccountID) log.Printf("主机名: %s", cfg.Hostname) // 创建采集器 coll := NewCollector(COLLECTOR_URL) // 启动时检查并补全订单簿数据 // CheckAndRepairOrderBooks(cfg.AccountID) // 创建cron调度器 c := cron.New(cron.WithSeconds()) // 构建cron表达式 (每N秒执行一次) cronSpec := fmt.Sprintf("@every %ds", COLLECTION_INTERVAL) log.Printf("定时任务表达式: %s", cronSpec) // 添加定时任务 _, err := c.AddFunc(cronSpec, func() { runCollection(coll) }) if err != nil { log.Fatalf("添加定时任务失败: %v", err) } // 启动调度器 c.Start() log.Println("定时任务已启动") // 等待退出信号 quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("收到退出信号,正在关闭...") c.Stop() log.Println("采集器已停止") } // runCollection 执行一次数据采集和存储 func runCollection(coll *Collector) { // 检查是否为开市时间 now := time.Now() if !IsTradingTime(now) { return } log.Println("开始采集...") // 采集数据并检查变化 status, dataHash, changed, err := coll.CollectAndCheck() if err != nil { log.Printf("采集失败: %v", err) return } log.Printf("数据哈希: %s", dataHash) log.Printf("数据是否变化: %v", changed) // 如果数据没有变化,只记录日志 if !changed { log.Println("数据未变化,跳过存储") return } // 数据有变化,保存到数据库 log.Println("数据已变化,开始存储到数据库...") if err := SaveData(status); err != nil { log.Printf("保存数据失败: %v", err) return } // 记录成功的日志 // if err := store.SaveCollectionLog(dataHash, ymd, true, "数据保存成功"); err != nil { // log.Printf("保存采集日志失败: %v", err) // } log.Printf("数据存储成功 - 资产账户: %s, 订单数: %d, 持仓数: %d, 行情数: %d", status.Data.Assets.AccountID, len(status.Data.Orders), len(status.Data.Positions), len(status.Data.TickData)) }