flowsniper.ai
▌ ON THIS PAGE

The mental model

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:

What do I want the bot to react to?

That sentence is the entire product in compressed form. Everything below is the elaboration.

Trigger matrix

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_LOSS
Price drops below the per-position floor
✓ configurable % ✓ default 15%
TRAILING_STOP
Locks in profit after position arms
✓ tiered (15/25/40) ✓ single tier
TAKE_PROFIT
Sells at fixed % gain (if configured)
✓ if set ✓ if set
PARTIAL_LADDER
Sells in steps as profit grows
✓ default [+15/20%, +40/30%]
TIME_EXIT
Sells after holding too long
✓ default 120h
SIGNAL_EXIT
Sells on signal decay
Drift rebalance
Trim outperformers to target weight
✓ fully-built only
Universe dropout
Slow unwind when subnet fails quality screen
✓ rate by reason
Mirror sell
Target wallet reduces position
✓ proportional
Mirror close
Target wallet fully exits
User exit
Operator-initiated
via menu via [R] force via DESIGNATE_EXIT via menu / promote

Sniper exits in detail

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.

Priority order

When multiple triggers fire on the same cycle, Sniper resolves in this order (lowest number wins):

  1. STOP_LOSS — capital protection trumps everything
  2. TRAILING_STOP — lock in gains once armed
  3. SIGNAL_EXIT — decay-based exit
  4. TAKE_PROFIT — fixed-percent target hit
  5. TIME_EXIT — held too long but not bleeding
  6. PARTIAL_LADDER — step-based partial profit-taking

STOP_LOSS

Computes 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.

TRAILING_STOP — tiered

Sniper's trailing stop is the most nuanced exit trigger in the bot. It tightens as the peak profit grows:

Peak gain (HWM %)Trail tightnessDefault %
≥ 40%Tightest tier3% from peak
≥ 25%Tight tier5% from peak
≥ 15%Standard tier7% from peak
≥ arm threshold (default 8%)Loose tiertrailing_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.

TAKE_PROFIT

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.

PARTIAL_LADDER

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).

TIME_EXIT

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.

SIGNAL_EXIT

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 exits in detail

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.

Read this before you put serious capital in Sentinel

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.

Drift rebalance — how it works

On every sweep cycle, Sentinel computes:

  1. Each held position's current weight in the portfolio (% of total Sentinel value)
  2. Each position's target weight from the tier's universe ranking
  3. The drift = actual weight − target weight

If drift exceeds drift_threshold_pct (3% Aggressive, 5% Balanced, 10% Conservative), Sentinel may queue a partial trim. "May" because four safeguards stack:

SAFEGUARD A — Build-out gate

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.

SAFEGUARD B — Cooldown

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.

SAFEGUARD C — Position floor

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.

SAFEGUARD D — Daily trim cap

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.

What drift rebalance is NOT

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.

Universe-dropout unwind — how it works

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.

Reason classification

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.

ReasonSpeedAggressiveBalancedConservative
poolFast7 days15 days30 days
dereg_riskFast7 days15 days30 days
mcap_minSlow14 days30 days60 days
mcap_ratioSlow14 days30 days60 days
pool_cvSlow14 days30 days60 days
flow_14d / flow_7dSlow14 days30 days60 days
ageSlow14 days30 days60 days
rankSlow14 days30 days60 days

Industry rationale

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.

How a single dropout plays out

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.

Mid-unwind safeguards

Operator overrides

Designate exits in detail

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."

STOP_LOSS

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%

TRAILING_STOP

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.

TAKE_PROFIT

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.

DESIGNATE_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 exits in detail

Shadow has no independent risk management. Its exit triggers are entirely target-driven.

Mirror sell (PARTIAL_EXIT)

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.

Mirror close (full EXIT)

When a watched wallet fully exits a subnet, Shadow closes your corresponding position completely. Reason logged as SHADOW target fully exited — mirror close.

What Shadow doesn't do

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.

Worked examples

Concrete timelines showing how each mode actually behaves. All examples assume default parameters and a 1τ wallet.

Example 1 — Sniper rides a winner through partial ladder + trailing stop

Day 1, 09:00
Sniper signal on SN42 hits ENGAGE. Conviction 0.72. Bot enters at 0.012τ, position size 0.08τ (~6.7α).
Day 2, 14:00
SN42 mark = 0.0138τ, pnl = +15.0%. PARTIAL_LADDER fires: sells 20% of position. ~5.4α remains.
Day 2, 14:01
Trailing stop arms (peak ≥ 8%). Now also actively protecting the remainder.
Day 3, 11:00
SN42 mark = 0.0168τ, pnl = +40.0%. PARTIAL_LADDER step 2 fires: sells 30% of remaining. ~3.8α remains. Trailing stop tier upgrades to "≥40% peak" tightness — now 3% from peak.
Day 4, 03:00
SN42 peaks at 0.0180τ (+50%). Trail floor recomputes: 0.0180 × 0.97 = 0.01746τ.
Day 4, 16:30
SN42 retraces to 0.01744τ. TRAILING_STOP fires. Bot sells remaining ~3.8α. Position closed.
Realized pnl across all three exits: +44% blended.

Example 2 — Sentinel holds through drawdown, trims a winner months later

Week 1
Sentinel (Balanced tier, 0.5τ budget) builds 8-position portfolio over 5 days. Each position ~0.0625τ.
Week 3
SN42 drops 25% from entry. Drift logic notes SN42 is now under-weight (4.8% actual vs 12.5% target). No exit fires. Drift rebalance only trims overweight positions; underweight positions get pending DCA buys instead.
Week 6
SN42 recovers to entry. SN77 has run +60% over the period, now at 18% of portfolio (target 12.5%). Drift = +5.5%, exceeds 5% threshold. Build-out gate ✓ (8/8 holdings). Cooldown ✓ (no prior rebalance). Position floor ✓ (well above 1.5× target).
Week 6, sweep
Drift rebalance fires: trim SN77 from 18% back to 12.5% target. Sells ~0.040τ of SN77 alpha. +0.024τ realized. Trim TAO becomes free Sentinel balance, available for next DCA cycle (likely topping up SN42 or another lagger).
Week 6+14 days
SN77 cooldown clears. Eligible for further trim if drift exceeds threshold again.

Example 3 — Designate stops out on a manual pick that breaks down

Day 1
Operator marks SN15 as a Designate target with default risk: 15% stop-loss, 8% trail arm, 6% trail. Bot enters at 0.0050τ.
Day 4
SN15 climbs to 0.0058τ (+16%). Trailing stop arms. Trail floor = 0.0058 × 0.94 = 0.005452τ.
Day 5
SN15 peaks at 0.0062τ (+24%). Trail floor recomputes: 0.0062 × 0.94 = 0.005828τ.
Day 6
SN15 drops to 0.005820τ. TRAILING_STOP fires. Bot exits at +16% on the original entry. Position closed.

Example 4 — Shadow mirrors a target through entry, partial exit, full close

Day 1
Add wallet "Keith" (10000τ holdings) to Shadow. First sweep: snapshot baseline. No mirror entries on the first sweep — baseline-on-add prevents copying pre-existing positions.
Day 3
Keith buys 50α of SN8 (a new position, not in baseline). Shadow detects diff. Sizes proportionally: Keith's buy is 0.5% of his wallet, so Shadow buys 0.5% of your Shadow budget. Mirror entry fires: 0.001τ position in SN8.
Day 5
SN8 runs +30%. Keith doesn't sell. Shadow doesn't sell. Both rolling.
Day 7
Keith sells 50% of his SN8 alpha. reduction_pct = 0.50. Mirror sell (PARTIAL_EXIT) fires: Shadow sells 50% of your SN8 position. ~0.00065τ realized at +30%.
Day 12
SN8 retraces to entry. Keith holds. Shadow holds.
Day 14
Keith sells the remaining 50% (full exit). Mirror close (full EXIT) fires: Shadow closes its remaining SN8 position at break-even.

Parameter reference

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.).

Sniper

ParameterDefaultRangeWhat 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

Sentinel has no exit-trigger parameters per se — its exit behavior is governed by the tier config. The relevant knobs:

ParameterConservativeBalancedAggressive
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

Designate uses Sniper's parameter names but with its own defaults. These are the defaults applied when a position has no custom_risk dict:

ParameterDefaultNotes
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.

Shadow

ParameterDefaultWhat 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.

"I want X" decision tables

Profit-taking

What you wantModeHow 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

Loss / risk management

What you wantModeHow 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.

Edge cases

SituationWhat 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.

Strategy combinations

SetupWhy 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.

What's deliberately missing

Some behaviors users sometimes expect but the bot intentionally does not implement. These are design choices, not feature gaps.

No price-based stop-loss on Sentinel

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.

No partial profit ladder on 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.

No automatic time-out on Sentinel/Designate/Shadow

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.

No automatic stop-loss propagation in Shadow

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.

No automatic re-entry after STOP_LOSS

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.