dev 2
This commit is contained in:
@@ -5,101 +5,46 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"big-qmt/go-client/apps/zt/logic"
|
||||
"big-qmt/go-client/sdk"
|
||||
)
|
||||
|
||||
func main() {
|
||||
log.SetFlags(log.LstdFlags | log.Lmicroseconds)
|
||||
cfg := loadConfig()
|
||||
client := sdk.New(cfg.QMTBaseURL, cfg.QMTToken, cfg.AccountType, cfg.HTTPTimeout)
|
||||
books := newOrderBook()
|
||||
cfg := logic.LoadConfig()
|
||||
client := sdk.New(cfg.QMTBaseURL, cfg.QMTToken, cfg.HTTPTimeout).SetAccountType(cfg.AccountType)
|
||||
books := logic.NewOrderBook()
|
||||
|
||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
||||
defer stop()
|
||||
|
||||
startup := context.Background()
|
||||
assets, err := client.Assets(startup, cfg.AccountType)
|
||||
assets, err := client.Assets(startup)
|
||||
if err != nil {
|
||||
logf("ERROR", "启动获取资产失败: %v", err)
|
||||
log.Printf("[ERROR] 启动获取资产失败: %v", err)
|
||||
}
|
||||
positions, err := client.Positions(startup, cfg.AccountType)
|
||||
positions, err := client.Positions(startup)
|
||||
if err != nil {
|
||||
logf("ERROR", "启动获取持仓失败: %v", err)
|
||||
log.Printf("[ERROR] 启动获取持仓失败: %v", err)
|
||||
positions = []sdk.Position{}
|
||||
}
|
||||
overview(cfg, assets, positions)
|
||||
logf("INFO", "[ZT] host_key=%s interval=%s", cfg.HostKey, cfg.LoopInterval)
|
||||
logf("INFO", "[ZT] Init Success, waiting trading session")
|
||||
logic.Overview(cfg, assets, positions)
|
||||
log.Printf("[INFO] [ZT] host_key=%s interval=%s signal=%s/a/dcm_signal", cfg.HostKey, cfg.LoopInterval, cfg.APIHost)
|
||||
log.Printf("[INFO] [ZT] Init Success, waiting trading session")
|
||||
|
||||
ticker := time.NewTicker(cfg.LoopInterval)
|
||||
defer ticker.Stop()
|
||||
runOnce(ctx, client, books, cfg)
|
||||
logic.RunOnce(ctx, client, books, cfg)
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
logf("INFO", "[ZT] 停止")
|
||||
log.Printf("[INFO] [ZT] 停止")
|
||||
return
|
||||
case <-ticker.C:
|
||||
runOnce(ctx, client, books, cfg)
|
||||
logic.RunOnce(ctx, client, books, cfg)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func runOnce(ctx context.Context, client *sdk.Client, books *orderBook, cfg Config) {
|
||||
if !tradingTime(time.Now()) {
|
||||
return
|
||||
}
|
||||
roundCtx, cancel := context.WithTimeout(ctx, cfg.HTTPTimeout*4)
|
||||
defer cancel()
|
||||
|
||||
assets, err := client.Assets(roundCtx, cfg.AccountType)
|
||||
if err != nil {
|
||||
logf("ERROR", "获取资产失败: %v", err)
|
||||
return
|
||||
}
|
||||
positions, err := client.Positions(roundCtx, cfg.AccountType)
|
||||
if err != nil {
|
||||
logf("ERROR", "获取持仓失败: %v", err)
|
||||
return
|
||||
}
|
||||
codes := passCodes(cfg)
|
||||
seen := map[string]struct{}{}
|
||||
stockList := make([]string, 0, len(codes)+len(positions))
|
||||
addCode := func(code string) {
|
||||
n := normalizeCode(code, "")
|
||||
if n == "" {
|
||||
n = strings.ToUpper(strings.TrimSpace(code))
|
||||
}
|
||||
if n == "" {
|
||||
return
|
||||
}
|
||||
if _, ok := seen[n]; ok {
|
||||
return
|
||||
}
|
||||
seen[n] = struct{}{}
|
||||
stockList = append(stockList, n)
|
||||
}
|
||||
for _, code := range codes {
|
||||
addCode(code)
|
||||
}
|
||||
for _, p := range positions {
|
||||
addCode(p.StockCode)
|
||||
}
|
||||
ticks := map[string]sdk.Tick{}
|
||||
if len(stockList) > 0 {
|
||||
raw, err := client.FullTick(roundCtx, stockList)
|
||||
if err != nil {
|
||||
logf("ERROR", "获取行情失败: %v", err)
|
||||
return
|
||||
}
|
||||
for code, tick := range raw {
|
||||
ticks[normalizeCode(code, "")] = tick
|
||||
ticks[code] = tick
|
||||
}
|
||||
}
|
||||
runRound(roundCtx, client, books, cfg, assets, ticks, positions)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user