Docs / Build a strategy

Entry strategy

How an order is placed once a signal fires, and the filters that gate the signal before it becomes an order.

A signal firing does not mean an order has been placed. The entry strategy decides two things after a signal:

  • Filters run in order and can block or delay the signal (require a confirmation bar, gate by ADX, sit out around CPI, cool down after the prior trade, …).
  • The executor decides how the order is placed once the signal survives every filter — a single aggressive limit, a passive rest at the signal price, an ATR-scaled pullback, a scale-in ladder, TWAP, or a modifier that wraps another executor.

Both pieces are optional. A strategy with no filters and no configured executor fires every signal through the default Aggressive Limit executor — the byte-for-byte pre-plugin behavior.

Filters#

Filters are pure transforms over the signal data. Each one either passes the signal through, blocks it, or shifts it forward by a bar. They run in the order you list them — a filter later in the chain never sees a signal an earlier filter dropped.

CategoryFilterWhen to use
ConfirmationWait for Close ConfirmationRequire the confirmation bar's close to agree with the signal direction — filters false triggers at one bar of lag.
ConfirmationTwo-Bar ReversalOnly fire after one adverse bar + one reclaim. Catches trends with a pullback; drops trends that extend immediately.
ConfirmationVolume ConfirmationRequire the signal bar's volume to exceed a multiple of the rolling mean. Thin-volume signals are more often fakeouts.
MomentumMomentum AlignmentRequire an indicator column (RSI, MACD histogram, custom) to agree with the signal direction.
MomentumADX GateOnly fire when ADX is above (or below) a threshold — the classic trend-strength gate.
VolatilityATR Band GateOnly fire when ATR/price sits inside a min/max band. Skips dead markets and blow-off spikes.
VolatilitySqueeze ReleaseOnly fire within N bars of a volatility-squeeze release.
ScheduleSession GateRestrict entries to a UTC time-of-day window on selected weekdays.
ScheduleMacro Event BlackoutSuppress entries around scheduled macro events (CPI, FOMC, NFP, ...).
TimingNext Bar Open EntryShift every signal forward by one bar — the "don't cheat" backtest convention.
TimingCooldownSuppress entries for N bars after the prior signal fires — reduces overtrading in choppy regimes.

Every filter that references an indicator (ATR band, ADX, squeeze, macro event, momentum) needs that indicator attached to the strategy so the referenced column exists on the DataFrame. A missing column is treated as "no signal to filter" and the filter becomes a no-op — the strategy keeps trading, just without the intended gate. That's usually a symptom, not the goal.

Executor#

The executor decides how the entry order is placed once the signal survives every filter.

CategoryExecutorBehaviour
FlatAggressive Limit (default)Walks a LIMIT from 0.5% slippage up to 2% until it fills. Near-immediate fill in liquid markets.
FlatPassive LimitRests at the signal-bar price for N bars — no chase, no spread paid.
FlatATR Pullback LimitRests atr_multiplier × ATR below (long) or above (short) the signal. Requires an ATR indicator.
FlatPrior Bar Extreme LimitRests at the signal bar's own low (long) or high (short). Wick-back retest entry.
FlatStructural Level LimitRests at a named indicator level — pivot, support/resistance, Donchian band, POC.
FlatValue Area ReversionRests at VolumeProfile POC/VAL/VAH. Requires a VolumeProfile indicator.
Multi-fillPrice LadderScale in with several LIMIT orders at progressively deeper offsets from the signal.
Multi-fillTWAPTime-weighted equal slices, one per bar-interval. Reduces market impact on larger orders.
ModifierTwo-Phase ProbeAggressive probe slice + follower handles the rest. Hedges "we missed the entry" against "we chased the top".
ModifierAdverse Move AbortWraps another executor with a "don't chase" cutoff: cancels every pending order if price moves against fill by abort_pct.

Modifier executors wrap another executor — you pick the inner behavior (passive / pullback / ladder / etc.) and the modifier layers its own rule on top. Modifiers cannot wrap other modifiers; nesting is capped at one level so the mental model stays "wrapper + inner".

TIP

The Aggressive Limit default is right for most signals in liquid markets — a small spread is a cheap price for a near-immediate fill. Reach for a passive or pullback variant when you're trading a signal that reliably retraces (a volatility squeeze, a value-area reversion, a trend pullback) — you'll pay less per fill when you fill, at the cost of missing a fraction of signals.

Fail-open by design#

If an executor or filter references an indicator that isn't attached to the strategy, the runtime falls back to a safe default (a passive limit at the signal price for the executor; a no-op for the filter) rather than crashing the trade. The Build rail surfaces missing dependencies in the picker with a [needs …] chip so you catch them before saving the config.

Was this page helpful?