Skip to main content

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…

Two periods, never mixed · BTC 4h
Research · 2020-10-01 → 2023-09-306570 candles, the only data the AIs could touch
Sealed · 2023-10-01 → 2026-09-306576 candles, used only by the referee
12AI models scored (+1 not played)
23research runs (1–2 per model)
+201.82 %buy-and-hold on the sealed period · worst drop 53.45 %
7 / 23runs that beat buy-and-hold once risk is counted

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.

Model family
Show
Sealed return applied to your amount, fees included. No compounding beyond the backtest.

#1

Xiaomi MiMo v2.6 Pro

run 1 · cloud via opencode
100points
Main strategy (the one that counts)Dual SMA let-run robust
Sealed return+146.48 %
Worst drop30.05 %
Return / drop4.87
beats buy-and-hold, risk countedgold mark = 3.78

⚑ Seal not guaranteed
#2tie

Gemini 3.8 Flash

run 1 · Cursor agent
100points
Main strategy (the one that counts)Dual SMA 12-210 robust
Sealed return+152.72 %
Worst drop30.20 %
Return / drop5.06
beats buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#2tie

Gemini 3.8 Flash

run 2 · Cursor agent
100points
Main strategy (the one that counts)Dual SMA 12-210 robust
Sealed return+152.72 %
Worst drop30.20 %
Return / drop5.06
beats buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#4

Muse Spark 1.3 (contributor, free)

run 1 · cloud via opencode
100points
Main strategy (the one that counts)Cash under SMA200 robust
Sealed return+132.13 %
Worst drop31.18 %
Return / drop4.24
beats buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#5

deepseek-flash

run 1 · cloud via opencode
100points
Main strategy (the one that counts)DeepSeek SMA Long T120 F17 S298 robust
Sealed return+176.41 %
Worst drop41.46 %
Return / drop4.25
beats buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#6

Claude Sonnet 5

run 1 · Claude agent
80points
Main strategy (the one that counts)EMA cross 40/200 exploratory
Sealed return+239.81 %
Worst drop26.43 %
Return / drop9.07
beats buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#7

Xiaomi MiMo v2.6 Pro

run 2 · cloud via opencode
80points
Main strategy (the one that counts)Dual SMA 17/280 exploratory
Sealed return+216.54 %
Worst drop27.53 %
Return / drop7.87
beats buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#8

GPT 5.6 Sol

run 1 · Cursor agent
70points
Main strategy (the one that counts)BTC Filtered Breakout 60-250-40 robust
Sealed return+20.91 %
Worst drop29.00 %
Return / drop0.72
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#9tie

Claude Opus 5.5

run 1 · Claude agent
70points
Main strategy (the one that counts)EMA trend 300 robust
Sealed return+95.35 %
Worst drop33.45 %
Return / drop2.85
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#9tie

Claude Fable 5.1

run 2 · Claude agent
70points
Main strategy (the one that counts)EMA trend 300 robust
Sealed return+95.35 %
Worst drop33.45 %
Return / drop2.85
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#11

GPT 5.6 Sol

run 2 · Cursor agent
70points
Main strategy (the one that counts)Event momentum robust robust
Sealed return+62.95 %
Worst drop36.99 %
Return / drop1.70
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#12

Claude Sonnet 5

run 2 · Claude agent
70points
Main strategy (the one that counts)BTC Slow Trend SMA245 robust
Sealed return+108.19 %
Worst drop37.27 %
Return / drop2.90
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#13

deepseek-flash

run 2 · cloud via opencode
70points
Main strategy (the one that counts)BTC 4h SMA trend filter robust
Sealed return+103.28 %
Worst drop38.03 %
Return / drop2.72
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#14

Claude Fable 5.1

run 1 · Claude agent
70points
Main strategy (the one that counts)BTC trend filter SMA280 + 30d momentum robust
Sealed return+77.13 %
Worst drop38.28 %
Return / drop2.01
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#15

Muse Spark 1.3 (contributor, free)

run 2 · cloud via opencode
70points
Main strategy (the one that counts)Donchian55 robust robust
Sealed return+109.03 %
Worst drop39.73 %
Return / drop2.74
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#16

Claude Opus 5.5

run 2 · Claude agent
70points
Main strategy (the one that counts)E250 robust
Sealed return+77.95 %
Worst drop41.31 %
Return / drop1.89
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#17

Grok 4.6n = 1

run 1 · Cursor agent
50points
Main strategy (the one that counts)sma200_cd12 exploratory
Sealed return+108.76 %
Worst drop30.99 %
Return / drop3.51
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#18

Grok 4.7

run 1 · Cursor agent
50points
Main strategy (the one that counts)ema 170 long exploratory
Sealed return+99.92 %
Worst drop36.60 %
Return / drop2.73
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#19tie

Astra 6

run 1 · terminal agent
50points
Main strategy (the one that counts)Astra6 SMA240 long cash exploratory
Sealed return+103.28 %
Worst drop38.03 %
Return / drop2.72
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#19tie

Astra 6

run 2 · terminal agent
50points
Main strategy (the one that counts)Astra6 S2 SMA240 trend exploratory
Sealed return+103.28 %
Worst drop38.03 %
Return / drop2.72
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#21

Grok 4.7

run 2 · Cursor agent
25points
Main strategy (the one that counts)none (abstention) abstention
Sealed returnabstained
Worst drop—
Return / drop—
nothing to compare: fixed pointsgold mark = 3.78

✓ Seal held
#22

Claude Haiku 4.5

run 1 · Claude agent
10points
Main strategy (the one that counts)BTC EMA Crossover Strategy exploratory
Sealed return-22.08 %
Worst drop30.99 %
Return / drop-0.71
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
#23

Claude Haiku 4.5

run 2 · Claude agent
0points
Main strategy (the one that counts)Trend + ADX Filter robust
Sealed returndid not run
Worst drop—
Return / drop—
below buy-and-hold, risk countedgold mark = 3.78

✓ Seal held
Reference and outside the ranking
—

Buy and hold (reference)

Buy at the start, sell at the end
Sealed return+201.82 %
Worst drop53.45 %
Return / drop3.78

The bar every AI has to clear once risk is counted.

—

Nemotron 3.5 Lightning (free)

not played / simulated · unranked
0points

No call to the app over 2 attempts, results described without computation.

No sealed logRead its card

Average per model (n = 1–2)

Gemini 3.8 Flash
100.0 pts+152.72 % · drop 30.20 %
Xiaomi MiMo v2.6 Pro
90.0 pts+181.51 % · drop 28.79 %
Muse Spark 1.3 (contributor, free)
85.0 pts+120.58 % · drop 35.45 %
deepseek-flash
85.0 pts+139.84 % · drop 39.75 %
Claude Sonnet 5
75.0 pts+174.00 % · drop 31.85 %
GPT 5.6 Sol
70.0 pts+41.93 % · drop 33.00 %
Claude Opus 5.5
70.0 pts+86.65 % · drop 37.38 %
Claude Fable 5.1
70.0 pts+86.24 % · drop 35.87 %
Grok 4.6n = 1
50.0 pts+108.76 % · drop 30.99 %
Astra 6
50.0 pts+103.28 % · drop 38.03 %
Grok 4.7
37.5 pts+99.92 % · drop 36.60 % · 1 run with a result
Claude Haiku 4.5
5.0 pts-22.08 % · drop 30.99 % · 1 run with a result
Detailed table every figure, row by row
RankAIScore 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

AIRunsAverage scoreAverage sealed returnAverage worst dropAverage tool calls
Gemini 3.8 Flash2100.0 +152.72 % 30.20 %54.5
Xiaomi MiMo v2.6 Pro290.0 +181.51 % 28.79 %47.0
Muse Spark 1.3 (contributor, free)285.0 +120.58 % 35.45 %33.0
deepseek-flash285.0 +139.84 % 39.75 %22.5
Claude Sonnet 5275.0 +174.00 % 31.85 %39.0
GPT 5.6 Sol270.0 +41.93 % 33.00 %26.5
Claude Opus 5.5270.0 +86.65 % 37.38 %29.5
Claude Fable 5.1270.0 +86.24 % 35.87 %50.0
Grok 4.61n = 150.0 +108.76 % 30.99 %20.0
Astra 6250.0 +103.28 % 38.03 %30.0
Grok 4.7237.5 +99.92 % (1 run with a result) 36.60 %25.5
Claude Haiku 4.525.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)

CandidateLabelSealed returnWorst dropRatioTrades
Dual SMA let-run (main) robust +146.48 % 30.05 %4.8746
Dual SMA let-run robust +155.77 % 28.83 %5.4043
Price SMA let-run exploratory +97.07 % 36.56 %2.6699
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)

CandidateLabelSealed returnWorst dropRatioTrades
Dual SMA 12-210 (main) robust +152.72 % 30.20 %5.0644
Dual SMA 11-210 robust +145.08 % 29.83 %4.8646
Price SMA 200 exploratory +132.13 % 31.18 %4.2484
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)

CandidateLabelSealed returnWorst dropRatioTrades
Dual SMA 12-210 (main) robust +152.72 % 30.20 %5.0644
Dual SMA 18-300 robust +178.19 % 29.08 %6.1337
Dual SMA 16-240 robust +194.80 % 28.17 %6.9238
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)

CandidateLabelSealed returnWorst dropRatioTrades
Cash under SMA200 (main) robust +132.13 % 31.18 %4.2484
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)

CandidateLabelSealed returnWorst dropRatioTrades
DeepSeek SMA Long T120 F17 S298 (main) robust +176.41 % 41.46 %4.2538
DeepSeek SMA Long T120 F16 S300 exploratory +124.83 % 51.20 %2.4439
DeepSeek SMA Long T120 F12 S236 exploratory +244.15 % 43.53 %5.6140
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)

CandidateLabelSealed returnWorst dropRatioTrades
EMA cross 40/200 (main) exploratory +239.81 % 26.43 %9.0734
SMA cross 15/210 exploratory +176.15 % 29.74 %5.9237
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)

CandidateLabelSealed returnWorst dropRatioTrades
Dual SMA 17/280 (main) exploratory +216.54 % 27.53 %7.8734
Dual SMA 70/250 exploratory +103.42 % 41.07 %2.5216
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)

CandidateLabelSealed returnWorst dropRatioTrades
BTC Filtered Breakout 60-250-40 (main) robust +20.91 % 29.00 %0.7252
BTC Filtered Breakout 90-250-40 exploratory -3.48 % 35.89 %-0.1047
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)

CandidateLabelSealed returnWorst dropRatioTrades
EMA trend 300 (main) robust +95.35 % 33.45 %2.8589
EMA trend 250 robust +77.95 % 41.31 %1.8993
Slow trend exploratory +132.13 % 31.18 %4.2484
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)

CandidateLabelSealed returnWorst dropRatioTrades
EMA trend 300 (main) robust +95.35 % 33.45 %2.8589
SMA trend 250 robust +122.42 % 36.30 %3.3776
SMA300 conf SMA50 exploratory +84.41 % 32.31 %2.6147
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)

CandidateLabelSealed returnWorst dropRatioTrades
Event momentum robust (main) robust +62.95 % 36.99 %1.7085
BTC SMA282 regime exploratory +89.58 % 34.91 %2.5786
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)

CandidateLabelSealed returnWorst dropRatioTrades
BTC Slow Trend SMA245 (main) robust +108.19 % 37.27 %2.9081
BTC Slow Trend SMA300 exploratory +101.84 % 31.76 %3.2174
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)

CandidateLabelSealed returnWorst dropRatioTrades
BTC 4h SMA trend filter (main) robust +103.28 % 38.03 %2.7281
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)

CandidateLabelSealed returnWorst dropRatioTrades
BTC trend filter SMA280 + 30d momentum (main) robust +77.13 % 38.28 %2.0196
BTC trend filter SMA280 robust +102.20 % 33.87 %3.0284
BTC 30d time-series momentum exploratory +54.16 % 40.05 %1.35116
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)

CandidateLabelSealed returnWorst dropRatioTrades
Donchian55 robust (main) robust +109.03 % 39.73 %2.7421
Dual SMA robust exploratory +326.39 % 35.24 %9.2638
EMA50 ADX robust exploratory +56.37 % 58.59 %0.9633
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)

CandidateLabelSealed returnWorst dropRatioTrades
E250 (main) robust +77.95 % 41.31 %1.8993
Price EMA 300 exploratory +95.35 % 33.45 %2.8589
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)

CandidateLabelSealed returnWorst dropRatioTrades
sma200_cd12 (main) exploratory +108.76 % 30.99 %3.5156
sma200_cd0 exploratory +132.13 % 31.18 %4.2484
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)

CandidateLabelSealed returnWorst dropRatioTrades
ema 170 long (main) exploratory +99.92 % 36.60 %2.73110
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)

CandidateLabelSealed returnWorst dropRatioTrades
Astra6 SMA240 long cash (main) exploratory +103.28 % 38.03 %2.7281
Astra6 ROC180 long cash exploratory +54.16 % 40.05 %1.35116
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)

CandidateLabelSealed returnWorst dropRatioTrades
Astra6 S2 SMA240 trend (main) exploratory +103.28 % 38.03 %2.7281
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)

CandidateLabelSealed returnWorst dropRatioTrades
BTC EMA Crossover Strategy (main) exploratory -22.08 % 30.99 %-0.71236
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)

CandidateLabelSealed returnWorst dropRatioTrades
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.41108

Return against worst drop

Above the gold line = better than buy-and-hold once risk is counted.

filled = labelled “robust” hollow = “exploratory” buy-and-hold Click a point to open its method. The filter and the “best candidate” switch above move the points.

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.

Research styles

Groups made by reading each submission and its call log. Each run’s card below gives the evidence.

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 opencode
⚑ 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.
Tool calls47 · 68% successful
Duration21.9 min
Blind testyes (30% held back)

Method: 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
Sweeps run / sent3 / 17
Backtests run / sent10 / 10
Docs re-read5 (tools/list ×3, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call16
Most frequent errorssandbox.preflight_failed ×10, sandbox.sweep_parameter_unsupported ×4, missing_strategy_input ×1
Attempts on sealed data0

Ideas 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).

Exact script · call log

Gemini 3.8 Flash (run 1)

Rank 2 · score 100 · robust · Cursor agent
Tool calls71 · 97% successful
Duration4.6 min
Blind testyes (30% held back)

Method: 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
Sweeps run / sent7 / 8
Backtests run / sent57 / 58
Docs re-read2 (tools/list ×1, list_sandbox_datasets ×1)
First test at call3
Most frequent errorssandbox.preflight_failed ×2
Attempts on sealed data0

Ideas 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”.

Exact script · call log

Gemini 3.8 Flash (run 2)

Rank 2 · score 100 · robust · Cursor agent
Tool calls38 · 84% successful
Duration10.6 min
Blind testunknown (requests not kept)

Method: 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
Sweeps run / sent10 / 13
Backtests run / sent14 / 14
Docs re-read1 (tools/list ×1)
First test at call4
Most frequent errorsSANDBOX_ARGUMENTS_INVALID ×3, sandbox.preflight_failed ×2, invalid_numeric_value ×1
Attempts on sealed data0

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

Exact script · call log

Muse Spark 1.3 (contributor, free) (run 1)

Rank 4 · score 100 · robust · cloud via opencode
Tool calls34 · 85% successful
Duration5.5 min
Blind testyes (30% held back)

Method: 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
Sweeps run / sent1 / 3
Backtests run / sent17 / 18
Docs re-read5 (tools/list ×3, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call9
Most frequent errorsSANDBOX_ARGUMENTS_INVALID ×4, sandbox.sweep_parameter_unsupported ×1
Attempts on sealed data0

Ideas 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).

Exact script · call log

deepseek-flash (run 1)

Rank 5 · score 100 · robust · cloud via opencode
Tool calls21 · 100% successful
Duration5.7 min
Blind testyes (25% held back)

Method: 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
Sweeps run / sent9 / 9
Backtests run / sent11 / 11
Docs re-read0 ()
First test at call1
Most frequent errorsnone
Attempts on sealed data0

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.

Exact script · call log

Claude Sonnet 5 (run 1)

Rank 6 · score 80 · exploratory · Claude agent
Tool calls43 · 98% successful
Duration2.5 min
Blind testyes (30% held back)

Method: 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
Sweeps run / sent19 / 19
Backtests run / sent15 / 16
Docs re-read5 (tools/list ×2, get_sandbox_capabilities ×2, list_sandbox_datasets ×1)
First test at call8
Most frequent errorssandbox.preflight_failed ×1
Attempts on sealed data0

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

Exact script · call log

Xiaomi MiMo v2.6 Pro (run 2)

Rank 7 · score 80 · exploratory · cloud via opencode
Tool calls47 · 51% successful
Duration16.6 min
Blind testyes (40% held back)

Method: 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
Sweeps run / sent4 / 11
Backtests run / sent10 / 19
Docs re-read3 (tools/list ×1, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call14
Most frequent errorsSANDBOX_ARGUMENTS_INVALID ×17, missing_strategy_input ×3, unsupported_condition ×1
Attempts on sealed data0

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

Exact script · call log

GPT 5.6 Sol (run 1)

Rank 8 · score 70 · robust · Cursor agent
Tool calls22 · 95% successful
Duration3.6 min
Blind testyes (50% held back)

Method: 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
Sweeps run / sent12 / 13
Backtests run / sent1 / 1
Docs re-read6 (tools/list ×4, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call8
Most frequent errorssandbox.sweep_work_budget_exceeded ×1
Attempts on sealed data0

Ideas 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”.

Exact script · call log

Claude Opus 5.5 (run 1)

Rank 9 · score 70 · robust · Claude agent
Tool calls27 · 85% successful
Duration2.9 min
Blind testyes (50% held back)

Method: 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
Sweeps run / sent11 / 13
Backtests run / sent2 / 2
Docs re-read4 (tools/list ×2, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call7
Most frequent errorsSANDBOX_ARGUMENTS_INVALID ×1, sandbox.preflight_failed ×1, unknown_native_family ×1
Attempts on sealed data0

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

Exact script · call log

Claude Fable 5.1 (run 2)

Rank 9 · score 70 · robust · Claude agent
Tool calls55 · 98% successful
Duration9.8 min
Blind testyes (40% held back)

Method: 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
Sweeps run / sent14 / 15
Backtests run / sent19 / 19
Docs re-read6 (tools/list ×4, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call11
Most frequent errorssandbox.sweep_parameter_unsupported ×1
Attempts on sealed data0

Ideas 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).

Exact script · call log

GPT 5.6 Sol (run 2)

Rank 11 · score 70 · robust · Cursor agent
Tool calls31 · 97% successful
Duration4.0 min
Blind testyes (40% held back)

Method: 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
Sweeps run / sent5 / 6
Backtests run / sent14 / 14
Docs re-read6 (tools/list ×4, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call12
Most frequent errorssandbox.sweep_work_budget_exceeded ×1
Attempts on sealed data0

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

Exact script · call log

Claude Sonnet 5 (run 2)

Rank 12 · score 70 · robust · Claude agent
Tool calls35 · 71% successful
Duration1.9 min
Blind testyes (30%, 50% held back)

Method: 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
Sweeps run / sent7 / 8
Backtests run / sent4 / 10
Docs re-read8 (tools/list ×4, get_sandbox_capabilities ×3, list_sandbox_datasets ×1)
First test at call17
Most frequent errorsSANDBOX_ARGUMENTS_INVALID ×6, unknown_native_family ×3, sandbox.preflight_failed ×1
Attempts on sealed data0

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

Exact script · call log

deepseek-flash (run 2)

Rank 13 · score 70 · robust · cloud via opencode
Tool calls24 · 79% successful
Duration5.3 min
Blind testyes (20%, 35% held back)

Method: 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
Sweeps run / sent6 / 6
Backtests run / sent2 / 2
Docs re-read5 (tools/list ×3, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call16
Most frequent errorsunsupported_condition ×3, invalid_parameter_metadata ×1, invalid_number ×1
Attempts on sealed data0

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

Exact script · call log

Claude Fable 5.1 (run 1)

Rank 14 · score 70 · robust · Claude agent
Tool calls45 · 96% successful
Duration6.9 min
Blind testyes (40% held back)

Method: 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
Sweeps run / sent31 / 32
Backtests run / sent4 / 4
Docs re-read5 (tools/list ×3, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call9
Most frequent errorssandbox.sweep_parameter_unsupported ×1, unsupported_directive ×1
Attempts on sealed data0

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

Exact script · call log

Muse Spark 1.3 (contributor, free) (run 2)

Rank 15 · score 70 · robust · cloud via opencode
Tool calls32 · 88% successful
Duration4.6 min
Blind testyes (30% held back)

Method: 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
Sweeps run / sent5 / 6
Backtests run / sent10 / 10
Docs re-read6 (tools/list ×4, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call13
Most frequent errorsSANDBOX_ARGUMENTS_INVALID ×1, unsupported_condition ×1, sandbox.preflight_failed ×1
Attempts on sealed data0

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

Exact script · call log

Claude Opus 5.5 (run 2)

Rank 16 · score 70 · robust · Claude agent
Tool calls32 · 78% successful
Duration3.3 min
Blind testyes (33% held back)

Method: 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
Sweeps run / sent7 / 12
Backtests run / sent9 / 9
Docs re-read5 (tools/list ×2, get_sandbox_capabilities ×2, list_sandbox_datasets ×1)
First test at call8
Most frequent errorssandbox.preflight_failed ×3, sandbox.sweep_parameter_unsupported ×2, SANDBOX_ARGUMENTS_INVALID ×1
Attempts on sealed data0

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

Exact script · call log

Grok 4.6 (run 1)

Rank 17 · score 50 · exploratoryn = 1 · Cursor agent
Tool calls20 · 100% successful
Duration4.1 min
Blind testunknown (requests not kept)

Method: 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
Sweeps run / sent4 / 4
Backtests run / sent6 / 6
Docs re-read4 (tools/list ×2, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call10
Most frequent errorsnone
Attempts on sealed data0

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

Exact script · call log

Grok 4.7 (run 1)

Rank 18 · score 50 · exploratory · Cursor agent
Tool calls40 · 100% successful
Duration5.7 min
Blind testyes (50% held back)

Method: 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
Sweeps run / sent18 / 18
Backtests run / sent19 / 19
Docs re-read2 (get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call4
Most frequent errorsnone
Attempts on sealed data0

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.

Exact script · call log

Astra 6 (run 1)

Rank 19 · score 50 · exploratory · terminal agent
Tool calls34 · 100% successful
Duration5.7 min
Blind testyes (33% held back)

Method: 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
Sweeps run / sent16 / 16
Backtests run / sent10 / 10
Docs re-read6 (tools/list ×4, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call9
Most frequent errorsnone
Attempts on sealed data0

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.

Exact script · call log

Astra 6 (run 2)

Rank 19 · score 50 · exploratory · terminal agent
Tool calls26 · 100% successful
Duration6.2 min
Blind testyes (30% held back)

Method: 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
Sweeps run / sent8 / 8
Backtests run / sent10 / 10
Docs re-read6 (tools/list ×4, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call8
Most frequent errorsnone
Attempts on sealed data0

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.

Exact script · call log

Grok 4.7 (run 2)

Rank 21 · score 25 · abstention · Cursor agent
Tool calls11 · 100% successful
Duration1.9 min
Blind testyes (50% held back)

Method: 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
Sweeps run / sent9 / 9
Backtests run / sent1 / 1
Docs re-read1 (list_sandbox_datasets ×1)
First test at call2
Most frequent errorsnone
Attempts on sealed data0

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 agent
Tool calls18 · 89% successful
Duration3.0 min
Blind testno sweep ran

Method: 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
Sweeps run / sent0 / 0
Backtests run / sent0 / 0
Docs re-read1 (tools/list ×1)
First test at call—
Most frequent errorsoperation_in_progress ×1, no_error_detail ×1
Attempts on sealed data0

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

Exact script · call log

Claude Haiku 4.5 (run 2)

Rank 23 · score 0 · robust · Claude agent
Tool calls36 · 39% successful
Duration4.3 min
Blind testno sweep ran

Method: 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
Sweeps run / sent0 / 14
Backtests run / sent1 / 6
Docs re-read4 (tools/list ×2, get_sandbox_capabilities ×1, list_sandbox_datasets ×1)
First test at call9
Most frequent errorsSANDBOX_ARGUMENTS_INVALID ×16, sandbox.request_schema ×3, unsupported_condition ×1
Attempts on sealed data0

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

Exact script · call log

Nemotron 3.5 Lightning (free)

Not played / simulated · score 0
⚑ Simulated research — No tool call recorded; results described without any computation.
Tool calls0
Attempts2
Sealed lognone

Method: 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:

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

TradingView Starter
Choose the account path. Prove the strategy separately.
Your first chart and price alert do not require the Lab. Strategy Arena proof remains required before trusting or exporting a strategy.
Partner attribution is for first-time users and web purchases only. Strategy Arena may earn a commission on eligible purchases; starting with a free account needs no payment.
I have never had an account · Start free I already have an account Check a strategy
More TradingView paths
Evidence-gated Pine review

Backtests and paper trading. No profit promise. See also: the forward test · Methodology · LLM trading benchmark: dated paper results by market (JSON, CSV)