实盘要跑在 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>
51 lines
3.2 KiB
Bash
51 lines
3.2 KiB
Bash
# 生产配置。装到 /etc/chan-live/live.env,权限 640 root:chan。
|
||
# **不要提交填好的版本**——这里有交易权限的密钥。
|
||
#
|
||
# 改完要重启:sudo systemctl restart chan-live-exec
|
||
|
||
# ── Bitget 密钥 ───────────────────────────────────────────────────
|
||
# 权限只勾「只读」+「交易」,**不要勾提币**。
|
||
# IP 白名单填这台机的公网出口 IP(curl -s https://api.ipify.org 看)。
|
||
# 这也是执行器必须跑在这台机上的唯一原因——密钥绑了这个 IP。
|
||
BITGET_API_KEY=
|
||
BITGET_API_SECRET=
|
||
BITGET_PASSPHRASE=
|
||
|
||
# ── 信号来源(采集机)─────────────────────────────────────────────
|
||
# ssh 目标。可以是 ~/.ssh/config 里的别名,或 user@ip
|
||
SHIP_FROM=sg-collector
|
||
# 采集机上总线文件的路径(在对端 shell 里展开,可用 ~)
|
||
SHIP_REMOTE_BUS=~/chan-live/state/signals_live.jsonl
|
||
|
||
# ── 状态与总线 ────────────────────────────────────────────────────
|
||
# 生产状态的根。**不要指到仓库里**:git checkout/clean 会动仓库,而这里存的
|
||
# 是日亏损累计与在场仓位,被清掉等于 MAX_DAY_LOSS / MAX_OPEN 两道闸失忆。
|
||
# systemd 单元里 ReadWritePaths 也是这个路径,改了要一起改
|
||
LIVE_HOME=/var/lib/chan-live
|
||
SIGNAL_BUS=/var/lib/chan-live/state/signals_live.jsonl
|
||
|
||
# ── 仓位 ─────────────────────────────────────────────────────────
|
||
# 每笔名义额(USDT)。杠杆**不改**手续费与滑点(都按名义额收),所以抬名义额
|
||
# 有真实成本;抬它的唯一理由是压掉步长取整:实测最差币的偏差
|
||
# 100U → 6.7%(SOL)、500U → 1.8%、1000U → 0.6%
|
||
LIVE_NOTIONAL=500
|
||
# 杠杆只影响占用保证金,不影响名义敞口/手续费/滑点/盈亏绝对值。
|
||
# 名义 500 在 10x 下占 50 USDT 保证金;止损在 2 ATR ≈ 0.2%,而 10x 强平约需
|
||
# 逆向 10% = 100 个 ATR,差 50 倍。交易所侧记得设**逐仓**
|
||
LIVE_LEVERAGE=10
|
||
|
||
# ── 硬约束:封的是「代价不随仓位缩小」的那几类故障 ─────────────────
|
||
# 并发仓位数。信号 6.8 笔/天、持仓 48 分钟 → 期望并发 0.23 笔,3 已很宽。
|
||
# 超了说明有 bug,不是行情好
|
||
LIVE_MAX_OPEN=3
|
||
# 日开仓上限。专门封「循环里的 bug 反复开仓」——单笔小但笔数无界
|
||
LIVE_MAX_DAY=15
|
||
# 日亏损上限(USDT)。一笔止损约 1 USDT,15 笔全亏 15 USDT
|
||
LIVE_MAX_DAY_LOSS=20
|
||
# 信号超过这么久就不做。参考成交价是次根开盘价,过期后跑的不是回测那个价。
|
||
# ⚠️ 这道闸依赖两机时钟一致,chrony 必须在跑(install.sh 会装)
|
||
LIVE_STALE_S=20
|
||
|
||
# 交易的币池。要与采集机一致,否则会收到不做的币的信号(会被忽略但徒增噪声)
|
||
SYMS=BTC,ETH,SOL,BNB,XRP,DOGE,ADA,AVAX,LINK,LTC
|