wolf-strategy by senpi-ai/senpi-skills
npx skills add https://github.com/senpi-ai/senpi-skills --skill wolf-strategyWOLF 为它的主人狩猎。它自主扫描、入场、出场和轮换仓位——无需许可。当条件满足时,它就会行动。速度就是优势。
已验证: 已实现盈利 +$1,500,25+ 笔交易,65% 胜率,单次会话,预算 $6.5k。
v6:多策略支持。 每个策略都有独立的钱包、预算、仓位槽位和 DSL 配置。同一资产可以同时在不同策略中持有(例如,策略 A 做多 HYPE + 策略 B 做空 HYPE)。
v6.1.1:风险守护者与策略锁。 第 6 个定时任务(5分钟,预算模型级别)强制执行账户级别的防护栏——每日亏损暂停、每日最大入场次数、连续亏损冷却期。策略锁用于并发保护。open-position.py 中的门控检查会在 gate != OPEN 时拒绝新入场。
v6.3:DSL v5.3.1 高水位线。 默认 DSL 配置文件和策略配置使用高水位线模式(lockMode: pct_of_high_water),包含 lockHwPct 层级和每层级的 consecutiveBreachesRequired。每个策略有一个 DSL 定时任务运行 dsl-v5.py (v5.3.1);状态文件位于 {workspace}/dsl/{strategyId_UUID}/。迁移脚本:wolf-migrate-dsl.py。
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
v6.2:DSL v5.2 集成。 用 dsl-dynamic-stop-loss 技能替换了内部的 dsl-combined.py。通过 dsl-v5.py 实现原生 Hyperliquid 止损同步。
创建策略时,请在调用中包含 skill_name 和 skill_version。详情请参阅 references/skill-attribution.md。
wolf-strategies.json)包含所有策略的中心配置。由 wolf-setup.py 创建/更新。
wolf-strategies.json
├── strategies
│ ├── wolf-abc123 (激进动量,3 仓位槽位,tradingRisk=aggressive)
│ └── wolf-xyz789 (保守 XYZ,2 仓位槽位,tradingRisk=conservative)
└── global (telegram, workspace)
DSL 状态文件位于 DSL 技能的目录下(按策略 UUID)。Wolf 特定的状态(交易计数器)保留在 state/ 中:
dsl/ # 由 dsl-dynamic-stop-loss 技能拥有
├── abc12345-.../ # 策略 A UUID
│ ├── strategy-abc12345....json # DSL 策略配置
│ ├── HYPE.json # 仓位状态
│ └── xyz--SILVER.json # XYZ 仓位
└── xyz78901-.../ # 策略 B UUID
└── HYPE.json # 同一资产,不同 UUID 目录,无冲突
state/ # 仅 wolf 状态(此处无 DSL 文件)
├── wolf-abc123/
│ └── trade-counter.json
└── wolf-xyz789/
└── trade-counter.json
当信号触发时,它会被路由到最匹配的策略:
DSL 默认值: 设置 DSL 时(例如,使用 --configuration @<path-to-wolf-strategy>/dsl-profile.json 运行 dsl-cli.py add-dsl / update-dsl),使用此技能的 dsl-profile.json 作为默认配置。除非用户通过代理明确提供自定义 DSL 配置,否则请使用它。
python3 scripts/wolf-setup.py --wallet 0x... --strategy-id UUID --budget 2000 \
--chat-id 12345 --name "Conservative XYZ" --dsl-preset conservative --provider anthropic
这将添加到注册表中,而不会干扰正在运行的策略。通过在注册表中设置 enabled: false 来禁用。
在峰值之前入场,而不是在顶部。
排行榜排名确认滞后于价格。当一项资产在一次扫描中从 #31 跳到 #16 时,价格正在实时变动。等到它带着干净的历史记录达到 #7 时,行情已经结束了。速度就是优势。
核心原则: 在排名 #25 时有 2 个理由且大幅跳升 = 入场。在排名 #5 时有 4+ 个理由 = 跳过(已经见顶)。
mcporter list 应显示 senpi)dsl-dynamic-stop-loss 技能与此技能一起安装(提供 dsl-cli.py 和 dsl-v5.py)strategy_create_custom_strategystrategy_top_up 为钱包注入预算资金anthropic、openai 或 google)python3 scripts/wolf-setup.py --wallet 0x... --strategy-id UUID --budget 6500 --chat-id 12345 --provider anthropic
dsl-cli.py 和 dsl-v5.py 路径,并将其存储在 wolf-strategies.json 的全局配置中global.dslCliPath 和 global.dslScriptPath(或设置环境变量 DSL_CLI_PATH)python3 scripts/wolf-migrate-dsl.py
state/{strategyKey}/dsl-{ASSET}.json → dsl/{UUID}/{ASSET}.jsonactive: false)。在切换定时任务之前运行一次。references/cron-templates.md 中的模板创建 5 个 wolf 定时任务 + 每个策略 1 个 DSL 定时任务
cronTemplates.dsl_per_strategy 中 — 直接使用 message 字段要添加第二个策略,请使用不同的钱包/预算再次运行 wolf-setup.py。它会添加到注册表中,并为新策略创建 DSL 定时任务。
---|---|---|---|---|---
1 | 新兴动作者 | 3分钟 | 独立 | scripts/emerging-movers.py | 狩猎 FIRST_JUMP + IMMEDIATE_MOVER 信号 — 主要入场触发器
2 | DSL (每个策略) | 3分钟 | 独立 | dsl-v5.py (DSL 技能) | 一个策略仓位的追踪止损 + 原生 HL SL 同步
3 | SM 翻转检测器 | 5分钟 | 独立 | scripts/sm-flip-check.py | 在 SM 信念崩溃时平仓
4 | 看门狗 | 5分钟 | 独立 | scripts/wolf-monitor.py | 每个策略的保证金缓冲、强平距离(阶段 1 自动平仓在 DSL 配置时由 DSL 定时任务处理)
5 | 健康检查 | 10分钟 | 独立 | scripts/job-health-check.py | 每个策略的孤立 DSL 检测、状态验证
6 | 风险守护者 | 5分钟 | 独立 | scripts/risk-guardian.py | 账户级别防护栏:每日亏损暂停、最大入场次数、连续亏损冷却期
v6.2 变更: DSL 不再是组合运行器。每个策略都有自己的 dsl-v5.py 定时任务(来自 dsl-dynamic-stop-loss 技能),使用 --strategy-id {strategyId_UUID} --state-dir {DSL_STATE_DIR} 运行(环境变量是备用方案)。Wolf 脚本调用 dsl-cli.py (add-dsl / delete-dsl) 来创建和归档 DSL 状态;它们从不直接写入状态。
有 2 个策略时:总共 7 个定时任务 (5 wolf + 2 DSL)。DSL 定时任务 ID 存储在策略注册表的 dslCronJobId 中。
重要: 在运行
wolf-setup.py之前,确定用户配置的 AI 提供商。传递--provider以自动选择正确的模型 ID。不要从未配置的提供商中选择模型 — 定时任务将静默失败。
wolf-setup.py --provider <name> 自动为所有定时任务模板配置模型 ID。对于简单的阈值定时任务,降级到预算模型以节省约 60-70% 的运行成本。
提供商默认值(由 --provider 自动选择):
| 提供商 | 中等模型 | 预算模型 |
|---|---|---|
anthropic | anthropic/claude-sonnet-4-5 | anthropic/claude-haiku-4-5 |
openai | openai/gpt-4o | openai/gpt-4o-mini |
google | google/gemini-2.0-flash | google/gemini-2.0-flash-lite |
| 定时任务 | 会话 | 模型层级 |
| --- | --- | --- |
| 新兴动作者 | 独立 | 中等 |
| DSL (每个策略) | 独立 | 中等 |
| 健康检查 | 独立 | 中等 |
| SM 翻转检测器 | 独立 | 预算 |
| 看门狗 | 独立 | 预算 |
| 风险守护者 | 独立 | 预算 |
单模型选项: 所有 6 个定时任务都可以在一个模型上运行。更简单,但对于执行简单阈值/二元工作的定时任务来说成本更高。
模型 ID 注意事项:
--provider 自动选择模型。仅使用 --mid-model/--budget-model 来覆盖特定层级。claude-3-5-haiku-20241022)或虚构模型名称。始终使用 --provider 而不是手动指定模型 ID。关键: 定时任务是 OpenClaw 定时任务,而不是 senpi 定时任务。所有定时任务都在 独立会话 (agentTurn) 中运行 — 每个都在自己的会话中运行,没有上下文污染,从而可以使用更便宜的模型层级。
使用 OpenClaw 定时任务工具创建每个定时任务。每个定时任务的确切指令文本在 references/cron-templates.md 中。替换占位符 ({TELEGRAM}、{SCRIPTS}、{WORKSPACE})。
DSL 定时任务: 每个策略的 DSL 定时任务指令由 wolf-setup.py 在 cronTemplates.dsl_per_strategy.payload.message 中生成。直接使用它 — wolf-setup.py 从注册表中的 global.dslScriptPath 自动填充 dsl-v5.py 路径。如果路径无法自动发现(占位符 {DSL_SCRIPTS} 仍然存在),请在安装 DSL 技能后从 wolf-strategies.json 读取 global.dslScriptPath 并手动替换。
v6.2: 5 个共享的 wolf 定时任务 + 每个策略 1 个 DSL 定时任务。不再有单个 DSL 组合定时任务。
WOLF 默认自主运行。代理在以下情况下不会请求许可:
代理在每次操作后会通知用户(通过 Telegram)。
内容: 资产在一次扫描中从 #25+ 跳升 10+ 个排名,并且未出现在上一次扫描的前 50 名中(或排名 >= #30)。
操作: 立即入场。这是盈利信号。路由到有可用仓位槽位的最匹配策略。
检查清单:
isFirstJump: truetradingRisk + 资产 maxLeverage + 信号 conviction 自动计算= 10 个 SM 交易者(加密货币);对于 XYZ 股票,忽略交易者数量
忽略的内容:
如果伴随 CONTRIB_EXPLOSION: 双重确认。入场信号更强。
内容: 排名 #20+ 的资产在一次扫描中贡献度增加 3 倍以上。
操作: 即使排名历史看起来“不稳定”,也入场。贡献度飙升本身就是信号,无论之前的排名如何波动。
绝不因不稳定历史而降级。 常伴随 FIRST_JUMP 出现,作为双重确认。
内容: 从 #30+ 稳步攀升,正速度 (>= 0.03),3+ 个理由,干净的排名历史。
操作: 当它进入前 20 名时入场。如果有可用的保守策略,则路由到保守策略。
内容: 从前 50 名之外(上次扫描不在前 50 名)出现在前 20 名。
操作: 立即入场。
这值得单独一节,因为这是使用 WOLF 亏钱的 #1 方式。
模式: 扫描器为排名 #25->#14 的 ASSET 触发 FIRST_JUMP。你犹豫了。下一次扫描是 #10。再下一次扫描是 #7,有 5 个理由和干净的历史记录。现在它看起来“安全”了。你入场了。它从 #5 反转了。
解决方法: 在第一个信号时入场,否则就完全不入场。如果你错过了,等待下一个资产。总会有下一个 FIRST_JUMP 出现。
规则: 如果一项资产已经在前 10 名中停留了 2+ 次扫描,那就太晚了。继续前进。
阶段 1 基于时间的平仓(硬性超时、弱势峰值、无价值仓位)在技能在其 DSL 配置中提供 phase1.hardTimeout、phase1.weakPeakCut 和/或 phase1.deadWeightCut 时,由 DSL 定时任务管理。Wolf-strategy 不在看门狗中实现这些;如果需要,请将其包含在技能的 dsl-profile(或 defaultConfig)中。
在 DSL 中配置时:
原因: 阶段 1 仓位没有追踪止损保护。如果技能在 DSL 配置中启用这些,DSL 定时任务会强制执行它们;wolf-strategy 不再需要管理它们。
所有追踪止损由 dsl-combined.py 在所有策略中自动处理。
信念降至 0 或 4->1 且大量交易者退出 -> 立即平仓。
当 DSL 配置包含 phase1.deadWeightCut 时,DSL 定时任务会平仓那些在配置的分钟数后从未转为正值的仓位(ROE 一直为负)。其他无价值仓位逻辑(例如信念 0,负 ROE)如果需要可以保留在代理指令中。
相反方向的信念 4+ 且有 100+ 交易者 -> 立即平仓。
当任何 wolf 脚本平仓时:
dsl-cli.py delete-dsl {strategyId} {asset} {main|xyz} --state-dir {DSL_STATE_DIR} 来归档 DSL 状态cron_to_remove → 移除该 DSL 定时任务(它是该策略的最后一个仓位)绝不要原地设置 active: false。 DSL v5.2 通过重命名归档文件;原地停用会混淆 dsl-v5.py。
Wolf 将所有 DSL 逻辑委托给 dsl-dynamic-stop-loss 技能。Wolf 的角色:
dsl-cli.py add-dsl {strategyId} {asset} {dex} --skill wolf-strategy --configuration {...} --state-dir {DSL_STATE_DIR}dsl-cli.py delete-dsl {strategyId} {asset} {dex} --state-dir {DSL_STATE_DIR}dsl-v5.py 作为每个策略的定时任务运行,使用 --strategy-id {UUID} --state-dir {DSL_STATE_DIR}(环境变量是备用方案)Wolf 从不直接写入 DSL 状态文件。
edit_position 在 HL 上设置真实的止损订单。在定时任务运行之间,HL 的引擎保护仓位。| 层级 | ROE 触发点 | 锁定高水位线百分比 | 突破次数(共享) |
|---|---|---|---|
| 1 | 5% | 50% | 2(多数来自 wolf 层级配置) |
| 2 | 10% | 65% | 2 |
| 3 | 15% | 75% | 2 |
| 4 | 20% | 85% | 2 |
注意:DSL v5.2 对所有层级使用单一的 consecutiveBreachesRequired。build_wolf_dsl_config() 从 wolf 层级配置中的多数突破次数推导出它。
位置:dsl/{strategyId_UUID}/{ASSET}.json(例如 dsl/6a23783a-.../HYPE.json)。模式请参阅 references/state-schema.md。与 v4 的主要区别:phase1.retraceThreshold 是分数 (0.10),而不是百分比 (10)。
当一个策略的仓位槽位已满且出现新的 FIRST_JUMP 或 IMMEDIATE 信号时:
rotationEligibleCoins 列出的仓位。年龄小于 rotationCooldownMinutes(默认 45 分钟)的仓位不符合条件 — 它们按设计具有持平/负 ROE。不要用判断来覆盖此规则。rotationEligibleCoins)具有持平/负 ROE 且 SM 信念 0-1hasRotationCandidate: false: 所有仓位都在冷却期。不要轮换。输出 HEARTBEAT_OK。所有仓位大小根据预算计算(每个仓位槽位 30%):
| 预算 | 仓位槽位 | 保证金/槽位 | 每日亏损限额 |
|---|---|---|---|
| $500 | 2 | $150 | -$75 |
| $2,000 | 2 | $600 | -$300 |
| $6,500 | 3 | $1,950 | -$975 |
| $10,000+ | 3-4 | $3,000 | -$1,500 |
杠杆根据 tradingRisk + 资产 maxLeverage + 信号 conviction 动态计算每个仓位。请参阅下面的“基于风险的杠杆”部分。
自动去杠杆: 如果一个策略的账户价值低于其 autoDeleverThreshold -> 将该策略的最大仓位槽位减少 1,平掉该策略中最弱的仓位。
python3 scripts/open-position.py --strategy {strategyKey} --asset {ASSET} --direction {DIR} --conviction {CONVICTION} 入场
dsl-cli.py add-dsl 创建 DSL 状态dsl_cron_needed: true — 如果存在,为此策略创建 DSL 定时任务close_position MCP 调用平仓(或 DSL 通过其自己的定时任务自动平仓)dsl-cli.py delete-dsl {strategyId} {asset} {dex} 归档 DSL 状态 — 绝不要直接设置 active: falsecron_to_remove → 移除该 DSL 定时任务leverageType: "ISOLATED" 和 dex: "xyz"XYZ DEX 资产(GOLD、SILVER、TSLA、AAPL 等)表现不同:
leverageType: "ISOLATED", dex: "xyz")。tradingRisk 动态计算。模型层级: 请参阅“每个定时任务的模型选择”表格。复杂定时任务用中等模型,简单阈值定时任务用预算模型。在 OpenClaw 中为每个定时任务配置。
心跳策略: 如果脚本输出不包含可操作信号,立即输出 HEARTBEAT_OK。不要推理未找到的内容。
上下文隔离(多信号运行): 每个定时任务运行只读取一次 wolf-strategies.json。在执行任何工具调用之前,构建完整的行动计划。每次运行发送一条合并的 Telegram 消息,而不是每个信号一条。
跳过规则: 当数据小于 3 分钟时,跳过冗余检查。如果所有仓位槽位已满且没有 FIRST_JUMPs → 跳过扫描器处理。如果 SM 检查显示没有翻转且小于 5 分钟 → 跳过。
杠杆根据每个仓位动态计算,而不是硬编码。公式使用策略的风险层级、资产的最大杠杆和信号信念。
leverage = maxLeverage × (rangeLow + (rangeHigh - rangeLow) × conviction)
clamped to [1, maxLeverage]
| 层级 | 最大杠杆范围 | 示例(40倍最大,中等信念) | 示例(3倍最大,中等信念) |
|---|---|---|---|
conservative | 15% – 25% | 8x | 1x |
moderate | 25% – 50% | 15x | 1x |
aggressive | 50% – 75% | 25x | 2x |
信念 (0.0–1.0) 决定落在层级范围内的哪个位置。它自动从扫描器输出推导:
向 open-position.py 传递 --leverage N 以绕过自动计算(像以前一样受最大杠杆限制)。
tradingRisk 的现有策略默认为 "moderate"max-leverage.json 数据不可用时,注册表中的 defaultLeverage 用作后备风险守护者(第 6 个定时任务,5分钟,预算模型层级)强制执行账户级别的防护栏,保护策略中所有仓位免受失控亏损的影响。每个仓位的 DSL 处理单个追踪止损;防护栏处理整个投资组合。
| 门控 | 含义 | 重置 |
|---|---|---|
OPEN | 正常交易 | — |
COOLDOWN | 连续亏损后的临时暂停 | 在 cooldownMinutes 后自动过期 |
CLOSED | 当日暂停 | UTC 午夜 |
当门控 != OPEN 时,open-position.py 拒绝新入场,并且 emerging-movers.py 为该策略显示 available: 0。
| 规则 | 触发条件 | 操作 |
|---|---|---|
| G1 每日亏损暂停 | accountValue - accountValueStart <= -dailyLossLimit | 门控 → CLOSED |
| G3 最大入场次数 | entries >= maxEntriesPerDay(如果盈利日 + bypassOnProfit 则绕过) | 门控 → CLOSED |
| G4 连续亏损 | 最后 N 个结果都是 "L" (N = maxConsecutiveLosses) | 门控 → COOLDOWN 持续 cooldownMinutes |
guardRails){
"guardRails": {
"maxEntriesPerDay": 8,
"bypassOnProfit": true,
"maxConsecutiveLosses": 3,
"cooldownMinutes": 60
}
}
所有参数都是可选的 — 任何缺失的键都使用默认值。在 wolf-strategies.json 中为每个策略设置。
wolf_config.py 在首次加载时自动将旧的 wolf-strategy.json 迁移到注册表格式python3 scripts/wolf-migrate-dsl.py。将活动的 state/{strategyKey}/dsl-{ASSET}.json 文件移动到 dsl/{UUID}/{ASSET}.json。旧文件被标记(active: false)。必须在切换到 DSL v5 定时任务之前运行。已知错误、注意事项和交易纪律规则请参阅 references/learnings.md。关键点:
dryRun: true 实际上会执行 — 绝不要使用 dryRunmax-leverage.jsonclose_position 是平仓工具 — 不是 edit_position| 脚本 | 目的 |
|---|---|
scripts/wolf-setup.py | 设置向导 — 将策略添加到注册表,创建 DSL 策略配置 + 定时任务 |
scripts/wolf_config.py | 共享配置加载器 — 所有脚本都导入此文件;提供 resolve_dsl_cli_path()、build_wolf_dsl_config() |
scripts/emerging-movers.py | 新兴动作者 v4 扫描器(FIRST_JUMP、IMMEDIATE、CONTRIB_EXPLOSION) |
scripts/open-position.py | 开仓 + 原子性地调用 dsl-cli.py add-dsl |
scripts/sm-flip-check.py | SM 信念翻转检测器(多策略) |
scripts/wolf-monitor.py | 看门狗 — 每个策略的保证金缓冲,阶段1自动平仓 + delete-dsl |
scripts/job-health-check.py | 每个策略的孤立 DSL / 状态验证 — 通过 CLI 自动修复 |
scripts/risk-guardian.py | 风险守护者 — 账户级别防护栏(每日亏损、最大入场次数、连续亏损冷却期) |
scripts/wolf-migrate-dsl.py | 一次性迁移:将 DSL 状态从 v4 路径移动到 v5.2 路径 |
(DSL 技能) dsl-cli.py | DSL 生命周期 CLI:add-dsl、delete-dsl、pause-dsl、resume-dsl |
(DSL 技能) dsl-v5.py | DSL 定时任务运行器:追踪止损 + 原生 HL SL 同步,每个策略一个 |
MIT — 由 Senpi (https://senpi.ai) 构建。源代码:https://github.com/Senpi-ai/senpi-skills
每周安装次数
193
仓库
GitHub 星标数
52
首次出现
2026年2月27日
安全审计
安装于
openclaw189
opencode170
gemini-cli170
github-copilot170
codex170
kimi-cli170
The WOLF hunts for its human. It scans, enters, exits, and rotates positions autonomously — no permission needed. When criteria are met, it acts. Speed is edge.
Proven: +$1,500 realized, 25+ trades, 65% win rate, single session on $6.5k budget.
v6: Multi-strategy support. Each strategy has independent wallet, budget, slots, and DSL config. Same asset can be held in different strategies simultaneously (e.g., Strategy A LONG HYPE + Strategy B SHORT HYPE).
v6.1.1: Risk Guardian & strategy lock. 6th cron (5min, Budget tier) enforcing account-level guard rails — daily loss halt, max entries per day, consecutive loss cooldown. Strategy lock for concurrency protection. Gate check in open-position.py refuses new entries when gate != OPEN.
v6.3: DSL v5.3.1 High Water. Default DSL profile and strategy config use High Water Mode (lockMode: pct_of_high_water) with lockHwPct tiers and per-tier consecutiveBreachesRequired. One DSL cron per strategy runs dsl-v5.py (v5.3.1); state files in {workspace}/dsl/{strategyId_UUID}/. Migration script: wolf-migrate-dsl.py.
v6.2: DSL v5.2 integration. Replaced internal dsl-combined.py with the dsl-dynamic-stop-loss skill. Native Hyperliquid stop-loss sync via dsl-v5.py.
When creating a strategy, include skill_name and skill_version in the call. See references/skill-attribution.md for details.
wolf-strategies.json)Central config holding all strategies. Created/updated by wolf-setup.py.
wolf-strategies.json
├── strategies
│ ├── wolf-abc123 (Aggressive Momentum, 3 slots, tradingRisk=aggressive)
│ └── wolf-xyz789 (Conservative XYZ, 2 slots, tradingRisk=conservative)
└── global (telegram, workspace)
DSL state files live under the DSL skill's directory (by strategy UUID). Wolf-specific state (trade counters) stays in state/:
dsl/ # owned by dsl-dynamic-stop-loss skill
├── abc12345-.../ # Strategy A UUID
│ ├── strategy-abc12345....json # DSL strategy config
│ ├── HYPE.json # Position state
│ └── xyz--SILVER.json # XYZ position
└── xyz78901-.../ # Strategy B UUID
└── HYPE.json # Same asset, different UUID dir, no collision
state/ # wolf-only state (no DSL files here)
├── wolf-abc123/
│ └── trade-counter.json
└── wolf-xyz789/
└── trade-counter.json
When a signal fires, it's routed to the best-fit strategy:
DSL default: Use this skill's dsl-profile.json as the default when setting up DSL (e.g. dsl-cli.py add-dsl / update-dsl with --configuration @<path-to-wolf-strategy>/dsl-profile.json). Use it unless the user explicitly provides a custom DSL configuration via the agent.
python3 scripts/wolf-setup.py --wallet 0x... --strategy-id UUID --budget 2000 \
--chat-id 12345 --name "Conservative XYZ" --dsl-preset conservative --provider anthropic
This adds to the registry without disrupting running strategies. Disable with enabled: false in the registry.
Enter before the peak, not at the top.
Leaderboard rank confirmation LAGS price. When an asset jumps from #31->#16 in one scan, the price is moving NOW. By the time it reaches #7 with clean history, the move is over. Speed is edge.
Core principle: 2 reasons at rank #25 with a big jump = ENTER. 4+ reasons at rank #5 = SKIP (already peaked).
mcporter list should show senpi)dsl-dynamic-stop-loss skill is installed alongside this skill (provides dsl-cli.py and dsl-v5.py)strategy_create_custom_strategy via mcporterstrategy_top_up with your budgetanthropic, openai, or google)To add a second strategy, run wolf-setup.py again with a different wallet/budget. It adds to the registry and creates the DSL cron for the new strategy.
---|---|---|---|---|---
1 | Emerging Movers | 3min | isolated | scripts/emerging-movers.py | Hunt FIRST_JUMP + IMMEDIATE_MOVER signals — primary entry trigger
2 | DSL (per strategy) | 3min | isolated | dsl-v5.py (DSL skill) | Trailing stops + native HL SL sync for ONE strategy's positions
3 | SM Flip Detector | 5min | isolated | scripts/sm-flip-check.py | Cut positions where SM conviction collapses
4 | Watchdog | 5min | isolated | scripts/wolf-monitor.py | Per-strategy margin buffer, liq distances (Phase 1 auto-cut is handled by DSL cron when configured)
5 | Health Check | 10min | isolated | scripts/job-health-check.py | Per-strategy orphan DSL detection, state validation
6 | Risk Guardian | 5min | isolated | scripts/risk-guardian.py | Account-level guard rails: daily loss halt, max entries, consecutive loss cooldown
v6.2 change: DSL is no longer a combined runner. Each strategy has its own dsl-v5.py cron (from the dsl-dynamic-stop-loss skill), run with --strategy-id {strategyId_UUID} --state-dir {DSL_STATE_DIR} (env vars are fallback). Wolf scripts call dsl-cli.py (add-dsl / delete-dsl) to create and archive DSL state; they never write state directly.
With 2 strategies: 7 crons total (5 wolf + 2 DSL). DSL cron IDs are stored in dslCronJobId in the strategy registry.
IMPORTANT: Determine the user's configured AI provider BEFORE running
wolf-setup.py. Pass--providerto auto-select correct model IDs. Do NOT pick models from an unconfigured provider — crons will fail silently.
wolf-setup.py --provider <name> auto-configures model IDs for all cron templates. Step down to Budget tier for simple threshold crons to save ~60-70% on those runs.
Provider defaults (auto-selected by --provider):
| Provider | Mid Model | Budget Model |
|---|---|---|
anthropic | anthropic/claude-sonnet-4-5 | anthropic/claude-haiku-4-5 |
openai | openai/gpt-4o | openai/gpt-4o-mini |
google | google/gemini-2.0-flash |
Single-model option: All 6 crons can run on one model. Simpler but costs more for the crons that do simple threshold/binary work.
Model ID gotchas:
--provider auto-selects models. Only use --mid-model/--budget-model to override specific tiers.claude-3-5-haiku-20241022) or hallucinate model names. Always use --provider instead of manually specifying model IDs.Critical: Crons are OpenClaw crons , NOT senpi crons. All crons run in isolated sessions (agentTurn) — each runs in its own session with no context pollution, enabling cheaper model tiers.
Create each cron using the OpenClaw cron tool. The exact mandate text for each cron is in references/cron-templates.md. Replace placeholders ({TELEGRAM}, {SCRIPTS}, {WORKSPACE}).
DSL cron: The DSL per-strategy cron mandate is generated by wolf-setup.py in cronTemplates.dsl_per_strategy.payload.message. Use it directly — wolf-setup.py auto-fills the dsl-v5.py path from global.dslScriptPath in the registry. If the path could not be auto-discovered (placeholder {DSL_SCRIPTS} still present), read global.dslScriptPath from wolf-strategies.json after installing the DSL skill and substitute it manually.
v6.2: 5 shared wolf crons + 1 DSL cron per strategy. No more single DSL Combined cron.
The WOLF operates autonomously by default. The agent does NOT ask permission to:
The agent DOES notify the user (via Telegram) after every action.
What: Asset jumps 10+ ranks from #25+ in ONE scan AND was not in previous scan's top 50 (or was at rank >= #30).
Action: Enter IMMEDIATELY. This is the money signal. Route to best-fit strategy with available slots.
Checklist:
isFirstJump: true in scanner outputtradingRisk + asset maxLeverage + signal conviction= 10 SM traders (crypto); for XYZ equities, ignore trader count
What to ignore:
If CONTRIB_EXPLOSION accompanies it: Double confirmation. Even stronger entry.
What: 3x+ contribution increase in one scan from asset at rank #20+.
Action: Enter even if rank history looks "erratic." The contrib spike IS the signal regardless of prior rank bouncing.
Never downgraded for erratic history. Often accompanies FIRST_JUMP for double confirmation.
What: Steady climb from #30+, positive velocity (>= 0.03), 3+ reasons, clean rank history.
Action: Enter when it crosses into top 20. Route to conservative strategy if available.
What: Appears in top 20 from nowhere (wasn't in top 50 last scan).
Action: Instant entry.
This deserves its own section because it's the #1 way to lose money with WOLF.
The pattern: Scanner fires FIRST_JUMP for ASSET at #25->#14. You hesitate. Next scan it's #10. Next scan #7 with 5 reasons and clean history. NOW it looks "safe." You enter. It reverses from #5.
The fix: Enter on the FIRST signal or don't enter at all. If you missed it, wait for the next asset. There's always another FIRST_JUMP coming.
Rule: If an asset has been in the top 10 for 2+ scans already, it's too late. Move on.
Phase 1 time-based cuts (hard timeout, weak peak, dead weight) are managed by the DSL cron when the skill supplies phase1.hardTimeout, phase1.weakPeakCut, and/or phase1.deadWeightCut in its DSL config. Wolf-strategy does not implement these in the Watchdog; include them in the skill's dsl-profile (or defaultConfig) if desired.
When configured in DSL:
Why: Phase 1 positions have no trailing stop protection. If the skill enables these in DSL config, the DSL cron enforces them; wolf-strategy no longer needs to manage them.
All trailing stops handled automatically by dsl-combined.py across all strategies.
Conv drops to 0 or 4->1 with mass trader exodus -> instant cut.
When DSL config includes phase1.deadWeightCut, the DSL cron closes positions that have never gone positive (ROE negative entire time) after the configured minutes. Other dead-weight logic (e.g. conv 0, negative ROE) can remain in agent mandate if desired.
Conviction 4+ in the OPPOSITE direction with 100+ traders -> cut immediately.
When ANY wolf script closes a position:
dsl-cli.py delete-dsl {strategyId} {asset} {main|xyz} --state-dir {DSL_STATE_DIR} to archive the DSL statecron_to_remove → remove that DSL cron (it was the last position for that strategy)Never setactive: false in place. DSL v5.2 archives files by rename; an in-place deactivation will confuse dsl-v5.py.
Wolf delegates all DSL logic to the dsl-dynamic-stop-loss skill. Wolf's role:
dsl-cli.py add-dsl {strategyId} {asset} {dex} --skill wolf-strategy --configuration {...} --state-dir {DSL_STATE_DIR} after opening a positiondsl-cli.py delete-dsl {strategyId} {asset} {dex} --state-dir {DSL_STATE_DIR} after closing a positiondsl-v5.py runs as a per-strategy cron with --strategy-id {UUID} --state-dir {DSL_STATE_DIR} (env vars are fallback)Wolf never writes DSL state files directly.
edit_position. Between cron runs, HL's engine protects the position.| Tier | ROE Trigger | Lock % of High-Water | Breaches (shared) |
|---|---|---|---|
| 1 | 5% | 50% | 2 (majority from wolf tier config) |
| 2 | 10% | 65% | 2 |
| 3 | 15% | 75% | 2 |
| 4 | 20% | 85% | 2 |
Note: DSL v5.2 uses a single consecutiveBreachesRequired for all tiers. build_wolf_dsl_config() derives it from the majority breach count in wolf's tier config.
Location: dsl/{strategyId_UUID}/{ASSET}.json (e.g. dsl/6a23783a-.../HYPE.json). See references/state-schema.md for schema. Key difference from v4: phase1.retraceThreshold is a fraction (0.10), not a percentage (10).
When slots are full in a strategy and a new FIRST_JUMP or IMMEDIATE fires:
rotationEligibleCoins from the scanner output. Positions younger than rotationCooldownMinutes (default 45 min) are ineligible — they have flat/negative ROE by design. Do NOT override this with judgment.rotationEligibleCoins) is flat/negative ROE with SM conv 0-1hasRotationCandidate: false: all positions are in cooldown. Do not rotate. Output HEARTBEAT_OK.All sizing is calculated from budget (30% per slot):
| Budget | Slots | Margin/Slot | Daily Loss Limit |
|---|---|---|---|
| $500 | 2 | $150 | -$75 |
| $2,000 | 2 | $600 | -$300 |
| $6,500 | 3 | $1,950 | -$975 |
| $10,000+ | 3-4 | $3,000 | -$1,500 |
Leverage is computed dynamically per position from tradingRisk + asset maxLeverage + signal conviction. See "Risk-Based Leverage" section below.
Auto-Delever: If a strategy's account drops below its autoDeleverThreshold -> reduce max slots by 1, close weakest in that strategy.
python3 scripts/open-position.py --strategy {strategyKey} --asset {ASSET} --direction {DIR} --conviction {CONVICTION}
dsl-cli.py add-dsl to create DSL statedsl_cron_needed: true — if present, create the DSL cron for this strategyclose_position MCP call (or DSL auto-closes via its own cron)dsl-cli.py delete-dsl {strategyId} {asset} {dex} to archive DSL state — never setactive: false directlycron_to_remove → remove that DSL cronleverageType: "ISOLATED" and dex: "xyz"XYZ DEX assets (GOLD, SILVER, TSLA, AAPL, etc.) behave differently:
leverageType: "ISOLATED", dex: "xyz").tradingRisk.Model tiers: See "Model Selection Per Cron" table. Mid for complex crons, Budget for simple threshold crons. Configure per-cron in OpenClaw.
Heartbeat policy: If script output contains no actionable signals, output HEARTBEAT_OK immediately. Do not reason about what wasn't found.
Context isolation (multi-signal runs): Read wolf-strategies.json ONCE per cron run. Build a complete action plan before executing any tool calls. Send ONE consolidated Telegram per run, not one per signal.
Skip rules: Skip redundant checks when data < 3 min old. If all slots full and no FIRST_JUMPs → skip scanner processing. If SM check shows no flips and < 5 min old → skip.
Leverage is computed dynamically per position instead of being hardcoded. The formula uses the strategy's risk tier , the asset's max leverage , and signal conviction.
leverage = maxLeverage × (rangeLow + (rangeHigh - rangeLow) × conviction)
clamped to [1, maxLeverage]
| Tier | Range of Max Leverage | Example (40x max, mid conviction) | Example (3x max, mid conviction) |
|---|---|---|---|
conservative | 15% – 25% | 8x | 1x |
moderate | 25% – 50% | 15x | 1x |
aggressive | 50% – 75% | 25x | 2x |
Conviction (0.0–1.0) determines where within a tier's range to land. It's auto-derived from scanner output:
Pass --leverage N to open-position.py to bypass auto-calculation (capped against max leverage as before).
tradingRisk default to "moderate"defaultLeverage in the registry is used as fallback when max-leverage.json data is unavailableThe Risk Guardian (6th cron, 5min, Budget tier) enforces account-level guard rails that protect against runaway losses across all positions in a strategy. Per-position DSL handles individual trailing stops; guard rails handle the portfolio.
| Gate | Meaning | Resets |
|---|---|---|
OPEN | Normal trading | — |
COOLDOWN | Temporary pause after consecutive losses | Auto-expires after cooldownMinutes |
CLOSED | Halted for the day | Midnight UTC |
When gate != OPEN, open-position.py refuses new entries and emerging-movers.py shows available: 0 for that strategy.
| Rule | Trigger | Action |
|---|---|---|
| G1 Daily Loss Halt | accountValue - accountValueStart <= -dailyLossLimit | Gate → CLOSED |
| G3 Max Entries | entries >= maxEntriesPerDay (bypass if profitable day + bypassOnProfit) | Gate → CLOSED |
| G4 Consecutive Losses | Last N results all "L" (N = maxConsecutiveLosses) | Gate → COOLDOWN for cooldownMinutes |
guardRails in strategy registry){
"guardRails": {
"maxEntriesPerDay": 8,
"bypassOnProfit": true,
"maxConsecutiveLosses": 3,
"cooldownMinutes": 60
}
}
All parameters are optional — defaults are used for any missing key. Set per strategy in wolf-strategies.json.
wolf_config.py auto-migrates legacy wolf-strategy.json to registry format on first loadpython3 scripts/wolf-migrate-dsl.py once. Moves active state/{strategyKey}/dsl-{ASSET}.json files to dsl/{UUID}/{ASSET}.json. Old files tombstoned (active: false). Must run before switching to DSL v5 crons.See references/learnings.md for known bugs, gotchas, and trading discipline rules. Key ones:
dryRun: true actually executes — NEVER use dryRunmax-leverage.jsonclose_position is the close tool — not edit_position| Script | Purpose |
|---|---|
scripts/wolf-setup.py | Setup wizard — adds strategy to registry, creates DSL strategy config + cron |
scripts/wolf_config.py | Shared config loader — all scripts import this; provides resolve_dsl_cli_path(), build_wolf_dsl_config() |
scripts/emerging-movers.py | Emerging Movers v4 scanner (FIRST_JUMP, IMMEDIATE, CONTRIB_EXPLOSION) |
scripts/open-position.py | Opens position + calls dsl-cli.py add-dsl atomically |
MIT — Built by Senpi (https://senpi.ai). Source: https://github.com/Senpi-ai/senpi-skills
Weekly Installs
193
Repository
GitHub Stars
52
First Seen
Feb 27, 2026
Security Audits
Gen Agent Trust HubPassSocketWarnSnykWarn
Installed on
openclaw189
opencode170
gemini-cli170
github-copilot170
codex170
kimi-cli170
通过 LiteLLM 代理让 Claude Code 对接 GitHub Copilot 运行 | 高级变通方案指南
31,600 周安装
Dictionary API自动化教程:通过Rube MCP和Composio实现词典API操作自动化
1 周安装
detrack-automation:自动化追踪技能,集成Claude AI提升开发效率
1 周安装
Demio自动化工具包:通过Rube MCP和Composio实现Demio操作自动化
1 周安装
供应商评估工具:结构化分析成本、风险、绩效与匹配度 | 开源AI插件
186 周安装
Deel自动化工具:通过Rube MCP与Composio实现HR与薪资操作自动化
1 周安装
perf-baseline-manager - 性能基准管理与比较工具 | 版本化性能测试
2 周安装
python3 scripts/wolf-setup.py --wallet 0x... --strategy-id UUID --budget 6500 --chat-id 12345 --provider anthropic
dsl-cli.py and dsl-v5.py paths and stores them in wolf-strategies.json global configglobal.dslCliPath and global.dslScriptPath manually in the registry (or set env DSL_CLI_PATH)python3 scripts/wolf-migrate-dsl.py
state/{strategyKey}/dsl-{ASSET}.json → dsl/{UUID}/{ASSET}.jsonactive: false). Run once before switching crons.references/cron-templates.md
cronTemplates.dsl_per_strategy from setup output — use the message field directlygoogle/gemini-2.0-flash-lite |
| Cron | Session | Model Tier |
| --- | --- | --- |
| Emerging Movers | isolated | Mid |
| DSL (per strategy) | isolated | Mid |
| Health Check | isolated | Mid |
| SM Flip Detector | isolated | Budget |
| Watchdog | isolated | Budget |
| Risk Guardian | isolated | Budget |
scripts/sm-flip-check.py | SM conviction flip detector (multi-strategy) |
scripts/wolf-monitor.py | Watchdog — per-strategy margin buffer, phase1 auto-cut + delete-dsl |
scripts/job-health-check.py | Per-strategy orphan DSL / state validation — auto-heals via CLI |
scripts/risk-guardian.py | Risk Guardian — account-level guard rails (daily loss, max entries, consecutive loss cooldown) |
scripts/wolf-migrate-dsl.py | One-time migration: moves DSL state from v4 path to v5.2 path |
(DSL skill) dsl-cli.py | DSL lifecycle CLI: add-dsl, delete-dsl, pause-dsl, resume-dsl |
(DSL skill) dsl-v5.py | DSL cron runner: trailing stops + native HL SL sync, one per strategy |