Tuning: Filters
Filters are the admission chain: each one can reject a candidate, and a trade is taken only if it clears every filter that is switched on. This is where most of a strategy's durable edge lives — a good strategy is usually a good model plus a selective filter chain, not a raw signal traded flat. The industry calls this stage Filters; other platforms use the same word.
Every filter here is a builder component. You tune it while building; when the strategy is published it locks as part of the unit. Turning a filter on or off, or adding/removing one from the chain, is a structural change and deploys through the evidence gate. See Component vocabulary for what each filter is for; this page is the knob reference.
Two filters are flagged load-bearing on the canvas — removing them lifts trade volume sharply and changes what the strategy is (measured over 2026-07-16→19 on a live config): the Trend Filter (+101% trade volume when removed) and Max Entry Price (+29%). The canvas warns before you drag either out of the chain. These figures describe how many more trades are admitted, not profit.
Confidence Bands
The always-on backbone filter (also known as signal-confidence banding — QuantConnect's Insight carries a Confidence field the same way). It splits candidates into three probability bands — high, mid, low — each with its own edge tolerance, so you can demand more edge from the shakier bands. It cannot be removed.
| Dial | Turning it up… | Range |
|---|---|---|
| Band Min Probability — prob_band_high_min, prob_band_mid_min, prob_band_low_min | Narrows the band to more-confident contracts (the band's lower edge moves up) | 0.01–1 |
| Band Edge Tolerance — prob_band_edge_tol_high, prob_band_edge_tol_mid, prob_band_edge_tol_low | Requires more edge before admitting a trade in that band — more selective | -1–1 |
Two ordering rules are enforced (a deploy that breaks them is rejected):
- The band minimums must be ordered low ≤ mid ≤ high.
- The edge tolerances must be ordered high ≤ mid ≤ low — the low-confidence band is asked for the most edge.
Trend Filter
Blocks trades that fight the current market move (also known as a trend filter — the same guard exists on Freqtrade and TradingView strategies). It has two layers: a bias-based guard you can switch off, and a leading momentum veto that is always on and protects every account regardless of the toggle.
| Dial | Turning it up… | Range |
|---|---|---|
| Trend Filter Enabled — directional_guard_enabled | Switches on the bias-based guard (the always-on leading veto below runs either way) | boolean |
| Yes / No Min/Max Bias — directional_guard_yes_min_bias, directional_guard_no_max_bias | Sets how much directional bias a YES / NO candidate may carry before it's blocked | float (step 0.01) |
| Leading Veto Threshold — directional_guard_micro_veto_pct | Makes the always-on veto less sensitive — a bigger adverse intra-hour move is needed to block an entry, so fewer trades are vetoed. Never 0 (that collapses the dead-band and vetoes flat markets) | 0.0001–0.05 |
| US Window Start / End (ET hour) — directional_guard_us_window_start_hour_et, directional_guard_us_window_end_hour_et | Defines the US-volume window where a tighter veto arms. A wider window arms the sensitive veto for more hours | 0–23 (start before end) |
| US Window RVol Min — directional_guard_us_window_rvol_min | Requires more relative volume before the in-window veto arms | 0–100 |
| In-Window Veto Threshold — directional_guard_us_window_micro_pct | The tighter in-window adverse-move threshold; must be ≤ the base Leading Veto Threshold | 0.0001–0.05 |
| Deep-ITM Honors Leading Veto — directional_guard_deep_itm_respect_momentum | When on, deep-ITM favorites are still vetoed on adverse leading momentum; off restores the legacy bypass | boolean |
Note the counterintuitive direction on the veto thresholds: raising them makes the guard less protective (it lets more through), because the threshold is the size of adverse move required to trigger a block.
Net-Edge Filter
Scores whether the edge is actually capturable after costs — spread, thin books, time pressure — rather than just large on paper. It is a cost check, not a second signal. There is no direct equivalent on other platforms; it is closest to the pre-trade cost checks in an execution risk engine.
| Dial | Turning it up… | Range |
|---|---|---|
| Net-Edge Filter Enabled — micro_edge_enabled | Switches the filter on | boolean |
| Min Score — micro_edge_min_score | Requires a higher capturability score — rarer, more selective entries | ≥ 0 |
| Spread Penalty Per Cent — micro_edge_spread_penalty_per_cent | Penalizes wide spreads more heavily, so wide-spread markets fail the score sooner | ≥ 0 |
| Thin Book Penalty — micro_edge_thin_book_penalty | Penalizes shallow books more heavily | ≥ 0 |
| Time Pressure Penalty — micro_edge_time_pressure_penalty | Penalizes trades close to settlement more heavily | ≥ 0 |
ETH runs wider spreads than BTC. An optional per-asset override, Spread Penalty Per Cent (ETH) (micro_edge_spread_penalty_per_cent_eth), lets ETH carry a lower penalty without changing BTC. Leave it blank to share the BTC value — see ETH-specific overrides.
Dynamic Edge Floor
Adapts the required edge to conditions instead of using one fixed number: it demands more edge when spreads are wide and accepts slightly less when books are deep.
| Dial | Turning it up… | Range |
|---|---|---|
| Dynamic Edge Floor Enabled — dynamic_edge_enabled | Switches the adaptive floor on | boolean |
| Spread Premium — dynamic_edge_spread_premium | Adds more required edge as spreads widen — stricter in wide markets | ≥ 0 |
| Depth Discount — dynamic_edge_depth_discount | Relaxes the required edge more when the book is deep — more permissive in liquid markets | ≥ 0 |
Spread Filter
Rejects a market whose bid-ask spread is too wide to trade into cleanly (also known as Freqtrade's SpreadFilter). This is the plain spread ceiling; the Net-Edge Filter above is the softer, scored version.
| Dial | Turning it up… | Range |
|---|---|---|
| Max Spread — max_spread_cents | Tolerates wider spreads — admits more markets, less selective | ≥ 1 cent |
An optional per-asset override, Max Spread (ETH) (max_spread_cents_eth), gives ETH its own, typically higher, ceiling. Blank shares the BTC value.
Max Entry Price
A hard price ceiling: never pay more than this to open a contract (also known as Freqtrade's PriceFilter). Capping the entry price bounds the downside per contract — a 96¢ favorite that flips loses 96¢ — which is why removing it is flagged load-bearing.
| Dial | Turning it up… | Range |
|---|---|---|
| Normal-Mode Max Entry Price — normal_max_entry_price_cents | Willing to pay more to open, admitting pricier favorites (and more per-contract tail risk). 99 = no cap | 1–99 cents |
| Hard Price Ceiling — hard_price_ceiling_cents | The absolute cap the entry price is clamped to; the normal cap must stay at or below it | 1–99 cents |
Applies to normal calendar slots only — Deep-ITM slots deliberately buy 95¢+ favorites and are exempt. The schema suggests 94 as a starting value, because the 95¢+ band in normal hours has little premium left after fees. A value above the Hard Price Ceiling can never take effect and is rejected on deploy (set the cap to 99 to disable it instead).
Overpriced-Edge Guard
Rejects mispricings so large they are likely stale or adverse — a data-quality guard, not a profit cap. This is the counterintuitive one: a larger claimed edge is not always better. An implausible edge is usually a stale quote or a miscalibrated model, so this caps edge from above. Full context: Maximum edge ceiling.
| Dial | Turning it up… | Range |
|---|---|---|
| Max Edge Ceiling — normal_max_edge_ceiling | Raising it loosens the guard (admits larger claimed edges). Lowering it rejects more suspiciously-large edges — more protective. 1 or unset = off, since edge can never exceed 1.0 | 0–1 |
The schema suggests 0.04–0.10 as a working band. Normal calendar slots only; Deep-ITM slots keep their own edge floor.
Volatility-Regime Filter
A state machine that slows or pauses trading in abnormal volume/volatility (also known as Freqtrade's VolatilityFilter / RangeStabilityFilter). It walks NORMAL → ELEVATED → SPIKE → COOLDOWN → RECOVERY based on relative volume.
| Dial | Turning it up… | Range |
|---|---|---|
| Volatility-Regime Filter Enabled — volume_regime_enabled | Switches the regime machine on | boolean |
| RVol Elevated / Spike / Exit / Weekend Spike — volume_rvol_elevated, volume_rvol_spike, volume_rvol_exit, volume_rvol_weekend_spike | Sets the relative-volume level that trips each transition. Raising a threshold makes the machine trip later (less cautious); lowering it trips sooner | ≥ 0.01 |
| Vol Ratio Spike — vol_ratio_spike | The volatility-ratio level that marks a spike | ≥ 0.01 |
| Regime Cooldown — regime_cooldown_minutes | Holds trading paused longer after a spike | ≥ 1 minute |
| Recovery Period — regime_recovery_minutes | Trades at half size with tighter edge for longer before returning to normal | ≥ 1 minute |
Moneyness Filter
Restricts entries to contracts at or beyond a moneyness threshold — how far past the strike the price already sits. This is the defining filter of the Deep-In-The-Money strategy, and its dials are the Deep-ITM ruleset. It is distinct from the Model-stage ITM Probability Tilt. Full context: Deep-ITM tuning.
| Dial | Turning it up… | Range |
|---|---|---|
| Min Moneyness — overnight_deep_itm_min_moneyness_pct | Requires contracts further in-the-money — more selective | 0.01–1 (fraction) |
| Min Edge — overnight_deep_itm_min_edge | Requires more edge to admit a deep-ITM entry | 0.01–1 |
| Min Probability — overnight_deep_itm_min_probability | Requires a higher modeled settle probability | 0.01–1 |
| Max Contracts — overnight_deep_itm_max_contracts | Allows a larger deep-ITM position | ≥ 1 |
| Max Spread — overnight_deep_itm_max_spread_cents | Tolerates wider spreads on deep-ITM entries | ≥ 1 cent |
These thresholds apply in the Trading Calendar's Deep-ITM slots — a restricted overnight/off-hours ruleset that places only on contracts clearing these stricter gates.
Entry Window
Limits new entries to a fresh-market window after each contract opens; held positions still settle normally.
| Dial | Turning it up… | Range |
|---|---|---|
| Entry Window — entry_window_minutes | Keeps the market open for new entries longer after it opens — admits later entries | ≥ 1 minute |
| Strict Entry Window — entry_window_strict | When on, blocks stale-market entries outright | boolean |
Fast-Move Filter
Blocks a new entry that would trade against a fast recent price move — an entry in the same direction as the move is never affected. It ships dormant: its threshold defaults to 0, which disables it, and it turns on only when you set a non-zero threshold.
| Dial | Turning it up… | Range |
|---|---|---|
| Fast-move range threshold — move_gate_range_threshold | The trailing-window price range that trips the block. A smaller non-zero value trips on smaller moves (more sensitive, blocks more); 0 = off | 0–1 (fraction of price) |
| Fast-move window (minutes) — move_gate_window_minutes | Measures the range over a longer trailing window | 5–60 |
Filters without dials
Two admission filters have no tunable thresholds — they are not a knob surface, so there is nothing to tune here, but they are part of the chain:
- Counterparty Filter — skips signals and orders on blacklisted tickers (exact match or a
PREFIX*glob). Its "value" is your account's ticker blacklist, which you edit directly in Bot Control — changes apply immediately, with no deploy. It is an operational list, not a deploy-gated dial. - Volatility Override — an advanced bot-integrity control with no buyer-facing parameters. It is not a tuning surface.
Next: Sizing — how big each admitted trade gets.