关于 roach-strategy
roach-strategy 是面向 Senpi runtime 的 Striker 专用交易技能。Producer 筛选市场信号并交由 runtime 处理,由 runtime 负责执行头寸操作和风险控制。
主要功能
- 01每 90 秒运行的市场信号 Producer
- 02Striker 信号筛选与冷却机制
- 03由 runtime 管理执行和风险限制
- 04优先 Maker 的退出单及 Taker 回退
- 05守护进程健康度与活动监控
适用场景
- 01向 Senpi runtime 发送符合条件的市场信号
- 02使用 runtime 强制执行的风险限制运行策略
- 03监控 Producer 守护进程健康度和信号活动
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ senpi-ai/ senpi-skills --skill roach-strategy安装后在 Claude Code 中输入/roach-strategy确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdruntime.yamlconfig/roach-config.jsonreferences/skill-attribution.mdscripts/roach_config.pyroach-producer.py详细介绍
🪳 ROACH v3.0.0 — 仅 Striker。senpi_runtime_helpers。
蟑螂能在任何环境中存活。ROACH 的生存之道,是在没有爆发行情时不交易。
v2.0 的变更
架构(而非策略):
| 层 | v1.x | v2.0 |
|---|---|---|
| 交易循环 | Agent 运行扫描器,Agent 调用 create_position | 生产器通过 SenpiClient.push_signal() 推送信号;运行时负责执行 |
| 入场门控 | Agent 决定 | LLM 直通门控(生产器已完成筛选) |
| 退出 | 通过 runtime.yaml 配置 DSL(效果良好) | 相同的 DSL 预设,但使用 FEE_OPTIMIZED_LIMIT 订单类型 — 优先做市,等待 60 秒,之后回退为吃单 |
| 风险门控 | Agent 在扫描器代码中执行 | 通过 runtime.risk.guard_rails 声明式配置 |
| 单资产冷却 | 生产器状态文件 | 运行时 + 生产器(纵深防御) |
v2 的原因: v1 每次退出都使用 MARKET 订单,每次退出需支付约 3 bp 的 HL 吃单手续费。近期 25 笔交易样本:HL 手续费为 $46,全部为吃单。v2 的 FEE_OPTIMIZED_LIMIT 配合 ensure_execution_as_taker: true 和 60 秒超时,优先争取做市成交,但在必须平仓时接受回退为吃单。预计可节省 50-70% 的 HL 退出手续费。
延续 v1.2 的策略: 禁用 Stalker。仅使用 Striker。FIRST_JUMP 从第 25 名及之后的排名跃升 >= 15,或 contribVelocity >= 15;得分 >= 10 且至少有 4 个理由;成交量为 1.5 倍;1h 价格走势一致;4h 趋势一致;禁止 XYZ。
文件
| 文件 | 用途 |
|---|---|
runtime.yaml | senpi-trading-runtime 规范(扫描器、动作、退出 DSL、guard_rails) |
scripts/roach-producer.py | 由 Cron 驱动的生产器 — 向运行时发送 Striker 信号 |
scripts/roach_config.py | 共享 MCP 辅助工具 + 原子状态 I/O |
config/roach-config.json | 可由操作者调整的默认值(仅供参考;以生产器常量为准) |
生产器行为
作为长驻守护进程,每 90 秒运行一次(通过 producer_daemon;扫描器锁及过期 PID 自动恢复由守护进程负责)。每次运行时:
- 防重入: 获取
state/<wallet-hash>/producer.lock。如果上一次运行尚未释放该锁(Cron 运行间隔短于 MCP 延迟),本次运行会正常跳过。 - 获取市场数据:
leaderboard_get_markets(前 50 名,在解析时过滤掉 XYZ)。 - 检测 Striker 信号: 排名跃升、contribVelocity,以及相对于扫描历史的贡献暴增。
- 应用硬性门槛: 4h 趋势一致,cc_15m >= 0.5,1h 价格走势一致且涨幅 >= 0.1%,成交量 >= 1.5 倍,得分 >= 10,至少有 4 个理由,资产不在 120 分钟冷却期内。
- 发送信号: 通过
client.push_signal()(直接向运行时 API 发起 HTTP POST)。 - 持久化扫描历史和冷却状态: 存储在
state/<wallet-hash>/下。
无执行代码。无持仓追踪。无 DSL 状态。这些全部由运行时负责。
入场流程
Producer daemon (90s tick)
↓ Striker signal detected
↓ client.push_signal(scanner="roach_signals", ...)
Runtime
↓ Schema-validates fields against runtime.yaml
↓ LLM gate (decision_model = ${ROACH_DECISION_MODEL})
↓ Pass-through unless malformed (producer already filtered everything else)
↓ OPEN_POSITION via FEE_OPTIMIZED_LIMIT (maker-first, 60s, taker fallback)
DSL (runtime-managed)
↓ Phase 1 max_loss 18% / 3-breach
↓ Phase 2 tiers (7/40, 12/55, 15/75, 20/85)
↓ hard_timeout 120min, weak_peak 45min, dead_weight 25min
↓ Exit via FEE_OPTIMIZED_LIMIT (maker-first, 60s, taker fallback)
必需的环境变量
运行时 YAML 使用以下替换项:
| 变量 | 用途 |
|---|---|
${WALLET_ADDRESS} | 策略钱包地址 |
${TELEGRAM_CHAT_ID} | 用于发送通知的 Telegram 聊天 ID |
${ROACH_DECISION_MODEL} | LLM 门控使用的纯模型名称。不要加提供商前缀(例如 google/...、anthropic/...、openai/...)——OpenClaw 会重复添加前缀,并以 500 Unknown model 错误拒绝请求。选择 OpenClaw 主机运行时注册表支持的任意模型。 |
生产器读取以下变量:
| 变量 | 用途 | 默认值 |
|---|---|---|
ROACH_WALLET | 钱包(必须与运行时 YAML 中的钱包一致)。按 Agent 单独设置是有意设计——请勿使用通用的 STRATEGY_ADDRESS。 根据 Turbine v2.0.9 的污染修复,如果多个 Agent 共用一个安装实例,共享环境变量会成为整个 Agent 群的风险入口。 | —(必需;缺失时生产器会明确报错) |
OPENCLAW_BIN | CLI 二进制名称 | openclaw |
EXTERNAL_SCANNER_NAME | 扫描器 ID | roach_signals |
ROACH_LEVERAGE | 信号负载中声明的杠杆 | 7 |
ROACH_MARGIN_USD | 信号负载中声明的每个仓位保证金 | 250 |
Producer 安装(在 OpenClaw 主机上)
senpi-skills 仓库中的源路径:roach/。OpenClaw 主机上的安装目标路径:/data/workspace/skills/roach-strategy/。这两个名称不同——仓库使用 roach,安装目录使用 SKILL.md 的 name 字段(roach-strategy)。
面向操作人员的完整安装操作手册位于 README.md — 五步流程(注册 openclaw.json 插件 → 安装 senpi-trading-runtime 技能 → 拉取 Roach 文件 → 设置环境变量 → 重新创建 runtime 并启动守护进程 → 冒烟测试)。
安装后,通过 senpi-helpers CLI 管理守护进程:
senpi-helpers list # daemons visible with recent LAST_TICK
senpi-helpers health roach-<wallet-suffix> # exit 0 = healthy
senpi-helpers stats roach-<wallet-suffix> --hours 1 # signals posted + error histogram
senpi-helpers restart roach-<wallet-suffix> # stop + re-exec from boot.json
检查 producer 状态(每个钱包的扫描历史):
ls -la /data/workspace/skills/roach-strategy/state/<wallet-hash>/
# Expect: scan-history.json with mtime in last few minutes.
# A fresh scan-history.json (mtime < 5 min) confirms the daemon is ticking.
风险范围(声明式,由 runtime 强制执行)
| 设置 | 值 |
|---|---|
| 仓位数(最大并发持仓) | 2 |
| 每个仓位的保证金 | $250 |
| 默认杠杆 | 7x |
| 每日亏损停机阈值 | 10% |
| 回撤停机阈值 | 25% |
| 每日最大入场次数 | 6 |
| 最大连续亏损次数 | 3 |
| 亏损后冷却时间 | 30 分钟 |
| 单个资产冷却时间 | 120 分钟 |
| XYZ 股票 | 在 producer 扫描层级禁止 |
预期行为
| 指标 | 预期 |
|---|---|
| 交易次数/天(震荡行情) | 0-1 |
| 交易次数/天(趋势行情) | 1-3 |
| 零交易天数 | 常见且正常 |
| 胜率 | 目标为 50-70%(Striker 质量) |
| 每笔平仓的平均手续费 | 显著低于 v1(maker 成交) |
| 手续费总额 / 交易量 | 相比 v1 基线减少约 50-70% |
保持静默是正常的。 如果 Roach 连续 24-48 小时没有交易,这意味着没有值得参与的 FIRST_JUMP 爆发行情。这说明实验正在按预期运行,并非 bug。
v2 中移除的内容
已移除(职责转移至 runtime):
roach-scanner.py(由roach-producer.py替代)- 交易计数器 / 每日亏损跟踪(runtime 的 guard_rails)
- Bootstrap 门控 / config/bootstrap-complete.json(runtime 安装负责处理状态)
- 扫描器中的资产冷却记录(producer 中仍保留,作为纵深防御,但 runtime 才是权威来源)
- 基于 PnL 动态调整仓位数(仓位数由 runtime 管理)
- 所有
create_position调用(执行由 runtime 管理)
永久禁用(在 v1.0 中决定):
- Stalker 模式及所有累积检测
- XYZ 股票(在扫描层级禁止)
许可证
MIT — 由 Senpi 构建(https://senpi.ai)。 源代码:https://github.com/Senpi-ai/senpi-skills
技能归属
创建策略时,在调用中包含 skill_name 和 skill_version。详情请参阅 references/skill-attribution.md。