QGrid_KAMA_PCT_ADX_Anti — Status & roadmap
Where this strategy is today
ENGINEERING COMPLETE — the code is correct, uniform and shippable. That is a statement about engineering, not about profitability; the performance verdict is separate and sits below it.
| Dimension | State |
|---|---|
| Correctness | 5 / 5 invariants pass |
| Console output | 18 tagged calls, 4 off-format |
| Side panel | 6 rows, padded to the 3-column grid |
| Chart marks | drawn only after the exchange confirms a fill |
| Palette | 8 / 8 canonical |
| GUI settings | 24 exposed · 20 read at runtime · 0 untunable · 4 inert |
| Deployed to a live install | Not yet — audited and staged, not yet shipped |
Performance verdict. Over three years on 7 markets it returns a median 3.2% against buy-and-hold's 49.6% — an edge of -45.6% — and is profitable on 7 of 7. On this window it is not a replacement for simply holding the asset, and nothing in these reports claims it is.
What it actually does
The pack's shared quantgrid engine — one file, one settings block, and 101 strategies in this pack are the same engine with a different block. This one is anchor: kama, spacing: pct, sizing: anti, regime: adx, which is what its name spells out.
A resting ladder under a moving anchor:
- Anchor —
G_anchorpicks the centre line; here KAMA overG_anchorPeriod(50). - Levels —
G_levels(10) rungs below the anchor, spaced byG_spacing; herepctatG_stepPct(1%) apart. The alternative is ATR-scaled. - Size per rung —
G_sizing(anti) makes each rung smaller than the one above:G_clip × G_sizeFactor^−(k−1), so 30 quote at the first rung, 23.1 at the second, 17.8 at the third. Martingale is the opposite and is what the_Martsiblings ship. - Exit —
G_tpMode(next) sells a filled rung at the next rung up.pctandatrmodes exist. - Regime gate —
G_regime(adx) stops the grid arming when ADX is aboveG_regimeThresh(25), on the reasoning that a ladder should not be catching a trend.
This one works, and it barely participates
It is the healthiest result in this audit so far: profit factor above 1 on all seven markets (1.00 to 1.64, median 1.29), profitable on 7 of 7, median drawdown 4.4%, and median fee drag under 2%. Nothing here is broken and nothing is stopping early — the seven returns spread over 8.2 points, which is what seven genuinely different market results look like.
The return is nonetheless +3.17% median over 3.2 years, roughly 1% a year, and the reason is on the deployment line: peak inventory is 7–11% of the account. Ninety percent of the capital never leaves cash.
That is arithmetic, not a judgement. G_clip is an absolute quote amount (30), not a fraction, and the ladder is 30 × 1.3^−(k−1) over ten rungs — about 110 quote in total, however large the account is. On the 1,000 tested that is 11%; on a 10,000 account it would be 1.1%; on a 200 account it would be 55% and the drawdown would be five times what is reported here.
So the honest way to read this page is: a small, well-behaved edge applied to a tenth of the account. Whether it survives being applied to the whole account is the open question, and it is the first thing the roadmap asks for.
The setting that would have expressed the ladder as a fraction of equity — G_invMax, labelled "Ceiling on how much of equity the grid may hold" — is one of the five settings this engine never reads. See the fixes report.
Read from the shipped strategy source, not from its documentation.
The measured constraint
Time in market is 95.8%, over 2750 round trips across all 7 markets and three years. Everything in the performance report rests on that fraction of the bars.
Settings, measured
The GUI exposes 24 settings. Which ones this strategy actually reads was measured by running it with a recording config proxy rather than inferred from the source — a quantgrid file bakes 24 keys and only the active mode's branch reads any of them.
- Read at the shipped defaults:
G_anchor,G_anchorPeriod,G_atrPeriod,G_clip,G_levels,G_regime,G_regimePeriod,G_regimeThresh,G_sizeFactor,G_sizing,G_skew,G_spacing,G_stepPct,G_tpMode,G_trendGuard,G_zGate - Read only once you change
G_spacing— the value that first reaches each:G_atrMultunderatr - Read only once you change
G_tpMode— the value that first reaches each:G_tpAtrMultunderatr;G_tpPctunderfixed - Read only once you change
G_trendGuard— the value that first reaches each:G_trendLenundertrue - Exposed but never read on this code path:
G_invMax,G_target,G_slPct,G_fee— turning these does nothing
What to build next
Ordered by expected effect on the result, not by effort.
1. Find out whether the edge survives being scaled up
Highest priority
Profit factor is above 1 on all seven markets and drawdown is 4.4%, on a ladder that commits about 110 quote regardless of account size — 9% of the 1,000 tested here.
That makes the headline return almost meaningless on its own. The same edge at four times the size is either roughly four times the return at roughly four times the drawdown, or it is not — grids stop behaving linearly once the ladder is deep enough that a single trend can fill every rung before any of them sells.
The experiment is G_clip at 30, 60, 120 and 240 on all seven markets, reading profit factor and drawdown rather than return. Profit factor holding near 1.29 as the clip grows is the result that would make this strategy interesting; profit factor decaying towards 1 is the result that says the edge lives in being small.
2. Two of this engine's five dead settings are the risk controls
Highest priority
G_invMax ("Ceiling on how much of equity the grid may hold") and G_slPct ("Hard stop for the whole basket") are never read, on this file and on all 101 that share the engine. G_skew, G_target and G_fee are inert too — the first two because the expression that uses them multiplies by zero in both of its branches.
That matters most for the experiment above. Scaling G_clip up is exactly the change that makes an inventory ceiling and a basket stop worth having, and neither exists. Wire G_invMax before scaling the clip, not after.
Fourteen of the 101 ship a non-zero G_slPct, so fourteen operators can see a stop-loss configured on a strategy that has none.
3. Check whether the ADX regime gate earns its place
High priority
The grid does not arm above ADX 25, on the reasoning that a ladder should not catch a trend. That is a plausible rule and it has never been measured on this engine.
It is also the gate most likely to be responsible for the low participation: a grid that refuses to arm in a third of conditions is a grid that is idle a third of the time, and idle is already this strategy's defining characteristic.
Run G_regime as adx and as none, and G_regimeThresh at 20, 25 and 35, across all seven markets. Read round-trip count and profit factor together — if turning the gate off doubles the trades and holds the profit factor, the gate is costing more than it saves.
4. The anti-martingale choice has 100 siblings to compare against
Worth testing
This file ships sizing: anti, making each rung smaller as price falls. Its _Mart siblings ship the opposite. Because all 101 files are the same engine, the pack is already a designed experiment across anchor, spacing, sizing and regime — and no one has read it as one.
Once enough of the 101 have been measured at 15m, the comparison to run is not strategy-versus-strategy but factor-versus-factor: anti versus martingale, pct versus atr spacing, kama versus ema versus donchian anchors, adx versus chop versus no regime gate. That is a far stronger result than any single file's return, and it costs nothing beyond the runs already queued.
5. Nothing is wrong with this one, and that is worth saying
Read before acting on the others
All five correctness invariants hold, the seven markets spread over 8.2 points rather than clustering on an arithmetic floor, no exit is silent, and it does not stop trading. After a run of strategies that reported a floor as a result, this one reports a result.
It still loses to buy-and-hold by a wide margin over this window — +3.17% against +49.6% — and the report says so. But the gap here is a statement about how little of the account it uses, not about the trades it makes.
Operator output, measured
Everything below was read out of the strategy file by the presentation audit, not taken from its documentation. These are the surfaces an operator actually watches: the terminal log, the side panel, the chart, and the settings the GUI offers.
- Tagged, aligned, coloured
- 18
- Raw and off-format
- 4
- Exempt (object and error dumps)
- 7
Every non-exempt line carries the strategy name, an event tag and the palette colour for that tag, so one terminal running many pairs stays readable.
- Data rows
- 6
- Section headers
- 1
- Rows with no tooltip
- 0
- Padded to the 3-column grid
- yes
- Model
- fill-confirmed
A mark is drawn only once the exchange confirms the fill, so the chart never shows a trade that did not happen.
- Non-canonical colours
- 0
One colour per meaning, identical in the log, the panel and the chart — the eight canonical roles.
Settings the GUI exposes
24 settings appear in the Gunbot strategy editor for this strategy. 20 of them are read at runtime — measured by running the strategy with a recording proxy over its config, not inferred from the source.
G_anchorG_anchorPeriodG_atrMultG_atrPeriodG_invMaxG_levelsG_regimeG_regimePeriodG_regimeThreshG_sizingG_skewG_spacingG_stepPctG_trendLenG_zGateG_clipG_sizeFactorG_targetG_tpAtrMultG_tpModeG_tpPctG_slPctG_trendGuardG_fee
Open presentation findings
- WARN · console — 4 raw console.* call(s) bypass the tagged emitter — output carries no tag and will not align: [${STRATEGY_NAME}] wait new candle.); return; } / [${STRATEGY_NAME}] anchor warming up.); return; } / [${STRATEGY_NAME}] buys gated.); return; }
- DEFECT · inputs — 4 knob(s) exposed in the GUI are never read on this strategy's code path — turning them does nothing: G_invMax, G_target, G_slPct, G_fee