How an audit is measured
Per-strategy audits of the Gunbot custom strategy pack. Each strategy is run on three years of real 1-hour market data across seven pairs, after fees and slippage, then audited for correctness and for uniform presentation in the Gunbot GUI. Every defect found is fixed and the fix is documented with before/after evidence.
What each audit covers
| Data | 7 markets (BTC, ETH, SOL, ADA, XRP, DOGE, LINK) × 27,760 hourly bars, 2023-07-11 → 2026-09 |
| Costs | 0.10% taker fee + 2 bps slippage on every fill |
| Fill model | Decision on a closed bar, market order fills at the next bar's open; stop-first on any bar that covers both stop and target |
| Correctness | 5 invariants: runs clean, no phantom chart marks, no negative balances, cost-independent trade count, places orders |
| Presentation | console log format, side panel, chart marks, GUI settings, colour palette |
Every number in every report is read from the run record that produced it, so a page cannot drift from its measurement.
How to read the return column
The edge column matters more than the return column, and both need the buy-and-hold column next to them. Over this window buy-and-hold was strongly positive on most pairs, so a strategy can show a respectable return while having badly underperformed simply holding the asset — and a strategy that sits in cash can show a small loss that would have looked like a large win in a bear window.
The pack was originally ranked on a single year (2025-07 → 2026-07) in which every market fell. Strategies whose edge came from not participating topped that ranking. Where a one-year figure exists, each performance report shows both windows side by side.
What these reports do not claim
An audited strategy is correct, not profitable. Nothing here was measured on a live exchange, the engine models spot and long-only with a single price per bar, and no strategy in this pack should be run unattended on capital that matters.
The engine has to prove itself first
None of the numbers in any report mean anything unless the measuring instrument is correct, so the pipeline runs a suite of known-answer tests against the backtest engine before it runs a single strategy, and aborts if any of them fail. The tests cover accounting, the fee and slippage arithmetic, determinism, and the look-ahead boundary — the question of whether a strategy was ever handed information it could not have had at decision time.
Last run: 53 passed, 0 failed — after which every audited strategy is run across 7 markets (ADA, BTC, DOGE, ETH, LINK, SOL, XRP).
Engine self-test, verbatim from the run that gated this build:
BACKTEST ENGINE SELF-TEST market=BTC 1h bars=8571 1. A strategy that never trades PASS runs clean PASS places no orders PASS equity stays exactly at starting capital PASS reports zero return PASS reports zero drawdown PASS charges no fees PASS reports zero exposure 2. Buy once and hold (answer computed by hand from the series) PASS runs clean PASS buys exactly once PASS never sells PASS final equity matches hand calculation PASS fee charged is exactly one taker fee on capital PASS stays ~fully invested (exposure > 99%) PASS tracks its own HODL benchmark to within entry costs 3. Cost model behaves monotonically PASS a churning strategy actually churns PASS same trade count regardless of cost (costs change P&L, not ability to act) PASS adding a fee strictly reduces return PASS adding slippage strictly reduces return further PASS zero-cost run pays zero fees PASS total fees equal the per-side fee identity exactly 4. Information boundary (the look-ahead question) PASS run completes without breaching the window contract PASS strategy is handed exactly `window` candles, never more PASS last candle handed to the strategy is the last CLOSED bar PASS quoted ask equals that same bar's close (no peeking at next open) PASS market fill price is the NEXT bar's open plus slippage PASS market fill price is NOT the decision bar's close 5. Determinism PASS two identical runs produce byte-identical fills PASS two identical runs produce identical metrics 6. Accounting integrity PASS cash reconstructed from the fill log matches the engine's cash PASS reported fees equal the sum of per-fill fees PASS cash never goes negative PASS asset never goes negative PASS no phantom chart marks 7. Indicator surface published on gb.data PASS the probe ran over the scored bars PASS rsi is published, finite, in range and varies PASS mfi is published, finite, in range and varies PASS adx is published, finite, in range and varies PASS stochK is published, finite, in range and varies PASS stochD is published, finite, in range and varies PASS diPlus is published, finite, in range and varies PASS diMinus is published, finite, in range and varies PASS atr is published, finite, in range and varies PASS ema1 is published, finite, in range and varies PASS ema2 is published, finite, in range and varies PASS highBB is published, finite, in range and varies PASS lowBB is published, finite, in range and varies PASS macdHistogram is published, finite, in range and varies PASS Bollinger bands bracket the price (high >= low, and price mostly inside) PASS getCandles aggregates to the timeframe requested PASS getCandles refuses a timeframe finer than the data PASS the aggregated bar opens where its first constituent bar opened PASS the aggregated bar closes where its last constituent bar closed PASS getCandles returns at most the count asked for, keeping the MOST RECENT bars 53 passed, 0 failed
The colour palette
The terminal log, the side panel and the chart share one colour contract, so the same event is never drawn two different ways depending on where it appears. The presentation audit checks every strategy against it, and the per-strategy reports report any colour outside it as a defect.
One colour per meaning, used identically in the terminal log, the side
panel and the chart marks. Before this was applied the pack used 104
distinct hex values, and the same event was drawn in two different colours
depending on where it appeared — BUY was #22c55e in the terminal but
#16c784 on the chart.
The palette
| Role | Hex | Swatch meaning | Used for |
|---|---|---|---|
BULL |
#16c784 |
green — buying, profit, upside | BUY log tag, buy chart mark, REBAL BUY, BUY QUOTE, TP, GAIN |
BEAR |
#e24b4a |
red — selling, stops, downside | SELL log tag, sell chart mark, REBAL SELL, SELL QUOTE, ATR STOP, STOP, SL |
WARN |
#fbbf24 |
amber — something was refused | WARN / PAUSE log tags, rejected orders, guard trips |
MUTED |
#6b7280 |
grey — no action taken | WAIT / HOLD / SKIP log tags |
REF |
#60a5fa |
blue — a reference price, not a trade | ANCHOR, REF, GRID TOP, GRID FLOOR |
LEVEL |
#f59e0b |
orange — a moving threshold | BREAK-EVEN, TRAIL |
RUNG |
#2f6f4f |
deep green — one step of a ladder | RUNG n, DCA n |
TEXT |
#e5e7eb |
light grey — panel label text | side-panel labels and inert values |
Eight colours. Nothing else should appear in a strategy file.
Rules
- A meaning has exactly one colour, everywhere. If a buy is green in the log it is the same green on the chart and in the panel.
- Red means the position is being reduced or protected — a sell, a stop, a
liquidation. It does not mean "error"; that is
WARN. - Amber means the strategy wanted to act and could not — an order was rejected, a guard blocked it, a knob was out of range. This is the colour an operator should scan for.
- Blue is never a trade. It marks a price the strategy is reasoning about.
- Deep green is structural — one rung of a grid or DCA ladder, as opposed to a live buy.
Why these values
They are the ones already dominant in the pack, so applying the palette moved the
fewest lines. #16c784 and #e24b4a are the Gunbot/TradingView-native green and
red, so marks match the surrounding chart. #fbbf24 was already the universal
warn colour (992 uses, no competitor).