过滤网信号推 Telegram,供手工小额实盘
自动执行链一行都还没写(下单/持仓状态/跨重启持久化/对账/熔断),而过全部 滤网的信号只有约 5.3 笔/天——低到人手能接。先手工跑一批,就能在写自动化 **之前**拿到真实费率档、真实成交价、真实出场行为,让执行链的每个假设都有 实测对照,而不是写完再发现出场模型不对。 推送内容按手工执行需要给全:参考成交价(回测口径的次根开盘)、按 2/3/8 ATR 换算的绝对价位、下单数量、该币滑点预算,以及一句「偏离超过预算就不值得做」。 剩余半仓止损保持 2ATR 不移成本,这是回测参数,移了就不是同一个收益结构。 时效是这条路最大的风险,所以起点取 kline_ts 而不是信号产生时刻——参考价就是 在 kline_ts 那一刻存在的,从信号时刻起算会漏掉数据延迟加计算那 0.5~1.5s,而 那段不可压缩。超过 TG_STALE_S 直接标记已失效,不让人自己判断:宁可漏做,不 要在偏离预算之外入场。 三条防线:lag 退化时不推(与「停开新仓」同一条规则,不能只在自动化里执行); 按 (币, K线时刻, 方向) 去重,避免补根或池重建重放导致开两次仓;无预算的币 (如 TRX)不推。推送任何失败只打日志,不连坐采集——已验假 token 下降级为 HTTP 401 日志而非抛异常。 凭据走 tg.env(已 gitignore),给了 tg.env.example 说明怎么拿 token 和 chat id。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -71,6 +71,8 @@ import pandas as pd
|
||||
|
||||
from lib.shadow_budget import LAG_ALARM_MS, LAG_WINDOW, lag_healthy
|
||||
|
||||
import tg_notify
|
||||
|
||||
# 站点标识。跨地对比时两台机器的 CSV 要能合起来读,没有这一列就分不清哪行
|
||||
# 来自哪台。默认取主机名,部署脚本会显式传 SHADOW_SITE(如 sg-hetzner)
|
||||
SITE = os.environ.get("SHADOW_SITE") or socket.gethostname()
|
||||
@@ -646,6 +648,18 @@ class Shadow:
|
||||
self._record_later(sym, kline_ts, h, t_data, t_signal,
|
||||
baseline, atr_pct, lag_ok),
|
||||
f"record {sym}")
|
||||
# 手工执行的推送。只推过全部滤网的,且 lag 退化时不推——那与
|
||||
# 「停开新仓」是同一条规则,不能只在自动化里执行
|
||||
if h["pass_all"] and atr_pct:
|
||||
if not lag_ok:
|
||||
print(f" [TG] {sym} lag 退化,按停开新仓规则不推",
|
||||
flush=True)
|
||||
else:
|
||||
self._spawn(
|
||||
tg_notify.push_signal(
|
||||
sym, h["direction"], float(baseline),
|
||||
float(atr_pct), kline_ts, t_data - kline_ts),
|
||||
f"tg {sym}")
|
||||
|
||||
def _probe_lag(self, sym: str, lag_ms: int) -> tuple[float, bool]:
|
||||
"""记一根的到达延迟,返回 (滚动中位数, 该币是否健康)。
|
||||
|
||||
Reference in New Issue
Block a user