← Audited builds

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

  1. 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.
  2. Red means the position is being reduced or protected — a sell, a stop, a liquidation. It does not mean "error"; that is WARN.
  3. 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.
  4. Blue is never a trade. It marks a price the strategy is reasoning about.
  5. 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).

← Back to the audited builds