执行器活着不代表链路活着——搬运死了一样心跳正常、一样什么都不做。 所以每小时那条必须读 ship_alive.json:ssh 是否在连、文件是否还在刷。 连上/断开立刻落盘,不靠 5 分钟心跳,否则第一轮会误报上游断了。 Co-authored-by: Cursor <cursoragent@cursor.com>
72 lines
4.4 KiB
Bash
72 lines
4.4 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
|
||
|
||
# 盯交易所侧出场的轮询间隔(秒)。**别关掉这个循环**:止损与止盈在交易所侧
|
||
# 成交,本进程收不到通知,缺了它 pnl_day 恒为 0,MAX_DAY_LOSS 就是死的
|
||
LIVE_WATCH_S=10
|
||
|
||
# ── Telegram 通知 ─────────────────────────────────────────────────
|
||
# 拿 token:Telegram 里找 @BotFather → /newbot
|
||
# 拿 chat id:给 bot 随便发一句,再开
|
||
# https://api.telegram.org/bot<TOKEN>/getUpdates 看 result[0].message.chat.id
|
||
#
|
||
# 留空则完全不推(不报错)。推的内容:开仓、平仓(带已实现盈亏)、被硬约束
|
||
# 挡住、报错、对账平仓、跨日结算、启动与停机、整点在线。
|
||
# **不推**信号过期跳过(常态,搬运重连会重放旧信号)和 5 分钟日志心跳。
|
||
# 量级约 55 条/天上限(含 24 条在线)。
|
||
TG_TOKEN=
|
||
TG_CHAT=
|
||
# 前缀,用来和采集机推的手工信号区分开——两边可以共用同一个 bot 和对话
|
||
TG_TAG=实盘
|
||
# 整点在线的间隔(分钟)。0 关掉。60 = 每天 24 条,和成交推送量级相当。
|
||
# 这条必须带上游新鲜度:执行器活着不代表链路活着
|
||
TG_HB_MIN=60
|