volHarvester — 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
SUPERSEDED — use volRegimeMM instead. This strategy was renamed volRegimeMM at v2.0 and both files ship in this pack. They were measured against each other here on 3 years × 7 markets and are behaviourally identical: same trades, same returns to four decimal places, same final cash. There is no behavioural reason to choose this file over its successor.
What it 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 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.
There is no stop-loss sell. Every sell path requires a profit.
Correction: an earlier version of this page described the strategy as capturing a variance risk premium and credited a Yang-Zhang estimator, following the file's own header. Both were wrong and the header has been corrected — see the fixes report. Capturing a variance risk premium needs options or variance swaps, which Gunbot does not access; the strategy takes outright long spot exposure and holds it on 99.5% of bars. Yang-Zhang was declared in the persisted store and never computed.
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. Use volRegimeMM and retire this file
Highest priority
This is the v1.6 file; volRegimeMM is the maintained v2.0. Measured side by side they are identical — the rename corrected documentation, not behaviour.
Both are currently selectable in the Gunbot GUI as separate entries, so an operator can pick this one without knowing it is superseded. The right action is to remove its editor entry so it cannot be chosen fresh, keeping the file only for operators already running it. Everything below applies equally to volRegimeMM and is better pursued there.
The same situation exists for two further pairs in the pack: almgrenMicroMM → arrivalPriceMM, and gatheralNoArbMM → driftCorrectedMM. All six ship, all six are in the GUI, and neither of those pairs has been checked for whether v1 and v2 actually differ.
2. Re-tune the ladder, which has never been tuned
High priority
VH_MAX_DCA (6) and VH_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.
Enabling it at those untouched defaults more than doubled median return while slightly reducing median drawdown, which suggests the parameter space is unexplored. Run the sweep on volRegimeMM, not here.
3. Give it a way out of a position that never becomes profitable
High priority
Every sell path requires a gain, so inventory bought into a decline is held until the market recovers. That is why the win rate reads 100% on all seven markets — a structural artifact of having only profitable exits, not a measure of skill. The risk lives entirely in what it still holds, so drawdown is the number to watch.
Worth testing: release a rung once the volatility regime that justified buying it has clearly passed, independent of profit.
4. Check whether four estimators beat one
Worth testing
The ensemble averages four estimators, which is more code than any one of them, and every decision reads only the z-score of the average — so much of what distinguishes them may be normalised away before it reaches a decision. Running each alone would either justify the complexity or remove it.
This audit found that two further estimators were claimed in the header and never implemented, so the question of how many are needed is open rather than settled.
5. 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 read 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 the report can say 20 settings are exposed but cannot prove all 20 are read. This audit found two dead settings here by hand (VH_MAX_DCA, VH_DCA_DECAY) — exactly what the proxy would have caught automatically.
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)
- 13
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_CYCLESVH_VOL_LBVH_EWMAVH_HIGH_ZVH_EXT_ZVH_LOW_ZVH_SELL_ZVH_BUY_ZVH_MAX_EXPVH_MAX_DCAVH_DCA_DECAYVH_COMPOUNDVH_SPMIN_ORDER_QUOTEVH_TLVH_CAPITAL_ALLOCVH_GAINVH_MAX_DDVH_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