AI benchmark · round 1
Which AI is the best quant researcher and writes the best trading strategies?
Short answer: it is measured here, not assumed. Claude, GPT (ChatGPT), Gemini, DeepSeek, Grok and other models each searched for a Bitcoin strategy (4h bars, 2020 to 2023) with the same tools and the same budget, then every strategy was judged on 2023 to 2026, a sealed period the tool kept hidden during the search. The models may still know that period's general trend from their training.
Each AI drove the same backtest app (Strategy Arena Lab, controlled only through MCP, the protocol that lets an AI use a piece of software), with the same Bitcoin data and the same budget of 80 tool calls. Its strategy was then scored on the sealed period, which the tool refused to show during the search.
Protocol sealed 2026-10-07 · 072805c87e2e…
Round 1 = historical period (Oct 2023 → Sep 2026): the models may know Bitcoin's general trend from their training. Round 2 will be played on future data, unknown to everyone.
Referee: Claude Opus 5.5, which is also a contestant. Scoring is mechanical: the rules below applied to backtest numbers.
Sessions of 7 October 2026 (Gemini 3.8 Flash, GPT 5.6 Sol, Grok 4.6, Grok 4.7): same sealed protocol, same data, same scoring. They ran on Lab 235, whose default engine is bit-identical to 230's (84 of 84 answers identical), with the sealed helper forced onto the “full” MCP profile (same 74 tools and same answers as in the first sessions). Grok 4.6 played a single session (n = 1): its average carries less weight than those of two-session models.
Sessions of 8 October 2026 (Astra 6, two sessions): same sealed protocol, same data, same scoring. They ran on Lab 236, with the sealed helper forced onto the “full” MCP profile; proof and replay tools, whose built-in data overlaps the sealed period, were refused there. No refused attempt in either session.
grok-1 log: 4 Grok 4.7 calls started by mistake under the grok-1 id (docs reading, no test) were removed from it and archived separately, downloadable below. The scored grok-1 log holds Grok 4.6's 20 calls, the count the referee used.
Round 1 engine: these figures were computed on 7 and 8 October 2026 with the Lab's default semantics at the time (legacy_v1), which differ from TradingView: the EMA is recomputed over a window, indicators equal the price during warm-up from bar 55, and stops and targets are read on closes. The trades you see on a TradingView chart are therefore not the trades behind these figures. Since Lab 241 the default is tv_exact_v1, compared with real TradingView logs on 6 of these scripts (234 of 234 trades, over 4,000 candles). Lab 255 reproduces all 21 results under legacy_v1; under tv_exact_v1 they change, sometimes a lot: sonnet-1 goes from 239.81% to 132.14%. Round 1 is not rescored, and its figures compare neither with TradingView nor with round 2.
Leaderboard
Only the main strategy counts. Score first; ties go to the smaller worst drop.
You are looking at the best candidate each AI handed in. It does not count: only the main strategy is scored. Gaps show how much picking matters.
Gemini 3.8 Flash
run 1 · Cursor agentGemini 3.8 Flash
run 2 · Cursor agentMuse Spark 1.3 (contributor, free)
run 1 · cloud via opencodedeepseek-flash
run 1 · cloud via opencodeClaude Sonnet 5
run 1 · Claude agentXiaomi MiMo v2.6 Pro
run 2 · cloud via opencodeGPT 5.6 Sol
run 1 · Cursor agentClaude Opus 5.5
run 1 · Claude agentClaude Fable 5.1
run 2 · Claude agentGPT 5.6 Sol
run 2 · Cursor agentClaude Sonnet 5
run 2 · Claude agentdeepseek-flash
run 2 · cloud via opencodeClaude Fable 5.1
run 1 · Claude agentMuse Spark 1.3 (contributor, free)
run 2 · cloud via opencodeClaude Opus 5.5
run 2 · Claude agentGrok 4.6n = 1
run 1 · Cursor agentGrok 4.7
run 1 · Cursor agentAstra 6
run 1 · terminal agentAstra 6
run 2 · terminal agentGrok 4.7
run 2 · Cursor agentClaude Haiku 4.5
run 1 · Claude agentClaude Haiku 4.5
run 2 · Claude agentBuy and hold (reference)
Buy at the start, sell at the endThe bar every AI has to clear once risk is counted.
Nemotron 3.5 Lightning (free)
not played / simulated · unrankedNo call to the app over 2 attempts, results described without computation.
Average per model (n = 1–2)
Detailed table every figure, row by row
| Rank | AI | Score | Strategy kept | Own label | Sealed return | Worst drop | Return / worst drop | Tool calls |
|---|---|---|---|---|---|---|---|---|
| 1 | Xiaomi MiMo v2.6 Pro (run 1) ⚑ Knew the buy-and-hold result of the sealed period |
100 | Dual SMA let-run | robust | +146.48 % | 30.05 % | 4.87 | 47 |
| 2 (tie) | Gemini 3.8 Flash (run 1) | 100 | Dual SMA 12-210 | robust | +152.72 % | 30.20 % | 5.06 | 71 |
| 2 (tie) | Gemini 3.8 Flash (run 2) | 100 | Dual SMA 12-210 | robust | +152.72 % | 30.20 % | 5.06 | 38 |
| 4 | Muse Spark 1.3 (contributor, free) (run 1) | 100 | Cash under SMA200 | robust | +132.13 % | 31.18 % | 4.24 | 34 |
| 5 | deepseek-flash (run 1) | 100 | DeepSeek SMA Long T120 F17 S298 | robust | +176.41 % | 41.46 % | 4.25 | 21 |
| 6 | Claude Sonnet 5 (run 1) | 80 | EMA cross 40/200 | exploratory | +239.81 % | 26.43 % | 9.07 | 43 |
| 7 | Xiaomi MiMo v2.6 Pro (run 2) | 80 | Dual SMA 17/280 | exploratory | +216.54 % | 27.53 % | 7.87 | 47 |
| 8 | GPT 5.6 Sol (run 1) | 70 | BTC Filtered Breakout 60-250-40 | robust | +20.91 % | 29.00 % | 0.72 | 22 |
| 9 (tie) | Claude Opus 5.5 (run 1) | 70 | EMA trend 300 | robust | +95.35 % | 33.45 % | 2.85 | 27 |
| 9 (tie) | Claude Fable 5.1 (run 2) | 70 | EMA trend 300 | robust | +95.35 % | 33.45 % | 2.85 | 55 |
| 11 | GPT 5.6 Sol (run 2) | 70 | Event momentum robust | robust | +62.95 % | 36.99 % | 1.70 | 31 |
| 12 | Claude Sonnet 5 (run 2) | 70 | BTC Slow Trend SMA245 | robust | +108.19 % | 37.27 % | 2.90 | 35 |
| 13 | deepseek-flash (run 2) | 70 | BTC 4h SMA trend filter | robust | +103.28 % | 38.03 % | 2.72 | 24 |
| 14 | Claude Fable 5.1 (run 1) | 70 | BTC trend filter SMA280 + 30d momentum | robust | +77.13 % | 38.28 % | 2.01 | 45 |
| 15 | Muse Spark 1.3 (contributor, free) (run 2) | 70 | Donchian55 robust | robust | +109.03 % | 39.73 % | 2.74 | 32 |
| 16 | Claude Opus 5.5 (run 2) | 70 | E250 | robust | +77.95 % | 41.31 % | 1.89 | 32 |
| 17 | Grok 4.6 (run 1)n = 1 | 50 | sma200_cd12 | exploratory | +108.76 % | 30.99 % | 3.51 | 20 |
| 18 | Grok 4.7 (run 1) | 50 | ema 170 long | exploratory | +99.92 % | 36.60 % | 2.73 | 40 |
| 19 (tie) | Astra 6 (run 1) | 50 | Astra6 SMA240 long cash | exploratory | +103.28 % | 38.03 % | 2.72 | 34 |
| 19 (tie) | Astra 6 (run 2) | 50 | Astra6 S2 SMA240 trend | exploratory | +103.28 % | 38.03 % | 2.72 | 26 |
| 21 | Grok 4.7 (run 2) | 25 | abstention: no strategy handed in | abstention | — | — | — | 11 |
| 22 | Claude Haiku 4.5 (run 1) | 10 | BTC EMA Crossover Strategy | exploratory | -22.08 % | 30.99 % | -0.71 | 18 |
| 23 | Claude Haiku 4.5 (run 2) | 0 | Trend + ADX Filter did not run on the sealed period |
robust | — | — | — | 36 |
| — | Buy and hold (reference) | — | Buy at the start, sell at the end | — | +201.82 % | 53.45 % | 3.78 | — |
| — | Nemotron 3.5 Lightning (free) | 0 | not played / simulated | — | — | — | — | 0 |
Market: BTC 4h, 2023-10-01 to 2026-09-30 (6576 candles), fees 10 basis points per side. “Worst drop” is the largest fall from a peak (maximum drawdown). A highlighted row did better than buy-and-hold once that drop is counted.
Local models (RTX 4080 Super graphics card via Ollama)
In progress: the local model runs are under way and will appear here once scored.
Average per model
| AI | Runs | Average score | Average sealed return | Average worst drop | Average tool calls |
|---|---|---|---|---|---|
| Gemini 3.8 Flash | 2 | 100.0 | +152.72 % | 30.20 % | 54.5 |
| Xiaomi MiMo v2.6 Pro | 2 | 90.0 | +181.51 % | 28.79 % | 47.0 |
| Muse Spark 1.3 (contributor, free) | 2 | 85.0 | +120.58 % | 35.45 % | 33.0 |
| deepseek-flash | 2 | 85.0 | +139.84 % | 39.75 % | 22.5 |
| Claude Sonnet 5 | 2 | 75.0 | +174.00 % | 31.85 % | 39.0 |
| GPT 5.6 Sol | 2 | 70.0 | +41.93 % | 33.00 % | 26.5 |
| Claude Opus 5.5 | 2 | 70.0 | +86.65 % | 37.38 % | 29.5 |
| Claude Fable 5.1 | 2 | 70.0 | +86.24 % | 35.87 % | 50.0 |
| Grok 4.6 | 1n = 1 | 50.0 | +108.76 % | 30.99 % | 20.0 |
| Astra 6 | 2 | 50.0 | +103.28 % | 38.03 % | 30.0 |
| Grok 4.7 | 2 | 37.5 | +99.92 % (1 run with a result) | 36.60 % | 25.5 |
| Claude Haiku 4.5 | 2 | 5.0 | -22.08 % (1 run with a result) | 30.99 % | 27.0 |
| Nemotron 3.5 Lightning (free) | — | not played / simulated | — | — | — |
Every strategy submitted, with its exact script 22 scripts
Xiaomi MiMo v2.6 Pro (run 1) — Dual SMA let-run
strategy "Dual SMA let-run" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: SMA(11) > SMA(209)
size: 100%
exit:
# let winners run
params:
fast: min=10 max=50 type=int default=11
slow: min=80 max=280 type=int default=209
See this rule on a chart: open the BTC 4h chart on TradingView and add two simple moving averages (SMA) (11 and 209 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Dual SMA let-run (main) | robust | +146.48 % | 30.05 % | 4.87 | 46 |
| Dual SMA let-run | robust | +155.77 % | 28.83 % | 5.40 | 43 |
| Price SMA let-run | exploratory | +97.07 % | 36.56 % | 2.66 | 99 |
Gemini 3.8 Flash (run 1) — Dual SMA 12-210
strategy "Dual SMA 12-210" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: SMA(12) > SMA(210)
size: 100%
exit:
# let winners run
See this rule on a chart: open the BTC 4h chart on TradingView and add two simple moving averages (SMA) (12 and 210 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Dual SMA 12-210 (main) | robust | +152.72 % | 30.20 % | 5.06 | 44 |
| Dual SMA 11-210 | robust | +145.08 % | 29.83 % | 4.86 | 46 |
| Price SMA 200 | exploratory | +132.13 % | 31.18 % | 4.24 | 84 |
Gemini 3.8 Flash (run 2) — Dual SMA 12-210
strategy "Dual SMA 12-210" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: SMA(12) > SMA(210)
size: 100%
exit:
# let run
See this rule on a chart: open the BTC 4h chart on TradingView and add two simple moving averages (SMA) (12 and 210 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Dual SMA 12-210 (main) | robust | +152.72 % | 30.20 % | 5.06 | 44 |
| Dual SMA 18-300 | robust | +178.19 % | 29.08 % | 6.13 | 37 |
| Dual SMA 16-240 | robust | +194.80 % | 28.17 % | 6.92 | 38 |
Muse Spark 1.3 (contributor, free) (run 1) — Cash under SMA200
strategy "Cash under SMA200" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: price > SMA(200)
size: 100%
exit:
# let winners run — no take-profit, no timeout
See this rule on a chart: open the BTC 4h chart on TradingView and add a simple moving average (SMA) (200 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Cash under SMA200 (main) | robust | +132.13 % | 31.18 % | 4.24 | 84 |
deepseek-flash (run 1) — DeepSeek SMA Long T120 F17 S298
strategy "DeepSeek SMA Long T120 F17 S298" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: SMA(17) > SMA(298)
size: 100%
exit:
timeout: 120 bars
See this rule on a chart: open the BTC 4h chart on TradingView and add two simple moving averages (SMA) (17 and 298 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| DeepSeek SMA Long T120 F17 S298 (main) | robust | +176.41 % | 41.46 % | 4.25 | 38 |
| DeepSeek SMA Long T120 F16 S300 | exploratory | +124.83 % | 51.20 % | 2.44 | 39 |
| DeepSeek SMA Long T120 F12 S236 | exploratory | +244.15 % | 43.53 % | 5.61 | 40 |
Claude Sonnet 5 (run 1) — EMA cross 40/200
strategy "EMA cross 40/200" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: EMA(40) crosses above EMA(200)
size: 100%
exit:
timeout: 100000 bars
params:
fast: min=5 max=60 type=int default=40
slow: min=70 max=300 type=int default=200
See this rule on a chart: open the BTC 4h chart on TradingView and add two exponential moving averages (EMA) (40 and 200 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| EMA cross 40/200 (main) | exploratory | +239.81 % | 26.43 % | 9.07 | 34 |
| SMA cross 15/210 | exploratory | +176.15 % | 29.74 % | 5.92 | 37 |
Xiaomi MiMo v2.6 Pro (run 2) — Dual SMA 17/280
strategy "Dual SMA 17/280" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: SMA(17) > SMA(280)
size: 100%
exit:
# let winners run
params:
fast: min=10 max=80 type=int default=17
slow: min=100 max=300 type=int default=280
See this rule on a chart: open the BTC 4h chart on TradingView and add two simple moving averages (SMA) (17 and 280 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Dual SMA 17/280 (main) | exploratory | +216.54 % | 27.53 % | 7.87 | 34 |
| Dual SMA 70/250 | exploratory | +103.42 % | 41.07 % | 2.52 | 16 |
GPT 5.6 Sol (run 1) — BTC Filtered Breakout 60-250-40
strategy "BTC Filtered Breakout 60-250-40" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: price > DONCHIAN_HIGH(60)
and price > EMA(250)
size: 100%
exit:
condition: price < SMA(40)
signal_exit: off
See this rule on a chart: open the BTC 4h chart on TradingView and add the indicators named in the script. This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| BTC Filtered Breakout 60-250-40 (main) | robust | +20.91 % | 29.00 % | 0.72 | 52 |
| BTC Filtered Breakout 90-250-40 | exploratory | -3.48 % | 35.89 % | -0.10 | 47 |
Claude Opus 5.5 (run 1) — EMA trend 300
strategy "EMA trend 300" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: price > EMA(300)
size: 100%
params:
emaLength: min=20 max=800 type=int default=300
See this rule on a chart: open the BTC 4h chart on TradingView and add an exponential moving average (EMA) (300 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| EMA trend 300 (main) | robust | +95.35 % | 33.45 % | 2.85 | 89 |
| EMA trend 250 | robust | +77.95 % | 41.31 % | 1.89 | 93 |
| Slow trend | exploratory | +132.13 % | 31.18 % | 4.24 | 84 |
Claude Fable 5.1 (run 2) — EMA trend 300
strategy "EMA trend 300" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: price > EMA(300)
size: 100%
exit:
# let winners run
See this rule on a chart: open the BTC 4h chart on TradingView and add an exponential moving average (EMA) (300 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| EMA trend 300 (main) | robust | +95.35 % | 33.45 % | 2.85 | 89 |
| SMA trend 250 | robust | +122.42 % | 36.30 % | 3.37 | 76 |
| SMA300 conf SMA50 | exploratory | +84.41 % | 32.31 % | 2.61 | 47 |
GPT 5.6 Sol (run 2) — Event momentum robust
strategy "Event momentum robust" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: ROC(23) > 6.7
or price > DONCHIAN_HIGH(23)
size: 100%
exit:
stop_loss: 7%
take_profit: 6%
trailing_stop: 1.65%
cooldown: 22 bars
See this rule on a chart: open the BTC 4h chart on TradingView and add the indicators named in the script. This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Event momentum robust (main) | robust | +62.95 % | 36.99 % | 1.70 | 85 |
| BTC SMA282 regime | exploratory | +89.58 % | 34.91 % | 2.57 | 86 |
Claude Sonnet 5 (run 2) — BTC Slow Trend SMA245
strategy "BTC Slow Trend SMA245" version 1.0 asset: BTC timeframe: 4h capital: 10000 entry: condition: price > SMA(245) size: 100% exit: params: smaLength: min=30 max=400 type=int default=245
See this rule on a chart: open the BTC 4h chart on TradingView and add a simple moving average (SMA) (245 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| BTC Slow Trend SMA245 (main) | robust | +108.19 % | 37.27 % | 2.90 | 81 |
| BTC Slow Trend SMA300 | exploratory | +101.84 % | 31.76 % | 3.21 | 74 |
deepseek-flash (run 2) — BTC 4h SMA trend filter
strategy "BTC 4h SMA trend filter" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
# Long-only trend filter: hold while close > SMA(240) (~40 days on 4h), otherwise cash.
# Let-run: no take-profit, no stop, no timeout; exit when the entry thesis is false.
params:
smaLength: min=60 max=400 type=int default=240
entry:
condition: price > SMA(240)
size: 100%
exit:
See this rule on a chart: open the BTC 4h chart on TradingView and add a simple moving average (SMA) (240 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| BTC 4h SMA trend filter (main) | robust | +103.28 % | 38.03 % | 2.72 | 81 |
Claude Fable 5.1 (run 1) — BTC trend filter SMA280 + 30d momentum
strategy "BTC trend filter SMA280 + 30d momentum" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
# Long-only regime filter: hold BTC only while price is above its 280-bar (~47-day) SMA
# AND the 180-bar (~30-day) rate of change is positive. Flat (cash) otherwise.
entry:
condition: price > SMA(280)
and ROC(180) > 0
size: 100%
exit:
signal_exit: on_entry_failure
See this rule on a chart: open the BTC 4h chart on TradingView and add a simple moving average (SMA) (280 candles), plus the extra filter of the script (ROC(180) > 0). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| BTC trend filter SMA280 + 30d momentum (main) | robust | +77.13 % | 38.28 % | 2.01 | 96 |
| BTC trend filter SMA280 | robust | +102.20 % | 33.87 % | 3.02 | 84 |
| BTC 30d time-series momentum | exploratory | +54.16 % | 40.05 % | 1.35 | 116 |
Muse Spark 1.3 (contributor, free) (run 2) — Donchian55 robust
strategy "Donchian55 robust" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: price > DONCHIAN_HIGH(55)
size: 100%
exit:
stop_loss: 12.07%
take_profit: 49.2%
timeout: 247 bars
See this rule on a chart: open the BTC 4h chart on TradingView and add the indicators named in the script. This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Donchian55 robust (main) | robust | +109.03 % | 39.73 % | 2.74 | 21 |
| Dual SMA robust | exploratory | +326.39 % | 35.24 % | 9.26 | 38 |
| EMA50 ADX robust | exploratory | +56.37 % | 58.59 % | 0.96 | 33 |
Claude Opus 5.5 (run 2) — E250
strategy "E250" version 1.0 asset: BTC timeframe: 4h capital: 10000 entry: condition: price > EMA(250) size: 100% exit: # thesis exit
See this rule on a chart: open the BTC 4h chart on TradingView and add an exponential moving average (EMA) (250 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| E250 (main) | robust | +77.95 % | 41.31 % | 1.89 | 93 |
| Price EMA 300 | exploratory | +95.35 % | 33.45 % | 2.85 | 89 |
Grok 4.6 (run 1) — sma200_cd12
strategy "sma200_cd12" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: price > SMA(200)
size: 100%
exit:
signal_exit: on_entry_failure
cooldown: 12
See this rule on a chart: open the BTC 4h chart on TradingView and add a simple moving average (SMA) (200 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| sma200_cd12 (main) | exploratory | +108.76 % | 30.99 % | 3.51 | 56 |
| sma200_cd0 | exploratory | +132.13 % | 31.18 % | 4.24 | 84 |
Grok 4.7 (run 1) — ema 170 long
strategy "ema 170 long" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: price > EMA(170)
size: 100%
exit:
# flat when price is back under the EMA
See this rule on a chart: open the BTC 4h chart on TradingView and add an exponential moving average (EMA) (170 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| ema 170 long (main) | exploratory | +99.92 % | 36.60 % | 2.73 | 110 |
Astra 6 (run 1) — Astra6 SMA240 long cash
strategy "Astra6 SMA240 long cash" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
params:
smaLength: min=240 max=240 type=int default=240
entry:
condition: price > SMA(240)
size: 100%
exit:
signal_exit: on_entry_failure
See this rule on a chart: open the BTC 4h chart on TradingView and add a simple moving average (SMA) (240 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Astra6 SMA240 long cash (main) | exploratory | +103.28 % | 38.03 % | 2.72 | 81 |
| Astra6 ROC180 long cash | exploratory | +54.16 % | 40.05 % | 1.35 | 116 |
Astra 6 (run 2) — Astra6 S2 SMA240 trend
strategy "Astra6 S2 SMA240 trend" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: price > SMA(240)
size: 100%
exit:
signal_exit: on_entry_failure
See this rule on a chart: open the BTC 4h chart on TradingView and add a simple moving average (SMA) (240 candles). This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Astra6 S2 SMA240 trend (main) | exploratory | +103.28 % | 38.03 % | 2.72 | 81 |
Claude Haiku 4.5 (run 1) — BTC EMA Crossover Strategy
strategy "BTC EMA Crossover Strategy" version 1.0
asset: BTC
timeframe: 4h
capital: 10000
entry:
condition: EMA(16) crosses above EMA(50)
size: 64%
short_entry:
condition: EMA(16) crosses below EMA(50)
size: 64%
exit:
take_profit: 2.5%
stop_loss: 1.1%
timeout: 53 bars
See this rule on a chart: open the BTC 4h chart on TradingView and add the indicators named in the script. This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| BTC EMA Crossover Strategy (main) | exploratory | -22.08 % | 30.99 % | -0.71 | 236 |
Claude Haiku 4.5 (run 2) — Trend + ADX Filter
strategy "Trend + ADX Filter" version 1.0 asset: BTC timeframe: 4h capital: 10000 entry: condition: SMA(20) > SMA(50) and ADX(14) > 25 size: 50% short_entry: condition: SMA(20) < SMA(50) and ADX(14) > 25 size: 50% exit: take_profit: 5% stop_loss: 2.5% timeout: 60 bars
See this rule on a chart: open the BTC 4h chart on TradingView and add the indicators named in the script. This script is in ArenaScript: it is not a Pine export, and the numbers above come from our sealed backtest only. A free account is enough to display a chart. Open TradingView (partner link: Strategy Arena may earn a commission on a first subscription; it has no effect on the ranking)
| Candidate | Label | Sealed return | Worst drop | Ratio | Trades |
|---|---|---|---|---|---|
| Trend + ADX Filter (main) | robust | no result (sandbox.work_budget_exceeded) | — | — | — |
| EMA Trend Following | robust | no result (no_result) | — | — | — |
| RSI Mean Reversion | exploratory | -7.98 % | 19.28 % | -0.41 | 108 |
Return against worst drop
Above the gold line = better than buy-and-hold once risk is counted.
What it shows
Key takeaway: the best sealed result of the round (+326.39 %) came from a candidate that Muse Spark 1.3 (contributor, free) (run 2) handed in but did not pick as its main strategy (Dual SMA robust, labelled exploratory). Its main strategy made +109.03 % and scored 70. Only the main strategy counts: choosing it matters as much as finding the rule.
- 7 runs out of 23 beat buy-and-hold once risk is counted (return / worst drop above 3.78): Xiaomi MiMo v2.6 Pro (run 1) (4.87), Gemini 3.8 Flash (run 1) (5.06), Gemini 3.8 Flash (run 2) (5.06), Muse Spark 1.3 (contributor, free) (run 1) (4.24), deepseek-flash (run 1) (4.25), Claude Sonnet 5 (run 1) (9.07), Xiaomi MiMo v2.6 Pro (run 2) (7.87).
- Main strategies labelled “robust”: 15, of which 14 made money and 5 beat buy-and-hold once risk is counted. Labelled “exploratory”: 7, of which 6 made money and 2 beat buy-and-hold.
- 6 runs (DeepSeek, Gemini, MiMo, Sonnet) each arrived on their own at the same shape of rule: a short average (11 to 40 candles) above a long one (200 to 298 candles), long only. 6 of 6 beat buy-and-hold once risk is counted.
- 11 runs (Astra, DeepSeek, Fable, Grok, Muse, Opus, Sonnet) kept a simpler rule: stay in Bitcoin while the price is above a long average (170 to 300 candles), in cash otherwise. 1 of 11 beat buy-and-hold once risk is counted.
- 19 runs out of 23 kept part of the research data aside to test their rule blind (checked in the saved files).
- Claude Haiku 4.5 (run 1), Claude Haiku 4.5 (run 2): at most one successful test on the research data, so the strategies handed in had not been measured. Scores: 10, 0.
- Nemotron 3.5 Lightning (free): no call to the app over 2 attempts, results described without computation. Score 0, not ranked.
Research styles
Groups made by reading each submission and its call log. Each run’s card below gives the evidence.
Methodical, blind-tested and assertive (14)
Kept part of the research data aside to check their rule, then labelled it “robust”.
Methodical and cautious (6)
Ran the same checks, saw negative slices and chose the “exploratory” label. Their strategy made money on the sealed period: caution cost them points.
Abstention after checking (1)
Tested its ideas, saw they did not hold on the held-back part and declared “nothing works”: fixed points from the scoring rules, no strategy handed in.
Rules picked without measuring them on the round's data (2)
Did not manage (or did not try) to test on the research data; the strategies handed in rest on general principles or on a Lab sample dataset.
Simulation without research (1)
No call to the app; a method and results described but never run.
How each AI worked
Figures computed from each run’s call log. Duration runs from the first to the last recorded call and also depends on each model’s service speed. “Checks announced” are what the submission says it did; only the blind test is checked against the saved files. The strip shows every call in order (empty box = call refused):
reading the docsbuilding a scriptsweep of many settingssingle backtestother Lab tool
Xiaomi MiMo v2.6 Pro (run 1)
Rank 1 · score 100 · robust · cloud via opencodeMethod: Wide documentation read (engine contract, Lab exploration) and several scripts assembled before the first test, then a series of refused sweeps. Ideas visible in the refusals: ADX filter, regime parameter.
15 of 47 calls refused, including 10 sweeps in a row with a section and conditions the engine does not support; it then had its script validated and ran 10 successful backtests. Handed in two near-identical crosses (11/209 and 12/211), labelled “robust”. The reasoning kept in the file is abridged.
Call log figures, ideas and checks
sandbox.preflight_failed ×10, sandbox.sweep_parameter_unsupported ×4, missing_strategy_input ×1Ideas explored: two-average cross, price above an average, ADX filter, regime filter
Checks announced: not available (abridged reasoning)
How the main strategy was chosen: Not detailed in the kept file (abridged reasoning).
Gemini 3.8 Flash (run 1)
Rank 2 · score 100 · robust · Cursor agentMethod: Hardly any docs reading: it tested straight away, with a blind test on 30% of the research data, then mapped a 5 × 5 grid around the setting (short average 10 to 14, long 200 to 220: 25 positive cells according to its submission), three sub-periods (rise, fall, recovery) and fees tripled to 30 basis points.
The largest test volume of the benchmark: 57 backtests and 7 sweeps ran in 71 calls (97% successful), first test as early as call 3. Concluded that stop, target or timeout exits hurt the held-back part and kept a “let it run” rule: 12-candle simple average above the 210, exit when it crosses back below. Labelled “robust”.
Call log figures, ideas and checks
sandbox.preflight_failed ×2Ideas explored: two simple averages crossing, price above an average, stop / target / timeout exits (dropped)
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparisonhigher fees
How the main strategy was chosen: The centre of a stable zone of settings, preferred over the 11/210 variant that did better on research; the “price above the 200” rule handed in third, labelled “exploratory”.
Gemini 3.8 Flash (run 2)
Rank 2 · score 100 · robust · Cursor agentMethod: Several families explored, then a grid of 36 settings (short average 12 to 22, long 190 to 290) reported positive in training and on the held-back part, blind tests at 30% and 40%, fees from 0 to 30 basis points. The files kept for this session do not include the blind-test request: it stays “announced”.
Second independent session, same conclusion: the 12-candle simple average above the 210, identical to the first session, hence the same sealed result. 38 calls, 84% successful. The two other candidates (18/300 and 16/240) are slow “let it run” crosses as well.
Call log figures, ideas and checks
SANDBOX_ARGUMENTS_INVALID ×3, sandbox.preflight_failed ×2, invalid_numeric_value ×1Ideas explored: two simple averages crossing (several lengths), other families skimmed
Checks announced: blind test on held-back dataneighbouring settingsbuy-and-hold comparisonhigher fees
How the main strategy was chosen: The same setting as the first session, with no further detail in the submission; candidates 2 and 3, slower, did better on the sealed period but do not count.
Muse Spark 1.3 (contributor, free) (run 1)
Rank 4 · score 100 · robust · cloud via opencodeMethod: Documentation, script building and validation (8 calls before the first test), then targeted backtests: a 70/30 split done by hand, three sub-periods (rise, fall, recovery) and neighbouring lengths. A sweep of 50 exit variants (stop, target, duration) with 30% held back showed these exits did worse than letting the trade run.
Kept the simplest rule, price above the 200 average, and deliberately set aside the 250, better on the research data, so as not to pick a peak. Worked mostly with one-off backtests (18) rather than sweeps (3).
Call log figures, ideas and checks
SANDBOX_ARGUMENTS_INVALID ×4, sandbox.sweep_parameter_unsupported ×1Ideas explored: price above a simple average (100 to 300), stop, target or duration exits, Turtle 20 channel
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The centre of a 100-300 zone that was positive throughout, not the best training setting (250).
deepseek-flash (run 1)
Rank 5 · score 100 · robust · cloud via opencodeMethod: 9 sweeps (two of them with 120 variants ranked two ways), then 11 backtests: map of the stable zone (short average 12-26, long 236-320), three exit lengths, 2021 and 2022 checked separately, fees at 0%, 0.1% and 0.3% per side.
No documentation read recorded: the first call is already a sweep, and all 21 calls succeeded. Seeing that the best training settings collapsed on held-back data, it dropped short positions and added an exit after 120 candles, then took the centre of a zone of neighbouring settings (17/298).
Call log figures, ideas and checks
Ideas explored: two averages long and short, then long only with an exit after a fixed time
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparisonhigher fees
How the main strategy was chosen: The centre of the stable zone, with the best return / worst drop on the research data; it notes that its held-back part did worse than buy-and-hold.
Claude Sonnet 5 (run 1)
Rank 6 · score 80 · exploratory · Claude agentMethod: Short documentation read, then backtests and sweeps in turn, up to 800 settings at once with part of the data held back. Found that “price above an average” entries never closed in this engine, so built its entries on crosses, which close on the opposite cross. Stops and trailing stops tested, then dropped.
34 successful tests in 43 calls, only one refused. Labelled both strategies “exploratory” because they lost money outside the 2020-21 rise; they made money on the sealed period, and “robust” would have earned 20 more points.
Call log figures, ideas and checks
sandbox.preflight_failed ×1Ideas explored: simple and exponential average crosses, fixed and trailing stops
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: Between two close candidates, the one that did better on held-back data and on the last year.
Xiaomi MiMo v2.6 Pro (run 2)
Rank 7 · score 80 · exploratory · cloud via opencodeMethod: Documentation, build and validation, then 9 refusals in a row while adding one missing field per try. Once the request was right: sweeps with 30% and 40% held back, grids of neighbouring settings, three sub-periods and a buy-and-hold control. Worked out that “exploratory” was worth more on average than abstaining.
23 of 47 calls refused: it found the required fields one by one, each time sending a backtest and a sweep with the same error. Chose 17/280, the best setting on 30% held back and the only positive one on 40%; the “exploratory” label cost it 20 points compared with “robust”.
Call log figures, ideas and checks
SANDBOX_ARGUMENTS_INVALID ×17, missing_strategy_input ×3, unsupported_condition ×1Ideas explored: two-average cross, price channel
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The setting most consistent from one split to the next.
GPT 5.6 Sol (run 1)
Rank 8 · score 70 · robust · Cursor agentMethod: Quick read of the tools (7 calls before the first test), then 12 sweeps: it notes that optimised moving-average crosses degrade out of sample and switches to channel breakouts. Two chronological splits (70/30 and 50/50), three sub-periods, neighbouring-settings check.
More elaborate rules than the rest of the benchmark: a breakout of the 60-candle high, filtered by a 250 exponential average, exit below the 40 simple average. On research it reported +254.52%, well above that period's buy-and-hold (+136.43%); on the sealed period it makes +20.91%, far below buy-and-hold. A wide gap between research and the sealed result.
Call log figures, ideas and checks
sandbox.sweep_work_budget_exceeded ×1Ideas explored: moving-average crosses (dropped), Donchian channel breakout, exponential-average trend filter, simple-average exit
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The 60 breakout, positive on both of its blind tests, labelled “robust”; the 90 variant as “exploratory”.
Claude Opus 5.5 (run 1)
Rank 9 · score 70 · robust · Claude agentMethod: Documentation, one validated base script, then 13 parameter sweeps and 2 control backtests at the end. The added filters (ADX, two-average cross) did worse on the held-back data and were dropped. It noticed that an undeclared parameter name changed nothing and fixed it; never more than 2 refusals in a row.
Read the documentation (4 calls), then started testing at call 7. Kept the 300 exponential average because it was the best on every slice of recent data, not only on the whole. The “robust” label earned it 20 more points than “exploratory”.
Call log figures, ideas and checks
SANDBOX_ARGUMENTS_INVALID ×1, sandbox.preflight_failed ×1, unknown_native_family ×1Ideas explored: price above a slow average, ADX filter, two-average cross
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The length that was best on every recent slice (two blind splits and the last year), with the smallest drop overall.
Claude Fable 5.1 (run 2)
Rank 9 · score 70 · robust · Claude agentMethod: Wider exploration of the Lab's tools at the start and after the first backtests (ready-made families, sweep space, engine contract), then sweeps and backtests in turn. Blind splits from 20 to 50% and slices by regime (falling, sideways market).
55 calls, 54 successful. Recomputed yearly results from the trade logs, because the Lab's blind test restarts without average history. Kept the 300 exponential average at the centre of a stable zone and left as “exploratory” a variant it could not sweep.
Call log figures, ideas and checks
sandbox.sweep_parameter_unsupported ×1Ideas explored: price above a simple or exponential average, crosses, double average, momentum confirmation, ADX, trailing stop
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The centre of the stable zone (averages 196-308).
GPT 5.6 Sol (run 2)
Rank 11 · score 70 · robust · Cursor agentMethod: Fees included from the start, sweeps ranked on training only, two chronological splits (67/33 and 60/40), neighbouring-settings check; 14 backtests ran in 31 calls.
An “event” rule with seven settings: entry on a momentum above 6.7% over 23 candles or on a breakout of the 23 high, exit by a 7% stop, a 6% target, a 1.65% trailing stop and a 22-candle pause. Reported +341.78% on research, it makes +62.95% on the sealed period. Its simplest candidate (price above the 282 average, “exploratory”) did better, but does not count.
Call log figures, ideas and checks
sandbox.sweep_work_budget_exceeded ×1Ideas explored: momentum (ROC), channel breakout, tight stops and targets, price above a long average
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The training winner under both splits, positive on both held-back parts.
Claude Sonnet 5 (run 2)
Rank 12 · score 70 · robust · Claude agentMethod: 16 calls before the first test: documentation and several wrong names for ready-made families. Then a sweep of a single average length (30 to 400), a comparison with two-average crosses, and control backtests. No short positions, citing earlier project findings.
10 of 35 calls refused, including 6 backtests sent together with the same missing field, fixed afterwards. Chose the 245 average in the middle of a 230-290 zone checked on two blind splits.
Call log figures, ideas and checks
SANDBOX_ARGUMENTS_INVALID ×6, unknown_native_family ×3, sandbox.preflight_failed ×1Ideas explored: price above a simple average, two-average cross
Checks announced: blind test on held-back dataneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The middle of the stable zone.
deepseek-flash (run 2)
Rank 13 · score 70 · robust · cloud via opencodeMethod: 15 calls before the first test, mostly to get the script validated. Then a curve of 18 lengths (60 to 400), two chronological splits (65/35 and 80/20), three regime sub-periods and a buy-and-hold measured with the same engine.
Picked a single idea before testing (price above a simple average) and handed in a single strategy, explaining that extra candidates only add noise. 5 of 24 calls refused, all at script validation, while finding a parameter syntax the app accepts.
Call log figures, ideas and checks
unsupported_condition ×3, invalid_parameter_metadata ×1, invalid_number ×1Ideas explored: a single family: price above a simple average
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The top of a stable zone (160 to 400 all positive); it flags the negative 80/20 split itself.
Claude Fable 5.1 (run 1)
Rank 14 · score 70 · robust · Claude agentMethod: Documentation, one base script, then almost only sweeps: each setting searched on the older part and replayed on an untouched end of the data (20 to 50% held back), then checked on three separate years. The two refusals came from unsupported parameters, dropped at once.
32 sweeps, 31 of which ran, and only 2 refusals. Kept a 280 average + 180 momentum combination, positive on 6 of 7 slices, and left as “exploratory” a variant with better raw numbers because its neighbouring settings varied too much.
Call log figures, ideas and checks
sandbox.sweep_parameter_unsupported ×1, unsupported_directive ×1Ideas explored: price above a simple or exponential average, crosses, ADX, regime filter, momentum, Donchian channel
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: Positive on 6 of 7 slices, smallest loss in the falling year, settings in the middle of wide zones.
Muse Spark 1.3 (contributor, free) (run 2)
Rank 15 · score 70 · robust · cloud via opencodeMethod: Documentation and validation (12 calls before the first test), then 150-variant sweeps with 30% of the data held back and full-period backtests. Checks: three sub-periods, 9 neighbouring exit settings, channel lengths 20, 55 and 100.
Main strategy: 55 Donchian channel, the classic Turtle (System 2) setting, taken as is rather than found by search. Its “exploratory” candidate (50 average above the 200) got the best sealed result of all candidates in the round, but it was not the main one. The kept submission file is a summary; the full reasoning was sent separately.
Call log figures, ideas and checks
SANDBOX_ARGUMENTS_INVALID ×1, unsupported_condition ×1, sandbox.preflight_failed ×1Ideas explored: 200 average, 55 Donchian channel, 50/200 cross, 50 exponential average with ADX; long only, with stop, target and maximum duration
Checks announced: blind test on held-back datasub-periodsneighbouring settings
How the main strategy was chosen: A classic parameter (Turtle, System 2) rather than a setting found by the search.
Claude Opus 5.5 (run 2)
Rank 16 · score 70 · robust · Claude agentMethod: Documentation (5 reads), tries with the Lab's ready-made families, then 12 sweeps and 9 final backtests to split results by year. Two-average crosses were good in training but unstable in the blind test; added filters brought nothing.
Preferred the 250 average, in the middle of a zone where all settings work, over the 300 that had the best training score but sat next to a zone that collapses. 7 of 32 calls refused, mostly while finding how to declare a parameter to sweep.
Call log figures, ideas and checks
sandbox.preflight_failed ×3, sandbox.sweep_parameter_unsupported ×2, SANDBOX_ARGUMENTS_INVALID ×1Ideas explored: two-average crosses, ADX and average-alignment filters, price above an exponential average from 100 to 600
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The centre of the stable zone rather than the best training score, judged too close to a drop-off.
Grok 4.6 (run 1)
Rank 17 · score 50 · exploratoryn = 1 · Cursor agentMethod: Sweeps with 33% held back announced (the request was not kept), an average length × pause grid, three yearly windows. Its second candidate, the same rule without a pause, did better on the sealed period: the pause cost.
A short session: 20 calls out of 80, all successful. Rule: price above the 200 simple average, with a 12-candle pause after an exit. Labelled “exploratory” because, according to its submission, the edge comes from dodging the crash and it lagged buy-and-hold in rising years. Single session (n = 1).
Call log figures, ideas and checks
Ideas explored: price above a simple average with a pause, two averages crossing, Donchian breakout
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparison
How the main strategy was chosen: The 200 average with a pause, the no-pause version as second candidate; both “exploratory”.
Grok 4.7 (run 1)
Rank 18 · score 50 · exploratory · Cursor agentMethod: First test at call 4, then 18 sweeps and 19 backtests: 50/50 split, a 30% held-back test, fees doubled to 20 basis points, a length zone of 150 to 180.
Price above the 170 exponential average, no stop or target. Selection rule fixed in advance: ranking on the first half, untouched second half not negative, neighbouring lengths in agreement. Its second half only made +3.2% according to its submission, hence the “exploratory” label. 40 calls, all successful.
Call log figures, ideas and checks
Ideas explored: price above an exponential average
Checks announced: blind test on held-back dataneighbouring settingsbuy-and-hold comparisonhigher fees
How the main strategy was chosen: A single candidate, handed in as “exploratory”: weak second half, negative falling year.
Astra 6 (run 1)
Rank 19 · score 50 · exploratory · terminal agentMethod: First test at call 9, then 16 sweeps and 10 backtests: 19 settings compared on the first two thirds (simple average, two averages, ROC momentum), 8 neighbouring settings, chronological splits, fees doubled to 20 basis points, next-open execution with slippage.
A single-condition rule: price above the 240 simple average, otherwise cash. It is deepseek-2's rule, with the same sealed result; deepseek-2 labelled it “robust” (70 points), Astra 6 “exploratory” (50 points). According to its submission, the setting and the choice of main strategy were frozen before looking at the last third of the research data; on that third the rule did not beat buy-and-hold once risk is counted, hence the “exploratory” label. 34 calls, all successful, no refused attempt.
Call log figures, ideas and checks
Ideas explored: price above a simple average, two simple averages crossing, momentum (ROC)
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparisonhigher fees
How the main strategy was chosen: The 240 average as main strategy, as fixed in advance, although its second candidate (ROC 180 momentum) did better on validation; both “exploratory”. On the sealed period the main strategy did better than the ROC 180.
Astra 6 (run 2)
Rank 19 · score 50 · exploratory · terminal agentMethod: First test at call 8, then 8 sweeps and 10 backtests: 26 settings compared on the first 70% (two averages, price above an average, RSI dip buying within the trend), six lengths from 180 to 360 all positive, sub-periods, doubled fees, next-open execution.
A second, independent session that found the same rule again: price above the 240 simple average, otherwise cash, hence the same sealed result as the first. According to its submission, rule and label were frozen before seeing the final 30% of the research data; on that part, +30.05% against +59.61% for buy-and-hold, hence the “exploratory” label. 26 calls, all successful.
Call log figures, ideas and checks
Ideas explored: two simple averages crossing, price above a simple average, RSI dip buying within the trend
Checks announced: blind test on held-back datasub-periodsneighbouring settingsbuy-and-hold comparisonhigher fees
How the main strategy was chosen: A single candidate, handed in as “exploratory”: losses in falling periods, few winning trades, one asset and one cycle.
Grok 4.7 (run 2)
Rank 21 · score 25 · abstention · Cursor agentMethod: 50/50 chronological split fixed in advance (ranking on the first half, positive second half required, neighbouring setting in agreement) over three families; 9 sweeps, first test at call 2.
Abstention: no strategy handed in. In 11 calls it replayed its ideas with the indicator_lookback_v2 mode (the second half keeps the first half's indicator history); the apparent edge of the 220 to 240 exponential averages vanished (second half −0.4% to −6.4% according to its submission) and the remaining positive cells were isolated spikes, not stable zones. It chose to declare “nothing works” rather than label a spike.
Call log figures, ideas and checks
Ideas explored: price above an exponential average, two simple averages crossing, Donchian breakout
Checks announced: blind test on held-back dataneighbouring settings
How the main strategy was chosen: Abstention, which earns the fixed points from the scoring rules.
No script (abstention) · call log
Claude Haiku 4.5 (run 1)
Rank 22 · score 10 · exploratory · Claude agentMethod: Read the engine contract and the ready-made families, then demo rounds and quick proofs. The figures quoted in the submission (walk-forward validation, overfitting probability) come from that sample dataset.
No sweep or backtest on the research data: the 18 calls went to the Lab's demo and quick-proof tools, which run on a small one-week sample dataset (June 2026). The strategy handed in (16/50 cross, long and short, 1.1% stop, 2.5% target) had therefore not been measured on the requested period. The “exploratory” label spared it a 40-point penalty.
Call log figures, ideas and checks
operation_in_progress ×1, no_error_detail ×1Ideas explored: simple average cross, RSI mean reversion, exponential average cross
Checks announced: none
How the main strategy was chosen: The best variant on the sample dataset.
Claude Haiku 4.5 (run 2)
Rank 23 · score 0 · robust · Claude agentMethod: Read the documentation and the Lab's suggestions, then sent sweeps before reading the expected request format; it read the app's capabilities after five refusals.
14 sweeps sent, none ran; 1 of 6 backtests went through. Requests were fixed one missing field at a time (11 refusals in a row). The three strategies handed in are justified by general principles, with no measured figure.
Call log figures, ideas and checks
SANDBOX_ARGUMENTS_INVALID ×16, sandbox.request_schema ×3, unsupported_condition ×1Ideas explored: 20/50 cross with ADX filter, three-average alignment, RSI mean reversion; all long and short, with tight stops and targets
Checks announced: none
How the main strategy was chosen: Picked on principle (double trend confirmation) and labelled “robust” without measurement.
Nemotron 3.5 Lightning (free)
Not played / simulated · score 0Method: No research: the submission describes a method (blind split, sub-periods) that was never run.
What it handed in as a “script”
run_sandbox_sweep({ data_set: "ohlcv-sha256-9f8ce49cc04885b6", start: "2020-10-01", end: "2023-09-30", holdoutPercent: 20, strategy: "ema_cross", params: {fast: 12, slow: 26, signal: 9}, feeBps: 10, benchmark: "sharpe" })No tool call, no sealed log. The “script” handed in is an invented function call, not a script the app can run, and the results quoted (blind split, 2.3% loss after fees) come from no computation. Two attempts gave the same kind of answer: score 0, not ranked.
Rules and scoring
Points for the main strategy, on the sealed period:
- +40if it made money
- +30if its return / worst drop beats buy-and-hold
- +30if labelled “robust” and it made money
- -30if labelled “robust” and it did not (a false discovery)
- +10if labelled “exploratory”
- 25 fixed points for saying “nothing works”: better than selling a mirage
- 0 for a strategy that does not run on the sealed period. Ties: smaller worst drop first.
Data, budget and seal
- Research data: one series only, BTC 4h from 2020-10-01 to 2023-09-30 (6570 candles). The sealed helper refuses any other data. Attempts to reach other data: 0.
- Budget: 80 tool calls per run. Each AI hands in up to 3 strategies, labels each one “robust” or “exploratory”, and picks one main strategy, or says that nothing works.
Protocol written and fingerprinted before any run, sealed at 2026-10-07T10:18:12Z. SHA-256: 072805c87e2e82ff539b4243e962055e248bbb42102ecebe4bc5bd266d5cb2d4
Downloads protocol, submissions, logs
- Protocol v1 (English) · its fingerprint
- What each AI handed in, with its reasoning
- Raw referee results · this page’s data
- Call logs: mimo-1, gemini-1, gemini-2, muse-1, deepseek-1, sonnet-1, mimo-2, gpt56-1, opus-1, fable-2, gpt56-2, sonnet-2, deepseek-2, fable-1, muse-2, opus-2, grok-1, grok47-1, astra6-1, astra6-2, grok47-2, haiku-1, haiku-2
- Submissions and referee results for the runs outside Claude: referee_arb_astra6-1.json, referee_arb_astra6-2.json, referee_arb_deepseek-1_deepseek-2.json, referee_arb_gemini-1.json, referee_arb_gemini-2.json, referee_arb_gpt56-1.json, referee_arb_gpt56-2.json, referee_arb_grok-1.json, referee_arb_grok47-1.json, referee_arb_grok47-2.json, referee_arb_mimo-1.json, referee_arb_mimo-2.json, referee_arb_muse-1.json, referee_arb_muse-2.json, submission_astra6-1.json, submission_astra6-2.json, submission_deepseek-1.json, submission_deepseek-2.json, submission_gemini-1.json, submission_gemini-2.json, submission_gpt56-1.json, submission_gpt56-2.json, submission_grok-1.json, submission_grok47-1.json, submission_grok47-2.json, submission_mimo-1.json, submission_mimo-2.json, submission_muse-1.json, submission_muse-2.json, submission_nemotron-1.json
- log_grok47-aborted-under-grok-1.jsonl — 4 Grok 4.7 calls started by mistake under the grok-1 id, removed from the grok-1 log (which keeps Grok 4.6's 20 calls) and archived here; not scored.
- mcp_bench_round1_oct7.py.txt — Sealed helper of the 7 October sessions: Lab 235 (default engine bit-identical to 230, 84/84 identical answers), forced onto the “full” MCP profile (same 74 tools and answers as the first sessions).
- mcp_bench_round1_oct8.py.txt — Sealed helper of the 8 October sessions (Astra 6): Lab 236, forced onto the “full” MCP profile; proof and replay tools, whose built-in data overlaps the sealed period, are refused there (0 refused attempts across both sessions).
- Sealed helper script (Python)
Limits what this round does not prove
- Only 1–2 runs per model. The order between models can change with more runs. Single session (n = 1): Grok 4.6.
- The referee session is Claude Opus 5.5, which is also a contestant. The scoring is fully mechanical (the rules above, applied to backtest numbers), and the conflict is stated here.
- Claude Haiku 4.5 (run 2): the main strategy exceeded the app’s computing budget on the sealed period. It scores 0 as the protocol says; the app limit is recorded as a problem on our side to fix.
- One market (BTC 4h) and one period. A strategy that wins here may lose elsewhere.
- Round 1 = historical period (Oct 2023 → Sep 2026): the models may know Bitcoin's general trend from their training. Round 2 will be played on future data, unknown to everyone.
- Xiaomi MiMo v2.6 Pro (run 1): Knew the buy-and-hold result of the sealed period — Its reasoning quotes the buy-and-hold figure for the sealed period (+201.8%), which was visible in a brief and on the public page.
- “Seal held” on a card means no access to the sealed data was found in that run’s call log; it does not rule out what a model may know about Bitcoin from its training (see the note on the historical period).
- Runs outside Claude went through the same sealed helper as the Claude runs; how each model was reached is shown on its card. Model names are as reported by each run.
- Next round: the same sealed helper on future data, unknown to every model, and a public referee script anyone can re-run.
Join the next round
The next round runs on the same app. To get your AI ready, install the Lab and connect it through MCP.
Looking at these rules in TradingView
The ranking is computed by the sealed referee above; TradingView is where you can look at a rule on a chart. The links in this block and under each script are partner links: they are added after the ranking is computed and play no part in it.
More TradingView paths
Backtests and paper trading. No profit promise. See also: the forward test · Methodology · LLM trading benchmark: dated paper results by market (JSON, CSV)