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 Probabilityprob_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.011 | | Band Edge Toleranceprob_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 | -11 |

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 Enableddirectional_guard_enabled | Switches on the bias-based guard (the always-on leading veto below runs either way) | boolean | | Yes / No Min/Max Biasdirectional_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 Thresholddirectional_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.00010.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 | 023 (start before end) | | US Window RVol Mindirectional_guard_us_window_rvol_min | Requires more relative volume before the in-window veto arms | 0100 | | In-Window Veto Thresholddirectional_guard_us_window_micro_pct | The tighter in-window adverse-move threshold; must be the base Leading Veto Threshold | 0.00010.05 | | Deep-ITM Honors Leading Vetodirectional_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 Enabledmicro_edge_enabled | Switches the filter on | boolean | | Min Scoremicro_edge_min_score | Requires a higher capturability score — rarer, more selective entries | ≥ 0 | | Spread Penalty Per Centmicro_edge_spread_penalty_per_cent | Penalizes wide spreads more heavily, so wide-spread markets fail the score sooner | ≥ 0 | | Thin Book Penaltymicro_edge_thin_book_penalty | Penalizes shallow books more heavily | ≥ 0 | | Time Pressure Penaltymicro_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 Enableddynamic_edge_enabled | Switches the adaptive floor on | boolean | | Spread Premiumdynamic_edge_spread_premium | Adds more required edge as spreads widen — stricter in wide markets | ≥ 0 | | Depth Discountdynamic_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 Spreadmax_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 Pricenormal_max_entry_price_cents | Willing to pay more to open, admitting pricier favorites (and more per-contract tail risk). 99 = no cap | 199 cents | | Hard Price Ceilinghard_price_ceiling_cents | The absolute cap the entry price is clamped to; the normal cap must stay at or below it | 199 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 Ceilingnormal_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 | 01 |

The schema suggests 0.040.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 Enabledvolume_regime_enabled | Switches the regime machine on | boolean | | RVol Elevated / Spike / Exit / Weekend Spikevolume_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 Spikevol_ratio_spike | The volatility-ratio level that marks a spike | ≥ 0.01 | | Regime Cooldownregime_cooldown_minutes | Holds trading paused longer after a spike | ≥ 1 minute | | Recovery Periodregime_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 Moneynessovernight_deep_itm_min_moneyness_pct | Requires contracts further in-the-money — more selective | 0.011 (fraction) | | Min Edgeovernight_deep_itm_min_edge | Requires more edge to admit a deep-ITM entry | 0.011 | | Min Probabilityovernight_deep_itm_min_probability | Requires a higher modeled settle probability | 0.011 | | Max Contractsovernight_deep_itm_max_contracts | Allows a larger deep-ITM position | ≥ 1 | | Max Spreadovernight_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 Windowentry_window_minutes | Keeps the market open for new entries longer after it opens — admits later entries | ≥ 1 minute | | Strict Entry Windowentry_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 thresholdmove_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 | 01 (fraction of price) | | Fast-move window (minutes)move_gate_window_minutes | Measures the range over a longer trailing window | 560 |

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.