hamuna-quant-cli 0.1.18__tar.gz → 0.1.20__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/PKG-INFO +1 -1
  2. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/__init__.py +1 -1
  3. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/live/qmt_broker.py +23 -1
  4. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/live/qmt_market.py +19 -2
  5. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli.egg-info/PKG-INFO +1 -1
  6. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/pyproject.toml +1 -1
  7. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/MANIFEST.in +0 -0
  8. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/README.md +0 -0
  9. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/README.md +0 -0
  10. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/__main__.py +0 -0
  11. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/_market_fallback.py +0 -0
  12. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/_metrics_15.py +0 -0
  13. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/_test_akquant_parity.py +0 -0
  14. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/akquant_data_adapter.py +0 -0
  15. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/akquant_runner.py +0 -0
  16. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/akquant_schema_adapter.py +0 -0
  17. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/base_strategy.py +0 -0
  18. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/cross_sectional_helpers.py +0 -0
  19. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/live/__init__.py +0 -0
  20. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/live/loader.py +0 -0
  21. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/live/runner.py +0 -0
  22. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/live/server_market_client.py +0 -0
  23. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/prebuilt_downloader.py +0 -0
  24. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/prebuilt_resolver.py +0 -0
  25. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/qmt_translator.py +0 -0
  26. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/runtime/__init__.py +0 -0
  27. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/runtime/backtest.py +0 -0
  28. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/runtime/cache.py +0 -0
  29. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/runtime/discipline.py +0 -0
  30. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/runtime/http_client.py +0 -0
  31. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/runtime/s3client.py +0 -0
  32. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/runtime/server_client.py +0 -0
  33. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli/scripts/server.json +0 -0
  34. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli.egg-info/SOURCES.txt +0 -0
  35. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli.egg-info/dependency_links.txt +0 -0
  36. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli.egg-info/entry_points.txt +0 -0
  37. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli.egg-info/requires.txt +0 -0
  38. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/hamuna_quant_cli.egg-info/top_level.txt +0 -0
  39. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/setup.cfg +0 -0
  40. {hamuna_quant_cli-0.1.18 → hamuna_quant_cli-0.1.20}/tests/test_live_safety.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hamuna-quant-cli
3
- Version: 0.1.18
3
+ Version: 0.1.20
4
4
  Summary: Hamuna A 股回测 + 实盘统一 CLI (akquant 0.3.x). 替代 v1 自建 driver + QMT-style 策略规范.
5
5
  Author-email: Hamuna Team <team@hamuna.example>
6
6
  License: MIT
@@ -12,4 +12,4 @@ server (13-key metrics schema). 全部走 akquant 0.3.x 引擎.
12
12
  """
13
13
  from __future__ import annotations
14
14
 
15
- __version__ = "0.1.18"
15
+ __version__ = "0.1.20"
@@ -291,7 +291,21 @@ def _make_trader_gateway():
291
291
 
292
292
  # ----- 生命周期 -----
293
293
  def connect(self) -> None:
294
- """调 /account 验证桥活 + 账户配 (bridge_server 没显式 /connect 协议)."""
294
+ """POST /set_account 设全局账户 + /account 验证桥活.
295
+
296
+ Round 18.63.12: 先 /set_account 设置 bridge 全局 ACCOUNT_ID — 否则
297
+ 桌面 app 轮询 /orders /positions 等不带 account_id 的请求报
298
+ ACCOUNT_NOT_CONFIGURED (仅 CLI 请求带 account_id 不够, bridge 全局
299
+ 账户未设, 无 account_id 的请求全部 400).
300
+ """
301
+ set_resp = self._http.post("/set_account", {
302
+ "account_id": self._account_id,
303
+ "account_type": self._account_type,
304
+ })
305
+ if not isinstance(set_resp, dict) or not set_resp.get("ok"):
306
+ raise BrokerHTTPError(
307
+ f"connect: /set_account 返回异常: {set_resp!r}"
308
+ )
295
309
  data = self._http.post("/account", {
296
310
  "account_id": self._account_id,
297
311
  "account_type": self._account_type,
@@ -733,6 +747,14 @@ if __name__ == "__main__":
733
747
 
734
748
  def do_POST(self):
735
749
  data = self._read_json()
750
+ if "/set_account" in self.path:
751
+ # Round 18.63.12: connect() 先 POST /set_account 设全局账户 —
752
+ # mock 同步返回 ok, 否则 paper 模式 connect 抛异常.
753
+ self._send(200, {"ok": True, "value": {
754
+ "account_id": data.get("account_id"),
755
+ "account_type": data.get("account_type") or "stock",
756
+ }})
757
+ return
736
758
  if "/account" in self.path:
737
759
  self._send(200, {"ok": True, "value": {
738
760
  "account_id": data.get("account_id"), "account_type": "stock",
@@ -685,10 +685,27 @@ def _to_bar_obj(raw: dict[str, Any], ts_ns: int | None = None):
685
685
  """
686
686
  import time as _t
687
687
  from akquant import Bar
688
- ts = ts_ns if ts_ns is not None else _t.time_ns()
688
+ # Round 18.63.9: 让 Bar.timestamp 用 QMT 真实时间 (qmt_time_ms 转 ns) 而非
689
+ # wall-clock ns. 副作用: QMT bar 时间可能早于 session 启动 → akquant live
690
+ # 引擎 `_active_start_time_ns` 预热过滤会当历史 bar 滤掉 → warmup 永远攒
691
+ # 不满 → on_bar 不触发. 修: 当 qmt_time_ms < 当前 wall-clock 时 (QMT bar
692
+ # 在历史), 用 wall-clock + period_ns 偏移保持单调递增, 让 live feed 不丢
693
+ # bar; 当 qmt_time_ms >= wall-clock 时 (盘中真推), 直接用 qmt_time_ms.
694
+ # qmt_time_ms 仍进 extra — 策略可同时读 bar.timestamp 与 bar.extra 取
695
+ # 不同时间. 详见策略 on_bar 的"qmt_stime" vs "cli_wall".
696
+ wall_ns = _t.time_ns()
697
+ qmt_ms = raw.get("time")
698
+ if isinstance(qmt_ms, (int, float)) and qmt_ms > 0:
699
+ qmt_ns = int(qmt_ms * 1_000_000) # ms → ns
700
+ if qmt_ns >= wall_ns:
701
+ ts = qmt_ns # 盘中真推: 直接用 QMT 时间
702
+ else:
703
+ # 历史 bar: fallback 到 wall-clock + period 偏移 (调用方传 ts_ns)
704
+ ts = ts_ns if ts_ns is not None else wall_ns
705
+ else:
706
+ ts = ts_ns if ts_ns is not None else wall_ns
689
707
  # 把 QMT 真实时间塞 extra — Bar 构造时一次性传 (事后不可写, Rust 侧冻结).
690
708
  # extra 必须是 f64 dict, 跳过 None / 非数字字段 (Rust 侧拒收 string).
691
- qmt_ms = raw.get("time")
692
709
  extra: dict[str, float] = {}
693
710
  if isinstance(qmt_ms, (int, float)) and qmt_ms > 0:
694
711
  extra["qmt_time_ms"] = float(qmt_ms)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hamuna-quant-cli
3
- Version: 0.1.18
3
+ Version: 0.1.20
4
4
  Summary: Hamuna A 股回测 + 实盘统一 CLI (akquant 0.3.x). 替代 v1 自建 driver + QMT-style 策略规范.
5
5
  Author-email: Hamuna Team <team@hamuna.example>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "hamuna-quant-cli"
7
- version = "0.1.18"
7
+ version = "0.1.20"
8
8
  description = "Hamuna A 股回测 + 实盘统一 CLI (akquant 0.3.x). 替代 v1 自建 driver + QMT-style 策略规范."
9
9
  readme = "hamuna_quant_cli/README.md"
10
10
  requires-python = ">=3.10"