VIPER v2.1 — Range-bound liquidity sniper. Enters at support/resistance when Bollinger Bands are tight, ATR is low, RSI is at extremes within the range, and volume is declining. Works when nothing is trending — the chop predator. USD-weighted OI filtering (min $5M). DSL High Water Mode (mandatory). 5-minute scan interval. Second-best performer in the Senpi zoo at +6.2% ROI.
The chop predator. When every momentum strategy is sitting idle because nothing is trending, VIPER is working.
+6.2% ROI and climbing. Second-best performer on the Senpi Predators tracker.
VIPER scans the top 25 assets by USD-weighted open interest every 5 minutes. It looks for assets stuck in a range — price bouncing between support and resistance — and enters at the boundaries:
The edge: range-bound markets are predictable. Support holds, resistance holds, and the bounce is mechanical. VIPER catches that bounce.
VIPER MUST use DSL High Water Mode. This is not optional.
When creating DSL state files for any VIPER position, you MUST include:
{
"lockMode": "pct_of_high_water",
"phase2TriggerRoe": 5,
"tiers": [
{"triggerPct": 5, "lockHwPct": 30, "consecutiveBreachesRequired": 3},
{"triggerPct": 10, "lockHwPct": 50, "consecutiveBreachesRequired": 2},
{"triggerPct": 15, "lockHwPct": 70, "consecutiveBreachesRequired": 2},
{"triggerPct": 20, "lockHwPct": 85, "consecutiveBreachesRequired": 1}
]
}
If tiers or lockMode is missing from the state file, the DSL engine falls back to flat 1.5% retrace and High Water Mode is silently disabled. Always verify the state file contains these fields after creation.
FALLBACK (until DSL engine supports pct_of_high_water): Use tiersLegacyFallback from config.
| Signal | Requirement |
|---|---|
| Bollinger Band width | < 4% (tight range) |
| ATR | < 1.5% (low volatility) |
| RSI | Oversold (< 35) for longs, overbought (> 65) for shorts |
| Volume | Declining (sellers/buyers exhausting) |
| OI (USD-weighted) | ≥ $5M (liquid enough to trade) |
| Min score | 5 |
All filters must pass. If any fails, skip. VIPER is selective — most scans produce zero signals.
| Setting | Value |
|---|---|
| Hard timeout | Disabled (0) |
| Weak peak cut | Disabled (0) |
| Dead weight | Disabled (0) |
| Floor base | 1.5% notional |
No time exits. If the range breaks, the floor catches it. If the range holds, patience wins.
| Tier | Trigger ROE | Lock (% of HW) | Breaches |
|---|---|---|---|
| 1 | 5% | 30% | 3 |
| 2 | 10% | 50% | 2 |
| 3 | 15% | 70% | 2 |
| 4 | 20%+ | 85% | 1 (infinite trail) |
Phase 2 triggers at +5% ROE (lower than momentum skills — range profits are smaller, start protecting earlier).
5% ROE stale for 30 minutes → close. Range bounces play out quickly. If the profit stalls, take it.
| Setting | Value |
|---|---|
| Margin per trade | 28% of account |
| Max positions | 3 |
| Leverage | Default 10x |
3 slots × 28% = 84% utilization. VIPER deploys capital aggressively because range entries have higher win rates.
| Rule | Value |
|---|---|
| Max entries/day | 8 |
| Daily loss limit | 8% |
| Max drawdown | 18% |
| Max single loss | 5% of account |
| Max consecutive losses | 4 → 20 min cooldown |
| Cron | Interval | Session | Purpose |
|---|---|---|---|
| Scanner | 5 min | isolated | Range detection + entry signals |
| DSL v5 | 3 min | isolated | High Water Mode trailing stops |
Both MUST be isolated sessions with agentTurn. Use NO_REPLY for idle cycles.
ONLY alert: Position OPENED (asset, direction, support/resistance level, score), position CLOSED (DSL or structural exit), risk triggered, critical error.
NEVER alert: Scanner found nothing, DSL routine, any reasoning.
All crons isolated. NO_REPLY for idle cycles.
On EVERY session, check config/bootstrap-complete.json. If missing:
config/bootstrap-complete.jsonVIPER is proven at +6.2% ROI as-is. One variant is available:
| Strategy | What Changes | When To Consider |
|---|---|---|
| MAMBA | VIPER entries + High Water Mode with wider tiers | When you want to capture range breakouts that escape into trends |
Start with vanilla VIPER. MAMBA is the upgrade path for capturing more from breakout trades.
| Metric | Expected |
|---|---|
| Trades/day | 3-8 |
| Win rate | ~60-65% (range entries are predictable) |
| Avg winner | 5-15% ROE |
| Avg loser | -8 to -12% ROE |
| Fee drag/day | $8-20 |
| Profit factor | Target 1.2-1.5 |
| File | Purpose |
|---|---|
scripts/viper-scanner.py | Range detection + entry signals |
scripts/viper_config.py | Shared config, MCP helpers, state I/O |
config/viper-config.json | All configurable variables with DSL High Water tiers + legacy fallback |
| DSL v5 (shared) | Trailing stop engine — MUST be configured with High Water Mode |
MIT — Built by Senpi (https://senpi.ai). Source: https://github.com/Senpi-ai/senpi-skills
When creating a strategy, include skill_name and skill_version in the call. See references/skill-attribution.md for details.