package logic import ( "context" "fmt" "log" "slices" "strings" "time" "big-qmt/go-client/config" "big-qmt/go-client/libs" "big-qmt/go-client/sdk" ) func logf(level, format string, args ...any) { log.Printf("[%s] %s", level, fmt.Sprintf(format, args...)) } func Overview(assets *sdk.Assets, positions []sdk.Position) { fmt.Println("\n" + strings.Repeat("=", 80)) fmt.Printf("【时间】%s\n", time.Now().Format("2006-01-02 15:04:05")) fmt.Printf("【配置】account_id: %s host_key: %s buy_value: %.0f\n", config.Account.AccountID, config.Account.HostKey, config.Account.BuyValue) if assets != nil { fmt.Printf("【资金】总资产:%.2f元,可用资金:%.2f元\n", assets.Total, assets.Available) } else { fmt.Println("【资金】查询失败") } fmt.Printf("【持仓】%d只\n", len(positions)) fmt.Println(strings.Repeat("=", 80)) for _, p := range positions { if p.Volume <= 0 { continue } code := p.StockCode fmt.Printf("【持仓】%s %s 持仓=%d 可用=%d 冻结=%d 在途=%d 昨仓=%d 成本=%.3f 现价=%.3f 市值=%.2f 浮盈=%.2f 盈亏比例=%.2f%%\n", code, p.StockName, p.Volume, p.CanUseVolume, p.FrozenVolume, p.OnRoadVolume, p.YesterdayVolume, p.OpenPrice, p.LastPrice, p.MarketValue, p.FloatProfit, p.ProfitRate*100) } } func RunOnce(ctx context.Context, client *sdk.Client, books *OrderBook, signals *libs.SignalResult) { if !libs.TradingTime(time.Now()) { return } // 1 取消过期订单 books.CancelExpired(ctx, client) // 2 验证可用资金 assets, err := client.Assets(ctx) if err != nil { logf("ERROR", "获取资产失败: %v", err) return } if assets.Available < assets.Total*config.Account.MinCashRatio { logf("INFO", "资金总闸:可用金额太少,禁止开新仓") return } // 3 获取大盘状态 IsAllow := libs.MarketAllowOpen() // 4 获取持仓 var allCodes []string pos_codes, positions, err := client.Positions(ctx) if err != nil { logf("ERROR", "获取持仓失败: %v", err) return } allCodes = append(allCodes, pos_codes...) // 5 验证有效开仓信号 allowOpen := make([]libs.SignalItem, 0) for code, item := range signals.Data { if !slices.Contains(pos_codes, code) { allowOpen = append(allowOpen, item) } } // 6 获取行情tick ticks, err := client.FullTick(ctx, allCodes) if err != nil { logf("ERROR", "获取行情失败: %v", err) return } // 7 执行开仓:有开仓信号 && 大盘指数允许开仓 if len(allowOpen) > 0 && IsAllow { openSignal(client, books, ticks, allowOpen) } // 8 持仓计算 managePositions(client, books, ticks, positions, IsAllow) }