实盘要跑在 AWS(API key 绑了 IP 白名单),而信号在新加坡那台算。借这次 把生产从研究侧摘出来,四条具体代价里第一条已经咬过: 1. live_state.json 原先落在 research/out/,而那里 shadow_hb 会自动 rename 归档、研究脚本会写、人也手工清过。那文件装的是 MAX_DAY_LOSS 累计与已 处理信号键,被清掉不报错,只是两道闸静默失效。改到 LIVE_HOME。 2. 采集器十币清空 300~560ms 直接叠在信号到达执行器的延迟上。 3. 研究侧探针 OOM 过一次(14.9GB),当时若有仓位在场会连坐执行器。 4. 为读两个常量 import 研究侧 step43,把 numpy/pandas/pyarrow 拖进实盘 进程。抽出 stdlib-only 的 live/exit_params.py,install.sh 加断言挡回归。 新增 live/ship_signals.py:AWS 侧 ssh tail 拉总线,每次重连从文件头重放 + 按幂等键去重,断线期间的信号自愈;旧信号由 staleness 闸挡掉不补做。 带时钟倒流检测——两机时钟不同步会让那道闸静默放宽。 部署件:systemd 两单元(搬运挂了执行器仍管在场仓位的超时平仓)、 install.sh、dryrun.sh(验密钥/白名单/时钟/ssh/取整)、status.sh、README。 验证:live_exec 重构后端到端空跑,SOL 多头与 ADA 空头的止损/两级止盈/ 数量取整逐项核对正确,isolated + post_only + reduceOnly 都在;搬运的去重、 重启不重复追加、脏数据跳过、断线重连重放均已测。 Co-authored-by: Cursor <cursoragent@cursor.com>
28 lines
1.6 KiB
Python
28 lines
1.6 KiB
Python
"""出场结构的唯一来源。**只用标准库**,这是硬约束。
|
|
|
|
为什么单独一个模块、且不许引第三方库:执行器要跑在只装了 `aiohttp` 的生产机
|
|
上。这几个数原先从 `research/step43_fill_aware_budget.py` 读,那个模块顶层
|
|
`import pandas`,于是生产机为了两个 float 得装 pandas + pyarrow(实测
|
|
`assert_decomposable()` 一调就把 numpy/pandas/pyarrow 全拖进来)。
|
|
|
|
方向也要注意:**生产拥有这个契约,研究侧反过来读它。** 反过来写成生产 import
|
|
研究侧,就等于把回测的依赖树绑到实盘进程上。
|
|
|
|
⚠️ 研究侧还散着 6 处同样的字面量(step44/47/48/49/52 与 exit_model 的默认
|
|
参数),本次没有统一。改这里的值**不会**自动改到那些脚本,对表要手工。
|
|
统一它们要重跑那批脚本确认结果不变,属于独立的一次改动。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
# 以 ATR 为单位的出场结构。来源:research/step43_fill_aware_budget.py 的
|
|
# 参数扫描结论(1m 主线)。含义见 live_exec.py 顶部注释
|
|
SL = 2.0 # 止损:入场价的 2 ATR
|
|
SCALE_AT = 3.0 # 减半点:3 ATR 处平掉一半
|
|
RUNNER = 8.0 # 剩余半仓的目标:8 ATR
|
|
RUNNER_STOP = 2.0 # 剩余半仓的止损,**不移动**,仍在入场价的 2 ATR
|
|
MAXB = 48 # 超时:48 根(1m 上即 48 分钟)
|
|
|
|
# 两个半仓共用同一个不动止损,这是「一次入场拆两腿」能等价于回测的前提。
|
|
# RUNNER_STOP != SL 时该等价性失效,`live_exec.assert_decomposable()` 会硬挡
|
|
DECOMPOSABLE = RUNNER_STOP == SL
|