Backcast Labs
ema-trend-following.fnb guest workspace
engine v1.8.1 · idle
Idle — nothing is running on your behalf.
EMA trend-followingBTC · ETH · SOL · 20/50 EMA cross
Sharpeannualized, after costs
Max drawdownhalt sits at −20 %
Tradesround trips
Profit factorgross win ÷ gross loss
Costs applied20 bps slip · 5 bps commnext-bar fills · delisted symbols included
AI Explainer reads the result above back in plain language, every run
AI Analyst asks what you want to find out, then goes and does the work
Standing review you say what matters once — after that it keeps checking, and speaks only when something crosses

Is this an edge, or did you search until something looked good?

A guest notebook on seeded sample markets. Defaults are deliberately pessimistic — 20 bps slippage, 5 bps commission, next-bar fills, delisted symbols kept in — so what you read here is the unflattering version. Cells 5 to 7 are the ones most backtesters skip: whether your setting sits on a plateau or a spike, whether it beats coin-flip entries with the same footprint, and how much of the result is explained by how many variants you tried.

[ ]
Parameters Move one and see instantly whether the edge survives realistic costs.
50
50
2.5
2.5×
20
20
5
5
timeframe
range

Defaults are deliberately pessimistic: 20 bps slippage, 5 bps commission, next-bar fills, delisted symbols included.

Risk guards, always on quarter-Kelly sizing 0.25 drawdown halt −20 % slippage cap 20 bps max per asset 7.5 % kill switch armed
[ ]
Table 1What the numbers above are actually measured on

A backtest is only as honest as its data. Every choice here has a price, and this cell puts a number on each one.

PropertyValueWhat it costs you
Run the parameters cell first.
Measure what excluding delisted symbols is worth.
[ ]
Figure 1Equity against buy-and-hold

See what the strategy actually returned against simply holding the market — scroll to zoom, drag to pan, double-click to reset.

scroll zoom · drag pan · dbl-click reset
Drawdown, with the −20 % halt line

The halt is not a forecast. It is the level at which the system stops trading and asks for a human, which is why the curve is drawn against it.

[ ]
Table 2Statistics

The numbers a serious allocator asks for — including the deflated Sharpe that discounts how many variants you tried.

MetricValueReads as
[ ]
Figure 2Is this a plateau, or a spike?

The same backtest re-run across the neighbourhood of your two shape parameters. A result that only works at exactly these numbers is not a result.

Sharpe at your setting
Median of its 8 neighbours
Spread across the grid, ±1 sd
Run the parameters cell first.
[ ]
Figure 3Against buy-and-hold, and against luck

Beating buy-and-hold is table stakes. The real test is beating coin-flip entries that trade exactly as often, hold exactly as long and pay exactly the same costs.

Percentile against 400 random-entry runs
Buy-and-hold Sharpe, same window
Sharpe above the random median
Run the parameters cell first.
ComparisonSharpeCAGRMax DDVerdict
[ ]
Figure 4Monte Carlo · resampled trade sequences, 12 months

How bad a year can get — before you find out with real money.

P5 terminal equity
P50 median
P95
Run the parameters cell first.
Max-drawdown distribution
[ ]
Figure 5Walk-forward · 6 folds

Proof the parameters still work on data they were never fitted on.

Efficiency ratio η · out-of-sample ÷ in-sample Sharpe
Folds profitable out-of-sample
Run the parameters cell first.
Table 4In-sample against out-of-sample, per fold
FoldIn-sample windowOut-of-sample windowIS SharpeOOS SharpeOOS returnLookback chosen
[ ]
Figure 6Monthly returns (%) and allocation, capped at 7.5 % per asset

Where the returns actually came from, and how thinly the risk is spread across them.

Monthly returns
Allocation, capped at 7.5 %
[ ]
Table 5Last 20 trades

Every round trip with its own fill cost, so nothing hides inside an average.

#OpenedAssetSideEntryExitHoldSlippageTick fillP&L
Lab tier Replace the 20 bps model with the real fill Tick-level order books for 2019–2026 replay every trade above against the book that existed at that second — queue position, partial fills, the spread you actually paid. The blurred column is that number.
[ ]
Table 6Research log — everything you tried, not just the one that worked

The record that keeps you honest with yourself. Every run this session, with its parameters, its result and the moment it happened — exportable, so the discarded attempts are on the page too.

#TimeStrategyTFLookbackATRCostsSharpeMax DDTradesKept
Nothing recorded yet.
Standing review — the part of this log you did not write

The same record, second register: every check the standing review made on its own, what it was watching, and what it found — including the checks where nothing crossed, which is most of them. Anything it priced is a row in the table above, tagged, and counted in cell [7] like a configuration you set yourself.

#TimeMandateWhat it checkedWhat it foundWhat it did
No mandate set — the standing review is off.
Take it to your execution platform

The validated configuration as your execution platform reads it — parameters, costs and the risk guards travelling with them, so nothing is re-typed by hand at the other end.

The payload above is yours to copy. Signing it, and pushing it straight to a venue over a webhook, is the Desk tier.
stdout
ReproducibilityEvery figure on this page is a pure function of the strategy, the parameters and the seed shown in the status bar. Same inputs, same page, on any machine.
engine v1.8.1 data Crypto perps · 2019-01-01 → 2026-08-31 · 4h bars 0 elapsed threads 8 · cpu 3 % seed Kelly 0.25 · halt −20 % CtrlK palette · ? shortcuts

Demo · simulated data · Part of the Mast family