A comprehensive cross-mode reference for what triggers what, when, and why. Use this to answer questions like “will my Sentinel position stop out if it drops 30%?” and “why didn't my Sniper take partial profits at +30%?” — without having to read the source.
Every parameter default and trigger condition documented here is grounded in the actual code. If you find a discrepancy between this page and observed bot behavior, the bot is right and we'll update.
Each of the four modes reacts to a different kind of signal. The single most useful question you can ask when picking a mode is:
That sentence is the entire product in compressed form. Everything below is the elaboration.
Each cell shows whether that exit trigger fires for that mode. ✓ means the trigger is active; dash means the mode does not react to that condition.
| Trigger | Sniper | Sentinel | Designate | Shadow |
|---|---|---|---|---|
STOP_LOSSPrice drops below the per-position floor |
✓ configurable % | — | ✓ default 15% | — |
TRAILING_STOPLocks in profit after position arms |
✓ tiered (15/25/40) | — | ✓ single tier | — |
TAKE_PROFITSells at fixed % gain (if configured) |
✓ if set | — | ✓ if set | — |
PARTIAL_LADDERSells in steps as profit grows |
✓ default [+15/20%, +40/30%] | — | — | — |
TIME_EXITSells after holding too long |
✓ default 120h | — | — | — |
SIGNAL_EXITSells on signal decay |
✓ | — | — | — |
Drift rebalanceTrim outperformers to target weight |
— | ✓ fully-built only | — | — |
Universe dropoutSlow unwind when subnet fails quality screen |
— | ✓ rate by reason | — | — |
Mirror sellTarget wallet reduces position |
— | — | — | ✓ proportional |
Mirror closeTarget wallet fully exits |
— | — | — | ✓ |
User exitOperator-initiated |
via menu | via [R] force | via DESIGNATE_EXIT | via menu / promote |
Sniper has the most complete exit toolkit of any mode. It runs every sweep cycle against every open Sniper position, evaluating six potential triggers in priority order.
When multiple triggers fire on the same cycle, Sniper resolves in this order (lowest number wins):
STOP_LOSS — capital protection trumps everythingTRAILING_STOP — lock in gains once armedSIGNAL_EXIT — decay-based exitTAKE_PROFIT — fixed-percent target hitTIME_EXIT — held too long but not bleedingPARTIAL_LADDER — step-based partial profit-takingComputes a price floor from the entry mark and the configured stop-loss percentage. If the current mark drops to or below the floor, Sniper exits the entire position.
floor = entry_mark × (1 - stop_loss_pct / 100)
trigger condition: current_mark ≤ floor
Default stop_loss_pct is 15%. Configurable per position via custom_risk on Designate-marked positions, otherwise uses the global Sniper default.
Sniper's trailing stop is the most nuanced exit trigger in the bot. It tightens as the peak profit grows:
| Peak gain (HWM %) | Trail tightness | Default % |
|---|---|---|
| ≥ 40% | Tightest tier | 3% from peak |
| ≥ 25% | Tight tier | 5% from peak |
| ≥ 15% | Standard tier | 7% from peak |
| ≥ arm threshold (default 8%) | Loose tier | trailing_stop_pct default 8% |
The trailing stop arms when peak gain crosses trailing_stop_arm_profit_pct (default 8%). Once armed, it stays armed — even if the position retraces back below 8%, the trail still protects you. This is intentional: a position that hit +30% and dropped to +5% should still get exited if it falls another 5% below the peak, not silently reset.
Hard ceiling. If position PnL reaches or exceeds take_profit_pct, exits the full position. Default is 100%, which means most operators never see this fire because trailing stop or partial ladder closes positions before they double.
Set lower (e.g., 50% or 25%) if you want to lock in big winners regardless of trailing stop behavior.
Sells fractions of the position at predefined PnL levels. Default ladder is two steps:
[+15% gain, sell 20% of position]
[+40% gain, sell 30% of position]
After the second step fires, ~50% of the position remains. That remainder is then managed by trailing stop or other triggers. The ladder fires at most once per step (no re-firing if price oscillates back through a level).
Sells positions held longer than max_hold_time_seconds. Default is 432000 seconds = 120 hours = 5 days. Reasoning: Sniper is built for momentum trades. A position held more than 5 days has either stopped trending or already taken profit via another trigger; holding longer adds opportunity cost without expected reward.
Time exit is the lowest-priority trigger. It only fires if no other exit has already been queued for that position on the same cycle.
Fires when a subnet's classification flips to EVADE AND its decay score crosses hard_exit_decay (default 0.68). Translation: the underlying setup that justified entry has rotted enough that holding is no longer rational.
This is the "the bot's own signals say get out" exit, distinct from price-based stops. A position can be in profit when SIGNAL_EXIT fires — the trigger is signal degradation, not pnl.
Sentinel has two exit categories: drift rebalance for positions that remain in the qualified universe (trim outperformers back to target weight), and universe-dropout unwind for positions whose subnets have fallen out of the qualified universe (slow exit at a rate determined by the dropout reason). There is no price-based stop-loss, no take-profit, no signal-decay exit.
Sentinel will hold positions through large price drawdowns — there is no automatic capital protection on price action alone. Capital protection comes from two sources: (1) the entry filter that screens subnets pre-purchase against tier-specific quality gates (pool size, age, dereg risk, flow direction), and (2) the universe-dropout unwind that gradually exits positions whose subnets later fail the same quality screen. If a held position remains in the qualified universe but loses 50% of its value, Sentinel still holds it.
On every sweep cycle, Sentinel computes:
If drift exceeds drift_threshold_pct (3% Aggressive, 5% Balanced, 10% Conservative), Sentinel may queue a partial trim. "May" because four safeguards stack:
If fewer than 75% of target holdings are held, no rebalancing fires. The math on a partial portfolio produces hostile decisions (each held position over-represents the target). Wait until the build is mostly complete before rebalancing.
Each subnet has a per-tier cooldown after rebalance: 14 days (Aggressive), 30 days (Balanced), 60 days (Conservative). No subnet rebalances more often than this regardless of how much it drifts.
Never trim below max(0.01τ, target_value). And refuse to trim positions that start below 1.5× their target value — drift noise alone isn't worth the trading fees. This prevents the "fee-and-slippage death spiral" on small positions.
At most 1 trim per netuid per UTC day. Prevents cascade failures where one cycle trims, the next cycle sees residual over-target weight, trims again, repeat.
If you need any of those behaviors on a Sentinel position, the answer is to promote the position to Designate via Designate → Promote Sentinel. The on-chain alpha doesn't move; only the DB row migrates. Designate's risk profile (stop-loss, trailing stop, take-profit) then applies.
When a held position's subnet falls out of the qualified universe (its quality screen starts failing), Sentinel automatically unwinds the position over time. The unwind rate depends on why it dropped out, modeled on industry practice.
On detection, Sentinel re-runs the universe filter checks against the held position's signal and records the FIRST failing reason. This reason is then locked in for the entire unwind window — the rate doesn't shift mid-unwind even if conditions evolve.
| Reason | Speed | Aggressive | Balanced | Conservative |
|---|---|---|---|---|
pool | Fast | 7 days | 15 days | 30 days |
dereg_risk | Fast | 7 days | 15 days | 30 days |
mcap_min | Slow | 14 days | 30 days | 60 days |
mcap_ratio | Slow | 14 days | 30 days | 60 days |
pool_cv | Slow | 14 days | 30 days | 60 days |
flow_14d / flow_7d | Slow | 14 days | 30 days | 60 days |
age | Slow | 14 days | 30 days | 60 days |
rank | Slow | 14 days | 30 days | 60 days |
Fast unwind — liquidity-driven dropouts (pool, dereg_risk). Industry index funds typically remove on liquidity grounds within 5–10 trading days. Thin liquidity means market impact gets worse the longer you wait.
Slow unwind — quality/valuation dropouts (mcap, flow, cv, age, rank). Active funds typically use 1–3 month unwind windows on outflow-driven removals. The position may recover; rushing the exit costs more than waiting.
Day 0: SN42 falls out (pool dropped below threshold). Sentinel logs the dropout, classifies pool reason, locks in 15-day unwind window (Balanced tier), records original position value, fires Discord webhook. No trim this cycle — gives a stable baseline.
Day 1: Position trimmed toward 93% of original value (1 day of 15 elapsed = 6.7% trim).
Day 5: Position trimmed toward 67% of original.
Day 10: Position trimmed toward 33% of original.
Day 15: Final exit fires. Discord webhook confirms full unwind. Subnet enters 7-day post-exit blacklist.
Or: any time before day 15, if SN42's pool recovers above threshold AND the subnet returns to the target list, unwind halts. Discord webhook fires recovery message. Normal Sentinel mechanics resume.
Designate → Promote Sentinel halts the unwind and applies Designate's risk profile. The picker shows a Status column that flags which positions are currently being unwound, so you can prioritize.Designate has a simpler risk model than Sniper: three triggers, no partial ladder, no time exit, no signal decay. The philosophy is "you marked the target — the bot manages it with industry-standard rules until you tell it otherwise."
Same mechanic as Sniper but with Designate-specific defaults. Configurable per position via custom risk settings when you mark the target.
floor = entry_mark × (1 - stop_loss_pct / 100)
default stop_loss_pct: 15%
Single tier, not tiered like Sniper's. Arms when peak gain crosses trail_arm_pct (default 8%), then sells if price drops trailing_stop_pct below the peak.
If take_profit_pct is set non-zero, fires a full exit when PnL reaches that level. Default is 0 (disabled). Set explicitly when marking a target if you want a hard upside exit.
Operator-initiated. Mark a Designate position for immediate exit through the menu. Routes through the same execution path as automated exits, with the reason logged as DESIGNATE_EXIT user-requested.
Shadow has no independent risk management. Its exit triggers are entirely target-driven.
When a watched wallet reduces its position in a subnet you also hold via Shadow, Shadow mirrors the reduction proportionally:
reduction_pct = (target_alpha_before - target_alpha_now) / target_alpha_before
your_alpha_to_sell = your_position × reduction_pct
Filtered by shadow_trade_delta_min (default 2%) — small target reductions below this threshold are ignored to prevent fee-dominated micro-trades.
When a watched wallet fully exits a subnet, Shadow closes your corresponding position completely. Reason logged as SHADOW target fully exited — mirror close.
If you want stop-loss-style protection on a Shadow position, the workflow is to promote the Shadow position to Designate. The mirror relationship is preserved — if the target sells, ShadowTracker still triggers your exit. But Designate's risk rules now also apply, whichever fires first wins.
Concrete timelines showing how each mode actually behaves. All examples assume default parameters and a 1τ wallet.
reduction_pct = 0.50. Mirror sell (PARTIAL_EXIT) fires: Shadow sells 50% of your SN8 position. ~0.00065τ realized at +30%.All defaults pulled from source. Operators can override any of these per their own configuration via the appropriate menu (Sniper menu for Sniper params, etc.).
| Parameter | Default | Range | What it does |
|---|---|---|---|
stop_loss_pct |
15.0 | 1.0 – 50.0 | Hard floor for STOP_LOSS. Position exits if mark drops below entry × (1 - pct/100). |
trailing_stop_pct |
8.0 | 1.0+ | Loose-tier trail. Used when peak gain is between arm threshold and 15%. |
trailing_stop_arm_profit_pct |
8.0 | 1.0 – 50.0 | Peak-gain threshold above which trailing stop arms. |
tiered_trail_15_pct |
7.0 | 1.0+ | Trail tightness when peak gain ≥ 15%. |
tiered_trail_25_pct |
5.0 | 1.0+ | Trail tightness when peak gain ≥ 25%. |
tiered_trail_40_pct |
3.0 | 1.0+ | Trail tightness when peak gain ≥ 40%. |
take_profit_pct |
100.0 | 0+ | Hard ceiling. Set 0 to disable. Set lower to lock big winners regardless of trail. |
max_hold_time_seconds |
432000 (5 days) | any positive int | TIME_EXIT threshold. Set 0 to disable. |
min_hold_time_seconds |
600 (10 min) | any positive int | Minimum hold before any exit can fire. Prevents whipsaw on volatile early-cycle data. |
hard_exit_decay |
0.68 | 0.0 – 1.0 | SIGNAL_EXIT threshold. Position exits if classification = EVADE AND decay_score ≥ this. |
partial_ladder |
[[15, 0.20], [40, 0.30]] | list of [pnl%, frac] | Partial-exit ladder. Each step: at this pnl%, sell this fraction of remaining position. |
Sentinel has no exit-trigger parameters per se — its exit behavior is governed by the tier config. The relevant knobs:
| Parameter | Conservative | Balanced | Aggressive |
|---|---|---|---|
drift_threshold_pct |
10.0 | 5.0 | 3.0 |
rebalance_min_interval_days |
60 | 30 | 14 |
weekly_deployment_pct |
10.0 | 20.0 | 35.0 |
max_position_pct |
25.0 | 20.0 | 18.0 |
holdings_default |
5 | 8 | 10 |
The build-out gate (75%), daily trim cap (1 per netuid), and position proximity floor (1.5× target) are not user-configurable in v1.2.
v1.2 override notes: Eight of the Sentinel tier values are now operator-tunable per tier via Sentinel → [9] Risk Profile → [F] Tier filter overrides: pool_min_tao, mcap_min_tao, mcap_pool_ratio_max, flow_14d_min_pct, flow_7d_min_pct, age_min_days, pool_cv_max_pct, dereg_rank_min. The max_position_pct is also overridable globally via [C] Adjust position cap (5–50% range, with a math floor warning when cap × holdings < 100%). Each tier maintains independent overrides — switching tiers preserves the customizations for the tier you switched away from.
Designate uses Sniper's parameter names but with its own defaults. These are the defaults applied when a position has no custom_risk dict:
| Parameter | Default | Notes |
|---|---|---|
stop_loss_pct |
15.0 | Same as Sniper default. |
trailing_stop_pct |
8.0 | Single-tier trail (Designate doesn't use Sniper's tiered system). |
trailing_stop_arm_profit_pct |
8.0 | Stored as trail_arm_pct in Designate's effective risk. |
take_profit_pct |
0.0 (disabled) | Set explicitly per position when marking the target if you want this active. |
When marking a Designate target, you can override any of these via the custom_risk dict, which takes precedence over the global defaults.
| Parameter | Default | What it does |
|---|---|---|
shadow_trade_delta_min |
2.0 | Minimum % change in target's position to trigger a mirror trade. Prevents micro-trade noise. |
shadow_budget_pct |
20.0 | % of wallet allocated to Shadow when in percentage budget mode. |
shadow_budget_tao |
0.25 | τ amount when in absolute budget mode. |
| What you want | Mode | How it works |
|---|---|---|
| Take aggressive partial profits at fixed %s | Sniper | PARTIAL_LADDER fires at +15% (sell 20%), +40% (sell 30%), then trailing stop on the rest |
| Take all profits at one fixed % | Sniper or Designate | TAKE_PROFIT triggers full exit at threshold (must be configured) |
| Lock gains via trailing stop after a position runs | Sniper (tiered) or Designate (single tier) | TRAILING_STOP arms after profit exceeds arm threshold, then sells if price drops the trail % below peak |
| Trim winners to feed laggards (no full exit) | Sentinel | Drift rebalance trims outperformers, redeploys into underweight positions. Only after portfolio is 75%+ built. 14-60 day cooldown depending on tier. |
| Hold the position no matter how high it runs | Sentinel mostly does this | Sentinel won't sell on profit alone; only on drift rebalance, which is portfolio-relative not absolute. Caveat: massively overweight positions get trimmed. |
| Mirror your favorite trader's profit-taking | Shadow | If they take profit, you take profit, proportionally |
| What you want | Mode | How it works |
|---|---|---|
| Hard stop-loss at fixed % below entry | Sniper or Designate | STOP_LOSS at the configured % (default 15% both) |
| Sell on technical breakdown | Sniper | SIGNAL_EXIT fires when classification flips to EVADE and decay crosses 0.68 |
| Time-out a position that's just sitting | Sniper | TIME_EXIT fires after 5 days (default) |
| Manual stop-loss whenever I decide | Designate | Use DESIGNATE_EXIT, or promote a Shadow/Sentinel position into Designate first |
| No automatic exit on losses | Sentinel or Shadow | Both will hold through drawdowns. Sentinel screens at entry; Shadow inherits risk from your target wallet. |
| Stop-loss on a Sentinel position | Promote to Designate | Use the menu to migrate. On-chain alpha doesn't move; only the DB row migrates between mode tables. |
| Situation | What happens |
|---|---|
| Subnet I hold drops 50% | Sniper stops out at floor. Designate stops out at floor. Sentinel holds. Shadow holds unless target sells. |
| Subnet I hold pumps 200% | Sniper: partial exits fire, trailing stop closes runner. Designate: take-profit fires if configured, else trailing stop. Sentinel: trims via drift rebalance over weeks if it gets too overweight. Shadow: holds unless target sells. |
| I want OUT of everything right now | Sniper: stop the daemon, manually unstake. Sentinel: menu [R] force rebalance + manual unstake. Designate: bulk DESIGNATE_EXIT via menu. Shadow: manual unstake or stop watching the source wallet. |
| Target wallet I'm shadowing rugs | Shadow's mirror-close fires when their alpha drops, but only when they actually sell. If they hold a dead bag, you hold a dead bag. Promote to Designate to apply your own stop-loss. |
| Subnet gets deregistered | Sentinel's universe filter catches it pre-entry. Once held, no automatic exit; the alpha may go to zero on chain. Manual exit only. |
| Bot crashes mid-trade | Open positions are safe — they sit on chain as staked alpha. When the daemon restarts, recon sweep reconciles DB to chain. No exits are missed permanently; the next sweep evaluates them all from current state. |
| Two modes hold the same subnet | Each mode tracks its position independently in its own state dict. Exits from one don't affect the other. Allowed and intentional — Sentinel can hold SN8 while Sniper takes a short-term scalp on the same subnet. |
| Setup | Why it works |
|---|---|
| Sniper + Sentinel | The classic. Sniper plays short-term momentum; Sentinel builds long-term portfolio. Sniper takes the fast money, Sentinel survives the volatility. |
| Sniper + Shadow | Active scans for momentum + information edge from wallets you trust. Sniper's rigor + Shadow's signal intelligence. |
| Sentinel + Shadow | Pure long-bias setup. Sentinel does broad risk-managed accumulation; Shadow concentrates capital around specific wallets you trust. |
| Sentinel + Designate | Sentinel handles broad portfolio; Designate is your conviction picks with proper stop-loss. Combines automated discipline with discretionary edge. |
| All four | Maximum strategy diversification. Some operators run this. Requires more wallet capital to give each mode a meaningful budget allocation. |
Some behaviors users sometimes expect but the bot intentionally does not implement. These are design choices, not feature gaps.
Sentinel doesn't react to price drawdowns — only to universe-quality changes. A position that drops 50% in price stays open as long as the underlying subnet still passes quality screening. A position whose subnet fails the screen gets unwound regardless of price. The protection model is "exit on thesis breakdown, not on price action." If you want price-based stop-loss on a specific Sentinel position, promote it to Designate.
Designate is "you mark it, the bot manages it." Adding a complex ladder would muddy the contract. If you want laddered profit-taking on a specific position, that's Sniper's territory.
All three are intentional-hold modes. Sniper is the only mode that gives up on stale positions because it's an active scalper. The other modes assume you have a thesis about why the position should keep being held.
Shadow is "trust the target wallet." If you want stop-loss on a copied position, promote the Shadow position to Designate. The on-chain alpha doesn't move; only the DB row migrates between mode tables. After promotion, the mirror relationship is preserved (target sells still trigger your exit) but Designate's risk rules also apply.
When a Sniper or Sentinel position stops out, the subnet is added to a 7-day blacklist. The bot will not re-enter that subnet for a week, regardless of what its signals say. This prevents "bounce trading" into a degrading subnet — if the signal model was wrong about it once, give the data time to clarify before trying again.
This reference is grounded in the v1.2 source. Defaults and behaviors may shift in future versions; the field manual at flowsniper.ai/docs tracks changes.
Found a discrepancy between this page and bot behavior? The bot is right. Report it in Discord and we'll update.