diff --git a/Makefile b/Makefile index 7511db3..a789665 100644 --- a/Makefile +++ b/Makefile @@ -152,12 +152,23 @@ print(" ▸ tick: 检查 %s · 出手 %s · 等待 %s · 拒绝 %s%s" % (d.get( len(d.get("fired") or []), len(d.get("waited") or []), len(d.get("rejected") or []),\ (" ⚠ 错误 " + json.dumps(e, ensure_ascii=False)) if e else ""))' -loop: ## 手动联测循环: 每 N 秒跑一跳择时再刷监视 (beat 停着时用; Ctrl-C 退出) - @echo "每 $(or $(N),20) 秒跑一跳并刷新。Ctrl-C 退出。" +# **出手 + 入账两跳都要跑**: exec-tick 只发单, 成交要 replay 那一跳才认领进账本。 +# 第一版只跑了 exec-tick —— 那样一旦成交, 单子成了而账本一直空, 看着像成交没回来。 +REPSUM := python3 -c 'import sys,json;\ +d=(json.loads(sys.stdin.read()) or {}).get("data") or {};\ +w=d.get("ws") or {}; e=(d.get("errors") or []);\ +print(" ▸ 入账: ws 成交 %s → 记账动作 %s · 外部成交 %s%s%s" % (w.get("trades",0),\ +w.get("actions",0), d.get("fills",0),\ +(" 挂起 " + str(len(w.get("held") or []))) if w.get("held") else "",\ +(" ⚠ 错误 " + json.dumps(e, ensure_ascii=False)) if e else ""))' + +loop: ## 手动联测循环: 每 N 秒跑「出手一跳 + 入账一跳」再刷监视 (beat 停着时用) + @echo "每 $(or $(N),20) 秒: 出手一跳 + 入账一跳 → 刷新监视。Ctrl-C 退出。" @while true; do \ sum=$$(curl -s -X POST '$(A)/api/ops/exec-tick' | $(TICKSUM)); \ + rep=$$(curl -s -X POST '$(A)/api/ops/replay' | $(REPSUM)); \ $(MAKE) --no-print-directory watch; \ - echo "$$sum"; \ + echo "$$sum"; echo "$$rep"; \ sleep $(or $(N),20); \ done @@ -198,6 +209,12 @@ t-dry: ## A6 择时试算 (实现B, 不经决策系统; dry_run 只算不发 t-tick: ## A7 真出手 (shadow 下 = 置 DISPATCHED 但不写下游, 你照着在 QMT 手工下) @curl -s -X POST '$(A)/api/ops/exec-tick' | $(J) +# **出手和入账是两条独立的路**, exec-tick 只管发单不管收账。成交回来落在 pms_qmt_inbox, +# 要 replay 这一跳才会认领进批次、算摊薄成本与安全垫。beat 停着时忘了跑它, 表现是 +# 「待入账」一直涨而账本持仓一直空 —— 看着像成交没回来, 其实是没人去收。 +t-replay: ## A7.5 成交入账 (ws 逐笔 + trading_order 增量 + 盘中轻对账) + @curl -s -X POST '$(A)/api/ops/replay' | $(J) + t-ins: ## A8 看指令与子单状态 @curl -s '$(A)/api/instructions?limit=50' | $(J)