A max drawdown number tells you how deep the hole was. It doesn't tell you what dug it, and the fix depends on that:
- Stops hit soon after entry. The entry or the stop size is the problem.
- Losers that were in profit first. The exit is the problem.
- Trades held too long against you. You need a time exit.
So I zoom into the worst stretch and look at the trades one by one. This post walks through one run, including a check I expected to explain the drawdown and that didn't.
The run
- Strategy: moving-average cross (5/20), take profit 0.3%, stop loss 0.2%
- Data: 30,000 synthetic 15-minute bars from a regime-switching generator. The dataset is named USDJPY_15M, but the prices and the dates (Oct 2026 to Sep 2027) are made up
- Result: 1,863 trades, +4.6%, max drawdown -14.1%, win rate 41.5%
The UI in the screenshots is in Japanese. There is an EN switch at the top right.
The worst week
Instead of the deepest point of the drawdown, I looked for the steepest 7-day fall in equity. The deepest point often sits at the end of a long, slow slide, and a single week of that slide looks like nothing. The steepest week was Dec 13 to Dec 20: equity went from 10,303 to 9,691.
I compared the 46 trades opened that week with all 1,863:
| That week | Whole run | |
|---|---|---|
| Win rate | 19.6% | 41.5% |
| Closed by the stop | 70% (32 of 46) | 49% |
| Median holding time | 0.76 h | 0.76 h |
| Losers that were in profit first (by at least half the loss) | 35% | 31% |
The holding time didn't change, so the trades weren't held longer. The share of losers that were in profit first barely moved, so the exit wasn't giving back more than usual. What changed was the stop: 70% of the week's trades ended there, against 49% over the whole run.
The check that didn't explain it
My first guess was that the market was unusual that week. I split the 44 weeks of the run two ways and looked at the stop-out rate in each group:
| Weeks grouped by | Quietest / choppiest quarter | Middle half | Most volatile / trending quarter |
|---|---|---|---|
| Median 15-minute move | 49.7% | 48.9% | 48.5% |
| Trend efficiency (net move / range) | 49.4% | 49.1% | 48.0% |
The stop-out rate is about 49% in every group. The drawdown week ranked 17th of 44 by volatility, right in the middle. It was a trending week (efficiency 0.68 against a median of 0.35), but the trending quarter as a whole made money: +33 a week on average.
A weekly label would have said "trend week, this strategy is fine in trends". That would have been wrong, and the weekly numbers couldn't show why.
What the trades showed
The zoomed chart shows it. Price rallied from 123.9 to 133.5 in three days, then moved sideways between 131 and 137, with a spike to 137.09 on Dec 16 that reversed within the day.
The stops were hit on both sides: 16 of 23 buys and 16 of 23 sells. A 0.2% stop is only about 2.5 median 15-minute moves wide. That's fine while price drifts. After a rally of nearly 8%, the swings around the new level were wide enough to reach it in both directions, while the average bar size for the week still looked normal.
The trade timeline under the charts shows the same range from the trades' side. Each bar is one trade, from open to close: green for buys, red for sells. Overlapping trades go on separate rows. The bars are short and they alternate between buys and sells, so these were quick stop-outs in both directions, not a few trades that dragged on.
This doesn't tell me the fix. It tells me where to look: at the stop size or at a filter right after large moves, not at the exit. I'd test either one on a part of the data I haven't looked at yet, because a filter tuned on one bad week fits that week and little else.
Doing this with your own backtest
- Find the steepest 7-day fall in equity, not the deepest point.
- For that week's trades, compare four numbers with the whole run: win rate, share closed by the stop, median holding time, share of losers that were in profit first.
- If only the stop share jumped, look at the entry and the stop. If the in-profit-first share jumped, look at the exit. If holding time jumped, add a time exit.
- Don't trust a weekly volatility or trend label to find it for you. In this run it pointed the wrong way.
How the zoom works
Some details on the chart side, in case you're building something similar.
The equity, drawdown, exposure and trade timeline charts are Chart.js with chartjs-plugin-zoom (Ctrl+wheel to zoom, drag to pan). When one finishes a zoom or pan, it reads its x range and applies it to the others with chart.zoomScale("x", { min, max }, "none"). The "none" animation mode matters: with animation on, each chart fires its own updates while the others are still moving.
The price chart is different. Its candles come from the server at a fixed bar budget, so on a range change it picks the finest timeframe that fits the range. In the clip, the zoomed week is drawn with 30-minute bars. It only picks timeframes the dataset actually has.
Redrawing the price chart is async. If it resets the other charts' ranges when it finishes, a Ctrl+wheel gesture that's still going gets cut off. So a flag keeps the other charts as they are while a sync redraw is in flight.
Entry and exit arrows are drawn only when 80 trades or fewer are in view. With 1,863 trades in the full view, arrows would just be noise. The two thin strips above the price chart show where opens and closes cluster, and the arrows take over once you've zoomed in far enough.
The demo runs without an account. The chart view in this post is in the app, where a free account comes with sample data to try it on: Hawk Backtester
If you find the cause of a drawdown a different way, I'd like to hear how.



Top comments (0)