ATRChannel_MM — 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 | 18 tagged calls, 0 off-format |
| Side panel | 6 rows, padded to the 3-column grid |
| Chart marks | drawn only after the exchange confirms a fill |
| Palette | 8 / 8 canonical |
| GUI settings | 32 exposed · 32 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 -41.7% against buy-and-hold's 39.2% — an edge of -112.0% — and is profitable on 1 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
The pack's shared MM-DCA template with its selector MM_signal set to atrchan. One file, fifteen possible strategies; the other fourteen signals and their settings sit dormant until the selector is changed. Fourteen other strategies in the pack are this same file with a different value — Donchian_Reversion_MM is the donchian branch and has its own report.
With atrchan selected it is a volatility-channel mean-reversion buyer:
- The channel.
SMA(close, MM_period=20)is the mid,ATR(MM_atrPeriod=20)the width. The floor ismid − MM_mult(2.0) × atr. - Entry. Price at or below the floor plus a fifth of an ATR —
price <= (mid − 2×atr) + atr × MM_entryPad(0.2). That adds one layer ofMM_tl(50 quote), decaying byMM_decay(0.75) per layer, up toMM_maxDca(3) layers, each further layer needing priceMM_step(0.25%) below the previous entry. Exposure capped atMM_maxExp(80%). - Exit — whole position, first match wins: hard stop at −
MM_maxDd(8%) from break-even; TTL atMM_maxHold(150) cycles; profit target atMM_gain + MM_fee(0.22% after this pack's fee repair); then the indicator exit,price >= mid − atr × MM_exitPad(0.1).
So it buys two ATRs below a 20-bar average and sells back at that average. The distance between those is the trade. Measured across seven markets over three years: 82.2% of exits are the profit target, 15.1% the indicator, 2.7% the stop, and the TTL never fires once in 4,427 exits.
Read from the shipped strategy source, not from its documentation.
The measured constraint
Time in market is 14.8%, over 4427 round trips across all 7 markets and three years. Everything in the performance report rests on that fraction of the bars. A strategy out of the market 85% of the time is not therefore a low-risk one: the 61.4% drawdown happens entirely inside the time it is committed.
Settings, measured
The GUI exposes 32 settings. Which ones this strategy actually reads was measured by running it with a recording config proxy rather than inferred from the source — a mm-dca file bakes 32 keys and only the active mode's branch reads any of them.
- Read at the shipped defaults:
MM_atrPeriod,MM_dcaMode,MM_decay,MM_entryPad,MM_exitPad,MM_fee,MM_gain,MM_maxDca,MM_maxDd,MM_maxExp,MM_maxHold,MM_minOrder,MM_mult,MM_period,MM_signal,MM_step,MM_tl - Read only once you change
MM_signal— the value that first reaches each:MM_af0,MM_afMaxunderpsar;MM_base,MM_conv,MM_spanBunderichimoku;MM_entry,MM_exitunderrsi;MM_entryPctundersupertrend;MM_exitAdx,MM_minStrunderadx;MM_fast,MM_minDip,MM_signalP,MM_slow,MM_smaPeriodundermacd
What to build next
Ordered by expected effect on the result, not by effort.
1. Fee drag is 67.7% of the account — the largest single term in the result
Highest priority
Median return is −41.7% over three years against a buy-and-hold of +39.2%, an edge of −112.0%. Median fee drag is 67.7% of the account, across 4,427 round trips — 632 per market.
Put those together and the diagnosis is arithmetic rather than opinion. The profit target realises a mean +0.81% and takes 82.2% of exits. The strategy pays roughly 0.2% per round trip in fees and slippage. So about a quarter of every winning trade is consumed by the cost of making it, and the strategy needs its 84% win rate just to stay near water — which it does not manage: the median profit factor is 0.83, and only XRP (1.04) is above 1.
The experiment this points at is not a better signal, it is less trading. The entry is 2 × ATR below a 20-bar mean and the exit is at the mean: widen MM_period from 20 towards 50+, or MM_mult from 2.0 towards 3.0, and the same logic takes perhaps a tenth as many trades at several times the distance. If the edge survives that, fee drag stops being the dominant term and the numbers become about the signal. If it does not survive, there was no signal — and that is worth knowing before tuning anything else.
The comparison is already on the shelf: Donchian_Reversion_MM, the same template on a 10-bar channel, takes 2,509 exits for a 34.7% fee drag and returns −28.8%. Half the trades, half the drag, 13 points better. The trend points the same way this recommendation does.
2. An 8% stop that realises −9.55% and has filled at −21.28%
High priority
MM_maxDd is set to 8 and the side panel draws the stop at exactly −8% from break-even. Across 121 stop exits the mean realised loss is −9.55% and the worst is −21.28% — 2.7× the setting.
This is the same defect already documented on Donchian_Reversion_MM, and it is a property of the shared template rather than of this branch: the decision is taken on a closed bar and the market order fills at the next bar's open, so any gap between them is loss the setting cannot prevent. Live, a second delay stacks on top, because the stop sits behind if (!isNewCandleTick) return and on an hourly chart is only evaluated once an hour.
It is deliberately not repaired here, for the reason given in that report: checking more often makes deep losses smaller and also stops out wicks that would have recovered, and with one price per bar this engine cannot tell those apart. What has changed since that report was written is that the data to settle it now exists — the archived market data holds 1-minute bars for all seven pairs. Re-running the template with the stop inside and outside the candle gate on 1m data would answer it once for all fifteen strategies.
Those 121 stops, 2.7% of all exits, cost −1,155% summed. The 669 indicator exits cost −943%. So a fortieth of the trades does more damage than the entire second-largest exit path.
3. Removing the stop turns −41.7% into +18.7%, and that is mostly an artifact
High priority
The second variant every report measures — never exit below the position average — changes this strategy more than almost any other audited so far:
| with the stop | never exits at a loss | |
|---|---|---|
| Median return | −41.7% | +18.7% |
| Median max drawdown | 61.4% | 36.9% |
| Ends still holding | — | 7 of 7 markets |
| Exits refused | — | 118,872 |
Read that carefully, because it is the most misleading-looking number in this report. The variant does not find a better strategy; it defers the loss into inventory. It ends holding an open position on all seven markets, so the +18.7% is a return on a book that has not been closed, and the 118,872 refused exits are the losses that would otherwise have been realised.
What it does tell you is real and useful: the stop and the indicator exit together are removing more value than they protect, on this window. That is consistent with the previous item — a −9.55% average stop against a +0.81% average win is a terrible exchange rate.
So the honest conclusion is not "turn the stop off". It is that the stop distance and the target distance are badly matched, and the fix is to move them together rather than to remove one. A target of 0.22% with a stop at 8% needs 36 wins per loss to break even; the strategy gets 30.
4. It is in the market 14.8% of the time and still loses 41.7%
Worth testing
Median exposure is 14.8% and mean weight is 10–14%, yet peak weight is 100% on six of seven markets. So the strategy is in cash most of the time, and when it commits it commits everything.
That matters for how the drawdown should be read. A 61.4% maximum drawdown incurred inside 14.8% of the bars is not a gently declining equity curve — it is concentrated in the fraction of time the strategy is actually exposed. Being out of the market 85% of the time does not make the committed 15% any safer, and the headline return understates how violent the invested periods were.
It also means the result rests on a relatively small sample of market conditions despite three years of data. Worth measuring before drawing conclusions: split the window by trend direction and report the strategy separately on rising and falling stretches. XRP is the only market where it made money (+6.8%), and XRP is where buy-and-hold rose most steeply — the opposite of what a mean-reversion buyer would be expected to prefer, which suggests the sample is small enough that market character is dominating.
5. Nothing needed repairing on this file
Read before acting on the others
This is the second strategy in the audit queue to come through with no defect of its own, after Donchian_Reversion_MM — and for the same reason. Its settings surface is complete: all 32 GUI knobs are read, 17 at the shipped defaults and 15 once MM_signal is changed, with none inert and none untunable. Its chart marks are fill-confirmed, its side panel is padded and fully tooltipped, its palette is canonical, and all 18 of its console calls use the tagged format.
The automatic fixers changed nothing: no log sites, no pyramid gate, no tooltips, no zero-knob sites. The re-run after the fix step was byte-identical, as it must be when nothing was fixed.
That is because the defects it would have carried were already found and repaired across the family during the SuperTrend_MM audit — the unread MM_fee that put the profit target exactly on the cost line, the mislabelled MM_signal selector, and the fee tooltip that disagreed with the file by a factor of two. MM_GAIN_NET: MM.gain + MM.fee at line 702 is that repair, and this strategy inherits it.
Everything in this report is therefore measured behaviour, not a defect list. The strategy does what it says it does. What it does is not currently profitable.
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
- 18
- Raw and off-format
- 0
- Exempt (object and error dumps)
- 7
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
- 6
- Section headers
- 1
- Rows with no tooltip
- 0
- Padded to the 3-column grid
- yes
- Model
- fill-confirmed
A mark is drawn only once the exchange confirms the fill, so the chart never shows a trade that did not happen.
- 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
32 settings appear in the Gunbot strategy editor for this strategy. 32 of them are read at runtime — measured by running the strategy with a recording proxy over its config, not inferred from the source.
MM_af0MM_afMaxMM_atrPeriodMM_baseMM_convMM_dcaModeMM_decayMM_entryMM_entryPadMM_entryPctMM_exitMM_exitAdxMM_fastMM_maxDcaMM_maxExpMM_minDipMM_minStrMM_multMM_periodMM_signalMM_signalPMM_smaPeriodMM_spanBMM_stepMM_minOrderMM_tlMM_exitPadMM_gainMM_maxDdMM_maxHoldMM_slowMM_fee