Why Does My Paper Strategy Have No Fills?
Zero fills is an observation, not a diagnosis. A no-order observer can be working as designed; a worker can be running without fresh data; an order can be rejected; and a simulator can use assumptions different from a real book. Several failures can coexist.
Trace one bounded run using its exact strategy version, market identifiers and timestamps. Preserve the first useful evidence at each stage. Do not loosen a risk control or launch a real trade simply to make the fill counter increase.
1. Confirm startup and the test scope
Check whether the strategy loaded, initialization completed and the expected worker stayed active during the observation window. Record exceptions rather than inferring success from a process badge. A missing import or unsupported callback can prevent decisions before a venue is involved.
Banger’s public 0.1.7 callback is on_market_tick(market, tick, ctx). Local banger run strategy.py --paper requires an existing file and the account setup described in the CLI documentation. The command does not create a strategy, select a fresh market for you or enable public live execution.
2. Establish delivered data
Look for actual callback observations with exact market/outcome identifiers and a meaningful timestamp. A successful connection alone does not prove that a snapshot or later update arrived. An open market in an old configuration can now be closed or unavailable.
Keep absent quotes separate from a zero price, and distinguish observation time from receipt time. Repeated or out-of-order records can invalidate a strategy condition even when the count increases. A green worker and a rising counter do not prove continuous, timely coverage.
3. Inspect the decision branch
Record the inputs immediately before the branch that proposes an order, along with the reason it did or did not proceed. A threshold never reached during a short window can legitimately produce no orders. Test the branch offline with a fixture that should trigger it and one that should not.
An observer intentionally designed to log data without placing orders should have zero fills. Define its success in delivered observations and clean shutdown, rather than modifying it into a trade merely to satisfy an unrelated metric.
4. Distinguish requests and admission
An intent is not an accepted order. Check returned errors and the resulting state. Price units, dollar stake versus contract quantity, market status, declared risk limits and supported methods can each matter.
Banger Context.place takes USD notional, while held-contract closes use a different quantity convention. Repeated small acquisitions can reach a cumulative position cap. Treat that rejection as evidence to explain, not permission to bypass the envelope or borrow another account’s allowance.
5. Identify the exact simulator
Real resting orders need counterparties; a crossing price does not guarantee complete execution regardless of depth, timing and venue rules. But those facts do not establish how a particular paper mode simulates a fill.
Banger’s public 0.1.7 forward-paper context explicitly assumes a fill at a non-crossing requested limit in one path, logged as paper.fill.resting-assumed. It uses a reported-volume cap when that input is available; that is not a reconstructed queue or full depth ladder. Missing quote data can also lead to a fallback. Hosted historical backtesting is a separate model.
Therefore, a non-crossing limit is not automatically the cause of a no-fill in this forward-paper path. Inspect admission, model and persisted execution evidence. Do not present passive simulated fills as faithful real-book outcomes or assume every mode behaves identically.
6. Preserve the result and stop
- Save the source version, exact market, window and delivered observations.
- Record decision reasons, rejected requests and returned order states.
- Identify model, fees, missing inputs and any assumed fills.
- Check retained history and completed resource shutdown separately.
- Keep unresolved evidence visible when the next stage cannot be established.
A useful diagnosis identifies a demonstrated failure or explains an intentional no-order result. It does not require trading until something fills. Banger’s public beta is paper-only; a synthetic fixture or simulated fill establishes limited implementation evidence, not real execution or a profitable strategy.