dipHunter — 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 | 12 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 | 17 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 -64.5% against buy-and-hold's 49.6% — an edge of -114.1% — and is profitable on 2 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
A hand-written Quantroduction spot strategy — no shared generator engine, one published model. It buys fear and sells a fixed percentage above its own break-even.
- Entry. Requires
RSI < DH_RSI_BUY (45)and one confirmation: eitherMFI < DH_MFI_BUY (40)or price below the lower Bollinger band. Blocked outright whileRSI > DH_RSI_GREED (65). One layer ofTRADING_LIMITper entry, capped atDH_MAX_EXP (70%)of equity. - Averaging down. Up to
DH_MAX_DCAfurther layers, each needing a furtherDH_DCA_DROP (3%)fall, sized byDH_DCA_DECAY (0.8)per level.DH_MAX_DCAships at 1, so one extra layer. The ladder was unreachable until the 2026-09-12 pack repair; it was left at 1 because deeper measured worse — it averages down, so extra layers buy further into a fall. - Exit. Three coded paths — a stop at
−DH_MAX_DD (15%)from break-even, TP1 selling half at+DH_TP_PCT (2%), TP2 selling the rest at+DH_TP2_PCT (4%)— plus a fourth that is not coded as a path at all: a resting limit order published every cycle at break-even + 2%.
That fourth one is the strategy. Measured over three years on seven markets it takes 1,799 of 2,072 exits (86.8%), because it sits at the same price as TP1 and is matched against the bar's high before the strategy is asked to decide. TP1 fires 91 times, the stop 182, and TP2 never fires once.
So the honest description is: it buys oversold dips and sells them with a resting +2% limit order, with a −15% stop behind it.
Read from the shipped strategy source, not from its documentation.
The measured constraint
Time in market is 80.1%, over 2952 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. A 91% win rate that loses 42.8% — the arithmetic, exactly
Highest priority
This strategy wins 90–94% of its trades on every market tested and returns a median −42.8% over three years. Both numbers are correct, and the exit table shows why in one line:
| exit | count | share | mean gain |
|---|---|---|---|
| Resting target fill | 1,799 | 86.8% | +2.00% |
| TP1 | 91 | 4.4% | +3.25% |
| Stop loss | 182 | 8.8% | −16.07% |
A loser is 8.0× a winner. At +2.00% per win and −16.07% per loss the break-even ratio is 8.0 wins per loss; the strategy actually achieves 9.9. So the gross edge is real but thin — about +0.47% per trade — and then 2,072 trades pay a median 27.6% fee drag on the account, which is larger than the whole edge.
This is the structural-win-rate trap in its clearest form anywhere in the pack: the win rate is a property of where the exits are placed, not of whether the strategy is any good. Nothing in the trade record warns you. The risk sits in the 8.8% tail and in the inventory, exactly as it does for the grid strategies.
The experiment that follows directly: the ratio of stop distance to target distance is 15:2. Sweep them together rather than separately — a 4% target against a 15% stop needs 7.5 wins per loss, a 2% target against an 8% stop needs 4.0. Both are reachable at the observed hit rate; the current pairing is the one that is not.
2. The 15% stop realises −16.07% and its worst fill is −22.7%
High priority
DH_MAX_DD is set to 15 and the strategy announces STOP LOSS: drawdown x% exceeds -15% limit. Across 182 stop exits the mean realised loss is −16.07% and the worst is −22.70% — 1.5× the setting.
The mechanism is the same one found on Donchian_Reversion_MM, and it is not strategy-specific: the decision is taken on a closed bar and the market order fills at the next bar's open, so a gap between the two is loss the setting cannot prevent. Live, a second delay stacks on top of it.
What is different here is that this strategy has a cheap fix available that the mm-dca family does not, because it is already using a resting order for its take-profit. Publishing ledger.customStopTarget at break-even × 0.85 would put the stop in the same place as the target — a resting order matched against the bar's low, intrabar, with no fill delay at all. The engine already models customStopTarget, and the reconcile block added in this audit already books a fill it did not perform, so the accounting for it exists.
That is a behavioural change and was not made here: a resting stop fills on wicks that a next-open stop would have slept through, and with one price per bar this engine cannot tell those apart. It is the single highest-value measurement outstanding on this strategy, and the archived market data now holds 1-minute data for all seven pairs, which can settle it.
3. TP2 has never fired, and TP1 fires 4% of the time
Worth testing
DH_TP2_PCT (sell everything at +4%) fired zero times in 2,072 exits. DH_TP1_PCT (sell half at +2%) fired 91 times, 4.4%.
Neither is inert in the dead-knob sense — the code reads them and the paths are reachable — but both are unreachable in practice, and for a structural reason: the resting limit order sits at the same +2% as TP1 and is matched first. A position can only reach TP1's market path on a bar where the high never touched break-even + 2% but the mid did, and it can only reach TP2 if the resting order was somehow not standing.
So the GUI presents a two-stage profit ladder that is really a single resting order. Two ways to make the panel honest, in increasing order of ambition: price TP1 above the resting target so the two are distinct decisions, or drop the market TP paths altogether and publish a second resting order for the TP2 tranche. Either way the panel's TP1/TP2 rows should stop advertising behaviour that 95.6% of exits do not follow.
4. DH_CAPITAL_ALLOC ships at 9090, which disables two safety features
Worth testing
DH_CAPITAL_ALLOC defaults to 9090 quote and feeds two things:
effectiveBase: min(baseBalance, DH_CAPITAL_ALLOC)— the per-pair capital cap. For any account below 9,090 quote theminalways selects the balance, so the cap never binds.- The daily loss limit,
dailyPnL < −(DH_CAPITAL_ALLOC × 0.02)— an absolute −181.80 quote. Against the 254-quote account this strategy calibrates to, that is a 71.6% single-day loss.
Both were checked over the full run rather than reasoned about: the circuit breaker and the daily loss limit each fired exactly zero times across three years and seven markets.
The default was left alone, and the measurement is the reason. Setting DH_CAPITAL_ALLOC to the account size actually in use (254) makes both gates live and makes the results worse on five of seven markets — ETH −5.8% → −30.2%, LINK −42.8% → −61.0%, SOL −37.5% → −46.2% — because the cap blocks re-entries that were recovering. So this is reported rather than repaired: an operator who sets it to a realistic figure should expect fewer trades and, on this data, a worse result. What they get in exchange is a daily loss limit that can actually stop the strategy.
5. It is deployed 66% of the time and holds the bag through the drawdown
Worth testing
Unlike most of the pack's mean-reversion strategies, this one is not mostly in cash: median exposure is 65.6%, and median max drawdown is 67.1% against a buy-and-hold that returned +39.2% over the same window. It is profitable on 1 of 7 markets and beats buy-and-hold on 0 of 7.
That combination — high exposure, high drawdown, a positive per-trade edge and a negative total — is what a strategy looks like when it sells its winners at +2% and holds its losers until −16%. The three-year window contains a real bull market, and capping every gain at 2% while leaving the downside to a distant stop gives all of it away.
The measurement worth having before any further tuning: split the window by trend direction and report the strategy separately on rising and falling stretches. On the one-year 2025-07 → 2026-07 window, where buy-and-hold returned a median −52%, this shape of strategy looks entirely different. Neither number alone is the truth about it.
6. What this audit repaired, and what it deliberately did not
Read before acting on the others
Repaired: the strategy now books the 86.8% of its exits it previously never saw, seventeen settings can hold the value 0, and four panel rows gained tooltips. The trading behaviour is byte-identical — same buys, same sells, same return and drawdown to the last decimal on all seven markets. What changed is that the panel now tells the truth.
Not repaired, deliberately, each with the measurement that decided it: the DCA ladder default stays at 1 (deeper measured worse), DH_CAPITAL_ALLOC stays at 9090 (setting it realistically measured worse), and the stop stays as a market order (a resting stop cannot be evaluated fairly on hourly bars).
None of that makes the strategy profitable on this window. It makes it honest about not being profitable, which is the prerequisite for the tuning work above.
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
- 12
- Raw and off-format
- 0
- Exempt (object and error dumps)
- 20
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
- 5
- Rows with no tooltip
- 0
- 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
17 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_CYCLESDH_MAX_DCADH_DCA_DROPDH_DCA_DECAYDH_RSI_BUYDH_RSI_GREEDDH_MFI_BUYDH_MAX_EXPDH_SPMIN_ORDER_QUOTEDH_TLDH_CAPITAL_ALLOCDH_TP_PCTDH_TP2_PCTDH_MAX_DDDH_FEE