← dipHunter

dipHunter — Status & roadmap

ENGINEERING COMPLETEAudited 2026-09-13· hand-written (no shared engine) engine· quantroduction· spot

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.

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:

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.

Terminal log
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.

Side panel
Data rows
20
Section headers
5
Rows with no tooltip
0
Padded to the 3-column grid
yes
Chart marks
Model
reference-levels

draws price levels into customChartTargets and no per-trade marks, so there is no intent-vs-fill distinction to get wrong

Colour palette
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