The LowMoney strategy on KGSTUSDT returned 0.00% over 2025-01-01 to 2025-12-31, turning 10,000.00 USDT into 10,000.00 USDT.
Annualized growth (CAGR) was 0.00%.
Data source -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_breakdown
Six-card KPI strip mirroring the live UI - combines risk (Max Drawdown, Sharpe), trade-economics (Profit Factor, Fees, Hold Time) and exit-mix (TP/SL/TSL) into one retrieval-friendly chunk.
This document is structured for deterministic RAG ingestion. Each top-level section is wrapped in HTML-comment chunk markers and follows a stable heading convention.
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 uppercase RAG-CHUNK so it doesn’t accidentally match a splitter that scans this very page; real markers use lowercase rag-chunk:
Splitter rule: match the case-sensitive lowercase regex \{/\*\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[^>]*-->.)
Data source -GET /backtests/{id} + /equity + /trades * Fields used: same prose rendered on the live page by <BacktestInterpretation> - pure, deterministic, no LLM * Transform:buildBacktestInterpretation(bt)
Long-form, rule-based interpretation of this run. Identical to what the page shows - embedded here so an LLM can quote it verbatim without re-deriving the analysis.
This run produced a 0.00% return on KGSTUSDT - a small positive result. Outcomes in this range are within the noise band of typical backtest variance and should not be over-interpreted as evidence of edge.About KGSTUSDT: KGSTUSDT is a stablecoin-quoted spot pair on Binance. Quote-side liquidity is deep, so slippage assumptions in this backtest map reasonably well to live execution at retail size.About the LowMoney strategy: LowMoney is calibrated for small starting balances - smaller position sizes, tighter risk controls, fewer parallel orders.Configuration analysis: The LowMoney configuration entered on a 0.1% pullback signal across 2 potential buy splits at 3 USDT each. Total deployable notional is therefore 6 USDT - a position-sizing footprint that is defensive at 0% of starting capital - most of the account stays in stablecoins as buffer. No hard stop-loss is configured - the strategy relies on take-profit zones and trailing logic instead, which trades smoother behaviour for higher tail-risk in sustained downtrends. Profit is taken in 2 laddered sell zones, which scales out gradually rather than betting on a single exit price - a structure that smooths returns at the cost of capping the very best winners. Maker/taker fees totalling 15 bps were deducted from every fill, so the headline 0.00% is already net of trading costs - no additional fee adjustment is required when comparing to other runs.Over the configured 365-day window the strategy reported 0.00 USDT of realised trade profit on a 10000 USDT starting balance, ending at a portfolio value of 10000.00 USDT. Mechanically annualising the 0.00% window return projects to roughly +0.0% per year - the window covers roughly one full year, so the annualised figure is closer to the realised pace than to an extrapolation, but a single year still represents a single market regime. Treat this number as a unit-conversion of the window result, not as an expected forward return.
This backtest was executed on historical Binance Spot 1-minute candles for KGSTUSDT, 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 LowMoney 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 (365 days from config.from to config.to) of KGSTUSDT 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.
Translating this result to live trading: KGSTUSDT is a deeply-liquid USDT-quoted pair on Binance, so the simulated fills here translate well to live execution at retail size. Lower trade frequency keeps slippage drag minimal, so live results should track the backtest more closely than a high-frequency configuration would. 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.
Deterministic Q&A - every question is always present so this section can be sliced into stable RAG chunks. Missing API fields render as null; metrics that can’t be derived locally render as “not available”.
Is a 0.00% return on KGSTUSDT a good backtest result?
It is a positive but modest result; whether it is ‘good’ depends on what a buy-and-hold of KGSTUSDT produced over the same window and on the realised drawdown.
What is the annualised return for this KGSTUSDT backtest?
Compounding the 0.00% over 365 days projects to +0.0% per year. This is a directional indicator only - crypto regimes change, and strategies rarely sustain peak performance year-over-year.
Can I run this exact LowMoney configuration live?
The configuration shown in the Strategy Configuration block is the same JSON schema the live unCoded TradingBot consumes, so it can be loaded into a live instance. That is a technical compatibility statement, not a recommendation: a passing backtest is necessary but not sufficient evidence that a configuration will be profitable in live trading. Before any live use, validate on an out-of-sample window, paper-trade it, confirm exchange-side fees match the simulated 7.5/7.5 bps, and start with a position size well below the backtested capital to absorb live slippage and execution differences.
How is this backtest different from others on KGSTUSDT?
Every run on the platform uses the same intrabar-fill engine and historical Binance Spot data, so the comparison is apples-to-apples. What differs between runs is the LowMoney parameter set (buy trigger, sell zones, splits, stop-loss) and the time window - both are visible above so you can rerun, tune, or fork this configuration.
This interpretation is generated deterministically from this run’s own metrics. Past performance is not indicative of future results - a profitable backtest is necessary but not sufficient evidence that a strategy will work in live trading on KGSTUSDT.
365.0 days (1.00 years) - (config.to - config.from) / 86 400 000 ms
Configured window (calendar days)
365 days - Math.round of the elapsed value above; this is what the narrative paragraph quotes
Equity-stat duration
7.0 days (0.02 years) - first -> last equity sample timestamp; used for CAGR / Sharpe / Sortino
Coverage gap
configured window is 365.0 days but equity samples span only 7.0 days - the engine omitted leading/trailing flat periods (e.g. dates before the asset began trading on the venue)
Every parameter the strategy received at runtime, validated against the canonical engine schema (ENGINE.md Section 20). Recognised parameters are passed verbatim into 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
2
Number of price levels in the buy-ladder (DCA depth).
buyVolumes
[50,50]
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
3
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
3
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.3]
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
1
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.00001
Exchange price tick (quote currency).
trailingStopLossPercentages
[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.
This section explains what the strategy actually does - the rules behind the parameters in Strategy Configuration. Without it the report would be a black box: numbers without semantics. We treat its absence as a defect, not a feature.
Black-box notice: this export does not include a machine-readable description of the strategy rules. The numeric results are still fully reproducible from the parameters in Strategy Configuration + the raw API attachments below, but the semantics of those parameters live in the engine source. Pass a strategyLogic object to buildVerifiableMdx (or wire up getModes() so the exporter can derive a sketch) to remove this notice.
Source unavailable in this export. Fetch GET /modes and select the entry whose filename == "5LowMoney.json" to inspect the public rule fields, or consult the engine source for the executable logic.
The execution engine is shared across every backtest on this site. Its static semantics - TP-vs-SL ordering inside an OLHC bar, TSL splits bypassing nominal TP, JS-legacy boolean parsing, Binance hard caps, fee model, equity sampling - are documented once in the canonical Engine Specification and pinned per-run via the engine_version field in this document’s frontmatter (see also the Data Source Metadata section).
Engine Specification
Canonical, versioned spec covering the bar-loop, order types, intra-bar fill rules, gap handling, fees, position sizing, risk management, multi-entry cascade, sell-time curves, portfolio accounting, determinism guarantees and the full configuration schema (Section 20).
Why this is a link, not an inline copy: the spec is identical for every backtest - embedding ~700 lines into each export would bloat every report 5-10x without adding per-run information. The single source of truth lives at uncoded.ch/docs/engine; this report only pins which revision applied (engine_version in the frontmatter).
Inputs the engine consumed for this run. Anything marked not provided is explicitly missing rather than silently omitted - pass the corresponding field via 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
KGSTUSDT
GET /backtests/{id} -> $.symbol
Candle interval
1m
platform invariant - all backtests run on 1-minute OHLCV candles
First candle (UTC)
2025-01-01 00:00:01
GET /backtests/{id} -> $.config.from
Last candle (UTC)
2025-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
Full data-source coverage (10/10 fields populated).
Snapshot at backtest end (2026-04-19 16:39:04 UTC):
Asset
Quantity
Value (USDT)
Allocation
USDT (Cash)
10,000.00
10,000.00
100.0%
KGST
0.00000000
0.00
0.0%
Total
-
10,000.00
100.0%
Unrealized P&L on remaining position: 0.00 USDT. The “Other” row, when present, is dominated by these open positions held outside the cash/base buckets.
Data source -GET /backtests/{id} + /equity + /trades * Fields used: every chart from the live <AnalyticsCharts> UI, with the exact transform + API fields it consumes
Below is the complete set of analytical charts shown in the backtester UI, regrouped into the same five tabs. Each card lists what it shows, how to read it, why it matters, the API fields + transform that produce it, and a down-sampled JSON preview of the underlying series so you can re-render the visualisation in any tool (Notion, Observable, a notebook, …) without calling the API again.
JSON previews are intentionally down-sampled (<= 60 points for line/area series, full bins for histograms). For the full series, hit the corresponding REST endpoint with your X-API-Key.
Data source -GET /backtests/{id}/equity * Fields used:timestamp, total_value_exit_net * Transform:computeDrawdown(equity)
What it shows. Percentage decline of the portfolio from its running all-time peak. Always <= 0%.How to read it. Each point is the relative drop from the highest equity value seen so far. The deepest valley is the maximum drawdown - the worst peak-to-trough loss any investor would have lived through.Why it matters. The single most important risk metric. A high return with a 60% drawdown is psychologically unsurvivable for most live traders.
Series contains 8 points but every numeric value is zero - likely a missing equity column (see ENGINE.md Section 13.1). Skipping the JSON payload to avoid suggesting measured data exists.
What it shows. Mark-to-market profit/loss of currently open positions, sampled along the backtest timeline.How to read it. Above zero => open positions are in profit; below zero => positions are underwater. Spikes show how much paper-PnL the strategy carries before realising it.Why it matters. Reveals the gap between realised (closed-trade) profit and the rollercoaster the strategy actually rides. Large negative excursions indicate the bot held losers.
Series contains 8 points but every numeric value is zero - likely a missing equity column (see ENGINE.md Section 13.1). Skipping the JSON payload to avoid suggesting measured data exists.
What it shows. Stacked area showing how the portfolio value splits between quote (cash) and base (coin held).How to read it. Cash floor stacks first, coin value on top - the top of the stack equals total equity. Wider coin bands => heavier in-market exposure.Why it matters. Lets you see whether outperformance came from holding coin during a rally or from disciplined cash management.Insights (auto-derived from total).
Stat
Value
Peak Total Equity
10,000.00 USDT @ 2025-12-24 23:59:00 UTC
Trough Total Equity
10,000.00 USDT @ 2025-12-24 23:59:00 UTC
Mean
10,000.00 USDT
Std Dev
0.0000 USDT
Last
10,000.00 USDT
Points
8
Sum
80,000.00 USDT
Across 8 points the series ranged from 10,000.00 USDT (2025-12-24 23:59:00 UTC) to 10,000.00 USDT (2025-12-24 23:59:00 UTC), averaging 10,000.00 USDT. 100% of points were positive, 0% negative. The most recent value is 10,000.00 USDT.
What it shows. Share of total portfolio value invested in the base coin at each sample.How to read it. 0% = fully in cash, 100% = fully invested. Areas above ~70% mean the strategy was strongly directional at that moment.Why it matters. Quantifies risk-on / risk-off behaviour. Low average exposure with strong returns hints at high capital efficiency.
Series contains 8 points but every numeric value is zero - likely a missing equity column (see ENGINE.md Section 13.1). Skipping the JSON payload to avoid suggesting measured data exists.
Data source -GET /backtests/{id}/equity * Fields used:timestamp, total_value_exit_net * Transform:dailyDelta(equity)
What it shows. First-difference of 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.
Series contains 7 points but every numeric value is zero - likely a missing equity column (see ENGINE.md Section 13.1). Skipping the JSON payload to avoid suggesting measured data exists.
Data source -GET /backtests/{id}/equity * Fields used:timestamp, total_value_exit_net * Transform:monthlyReturns(equity)
What it shows. Calendar-month percentage return computed from the first vs. last equity value of each month.How to read it. Green bars = profitable months, red bars = losing months. Look for clusters of red - they often map to specific market regimes (e.g. crypto bear quarters).Why it matters. Calendar-month returns are the standard reporting unit for traders and funds; they make like-for-like comparison with HODL trivial.
Series contains 1 points but every numeric value is zero - likely a missing equity column (see ENGINE.md Section 13.1). Skipping the JSON payload to avoid suggesting measured data exists.
Data source -GET /backtests/{id}/trades * Fields used:sell_time, profit * Transform:cumulativeProfit(trades)
What it shows. Running sum of realised per-trade profit, ordered by sell time.How to read it. Steep upward slope => winning streak. Plateaus => many neutral or breakeven trades. Down-slopes => losses dominate.Why it matters. Distinguishes ‘one big win + many losers’ (lottery) from ‘many small wins’ (edge). Smooth, monotonically rising curves are the dream.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/trades * Fields used:sell_time, profit * Transform:dailyTradeProfit(trades)
What it shows. Aggregated realised profit per calendar day across all trades.How to read it. Tall green bars are blockbuster days, red bars are pain days. Variance here drives the equity volatility above.Why it matters. Helps spot regime-dependence - e.g. all profit concentrated on Mondays, or all losses during weekend pumps.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/trades * Fields used:sell_time * Transform:tradesPerDay(trades)
What it shows. How many trades closed on each calendar day.How to read it. High bars = busy days (often during high volatility). Empty days = strategy sat on its hands.Why it matters. Sanity check on activity. Strategies that fire 200+ trades/day will be fee-bled in live; <1 trade/week may be too sparse to trust statistically.
No data available for this chart in the current run.
What it shows. Running sum of buy + sell fees across all trades, in quote currency.How to read it. A nearly-linear curve confirms fees scale with trade count. Steep slopes warn of an over-trading strategy.Why it matters. Compare the final value to total realised profit - if fees >= 50% of gross profit, the strategy is paying the exchange more than the trader.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/trades * Fields used:profit_percentage * Transform:profitDistribution(trades, 30)
What it shows. Histogram of per-trade percentage returns, binned across the observed range.How to read it. A long left-tail (deep losses) with a short right-tail screams ‘pick up pennies in front of a steamroller’. Tight, right-shifted bins are healthy.Why it matters. Distribution shape matters more than the average - payoff asymmetry decides whether the strategy survives black-swan markets.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/trades * Fields used:profit * Transform:rollingWinRate(trades, 50)
What it shows. Percentage of profitable trades within a sliding window of the last 50 closed trades.How to read it. Above 50% line => recent edge holds. Sustained dips below => regime change or strategy decay.Why it matters. Win rate alone is meaningless (you can have 90% wins and still lose money). Rolling win rate spots when the edge breaks over time.
No data available for this chart in the current run.
What it shows. Two cumulative-profit lines: gross (before subtracting fees) vs. net (the actual realised profit).How to read it. The vertical gap between gross and net is exactly what the exchange earned. Wider gaps => heavier fee drag.Why it matters. Quantifies the fee tax on edge. Useful when comparing fee-tier upgrades or maker-vs-taker variants.
No data available for this chart in the current run.
What it shows. Annualised risk-adjusted return computed over rolling 30-day and 90-day windows.How to read it. Above 1 = solid, above 2 = excellent, below 0 = losing money on risk-adjusted basis. Compare 30d vs 90d to see short vs medium-term consistency.Why it matters. A flat-to-rising rolling Sharpe is the gold standard for production-ready strategies; a collapsing Sharpe predicts upcoming drawdowns.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/equity * Fields used:timestamp, total_value_exit_net * Transform:drawdownRecoveryEpisodes(equity)
What it shows. Each point is one drawdown episode: x-axis = duration in days, y-axis = depth in %.How to read it. Top-left = quick shallow dips (good). Bottom-right = long deep underwater periods (bad). The single worst point dominates investor PTSD.Why it matters. Investors care about how long they sat underwater as much as how deep. This chart surfaces both at once.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/trades * Fields used:sell_time, profit * Transform:consecutiveStreaks(trades)
What it shows. Length of every uninterrupted run of wins (green) and losses (red) in chronological order.How to read it. Long red bars are the painful streaks; long green bars are the lucky ones. The longest red streak sets the realistic position-sizing limit.Why it matters. Behaviour during a 10-trade losing streak determines if a real trader would still be running the bot - most are not.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/equity * Fields used:base_value_exit_net, total_value_exit_net * Transform:baseExposure(equity)
What it shows. Same series as Base Exposure, re-framed as ‘how much working capital was actually deployed’.How to read it. Average level = average capital efficiency. 30% average means the strategy could in theory run 3x the notional with the same cash.Why it matters. Two strategies with identical returns are not equal - the one using less capital is far more attractive for portfolio composition.
Series contains 8 points but every numeric value is zero - likely a missing equity column (see ENGINE.md Section 13.1). Skipping the JSON payload to avoid suggesting measured data exists.
What it shows. Reconstructed price line of the traded asset with green dots for buys and red dots for sells.How to read it. Buys clustered near local lows + sells near highs => good market timing. Buys near local highs => classic FOMO behaviour.Why it matters. The most intuitive sanity check on whether the strategy is actually buying low and selling high vs. simply riding momentum.
No data available for this chart in the current run.
Total markers: 0 buys, 0 sells (UI caps each at 500 dots).
What it shows. Histogram of per-trade notional value (buy_price x buy_quantity) in quote currency.How to read it. A tight peak => uniform sizing. A long right-tail => a few oversized positions that dominate PnL and risk.Why it matters. Position-size variance is a hidden risk factor - strategies that ape into one mega-trade are not as repeatable as their headline numbers suggest.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/trades * Fields used:fill_type, profit_percentage * Transform:returnByFillType(trades)
What it shows. Stacked histogram showing how TP (take-profit), SL (stop-loss) and TSL (trailing stop-loss) fills are distributed across return bins.How to read it. Healthy strategies have TP fills bunched on the right (positive returns) and SL/TSL fills bunched on the left. Overlap between them indicates fuzzy exit logic.Why it matters. Confirms each exit mechanism does its job. If SL fills land in positive territory, the stop is probably too tight; if TP fills land in red, the order routing is broken.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/equity * Fields used:timestamp, total_value_exit_net * Transform:monthlyEquityYoY(equity)
What it shows. Equity rebased to 100 at the start of each calendar year, plotted month-by-month so years overlay.How to read it. Lines that consistently end above 100 => profitable in every plotted year. Crossover with the 100 reference line tells you when the year flipped from green to red.Why it matters. Year-over-year overlay is the fastest visual test for regime stability - strategies that worked only in 2021 will stand out clearly.Full series - 12 points.
Data source -GET /backtests/{id}/trades * Fields used:sell_time, profit * Transform:profitByWeekday(trades)
What it shows. Sum of realised profit aggregated by ISO weekday (Mon-Sun).How to read it. Bars above zero => winning days of the week, bars below => losing days. Crypto often shows distinct weekend behaviour.Why it matters. Surfaces calendar effects that a strategy may inadvertently exploit (or be exposed to). Useful for time-based filters in production.
Series contains 7 points but every numeric value is zero - likely a missing equity column (see ENGINE.md Section 13.1). Skipping the JSON payload to avoid suggesting measured data exists.
Data source -GET /backtests/{id}/trades * Fields used:sell_time, profit * Transform:profitByHour(trades)
What it shows. Sum of realised profit aggregated by hour-of-day (UTC), 0-23.How to read it. Clusters around US/EU/Asia trading sessions reveal which liquidity window the strategy actually monetises.Why it matters. Lets you build a time-of-day filter or schedule the live bot to only run during profitable hours, cutting fees and infra cost.
Series contains 24 points but every numeric value is zero - likely a missing equity column (see ENGINE.md Section 13.1). Skipping the JSON payload to avoid suggesting measured data exists.
What it shows. Scatter plot: x = trade hold duration in hours, y = realised return %.How to read it. Concentration in the upper-left (short hold + positive return) is ideal - fast turnover with edge. Lower-right (long hold + loss) means the strategy bag-holds losers.Why it matters. Tests whether time-in-market correlates with profitability. Strategies with no relationship are usually noise-driven.
No data available for this chart in the current run.
Data source -GET /backtests/{id}/trades * Fields used:fill_type * Transform:computeKPIs(equity, trades).fillTypes
What it shows. Counts of how many trades closed via TP (take-profit), SL (stop-loss) or TSL (trailing stop-loss).How to read it. TP-dominant => targets do most of the work. SL-dominant => the strategy bleeds via stops. TSL-dominant => relies heavily on trend-following.Why it matters. Tells you how profit was made, not just how much. Two strategies with the same return but different fill mixes have very different live behaviour.
Series contains 3 points but every numeric value is zero - likely a missing equity column (see ENGINE.md Section 13.1). Skipping the JSON payload to avoid suggesting measured data exists.
This section is optimized for LLM/RAG consumption. Every metric appears as both a flat key/value row and as canonical JSON so a model can quote exact values without re-deriving them. The JSON below is the exact object whose SHA-256 is published as facts_sha256 in the frontmatter - re-hash it to verify.
For every headline metric in this report, this table answers three questions: where did the value come from, what JSON field, and what transform (if any) was applied. Use it to audit any number - or to teach an LLM to cite values verbatim.
Metric
Source
JSON path
Transform
Value in this report
Symbol
GET /backtests/{id}
$.symbol
direct API value
KGSTUSDT
Mode
GET /backtests/{id}
$.mode_name
direct API value
5LowMoney.json
Status
GET /backtests/{id}
$.status
direct API value
completed
Period start
GET /backtests/{id}
$.config.from
direct API value
2025-01-01 00:00:01
Period end
GET /backtests/{id}
$.config.to
direct API value
2025-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
10,000.00 USDT
Return %
GET /backtests/{id}
$.return_pct
direct API value (cross-check: (final_value/start_balance - 1) * 100)
0.00%
Total profit
GET /backtests/{id}
$.total_profit
direct API value (cross-check: Sum trades[].profit)
0.00 USDT
Win rate %
GET /backtests/{id}
$.win_rate
direct API value (cross-check: 100 * count(trades[].profit > 0) / count(trades))
-
Trades count
GET /backtests/{id}
$.fulfilled_trades
direct API value (cross-check: count(trades))
0
Best trade
GET /backtests/{id}
$.max_profit
direct API value (cross-check: max(trades[].profit))
- USDT
Worst trade
GET /backtests/{id}
$.min_profit
direct API value (cross-check: min(trades[].profit))
These blocks are the unmodified API responses that produced every metric in this report. They are large by design - collapse them with the accordions below if you’re reading the doc as prose. Verify their integrity via the fingerprints in the Data Integrity chunk.
GET /backtests/1522e1a0-8523-4e5e-aa9d-a92c68269e5b - backtest summary (verbatim)
Verbatim trades.json payload is intentionally not embedded in this report (deprecated). The full trade ledger is attached below as RFC 4180 CSV (with a SHA-256 fingerprint) - and is also fetchable from GET /backtests/1522e1a0-8523-4e5e-aa9d-a92c68269e5b/trades.
Deterministic Q&A - every question is always present so this section can be sliced into stable RAG chunks. Missing API fields render as _null_; metrics that can’t be derived locally render as “not available”.
What strategy was tested and on which trading pair?
The LowMoney strategy was tested on KGSTUSDT over 2025-01-01 to 2025-12-31.Source: bt.mode_name, bt.symbol, bt.config.from, bt.config.to
What is the current status of this backtest?
Completed. Final metrics are available below.Source: bt.status, bt.error_message
Compound Annual Growth Rate is 0.00% over a 7 day window.Source: derived from equity series (eqStats.cagrPct, eqStats.durationDays)
Did it beat Buy & Hold of KGSTUSDT?
Buy & Hold comparison is not available - token return for the window was not provided.Source: bt.return_pct, opts.tokenReturnPct, outperformDelta
What was the worst drawdown?
The maximum peak-to-trough loss was -0.00% (0.00 USDT).Source: derived from equity series (eqStats.maxDrawdownPct, .maxDrawdownAbs, .underwaterDays, .recoveryDays)
How many trades did it take and what was the win rate?
0 trades were filled with a null win rate.Source: bt.fulfilled_trades, bt.win_rate, bt.active_orders, derived tradesPerMonth
What was the average, best, and worst trade?
Per-trade profit fields are null.Source: bt.avg_profit, bt.max_profit, bt.min_profit
What was the profit factor and expectancy?
Profit factor and expectancy are not available (no trade list available).Source: derived from trades (stats.profitFactor, .expectancy, .payoffRatio)
What were the longest winning and losing streaks?
Streak data is not available.Source: derived from trades (stats.consecWinsMax, .consecLossesMax)
How much was paid in fees?
Fee totals are not available (no trade list).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?
Sharpe / Sortino are not available (need at least a couple of days of equity data).Source: derived from equity series (eqStats.sharpeAnnualized, .sortinoAnnualized)
How volatile was the equity curve?
Annualized volatility of daily returns was 0.00%.Source: derived from equity series (eqStats.volatilityAnnualizedPct)
How long does the strategy hold positions?
Hold-time data is not available (no trade list).Source: derived from trades (stats.medianHoldingHours, .avgHoldingHours, .minHoldingHours, .maxHoldingHours)
How much of the time was capital deployed?
The strategy was in the market 0.0% of the period - the remainder sat in cash awaiting setups.Source: derived from equity series (eqStats.timeInMarketPct)
What were the best and worst months?
Monthly breakdown is not available.Source: derived from trades (stats.bestMonth, .worstMonth)
When did the backtest run and how long did it take?
Created at 2026-04-19T12:41:49.590578Z, started at 2026-04-19T16:37:10.016632Z, completed at 2026-04-19T16:39:04.516471Z. Engine elapsed time: 1.72 s.Source: bt.created_at, bt.started_at, bt.completed_at, bt.elapsed_sec
What configuration parameters were used?
Initial capital 10,000.00 USDT, data file null, timeframe null, fee % null, cloned from a base mode: no.Source: bt.start_balance, bt.data_file, bt.config.timeframe, bt.config.fee_pct, bt.is_duplicate
Where can I find a one-line summary written by the engine?
No. This is a historical backtest. It excludes live slippage variance, exchange outages, latency, and regime changes. Treat it as evidence the rules can be profitable, not a forward guarantee.Source: static disclaimer
The backtester UI lives at uncoded.ch/backtesting. The REST API endpoint below accepts the same JSON payload - authenticate with your 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.
Schema.org Dataset markup with 13 PropertyValue KPIs. Every numeric value is finite + range-validated; invalid / null fields are omitted so the JSON stays schema.org-compliant.
Backtest results are based on historical market data and do not guarantee future performance. Past returns are not indicative of future results. Trade at your own risk.