volRegimeMM — 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 | 15 tagged calls, 0 off-format |
| Side panel | 20 rows, padded to the 3-column grid |
| Chart marks | reference-levels |
| Palette | 8 / 8 canonical |
| GUI settings | 20 exposed · 0 read at runtime · 0 untunable · 0 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.4% against buy-and-hold's 39.2% — an edge of -34.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
Spot accumulation conditioned on the realized-volatility regime, not on price direction.
Four volatility estimators are computed each cycle and averaged into one σ — Parkinson (high-low range), a return-based rolling standard deviation, an ATR-normalised estimate, and an EWMA with λ = 0.97. That average is then z-scored against its own rolling 200-cycle history, and every decision reads the z-score rather than the raw σ:
- Accumulate when
volZ ≤ -0.5— calm relative to this market's own norm — one rung of a 6-level ladder, each rung 0.8× the last. - Scale out when
volZ ≥ 1.2and the position is at least 1% up, selling 30-80% depending on how extreme the spike is. - Take profit separately at 2× the gain target, selling half.
- Halt after 3 consecutive losses, or a daily loss beyond 2% of allocation.
Using a z-score rather than an absolute threshold is the design decision that makes it portable: 'calm' for DOGE and 'calm' for BTC are very different numbers, and the z-score puts both on one scale.
As with the other accumulate-and-scale strategies in this pack, there is no stop-loss sell. Every sell path requires a profit.
This is the maintained version of volHarvester, renamed at v2.0 because the original documented itself as variance-risk-premium capture, which it is not. Both files still ship and both are selectable in the GUI; they were measured against each other here and are behaviourally identical.
Read from the shipped strategy source, not from its documentation.
The measured constraint
Time in market is 99.5%, over 78 round trips across all 7 markets and three years. Everything in the performance report rests on that fraction of the bars.
Settings, measured
This strategy does not use the engine config surface.
What to build next
Ordered by expected effect on the result, not by effort.
1. Retire volHarvester rather than shipping both
Highest priority
volHarvester and this strategy are the same strategy. Measured on 3 years × 7 markets they produce identical trades and identical returns to four decimal places — same buys, same sells, same final cash. The only differences were in the header text and a dead store field.
Both are currently selectable in the Gunbot GUI as separate entries, so an operator can pick the superseded one without knowing it is superseded — and before this audit its header still claimed the variance-risk-premium framing that this file's own header calls a misrepresentation. Both headers are now corrected and volHarvester is marked SUPERSEDED, but the real fix is to stop shipping it: remove its editor entry so it cannot be chosen, and keep the file only for operators already running it.
The same question applies to two other pairs found in the pack: almgrenMicroMM → arrivalPriceMM and gatheralNoArbMM → driftCorrectedMM. All six files ship and all six are in the GUI. None has been checked for whether the v1 and v2 differ behaviourally.
2. Re-tune the ladder, which has never been tuned
Highest priority
VR_MAX_DCA (6) and VR_DCA_DECAY (0.8) had never done anything before this audit — the ladder could not advance past its first rung. So these values have never been measured, because until now they could not be.
Enabling the ladder at those untouched defaults already more than doubled median return while slightly reducing median drawdown. That strongly suggests the parameter space is unexplored. A sweep over MAX_DCA 3-10 and DCA_DECAY 0.6-1.0 is the highest-value experiment available on this strategy and should run before either value is treated as settled.
3. Give it a way out of a position that never becomes profitable
High priority
Every sell path requires a gain — the vol-spike exit needs gainPct ≥ 1%, the take-profit path 2%. Nothing closes a position that is underwater, so inventory bought into a decline is held until the market recovers.
That is why the win rate reads 100% on every market: a structural artifact, not a result. It only ever closes winners, and the risk lives entirely in what it still holds. Drawdown, not win rate, is the number to watch.
Worth testing: release a rung once the volatility regime that justified buying it has clearly passed — volZ back above 0 for N cycles — independent of profit. That keeps the thesis (buy calm, sell fear) while admitting the thesis can be wrong.
4. Check whether four estimators beat one
Worth testing
The ensemble is an equal-weighted mean of four estimators, which is meaningfully more code than any one of them. Whether the blend beats the best single estimator on this decision has never been measured — and since every decision reads only the z-score of the blend, much of what distinguishes the four may be normalised away before it reaches a decision.
Cheap to test and it either justifies the complexity or removes it: run with each estimator alone and compare. This audit already found that two further estimators were claimed in the header and never implemented, so the question of how many are actually needed is open rather than settled.
5. Measure it against cash, not buy-and-hold
Worth testing
It returns a positive result on 7 of 7 markets and still loses to buy-and-hold on 6, heavily where the market trended. That gap is mostly design, not flaw: it caps every exit at a small gain target and scales out into strength, so it cannot follow a trend by construction.
The benchmarks that would say something useful are return on capital actually at risk, and risk-adjusted return — median drawdown of 1.4% while invested on nearly every bar is the real claim worth testing, and buy-and-hold does not test it.
6. The settings measurement does not yet cover this lineage
Read before acting on the others
The audit proves which settings a strategy reads by running it with a recording proxy over its config object. That works for the 348 Gunbot Quant files, which go through one shared config accessor, and not yet for the 79 Quantroduction files including this one — they build a plain settings object straight from the GUI values, so there is nothing to wrap.
So the report can say 20 settings are exposed in the GUI but cannot yet prove all 20 are read, nor that nothing read is missing. This audit found two dead settings on this strategy by hand (VR_MAX_DCA, VR_DCA_DECAY), which is exactly what the proxy would have caught automatically. Wrapping the settings object would cover all 79 files at once and is the highest-value improvement to the audit itself.
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
- 15
- Raw and off-format
- 0
- Exempt (object and error dumps)
- 14
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
- 20
- Section headers
- 4
- Rows with no tooltip
- 1
- Padded to the 3-column grid
- yes
- Model
- reference-levels
draws price levels into customChartTargets and no per-trade marks, so there is no intent-vs-fill distinction to get wrong
- 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
20 settings appear in the Gunbot strategy editor for this strategy. Which of them the code reads has not yet been measured for this lineage: it does not use the shared config surface, so there is nothing to wrap with a recording proxy.
LOG_LEVELWARMUP_CYCLESVR_VOL_LBVR_EWMAVR_HIGH_ZVR_EXT_ZVR_LOW_ZVR_SELL_ZVR_BUY_ZVR_MAX_EXPVR_MAX_DCAVR_DCA_DECAYVR_COMPOUNDVR_SPMIN_ORDER_QUOTEVR_TLVR_CAPITAL_ALLOCVR_GAINVR_MAX_DDVR_FEE
Open presentation findings
- WARN · sidebar — 1 of 20 data row(s) carry no tooltip, so the value has no explanation in the GUI: Holding