QGrid_DONCHIAN_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.1% against buy-and-hold's 49.6% — an edge of -46.5% — and is profitable on 6 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 implementation, one settings block, and 101 strategies in this pack are the same engine with a different block. This one is anchor: donchian, spacing: pct, sizing: anti, regime: adx, which is what its name spells out.
A resting ladder under a moving anchor:
- Anchor — the Donchian midline over
G_anchorPeriod(50), i.e. the midpoint of the 50-bar high and low. - Levels —
G_levels(10) rungs below the anchor,G_stepPct(1%) apart. - Size per rung —
G_sizing(anti) makes each rung smaller the deeper it goes:G_clip × G_sizeFactor^−(k−1), so 30 quote at the first rung, 23.1 at the second, 17.8 at the third. - Exit —
G_tpMode(next) sells a filled rung at the next rung up. - Regime gate — the grid does not arm while ADX is above
G_regimeThresh(25).
A controlled experiment, by accident
This file and QGrid_KAMA_PCT_ADX_Anti are identical in every shipped setting except the anchor — same 1% spacing, same 10 rungs, same 30-quote clip, same 1.3 anti-martingale factor, same ADX-25 gate, same next-rung exit. One is a Donchian midline, the other a Kalman-adaptive moving average. Both were measured over the same 3 years, the same 7 markets, the same 15m bars.
So the pair answers a question no single report can: how much does the fair-value estimate matter?
| Donchian(50) | KAMA(50) | |
|---|---|---|
| median return | 3.07% | 3.17% |
| median profit factor | 1.40 | 1.29 |
| median max drawdown | 3.40% | 4.40% |
| profitable markets | 6 of 7 | 7 of 7 |
Per market the two agree to within a point on five of seven; the exceptions are ETH (Donchian +1.61 points better) and SOL (KAMA +2.90 better). Round-trip counts differ by up to a quarter — SOL takes 547 trades on Donchian and 678 on KAMA — and the returns still land in the same place.
Swapping the anchor moves the median by a tenth of a percentage point. Whatever edge this engine has does not come from the fair-value estimate. It comes from the ladder mechanics: buy a rung on a dip, sell it at the next rung up, size the deeper rungs smaller. The anchor only decides where the ladder is centred, and over three years that averages out.
That is worth knowing before anyone tunes an anchor period, and it is the first factor-level result the family has produced. The Donchian side is marginally the better-behaved of the two — higher profit factor on lower drawdown — but on one comparison across seven markets that is not a finding, it is a tie.
It works, and it barely participates
Profit factor is above 1 on 6 of 7 markets, median drawdown is 3.40%, and the seven returns spread over 5.5 points — genuinely different market results, not an arithmetic floor.
The return is nonetheless +3.07% median over 3.2 years, and the reason is the deployment line: peak inventory is about 10% of the account. G_clip is an absolute quote amount (30), not a fraction, so the whole ten-rung ladder commits roughly 110 quote regardless of account size — 11% of the 1,000 tested, 1.1% of a 10,000 account, 55% of a 200 one.
The setting that would express the ladder as a fraction of equity is G_invMax, "Ceiling on how much of equity the grid may hold", and it 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 2653 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. Read the 101 files as the factor experiment they already are
Highest priority
This strategy and QGrid_KAMA_PCT_ADX_Anti differ in exactly one setting and land within a tenth of a point of each other. That is not a curiosity — it is the shape of the whole family.
The 101 quantgrid files are a factorial design across anchor (sma / ema / kama / donchian / static), spacing (pct / atr), sizing (flat / anti / martingale), regime gate (adx / chop / none) and the tp mode. Nobody has read them as one, and every one of them is being measured at 15m anyway.
The comparison to run once enough have landed is factor-versus-factor, not strategy-versus-strategy: does anti beat martingale, does ATR spacing beat percent, does the regime gate earn its place. Each of those is a seven-market median over dozens of files, which is a far stronger result than any single file's return — and it costs nothing beyond the runs already queued.
On the evidence so far the anchor is the factor that matters least. Start with sizing and the regime gate.
2. Find out whether the edge survives being scaled up
Highest priority
Profit factor is above 1 on six of seven markets and drawdown is 3.40%, on a ladder that commits about 110 quote regardless of account size — roughly 10% of the 1,000 tested here.
That makes the headline return close to 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 one trend fills every rung before any of them sells.
Run G_clip at 30, 60, 120 and 240 across all seven markets and read profit factor and drawdown, not return. A profit factor holding near 1.40 as the clip grows is what would make this interesting; one decaying towards 1 says the edge lives in being small.
3. 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.
That matters most for the experiment above. Scaling G_clip up is precisely 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.
4. 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. Plausible, and never measured on this engine.
It is also a likely cause of the low participation: a grid that refuses to arm in a share of conditions is idle for that share 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 costs more than it saves. Because the KAMA sibling shares this exact gate, whatever the answer is can be checked twice.
5. Nothing is wrong with this one
Read before acting on the others
All five correctness invariants hold, the seven markets spread over 5.5 points rather than clustering on an arithmetic floor, and it does not stop trading.
It still loses heavily to buy-and-hold over this window — +3.07% against a market that returned far more — and the report says so. But that gap 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