Why the MarketMakerMinimalTest bot lost 0.23% on BTCUSDT - 2024 backtest across 367 days

CompletedLoses to BTCUSDT B&H· α -0.22%

MarketMakerMinimalTest6/4/2026, 7:17:23 PM

-0.23% return but -0.22% alpha vs holding BTCUSDT. Replayed on 367 days of Binance Spot BTCUSDT candles at roughly 2.1 trades per day.

BTCUSDT | 1002MarketMakerMinimalTest.json | 2024-01-01 - 2025-01-01 | -0.23% | 760 trades | 0% WR

Final Value
9976.82 USDT
Return
-0.23%
Profit
-23.18 USDT
Trades
760
Win Rate
0.0%
Open Orders
9
Best Trade
-0.030188 USDT
Worst Trade
-0.030823 USDT
Max Drawdown
-
Profit Factor
0.00
Sharpe
-
Wins / Losses
0 / 760
TP / SL / TSL
760 / 0 / 0
Total Fees
23.57 USDT
Max Streak W/L
0 / 760
Hold P50 / P95
1m / 52m

BTCUSDT Backtest - unCoded Crypto TradingBot

Strategy: MarketMakerMinimalTest | Period: 2024-01-01 to 2025-01-01 | Starting Capital: 10,000.00 USDT | Final portfolio value (incl. open positions): 9,976.82 USDT | Return: -0.23% | Closed trades: 760 (9 orders still open - excluded from win rate) | Closed-trade win rate: 0.0% | Best Trade: -0.0302 USDT | Worst Trade: -0.0308 USDT | Realized profit (closed trades only): -23.18 USDT | Profit Factor: 0.00 | Total Fees: 23.57 USDT

Detailed Summary

Backtest BTCUSDT (Mode: 1002MarketMakerMinimalTest.json) Period: 2024-01-01 00:00:01 to 2025-01-01 23:59:59 Starting balance: 10,000.00 USDT Final value: 9,976.82 USDT P&L: -23.18 USDT (-0.23%) Result: LOSS Completed trades: 760 Open orders at end: 9 Win rate: 0.0% Avg. profit/trade: -0.030494 USDT Best trade: -0.030188 USDT Worst trade: -0.030823 USDT Total profit (trades only): -23.175169 USDT Profit factor: 0.00 Total fees: 23.57 USDT Avg hold time: 0.2h TP / SL / TSL: 760 / 0 / 0 Strategy parameters: Buy trigger: -0.0025% from last buy Buy splits: 1 Sell targets: [0.0025] Investment per buy: 20.0 USDT Fees: maker 7.5 bps / taker 7.5 bps Elapsed: 2.0s

Strategy Configuration - MarketMakerMinimalTest
Buy Trigger: -0.0025%
Buy Splits: 1
Investment/Buy: 20 USDT
Start Balance: 10,000.00 USDT
Percent Mode: No
Free Quote %: 100.00%
Min Investment/Quote: 1 USDT
Min Quote Balance: 1 USDT
Can Buy: Yes
Can Buy Up: Yes
Can Buy Down: No
Can Sell: Yes
Stop Loss: No
Maker Fee: 7.5 bps
Taker Fee: 7.5 bps
Assumed Spread: 0 bps
Fees in Quote: Yes
Tick Size: 0.01
Step Size: 0.00001
Min Notional: 5
Intrabar Mode: OLHC
Order Latency: 2s
Cooldown: 1
Sell Activate Dist: 0.0001%
Sell Cancel Dist: 0.031%
Sell Zones (1):
+0.0025% → 100%

Loading equity data...

Daily summary · 367-day aggregate for BTCUSDT

Loading daily summary...

Findings unique to this BTCUSDT run · 0.0% WR · 760 trades · 367d

Findings derived from this run's own numbers - not shared boilerplate.

  • -0.23% return but -0.22% alpha vs holding BTCUSDT

    BTCUSDT itself moved -0.01% over the same window. Buying and holding would have delivered the larger figure, so this strategy captured only part of the underlying move - useful context that a bare "positive return" headline hides.

  • Payoff ratio 0.98x - best trade -0.03 USDT vs worst -0.03 USDT

    The largest winning BTCUSDT trade in this run was 0.98x the size of the largest losing trade. Combined with the 0.0% closed-trade win rate, this shape describes the exact win/loss geometry of this configuration - a fingerprint no other run in the library reproduces.

  • Estimated fee spend: ~45.60 USDT across 760 trades at 15 bps total

    Multiplying per-trade notional (~20.00 USDT) by two fills per round-trip, 15 bps total maker+taker cost and 760 closed trades yields roughly 45.60 USDT of exchange fees baked into the -23.18 USDT realized figure - a run-specific drag that changes with every parameter tweak.

  • Annualising the -0.23% window return over 367 days projects to -0.2% per year

    This is arithmetic, not a forecast: compounding the -0.23% observed over 367 days to a 365-day horizon yields -0.2%. The figure changes with every extra trading day and with every re-run of this BTCUSDT configuration, so it fingerprints this specific window uniquely.

  • Engine evaluated at least ~528,480 one-minute-equivalent BTCUSDT candles

    367 calendar days x 1,440 minutes per day = ~528,480 OHLCV bars replayed sequentially against the MarketMakerMinimalTest rule set (pairs with 1-second base data process up to 60x more) to produce the 760 closed trades on this page. The bar count, together with the intrabar mode, pins reproducibility for this exact run.

  • Average edge per closed trade: -15.2 bps of notional

    Dividing the -0.0305 USDT average closed-trade PnL by the ~20.00 USDT per-fill notional puts this configuration's micro-edge at -15.2 bps per round-trip. That figure has to survive live spread, slippage and the round-trip fee (~20 bps on Binance retail) - the narrower the gap, the more sensitive live performance becomes to execution quality.

  • Max deployable notional 20 USDT = 0% of 10000 USDT starting capital

    1 buy splits x 20.00 USDT each defines the ceiling of how much of the account can be in-market at once. That leaves ~100% of the account permanently in stablecoin as a buffer against extended BTCUSDT drawdowns. The number is a direct consequence of these two parameters and shifts with every tweak.

  • Average hold time per closed trade: 13.7 minutes

    Every closed BTCUSDT trade in this run averaged 13.7 minutes in market. The cadence emerges from the interaction of the MarketMakerMinimalTest exit ladder with realised BTCUSDT volatility over the window; the exact figure is unique to this parameter set and price path and will drift if either changes.

  • Run snapshot: -0.23% on BTCUSDT via MarketMakerMinimalTest between 2024-01-01 and 2025-01-01

    Realized -23.18 USDT across 760 closed trades, 0.0% closed-trade win rate, 9 still-open orders. Starting balance 10000.00 USDT ended at 9976.82 USDT portfolio value. These numbers belong to this run (id 0ab88f68) only - no other backtest in the library shares this exact combination.

  • Configuration fingerprint: buy trigger 0.0025% · 1 buy splits · 20 USDT per buy

    Full parameter set for this run - buy trigger 0.0025%, 1 buy splits, 20 USDT per buy, 1 sell zones, 15 bps total fees - combined with the BTCUSDT price path over 367 days produces the exact result on this page. Changing any single value would create a different run with a different URL.

  • Engine settings: 1s-1m BTCUSDT candles · intrabar "OLHC" · 2s order latency

    367 days of Binance Spot OHLCV (1-second to 1-minute base resolution, depending on the pair) was replayed against the MarketMakerMinimalTest rule set. The intrabar fill mode and latency assumption above are part of what makes this run reproducible - a different engine setting would produce a different equity curve on the same price data.

Performance Analysis

This run produced a -0.23% return on BTCUSDT — a small loss. Useful as a datapoint about how the MarketMakerMinimalTest parameters interact with BTCUSDT price action in this specific window; not on its own evidence that the configuration is unworkable.

About BTCUSDT: Bitcoin is the highest-cap and least volatile of the major crypto pairs. Backtests on BTC tend to produce smoother equity curves but also lower percentage returns than altcoins — the trade-off is reduced tail risk.

Only 0.0% of the 760 closed BTCUSDT trades ended in profit, which means the few winners had to be substantially larger than the many losers for the run to break even or grow. This figure covers closed trades only and **excludes 9 orders** that were still open at the end of the window.

Around 2.1 BTCUSDT trades per day puts this in the active swing-trading bracket — frequent enough to compound, infrequent enough that fees stay manageable.

The trade payoff distribution is fairly symmetric — wins and losses are similar in magnitude, suggesting the strategy is reading market structure consistently in both directions. Best single trade: -0.0302 USDT. Worst: -0.0308 USDT. Average per trade: -0.0305 USDT.

Risk profile (closed trades only): Per-trade exposure was minimal — the worst closed trade only cost 0.00% of starting capital. That low-risk-per-trade footprint is the signature of a tightly-sized configuration; expect smoother equity curves but also slower compounding in strong trend regimes. Best single trade contributed +-0.00% to the account, giving a best-vs-worst ratio of roughly 0.98:1 between the extreme closed trades. Note: this is a closed-trade statistic — open positions and unrealized PnL are not included.

Configuration analysis: The MarketMakerMinimalTest configuration entered on a 0.0025% pullback signal across 1 potential buy splits at 20 USDT each. Total deployable notional is therefore 20 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 1 laddered sell zone, 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.23% is already net of trading costs — no additional fee adjustment is required when comparing to other runs.

Over the configured 367-day window the strategy reported -23.18 USDT of realised trade profit on a 10000 USDT starting balance, ending at a portfolio value of 9976.82 USDT. Mechanically annualising the -0.23% window return projects to roughly -0.2% 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.

Hold-time profile: Average time in market per closed trade: 14 minutes - intraday scalp horizon where minute-level noise matters more than daily trend. This cadence is a direct consequence of the MarketMakerMinimalTest exit ladder interacting with realised BTCUSDT volatility over 367 days - a slower or faster market would shift the same rule set into a different bucket.

Break-even fee threshold: Given the realised -23.18 USDT profit across 760 closed trades at ~20.00 USDT notional per fill, the strategy would break even at approximately -7.6 bps of round-trip fees. Binance retail is ~20 bps round-trip (15 bps with BNB discount); the gap between that live cost and the -7.6 bps figure is the fee headroom this configuration has before it turns unprofitable - a metric specific to this run's trade count and per-trade size.

Realised profit velocity: On closed trades alone this configuration produced roughly -0.06 USDT/day, -0.44 USDT/week and -1.92 USDT/month across the 367-day BTCUSDT window. Velocity figures like these are useful for sizing - an operator running a 10x larger account on the same parameters would scale these numbers linearly, but slippage would grow non-linearly and eat into the top line.

Methodology & data

This backtest was executed on historical Binance Spot candles for BTCUSDT at a base resolution between 1 second and 1 minute (1-second for liquid pairs, 1-minute where finer data is unavailable), 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 each base candle sequentially, evaluates the MarketMakerMinimalTest 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.

In numerical terms the engine replayed at least ~528,480 one-minute-equivalent OHLCV bars end-to-end (pairs with 1-second base data process up to 60x more), one closed trade emerging on average every ~695 minute bars. That density is what pins reproducibility: rerunning the same MarketMakerMinimalTest configuration on the same BTCUSDT bar range with the same intrabar and latency settings will yield the same fills to the tick, which is why the run identifier 0ab88f68 deterministically anchors this URL.

Configured backtest window: approximately 12.1 months (367 days from `config.from` to `config.to`) of BTCUSDT price action at 1-second to 1-minute resolution — 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: BTCUSDT 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.

Frequently asked questions

Is a -0.23% return on BTCUSDT a good backtest result?
Not on its own. The -0.23% return looks strong in isolation, but simply holding BTCUSDT over the same window returned -0.01%, so this configuration underperformed buy-and-hold by -0.22% (negative alpha). A high headline return is not a good result when holding the coin would have done better.
What does the 0.0% win rate mean here?
It means 0.0 out of every 100 closed trades ended profitable. A lower win rate is fine when winners outsize losers, which is typical for trend-following modes.
What is the annualised return for this BTCUSDT backtest?
This backtest already covers about a full year (367 days), so the annualised figure is essentially the total return of -0.23% itself, not a projection. A single year is not predictive of future years.
Can I run this exact MarketMakerMinimalTest 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 BTCUSDT?
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 MarketMakerMinimalTest 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.
Why are 9 orders still shown as open?
The backtest ended at 2025-01-01 with 9 positions not yet closed. Their unrealised PnL is included in the portfolio value but not in the closed-trade win rate or the realised profit total - that is the standard reason the two numbers diverge on this page.
How much capital does the MarketMakerMinimalTest configuration deploy per position cluster?
Up to 20 USDT can be in-market at once (1 splits x 20.00 USDT). Against the 10000 USDT starting balance that is a 0% notional ceiling - sizing lower for live use is the most common way operators cushion against slippage on the first live drawdown.

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 BTCUSDT.

Related backtests · BTCUSDT · MarketMakerMinimalTest

Neighbouring runs from the library - same pair, same strategy, and the exact same BTCUSDT x MarketMakerMinimalTest combination.

Top BTCUSDT runs

All BTCUSDT backtests →

Same BTCUSDT x MarketMakerMinimalTest config

All BTCUSDT · MarketMakerMinimalTest runs →

Top MarketMakerMinimalTest runs (any pair)

All MarketMakerMinimalTest backtests →