Documentation Index
Fetch the complete documentation index at: https://uncoded.ch/docs/llms.txt
Use this file to discover all available pages before exploring further.
UNIUSDT * BasicMode
UNIUSDT | 4BasicMode.json | 2020-01-01 - 2020-12-31 | +16.50% | 56,486 closed trades | 100.0% closed WR | 847 open orders
Headline Performance
GET /backtests/{id} + /equity + /trades * Fields used: return_pct, final_value, total_profit, win_rate, fulfilled_trades, active_orders, unrealized_pnl_exit_net, max_profit, min_profitReturn
Final Value
Portfolio PnL
Realized Profit
Unrealized PnL
Win Rate (closed)
Closed Trades
Open Orders
Best Closed Trade
Worst Closed Trade
TL;DR
Performance KPI Metrics
GET /backtests/{id} + /equity + /trades * Fields used: server aggregates from /daily-stats and /extras (Total Fees, Gross Profit/Loss, fill-type counts) plus <AnalyticsCharts> KPI strip * Transform: bt.* + dailyStats.totals + extras.deep_dive.fill_type_breakdownMax Drawdown
Profit Factor
Sharpe Ratio
Total Fees
Avg Hold Time
TP / SL / TSL
Trade Economics
| Metric | Value | Interpretation |
|---|---|---|
| Profit Factor | inf (no losing trades) | Sum of winning trades / sum of losing trades. >1 = profitable edge, >2 = strong, inf = no losses. |
| Gross Profit | 3,068.48 USDT | Sum of all winning trades before fees. |
| Gross Loss | 0.00 USDT | Absolute sum of all losing trades. |
| Total Fees | 691.48 USDT | Buy + sell fees across all trades. |
| Fee Drag | 22.5% of gross profit | What share of edge the exchange consumed. |
| Avg Hold Time | 40.3 h | Mean duration a position is open. |
Exit Mix (Fill Types)
| Exit Type | Count | Share | What It Means |
|---|---|---|---|
| TP (Take Profit) | 56,486 | 100.0% | Position closed by hitting the profit target - the desired outcome. |
| SL (Stop Loss) | 0 | 0.0% | Position closed by hitting the stop - capital preservation in action. |
| TSL (Trailing Stop) | 0 | 0.0% | Trailing stop locked in profit during a trend. |
Verdict
For UNIUSDT, the strategy’s profit factor of inf (no losing trades) indicates gross winners materially exceeded gross losers in this window, exits are TP-dominant (100.0%), so most profit comes from hitting take-profit targets, fees consumed 22.5% of gross profit (notable but acceptable).Chunking & Headings Guide
Chunk markers
Every section is delimited by paired JSX comments - invisible to readers, trivial for splitters. (Earlier versions of this exporter used HTML comments; we switched to JSX comments in v2.4.0 because MDX 3 - the parser Mintlify uses - forbids HTML comments at the document level.) The example below uses uppercaseRAG-CHUNK so it doesn’t accidentally match a splitter that scans this very page; real markers use lowercase rag-chunk:
\{/\*\s*rag-chunk:(start|end)\b[^*]*\*/\} and treat everything between a matching start/end pair (same id) as one indivisible chunk. Never split inside a chunk. (For backwards compatibility with v2.3.x exports, splitters can OR-match the legacy regex <!--rag-chunk:(start|end)\b[^>]*-->.)
Heading convention
# Title- appears exactly once (the document title in the intro chunk).## Section- opens every top-level chunk. Heading text matches the chunk’stitleattribute.### Sub-section- purely visual; never introduces a new chunk.####and deeper - reserved for inline detail (e.g. per-chart sub-blocks inside the catalogue).
Chunk type taxonomy
| Type | Purpose | Best for retrieval of… |
|---|---|---|
meta | Frontmatter & document intro | document-identity questions |
summary | TL;DR-style condensed prose | ”give me the headline” |
kpis | Headline numbers, card grids | numeric lookups |
overview | Tabular meta (period, balance, …) | “what was tested” |
comparison | Strategy vs benchmark | ”did it beat buy & hold” |
claims | Assertion -> evidence -> source | citation-grade answers |
config | Reproduction parameters | ”how do I rerun this” |
chart | Single visualization w/ embedded data | chart-specific questions |
catalogue | Multi-chart bundle | exploratory chart questions |
risk / allocation / trade-stats / monthly / top-trades | Domain-specific analytics | targeted KPI questions |
validation | Data-quality report | trust / sanity questions |
facts | Machine-readable JSON + key-value | deterministic lookups |
qa | Pre-answered FAQ | direct Q&A retrieval |
glossary | Term definitions | disambiguation |
narrative | Human-oriented prose | ”explain like I’m…” |
structured | JSON-LD / schema.org | search-engine indexing |
provenance | Metric -> API field -> formula lookup | ”where does this number come from” |
integrity | SHA-256 fingerprints of raw API payloads | tamper-evidence checks |
attachments | Verbatim API responses + trade-sample CSV (full ledger via /trades pagination) | byte-level reproduction |
footer | Disclaimers, links | compliance lookups |
Recommended ingestion pipeline
- Split on
{/* rag-chunk:start ... */}/{/* rag-chunk:end ... */}boundaries. - Use the
idattribute as the vector-store primary key - stable across re-exports. - Store
type,title,tokens~, andbacktest_idas filterable metadata. - Do not further chunk the
facts,claims,qa, orstructuredsections - they’re designed to be retrieved whole. - The
cataloguechunk is large; if your context budget is tight, split it on its###sub-headings instead of dropping it.
Performance Analysis
GET /backtests/{id} + /equity + /trades * Fields used: same prose rendered on the live page by <BacktestInterpretation> - pure, deterministic, no LLM * Transform: buildBacktestInterpretation(bt)Methodology & data
This backtest was executed on historical Binance Spot 1-minute candles for UNIUSDT, with intrabar fill simulation in “OLHC” mode and a synthetic order latency of 2s applied to each fill to approximate real-world routing delay. The simulator processes every minute sequentially, evaluates the BasicMode rule set, and books fills against the next available bar - a standard event-driven backtesting approach that avoids look-ahead bias. Equity is marked-to-market on every closed trade and aggregated into the equity curve shown above. Configured backtest window: approximately 12.0 months (366 days fromconfig.from to config.to) of UNIUSDT 1-minute price action - a sample size that is large enough to span multiple short-term regimes. Note: the equity series may cover fewer days if the engine omits leading or trailing flat periods (e.g. dates before the asset began trading); see the Overview section for the exact equity-coverage span.
Live trading considerations
Translating this result to live trading: UNIUSDT is a deeply-liquid USDT-quoted pair on Binance, so the simulated fills here translate well to live execution at retail size. The high trade frequency means cumulative slippage and exchange-side latency will erode a few percent of the headline return over a full year - budget for that gap. Without a hard stop-loss, the live system depends on the take-profit ladder firing during recovery legs; a prolonged downtrend without recovery will hold positions open longer than backtest aggregates suggest. Additionally, exchange downtime, API rate limits, and funding-rate changes (on perp variants) are not modelled here and should be accounted for in production deployment.Frequently asked questions
Is a 16.50% return on UNIUSDT a good backtest result?
Is a 16.50% return on UNIUSDT a good backtest result?
What does the 100.0% win rate mean here?
What does the 100.0% win rate mean here?
What is the annualised return for this UNIUSDT backtest?
What is the annualised return for this UNIUSDT backtest?
Can I run this exact BasicMode configuration live?
Can I run this exact BasicMode configuration live?
How is this backtest different from others on UNIUSDT?
How is this backtest different from others on UNIUSDT?
Overview
GET /backtests/{id} * Fields used: symbol, mode_name, config.from, config.to, start_balance, final_value, avg_profit, status, created_at, started_at, completed_at, elapsed_sec, is_duplicate, data_file, id, summary_text| Field | Value |
|---|---|
| Trading Pair | UNIUSDT |
| Strategy | BasicMode |
| Period | 2020-01-01 -> 2020-12-31 |
| Configured window (inclusive elapsed) | 366.0 days (1.00 years) - (config.to - config.from) / 86 400 000 ms |
| Configured window (calendar days) | 366 days - Math.round of the elapsed value above; this is what the narrative paragraph quotes |
| Equity-stat duration | 105.0 days (0.29 years) - first -> last equity sample timestamp; used for CAGR / Sharpe / Sortino |
| Coverage gap | configured window is 366.0 days but equity samples span only 105.0 days - the engine omitted leading/trailing flat periods (e.g. dates before the asset began trading on the venue) |
| Start Balance | 10,000.00 USDT |
| Final Value | 11,650.37 USDT |
| Avg Profit / Trade | +0.0421 USDT |
| Trades / Month | 4697.5 |
| Status | completed |
| Created | 2026-04-27 17:28:43 UTC |
| Started | 2026-04-28 11:53:59 UTC |
| Completed | 2026-04-28 12:00:23 UTC |
| Compute Time | 5m 30s |
| Backtest ID | 24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1 |
| Engine summary: |
Verifiable Claims
| Claim | Evidence | Source |
|---|---|---|
| Strategy returned +16.50% over the tested window | return_pct = 16.5037 | GET /backtests/{id} -> return_pct |
| Capital grew from 10,000.00 to 11,650.37 USDT | final_value - start_balance = +1,650.37 USDT | GET /backtests/{id} -> start_balance, final_value |
| Roughly 56486 of 56486 trades were profitable | win_rate = 100% | GET /backtests/{id} -> win_rate, fulfilled_trades |
| Worst peak-to-trough loss was 59.07% | max_drawdown_pct = 59.0701 | derived client-side from /equity series |
| Risk-adjusted return (Sharpe, annualized, rf=0) = 1.00 | sharpe_annualized = 1.0007 | derived from daily-resampled equity returns |
Strategy Configuration
GET /backtests/{id} * Fields used: mode_name, config (full JSON payload)- Highlights
- Full JSON
| Parameter | Value |
|---|---|
canBuy | true |
canSell | true |
canBuyUp | true |
startBal | 10000 |
stepSize | 0.01 |
stopLoss | false |
tickSize | 0.001 |
buySplits | 7 |
Full Mode Configuration
POST /backtests to reproduce the run.- Engine Parameters
- YAML
| Parameter | Value | Meaning |
|---|---|---|
assumed_spread_bps | 0 | Spread (basis points) added to taker fills on top of the candle price. |
buyPercentage | 0.1 | Buy-trigger threshold as a fraction (e.g. 0.1 = -0.1% from last reference price). |
buySplits | 7 | Number of price levels in the buy-ladder (DCA depth). |
buyVolumes | [25,15,15,15,10,10,10] | Per-split sizing weights (sum ~ 100). Distributes investmentPerBuy x buySplits across the ladder. |
canBuy | true | Master switch - disables all buy-side logic when false. |
canBuyDown | false | Allow re-entries below the last buy price. |
canBuyUp | true | Allow re-entries above the last buy price (true) or only below (false). |
canSell | true | Master switch - disables all sell-side logic when false. |
dontBuyBelowQuoteAssetBalance | 1 | Refuse to open new buys if free quote drops below this absolute USDT amount. |
fees_in_quote | true | If true, fees are deducted from the quote (USDT) leg of every fill. |
intrabar_mode | OLHC | Intra-bar fill model (OLHC, OHLC, …) - see ENGINE.md Section 4. |
investmentPerBuy | 50 | Notional invested per buy event, in quote (USDT). |
investmentPerFreeQuotePercent | 0.01 | When investmentPercentMode = true: fraction of free quote balance to commit per buy. |
investmentPercentMode | false | If true, sizing is taken as a fraction of free quote balance instead of fixed USDT. |
maker_fee_bps | 7.5 | Maker fee in basis points (e.g. 7.5 = 0.075%). |
minInvestmentPerQuote | 20 | Hard floor on per-buy notional, regardless of percent-mode math. |
minNotional | 5 | Exchange minimum notional per order (USDT). |
order_latency_seconds | 2 | Latency injected between signal time and order placement. |
sellActivateDistancePercentage | 0.1 | Distance from buy price (%) at which a TSL becomes armed. |
sellCancelDistancePercentage | 1 | Distance (%) at which an unfilled sell order is cancelled and re-priced. |
sellPercentages | [0.25,0.35,0.5,0.75,1,2.5,5] | Take-profit ladder, each value is the per-tier profit target as a fraction. |
startBal | 10000 | Initial portfolio value in the quote currency (USDT). |
stepSize | 0.01 | Exchange size step (base asset). |
stopLoss | false | Hard stop-loss enabled flag. |
stopLossPercentage | 5 | Hard stop-loss distance from entry as a percent (5.0 = -5%). |
taker_fee_bps | 7.5 | Taker fee in basis points. |
tickSize | 0.001 | Exchange price tick (quote currency). |
trailingStopLossPercentages | [0,0,0,0,0,0,0] | Per-tier trailing-SL distances. Zero entries disable TSL on that tier. |
triggerCoolDown | 1 | Minimum bars/ticks between two consecutive buys on the same level. |
Strategy Logic
GET /modes and select the entry whose filename == "4BasicMode.json" to inspect the public rule fields, or consult the engine source for the executable logic.
Engine Specification
engine_version field in this document’s frontmatter (see also the Data Source Metadata section).Engine Specification
uncoded.ch/docs/engine; this report only pins which revision applied (engine_version in the frontmatter).
Data Source Metadata
buildVerifiableMdx({ dataSource: ... }) to fill it in. The engine spec describes deterministic execution semantics (segment order, fill rules, fee classification) that cannot be reverse-engineered from trades alone.| Field | Value | Source |
|---|---|---|
| Market-data provider | Binance Spot | caller DataSourceInput.provider |
| Exchange / venue | binance | caller DataSourceInput.exchange |
| Symbol | UNIUSDT | GET /backtests/{id} -> $.symbol |
| Candle interval | 1m | platform invariant - all backtests run on 1-minute OHLCV candles |
| First candle (UTC) | 2020-01-01 00:00:01 | GET /backtests/{id} -> $.config.from |
| Last candle (UTC) | 2020-12-31 23:59:59 | GET /backtests/{id} -> $.config.to |
| Timezone | UTC | default assumption (UTC) |
| Engine version | uncoded-engine (FastAPI backend) | caller DataSourceInput.engineVersion |
| Engine spec version | 1.1 | caller DataSourceInput.engineSpecVersion |
| Engine spec document | https://uncoded.ch/docs/engine | caller DataSourceInput.engineSpecPath |
Equity Curve
GET /backtests/{id}/equity * Fields used: timestamp, total_value_exit_net, total_value_mid, total_valueRisk & Quality Metrics
GET /backtests/{id}/equity * Fields used: timestamp, total_value_exit_net, total_value_mid, total_value, base_asset_bal (for time-in-market)Max Drawdown
CAGR
Volatility (ann.)
Sharpe Ratio
Sortino Ratio
Time in Market
Drawdown Detail
| Field | Value |
|---|---|
| Peak | 11,034.38 USDT @ 2020-09-18 23:59:00 UTC |
| Trough | 4,516.35 USDT @ 2020-11-04 23:59:00 UTC |
| Drawdown Duration | 47.0 days |
| Recovery | 2020-12-31 23:59:00 UTC (57.0 days to recover) |
| All-time Peak | 11,650.37 USDT |
Final Portfolio Allocation
GET /backtests/{id}/equity * Fields used: total_value_exit_net, quote_asset_bal, base_asset_bal, base_value_exit_net, base_value_mid, unrealized_pnl_exit_net| Asset | Quantity | Value (USDT) | Allocation |
|---|---|---|---|
| USDT (Cash) | 6,914.55 | 6,914.55 | 59.4% |
| UNI | 920.25000000 | 0.00 | 0.0% |
| Other (open positions, fee reserves, …) | - | 4,735.82 | 40.6% |
| Total | - | 11,650.37 | 100.0% |
Trade Analytics
GET /backtests/{id}/trades * Fields used: profit, profit_percentage, fill_type, buy_time, sell_time, buy_price, sell_price, buy_quantity, buy_fee_in_quote, sell_fee_in_quoteWins
Losses
Breakeven
Profit Factor
Payoff Ratio
Expectancy / Trade
Avg Win
Avg Loss
Median Trade
Max Win Streak
Max Loss Streak
Avg Holding
Median Holding
Total Volume
Total Fees
Gross Performance
| Metric | Value | Source |
|---|---|---|
| Gross Profit (winners only) | +9.07 USDT | Sum profit where profit > 0 (client-side from /trades) |
| Gross Loss (losers only) | -0.00 USDT | Sum -profit where profit < 0 (client-side from /trades) |
| Net Profit | +9.07 USDT | Gross Profit - Gross Loss |
| Closed-trade buy fees | 0.62 USDT | Sum buy_fee_in_quote over matched-pair rows of /trades |
| Closed-trade sell fees | 0.63 USDT | Sum sell_fee_in_quote over matched-pair rows of /trades |
| Closed-trade fees subtotal | 1.25 USDT | buy + sell on matched pairs |
| Open-position buy fees | 690.23 USDT | bt.total_fees - closed-trade subtotal - buy-side fees on the 847 orders still open at end of window (no matching sell row yet) |
| Total Fees Paid (authoritative) | 691.48 USDT | bt.total_fees - engine-tracked sum of every fee actually paid (closed + open buy fills). reconciles to closed-fees + open-position buy fees |
| Fees as % of Gross Profit | 7620.25% | Total Fees / Gross Profit |
bt.total_fees is the engine-tracked total of every fee actually paid. Per-trade rows in /trades only emit on matched buy+sell pairs, so positions still open at end-of-window contribute their buy-fee to bt.total_fees but not to the per-trade sum. The identity is exact:
bt.total_fees = Sum closed-trade (buy_fee + sell_fee) + Sum open-position buy_fees
Citation rules: use Total Fees Paid for the headline (the authoritative number every consumer should quote), use Closed-trade fees subtotal when reasoning specifically about realized round-trip economics, and use Open-position buy fees when sizing the unrealized exposure of the still-open ladder.Advanced - mechanical breakdown from API field mapping
Advanced - mechanical breakdown from API field mapping
| Line item | Formula | API field(s) | Endpoint |
|---|---|---|---|
| Closed-trade buy fees | Sum row.buy_fee_in_quote | buy_fee_in_quote per row | GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1/trades |
| Closed-trade sell fees | Sum row.sell_fee_in_quote | sell_fee_in_quote per row | GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1/trades |
| (A) Closed-trade subtotal | Sum (buy_fee_in_quote + sell_fee_in_quote) | both fee fields, matched-pair rows only | GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1/trades |
| (B) Total Fees Paid (engine) | direct read | total_fees (scalar) | GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1 |
| (C) = (B) - (A) Open-position buy fees | bt.total_fees - closed_subtotal | derived | - |
| Open orders count | direct read | active_orders | GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1 |
| Numerical walk-through for this run: |
/trades rows emit only on matched buy+sell pairs. A buy fill that hasn’t found its sell yet (still sitting in the DCA ladder at end-of-window) has already paid its fee - that fee is included in bt.total_fees (B) but not in any per-trade row, so it is not part of (A). The remainder (C) is therefore the buy-side fee paid on the 847 open orders.Holding Period Distribution
| Min | Median | Avg | Max |
|---|---|---|---|
| 0.0h | 0.3h | 0.9h | 5.8h |
Trade Timeline
| First Trade | Last Trade |
|---|---|
| 2020-09-17 03:06:00 UTC | 2020-12-31 23:56:00 UTC |
Breakdown by Exit Type
| Type | Count | Cumulative Profit | Avg Return |
|---|---|---|---|
TP | 100 | +9.07 USDT | +1.69% |
Monthly Performance
GET /backtests/{id}/trades * Fields used: sell_time (bucket key), profit| Month | Trades | Wins | Win Rate | Net P&L (USDT) |
|---|---|---|---|---|
| 2020-09 | 64 | 64 | 100.0% | +8.27 |
| 2020-10 | 3 | 3 | 100.0% | +0.04 |
| 2020-11 | 7 | 7 | 100.0% | +0.09 |
| 2020-12 | 26 | 26 | 100.0% | +0.68 |
Top Trades
GET /backtests/{id}/trades * Fields used: fill_type, buy_time, sell_time, buy_price, sell_price, profit, profit_percentageTop 10 Winners
Top 10 Winners
| # | Type | Period | Buy | Sell | Profit | % |
|---|---|---|---|---|---|---|
| 1 | TP | 2020-09-19 -> 2020-09-19 | 6.940000 | 7.288000 | +0.2463 | +4.86% |
| 2 | TP | 2020-09-18 -> 2020-09-18 | 7.349000 | 7.717000 | +0.2461 | +4.85% |
| 3 | TP | 2020-09-19 -> 2020-09-19 | 6.661000 | 6.995000 | +0.2461 | +4.86% |
| 4 | TP | 2020-09-18 -> 2020-09-18 | 6.666000 | 7.000000 | +0.2461 | +4.86% |
| 5 | TP | 2020-09-19 -> 2020-09-19 | 6.666000 | 7.000000 | +0.2461 | +4.86% |
| 6 | TP | 2020-09-18 -> 2020-09-18 | 6.021000 | 6.323000 | +0.2459 | +4.86% |
| 7 | TP | 2020-09-19 -> 2020-09-19 | 6.321000 | 6.638000 | +0.2458 | +4.86% |
| 8 | TP | 2020-09-18 -> 2020-09-18 | 6.322000 | 6.639000 | +0.2458 | +4.86% |
| 9 | TP | 2020-09-19 -> 2020-09-19 | 6.404000 | 6.725000 | +0.2458 | +4.86% |
| 10 | TP | 2020-09-18 -> 2020-09-18 | 6.406000 | 6.727000 | +0.2458 | +4.86% |
Top 10 Losers
Top 10 Losers
Charts Catalogue
GET /backtests/{id} + /equity + /trades * Fields used: every chart from the live <AnalyticsCharts> UI, with the exact transform + API fields it consumes- Equity & Balance
- Trade Analysis
- Risk & Recovery
- Deep Dive
- Advanced
Drawdown
GET /backtests/{id}/equity * Fields used: timestamp, total_value_exit_net * Transform: computeDrawdown(equity)drawdown).| Stat | Value |
|---|---|
| Shallowest DD | 0.00% @ 2020-09-17 23:59:00 UTC |
| Deepest DD | -59.07% @ 2020-11-04 23:59:00 UTC |
| Mean | -25.51% |
| Std Dev | 13.34% |
| Last | 0.00% |
| Points | 106 |
| Across 106 points the series ranged from -59.07% (2020-11-04 23:59:00 UTC) to 0.00% (2020-09-17 23:59:00 UTC), averaging -25.51%. 0% of points were positive, 97% negative. The most recent value is 0.00%. | |
| Showing 60 of 106 points (down-sampled for readability). |
Unrealized PnL
GET /backtests/{id}/equity * Fields used: timestamp, unrealized_pnl_exit_net * Transform: equity.map(p => ({ pnl: p.unrealized_pnl_exit_net }))pnl).| Stat | Value |
|---|---|
| Best Unrealized | 531.84 USDT @ 2020-09-18 23:59:00 UTC |
| Worst Unrealized | -7,164.45 USDT @ 2020-11-04 23:59:00 UTC |
| Mean | -3,522.60 USDT |
| Std Dev | 1,557.71 USDT |
| Last | -633.31 USDT |
| Points | 106 |
| Sum | -373,395.53 USDT |
| Across 106 points the series ranged from -7,164.45 USDT (2020-11-04 23:59:00 UTC) to 531.84 USDT (2020-09-18 23:59:00 UTC), averaging -3,522.60 USDT. 3% of points were positive, 97% negative. The most recent value is -633.31 USDT. | |
| Showing 60 of 106 points (down-sampled for readability). |
Balance Composition (Cash vs. Coin)
GET /backtests/{id}/equity * Fields used: quote_asset_bal, base_value_exit_net, total_value_exit_net * Transform: stack(quote, base, total)total).| Stat | Value |
|---|---|
| Peak Total Equity | 11,650.37 USDT @ 2020-12-31 23:59:00 UTC |
| Trough Total Equity | 4,516.35 USDT @ 2020-11-04 23:59:00 UTC |
| Mean | 8,218.25 USDT |
| Std Dev | 1,472.92 USDT |
| Last | 11,650.37 USDT |
| Points | 106 |
| Sum | 871,134.90 USDT |
| Across 106 points the series ranged from 4,516.35 USDT (2020-11-04 23:59:00 UTC) to 11,650.37 USDT (2020-12-31 23:59:00 UTC), averaging 8,218.25 USDT. 100% of points were positive, 0% negative. The most recent value is 11,650.37 USDT. | |
| Showing 60 of 106 points (down-sampled for readability). |
Base Exposure (% of Portfolio)
GET /backtests/{id}/equity * Fields used: base_value_exit_net, quote_asset_bal, total_value_exit_net * Transform: baseExposure(equity)exposure).| Stat | Value |
|---|---|
| Peak Exposure | 100.00% @ 2020-11-16 23:59:00 UTC |
| Min Exposure | 13.07% @ 2020-09-17 23:59:00 UTC |
| Mean | 92.70% |
| Std Dev | 18.15% |
| Last | 40.65% |
| Points | 106 |
| Across 106 points the series ranged from 13.07% (2020-09-17 23:59:00 UTC) to 100.00% (2020-11-16 23:59:00 UTC), averaging 92.70%. 100% of points were positive, 0% negative. The most recent value is 40.65%. | |
| Showing 60 of 106 points (down-sampled for readability). |
Daily Change
GET /backtests/{id}/equity * Fields used: timestamp, total_value_exit_net * Transform: dailyDelta(equity)total_value_exit_net between consecutive equity samples (typically daily).How to read it. Green bars are gain days, red bars are loss days. A long stretch of red bars indicates a sustained drawdown, not just a single bad day.Why it matters. Shows whether returns are consistent or driven by a few jackpot days - important for compounding and for sizing live capital.Insights (auto-derived from delta).| Stat | Value |
|---|---|
| Best Day | 2,101.53 USDT @ 2020-11-13 23:59:00 UTC |
| Worst Day | -1,417.80 USDT @ 2020-10-06 23:59:00 UTC |
| Mean | 13.16 USDT |
| Std Dev | 591.06 USDT |
| Last | 1,528.83 USDT |
| Points | 105 |
| Sum | 1,381.65 USDT |
| Across 105 points the series ranged from -1,417.80 USDT (2020-10-06 23:59:00 UTC) to 2,101.53 USDT (2020-11-13 23:59:00 UTC), averaging 13.16 USDT. 47% of points were positive, 53% negative. The most recent value is 1,528.83 USDT. | |
| Showing 60 of 105 points (down-sampled for readability). |
Monthly Returns
GET /backtests/{id}/equity * Fields used: timestamp, total_value_exit_net * Transform: monthlyReturns(equity)returnPct).| Stat | Value |
|---|---|
| Best Month | 63.70% @ 2020-11 |
| Worst Month | -46.25% @ 2020-10 |
| Mean | 11.84% |
| Std Dev | 41.77% |
| Last | 36.12% |
| Points | 4 |
| Across 4 points the series ranged from -46.25% (2020-10) to 63.70% (2020-11), averaging 11.84%. 50% of points were positive, 50% negative. The most recent value is 36.12%. | |
| Full series - 4 points. |
Machine-Readable Facts
facts_sha256 in the frontmatter - re-hash it to verify.- JSON
- Flat Table
Metric Provenance Index
| Metric | Source | JSON path | Transform | Value in this report |
|---|---|---|---|---|
| Symbol | GET /backtests/{id} | $.symbol | direct API value | UNIUSDT |
| Mode | GET /backtests/{id} | $.mode_name | direct API value | 4BasicMode.json |
| Status | GET /backtests/{id} | $.status | direct API value | completed |
| Period start | GET /backtests/{id} | $.config.from | direct API value | 2020-01-01 00:00:01 |
| Period end | GET /backtests/{id} | $.config.to | direct API value | 2020-12-31 23:59:59 |
| Start balance | GET /backtests/{id} | $.start_balance | direct API value | 10,000.00 USDT |
| Final value | GET /backtests/{id} | $.final_value | direct API value | 11,650.37 USDT |
| Return % | GET /backtests/{id} | $.return_pct | direct API value (cross-check: (final_value/start_balance - 1) * 100) | +16.50% |
| Total profit | GET /backtests/{id} | $.total_profit | direct API value (cross-check: Sum trades[].profit) | +2,377.00 USDT |
| Win rate % | GET /backtests/{id} | $.win_rate | direct API value (cross-check: 100 * count(trades[].profit > 0) / count(trades)) | 100.0% |
| Trades count | GET /backtests/{id} | $.fulfilled_trades | direct API value (cross-check: count(trades)) | 56,486 |
| Best trade | GET /backtests/{id} | $.max_profit | direct API value (cross-check: max(trades[].profit)) | +0.2463 USDT |
| Worst trade | GET /backtests/{id} | $.min_profit | direct API value (cross-check: min(trades[].profit)) | +0.0125 USDT |
| Avg profit / trade | GET /backtests/{id} | $.avg_profit | direct API value | +0.0421 USDT |
| Trades / month | derived | n/a | fulfilled_trades / (durationDays / 30.4375) | 4697.5 |
| Max drawdown % | GET /backtests/{id}/equity | $[*].total_value_* | maxDrawdown(equity) - running peak vs. trough | -59.07% |
| Max drawdown abs | GET /backtests/{id}/equity | $[*].total_value_* | maxDrawdown(equity).abs | -6,518.02 USDT |
| CAGR % | GET /backtests/{id}/equity | $[*].timestamp, $[*].total_value_* | (final/start)^(365.25/days) - 1 | +70.12% |
| Volatility (ann.) % | GET /backtests/{id}/equity | $[*].timestamp, $[*].total_value_* | std(daily_returns) * sqrt(365) | 143.38% |
| Sharpe ratio (ann.) | GET /backtests/{id}/equity | $[*].timestamp, $[*].total_value_* | mean(daily_returns) / std(daily_returns) * sqrt(365) (rf=0) | 1.00 |
| Sortino ratio (ann.) | GET /backtests/{id}/equity | $[*].timestamp, $[*].total_value_* | mean(daily_returns) / std(downside_returns) * sqrt(365) (rf=0) | 1.20 |
| Time in market % | GET /backtests/{id}/equity | $[*].base_asset_bal | count(samples where base_asset_bal>0) / count(samples) * 100 | 100.0% |
| Total fees | GET /backtests/{id}/trades | $[*].buy_fee_in_quote, $[*].sell_fee_in_quote | Sum (buy_fee_in_quote + sell_fee_in_quote) | 1.25 USDT |
| Gross profit (winners) | GET /backtests/{id}/trades | $[?(@.profit>0)].profit | Sum profit where profit > 0 | +9.07 USDT |
| Gross loss (losers) | GET /backtests/{id}/trades | $[?(@.profit<0)].profit | Sum abs(profit) where profit < 0 | 0.00 USDT |
| Profit factor | GET /backtests/{id}/trades | $[*].profit | Sum winners.profit / Sum abs(losers.profit) | inf |
| Payoff ratio | GET /backtests/{id}/trades | $[*].profit | avg(winners.profit) / avg(abs(losers.profit)) | inf |
| Expectancy / trade | GET /backtests/{id}/trades | $[*].profit | mean(trades[].profit) | +0.0907 USDT |
| Max consecutive wins | GET /backtests/{id}/trades | $[*].profit (ordered) | longest run where profit > 0 | 100 |
| Max consecutive losses | GET /backtests/{id}/trades | $[*].profit (ordered) | longest run where profit < 0 | 0 |
| Avg holding (h) | GET /backtests/{id}/trades | $[*].buy_time, $[*].sell_time | mean(sell_time - buy_time) / 3600 | 0.9h |
| Median holding (h) | GET /backtests/{id}/trades | $[*].buy_time, $[*].sell_time | median(sell_time - buy_time) / 3600 | 0.3h |
| Total volume (notional) | GET /backtests/{id}/trades | $[*].buy_quantity, $[*].buy_price | Sum (buy_quantity * buy_price) | 1,671 USDT |
Raw API Attachments
/trades. Full trade population: 56,486 closed trades - fetch the complete list via GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1/trades. Aggregate KPIs are computed server-side against the full population, not from this sample.GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1 - backtest summary (verbatim)
GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1 - backtest summary (verbatim)
GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1/equity - equity series (verbatim, 106 points)
GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1/equity - equity series (verbatim, 106 points)
trades.json payload is intentionally not embedded in this report (deprecated). The CSV attachment below is a 100-row audit sample of the full ledger, not the complete trade list - fetch the canonical full population (56,486 closed trades) via GET /backtests/24fb600a-f7eb-4f4b-b44a-ef0ea39aa0b1/trades (paginate through all pages).100-row audit sample from 56,486 closed trades (RFC 4180 CSV)
100-row audit sample from 56,486 closed trades (RFC 4180 CSV)
Frequently Asked Questions
_null_; metrics that can’t be derived locally render as “not available”.What strategy was tested and on which trading pair?
What strategy was tested and on which trading pair?
bt.mode_name, bt.symbol, bt.config.from, bt.config.toWhat is the current status of this backtest?
What is the current status of this backtest?
bt.status, bt.error_messageWhat was the total return?
What was the total return?
bt.return_pct, bt.start_balance, bt.final_value, bt.total_profitWhat was the annualized growth rate (CAGR)?
What was the annualized growth rate (CAGR)?
derived from equity series (eqStats.cagrPct, eqStats.durationDays)Did it beat Buy & Hold of UNIUSDT?
Did it beat Buy & Hold of UNIUSDT?
bt.return_pct, opts.tokenReturnPct, outperformDeltaWhat was the worst drawdown?
What was the worst drawdown?
derived from equity series (eqStats.maxDrawdownPct, .maxDrawdownAbs, .underwaterDays, .recoveryDays)How many trades did it take and what was the win rate?
How many trades did it take and what was the win rate?
bt.fulfilled_trades, bt.win_rate, bt.active_orders, derived tradesPerMonthWhat was the average, best, and worst trade?
What was the average, best, and worst trade?
bt.avg_profit, bt.max_profit, bt.min_profitWhat was the profit factor and expectancy?
What was the profit factor and expectancy?
derived from trades (stats.profitFactor, .expectancy, .payoffRatio)What were the longest winning and losing streaks?
What were the longest winning and losing streaks?
derived from trades (stats.consecWinsMax, .consecLossesMax)How much was paid in fees?
How much was paid in fees?
Sum(buy_fee_in_quote + sell_fee_in_quote) over every row of GET /backtests/{id}/trades - the API summary field bt.total_fees is used only for cross-checking, not as the source of truth.Source: derived from trades[].buy_fee_in_quote + trades[].sell_fee_in_quote (analyzeTrades -> stats.totalFees / .buyFees / .sellFees)Is the risk-adjusted return any good?
Is the risk-adjusted return any good?
derived from equity series (eqStats.sharpeAnnualized, .sortinoAnnualized)How volatile was the equity curve?
How volatile was the equity curve?
derived from equity series (eqStats.volatilityAnnualizedPct)How long does the strategy hold positions?
How long does the strategy hold positions?
derived from trades (stats.medianHoldingHours, .avgHoldingHours, .minHoldingHours, .maxHoldingHours)How much of the time was capital deployed?
How much of the time was capital deployed?
derived from equity series (eqStats.timeInMarketPct)What were the best and worst months?
What were the best and worst months?
derived from trades (stats.bestMonth, .worstMonth)When did the backtest run and how long did it take?
When did the backtest run and how long did it take?
bt.created_at, bt.started_at, bt.completed_at, bt.elapsed_secWhat configuration parameters were used?
What configuration parameters were used?
bt.start_balance, bt.data_file, bt.config.timeframe, bt.config.fee_pct, bt.is_duplicateWhere can I find a one-line summary written by the engine?
Where can I find a one-line summary written by the engine?
bt.summary_textAre these results guaranteed for live trading?
Are these results guaranteed for live trading?
static disclaimerGlossary
| Term | Definition |
|---|---|
| Return % | Total percentage change of portfolio value over the backtest window: (final_value - start_balance) / start_balance x 100. |
| CAGR | Compound Annual Growth Rate. Annualized return assuming compounding: (final/start)^(365.25/days) - 1. |
| Win Rate | Share of closed trades with positive net P&L (after fees): wins / (wins + losses) x 100. |
| Max Drawdown | Largest peak-to-trough decline of equity, measured in % of the previous peak. The single most important risk metric. |
| Drawdown Duration | Number of days spent below the previous equity peak before recovering (or end of window if not recovered). |
| Sharpe Ratio (annualized) | Mean daily return divided by standard deviation of daily returns, scaled by 365. Risk-adjusted return - higher is better, > 1 is decent. |
| Sortino Ratio (annualized) | Like Sharpe but only penalizes downside volatility. Often more representative for asymmetric strategies. |
| Volatility (ann.) | Standard deviation of daily returns x 365, expressed as a percentage. |
| Time in Market | Fraction of the period where the strategy held base-asset exposure (not 100% cash). |
| Buy & Hold | Reference benchmark: simply buying the underlying token at the start and holding to the end of the window. |
| Outperformance (pp) | Strategy return minus Buy & Hold return, in percentage points (not percent change). |
| Fulfilled Trades | Round-trip trades that have both an entry fill and an exit fill within the window. |
| Active Orders | Open positions still pending exit at the end of the backtest - their unrealized P&L is included in final_value. |
| Lookahead Bias | Using information that wouldn’t have been available at trade time. The validator flags trades whose buy_time precedes the configured from date. |
How to Read This Report
GET /backtests/{id} * Fields used: return_pct, fulfilled_trades, win_rateCheck the headline return
Reproduce This Run
GET /backtests/{id} * Fields used: symbol, mode_name, config (replayed verbatim)X-API-Key. Payload fields are validated against ENGINE.md Section 20; non-engine keys are stripped so the replay produces the exact same run.Structured Data (JSON-LD)
Dataset markup with 35 PropertyValue KPIs. Every numeric value is finite + range-validated; invalid / null fields are omitted so the JSON stays schema.org-compliant.[!] Disclaimer
Backtester: uncoded.ch/backtesting * Generated 2026-05-15 10:16:27 UTC