This commit is contained in:
2026-08-26 23:27:42 +08:00
parent c30c1541d2
commit cdbd03fe53
13 changed files with 256 additions and 355 deletions

View File

@@ -0,0 +1,111 @@
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, signals []*libs.SignalItem) {
if !libs.TradingTime(time.Now()) {
return
}
// 1 取消过期订单
OrderBook.CancelExpired(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 _, item := range signals {
if !slices.Contains(pos_codes, item.Code) {
allowOpen = append(allowOpen, item)
}
}
allowOpen = SignalFilter(allowOpen, config.Account.SignalAllow)
// 6 获取行情tick
ticks, err := client.FullTick(ctx, allCodes)
if err != nil {
logf("ERROR", "获取行情失败: %v", err)
return
}
// 7 执行开仓:有开仓信号 && 大盘指数允许开仓
if len(allowOpen) > 0 && IsAllow {
openSignal(client, ticks, allowOpen)
}
// 8 持仓计算
managePositions(client, ticks, positions, IsAllow)
}
func SignalFilter(in []*libs.SignalItem, name []string) []*libs.SignalItem {
newSignalItem := make([]*libs.SignalItem, 0)
if len(name) == 0 {
return newSignalItem
}
for _, i := range in {
for _, n := range name {
if i.SignalKey == n {
newSignalItem = append(newSignalItem, i)
}
}
}
return newSignalItem
}