roach-strategy について
roach-strategyは、Senpi runtime向けのStriker専用トレードスキルです。Producerが条件に合う市場シグナルを検出してruntimeに渡し、ポジション執行とリスク管理はruntimeが担います。
主な機能
- 0190秒間隔の市場シグナルProducer
- 02Strikerシグナルの条件判定とクールダウン
- 03runtimeによる執行とリスク制限の管理
- 04Maker優先、Takerフォールバックの決済
- 05デーモンの稼働状況と活動の監視
活用シーン
- 01条件を満たす市場シグナルのSenpi runtimeへの送信
- 02runtimeのリスク制限下でのストラテジー運用
- 03Producerデーモンの稼働状況とシグナル活動の監視
インストール
コマンドをコピーしてターミナルで実行します。
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 |
|---|---|---|
| 取引ループ | エージェントがスキャナーを実行し、エージェントが create_position を呼び出す | Producer が SenpiClient.push_signal() でシグナルを送信し、ランタイムが実行を管理 |
| エントリーゲート | エージェントが判断 | LLM パススルーゲート(Producer がすでにフィルタリング済み) |
| 決済 | runtime.yaml を介した DSL(良好) | 同じ DSL プリセットですが、FEE_OPTIMIZED_LIMIT 注文タイプを使用 — 60 秒間はメイカーを優先し、その後テイカーにフォールバック |
| リスクゲート | エージェントがスキャナーコード内で適用 | runtime.risk.guard_rails による宣言的な設定 |
| アセットごとのクールダウン | Producer の状態ファイル | ランタイムと Producer の両方(多層防御) |
v2 の理由: v1 はすべての決済で MARKET 注文を使用しており、HL のテイカー手数料として決済ごとに約 3 bp を支払っていました。直近の 25 件の取引サンプルでは、HL 手数料は $46 で、100% がテイカーでした。v2 の FEE_OPTIMIZED_LIMIT は、ensure_execution_as_taker: true と 60 秒のタイムアウトを設定し、メイカー約定を優先しつつ、ポジションを決済する必要がある場合はテイカーへのフォールバックを許容します。期待される回収率は、HL の決済手数料の 50~70% です。
v1.2 から投資仮説を維持: Stalker は無効。Striker のみ。#25 位以下からの FIRST_JUMP、順位上昇が 15 以上、または contribVelocity が 15 以上、理由が 4 つ以上でスコア 10 以上、出来高 1.5 倍、1 時間足の価格が一致、4 時間足のトレンドが一致、XYZ は禁止。
ファイル
| ファイル | 目的 |
|---|---|
runtime.yaml | senpi-trading-runtime の仕様(スキャナー、アクション、決済 DSL、guard_rails) |
scripts/roach-producer.py | Cron 駆動の Producer — Striker シグナルをランタイムに送信 |
scripts/roach_config.py | MCP ヘルパーの共通処理とアトミックな状態 I/O |
config/roach-config.json | オペレーターが調整できるデフォルト値(参考情報。Producer の定数が優先されます) |
Producer の動作
常駐デーモンとして 90 秒ごとに実行されます(producer_daemon 経由。古い PID の自動復旧機能を備えた scanner_lock はデーモンが管理します)。各ティックで次を実行します。
- 再入防止ガード:
state/<wallet-hash>/producer.lockを取得します。前回の実行でロックが解放されていない場合(Cron の間隔が MCP のレイテンシーより短い場合)、今回の実行は問題なくスキップされます。 - マーケットを取得:
leaderboard_get_markets(上位 50 件。解析時に XYZ を除外)。 - Striker シグナルを検出: スキャン履歴と比較し、順位の上昇、contribVelocity、寄与の急増を検出します。
- 厳格なゲートを適用: 4 時間足のトレンドが一致、cc_15m >= 0.5、1 時間足の価格が 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 ホストのランタイムレジストリがサポートする任意のモデルを選んでください。 |
Producer が読み込む環境変数は次のとおりです。
| 変数 | 目的 | デフォルト |
|---|---|---|
ROACH_WALLET | ウォレット(ランタイム YAML のウォレットと一致する必要があります)。設計上、エージェント固有です。汎用の STRATEGY_ADDRESS は使用しないでください。 Turbine v2.0.9 の混入修正によると、複数のエージェントが同じインストール環境を共有する場合、共有環境変数はフリート全体に影響する要因になります。 | —(必須。設定されていない場合、Producer は明示的に失敗します) |
OPENCLAW_BIN | CLI バイナリ名 | openclaw |
EXTERNAL_SCANNER_NAME | スキャナー ID | roach_signals |
ROACH_LEVERAGE | シグナルペイロードで指定するレバレッジ | 7 |
ROACH_MARGIN_USD | シグナルペイロードで指定するスロットごとの証拠金 | 250 |
プロデューサーのインストール(OpenClaw ホスト上)
senpi-skills リポジトリ内のソースパス:roach/。OpenClaw ホスト上のインストール先:/data/workspace/skills/roach-strategy/。2つの名前は異なります。リポジトリでは roach、インストールディレクトリでは SKILL.md の name フィールド(roach-strategy)を使用します。
オペレーター向けのインストール手順全体は README.md にあります。5段階の手順です(openclaw.json へのプラグイン登録 → senpi-trading-runtime スキルのインストール → Roach ファイルの取得 → 環境変数の設定 → ランタイムの再作成とデーモンの起動 → スモークテスト)。
インストール後は、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
プロデューサーの状態を確認します(ウォレットごとのスキャン履歴)。
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.
リスク範囲(宣言型、ランタイムによる強制)
| 設定 | 値 |
|---|---|
| スロット(同時保有ポジションの上限) | 2 |
| スロットあたりの証拠金 | $250 |
| デフォルトのレバレッジ | 7x |
| 日次損失による停止 | 10% |
| ドローダウンによる停止 | 25% |
| 1日あたりのエントリー上限 | 6 |
| 最大連敗数 | 3 |
| 損失後のクールダウン | 30 min |
| 資産ごとのクールダウン | 120 min |
| XYZ 株式 | プロデューサーのスキャン段階で禁止 |
想定される動作
| 指標 | 予想 |
|---|---|
| 1日あたりの取引数(横ばい相場) | 0-1 |
| 1日あたりの取引数(トレンド相場) | 1-3 |
| 取引がゼロの日 | よくあることで、正常です |
| 勝率 | 目標 50-70%(Striker 品質) |
| 決済あたりの平均手数料 | v1 より大幅に低い(メイカー約定) |
| 手数料合計 / 出来高 | v1 のベースライン比で約 50-70% 削減 |
静かな状態が正常です。 Roach が24~48時間取引を行わない場合、それは取引に値する FIRST_JUMP の急騰がなかったことを意味します。これは実験が機能しているということであり、バグではありません。
v2 で削除されたもの
削除済み(責務はランタイムに移行):
roach-scanner.py(roach-producer.pyに置き換え)- 取引カウンター / 日次損失の追跡(ランタイムの guard_rails)
- ブートストラップゲート / config/bootstrap-complete.json(ランタイムのインストール処理が状態を管理)
- スキャナーでの資産クールダウン管理(多層防御としてプロデューサーには引き続きありますが、権限を持つのはランタイムです)
- PnL に基づく動的スロット数(スロットはランタイムが管理)
- すべての
create_position呼び出し(実行はランタイムが管理)
恒久的に無効化(v1.0 で決定):
- Stalker モードと、すべての蓄積検出
- XYZ 株式(スキャン段階で禁止)
ライセンス
MIT — Senpi が開発(https://senpi.ai)。 ソース:https://github.com/Senpi-ai/senpi-skills
スキルの帰属情報
戦略を作成するときは、呼び出しに skill_name と skill_version を含めてください。詳細は references/skill-attribution.md を参照してください。