Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Backtesting Arena

REMOTE · TRADINGSTRATEGIES.WORK · SCANNED SEP 21

Crypto backtesting & Bitcoin cycle analytics. Point-in-time, DSR-corrected, look-ahead-aware.

0 this week 84 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security94
Transport & Reachability100
Schema Quality & AI Usability65
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 25811 tokens (~290/item across 89 items; 89 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management49
  • Stability check failed: schema churn in the 30 days we've observed: 1 tool removals, 83 breaking changes, 0 auth/transport breaks, 6 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 89 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 90 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Backtesting Arena MCP server?

Backtesting Arena is a hosted endpoint at https://tradingstrategies.work/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · tradingstrategies.work

# add to Claude Code
claude mcp add --transport http schoasch-backtesting-arena 'https://tradingstrategies.work/api/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "schoasch-backtesting-arena": {
      "url": "https://tradingstrategies.work/api/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "schoasch-backtesting-arena": {
      "type": "http",
      "url": "https://tradingstrategies.work/api/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.schoasch-backtesting-arena]
url = "https://tradingstrategies.work/api/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "schoasch-backtesting-arena": {
      "type": "remote",
      "url": "https://tradingstrategies.work/api/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add schoasch-backtesting-arena --url 'https://tradingstrategies.work/api/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  schoasch-backtesting-arena:
    url: "https://tradingstrategies.work/api/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "schoasch-backtesting-arena": {
      "Transport": "http",
      "Url": "https://tradingstrategies.work/api/mcp"
    }
  }
}
# add to Vellum
assistant mcp add schoasch-backtesting-arena -t streamable-http -u 'https://tradingstrategies.work/api/mcp'
// mcp.json
{
  "mcpServers": {
    "schoasch-backtesting-arena": {
      "type": "http",
      "url": "https://tradingstrategies.work/api/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 0
    • Tool “arena_list_onchain_series” rewrote its description, which is the text the model reads security
  • 19 Sept 26 0
    • Tool “arena_get_cycle_history” rewrote its description, which is the text the model reads security
    • “arena_get_cycle_history” added an optional parameter “view” cosmetic
  • 18 Sept 26 0
    • Tool “arena_get_btc_macro_correlations” rewrote its description, which is the text the model reads security
  • 14 Sept 26 0
    • Tool “arena_get_cycle” rewrote its description, which is the text the model reads security
    • Tool “arena_get_pulse” rewrote its description, which is the text the model reads security
    • Tool “arena_run_grid_backtest” rewrote its description, which is the text the model reads security
    • “arena_run_grid_backtest” added an optional parameter “funding_mode” cosmetic
    • “arena_run_grid_backtest” added an optional parameter “grid_mode” cosmetic
    • “arena_run_grid_backtest” added an optional parameter “leverage” cosmetic
  • 13 Sept 26 0
    • Tool “arena_get_strategy_filter_effect” rewrote its description, which is the text the model reads security
  • 12 Sept 26 0
    • Tool “arena_get_max_pain” rewrote its description, which is the text the model reads security
    • “arena_get_max_pain” reworded the description of “include_gex” cosmetic
  • 7 Sept 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “arena_dip_scenario” rewrote its description, which is the text the model reads security
    • Tool “arena_get_btc_market_structure” rewrote its description, which is the text the model reads security
    • Tool “arena_get_chart” rewrote its description, which is the text the model reads security
    • Tool “arena_get_gem_score” rewrote its description, which is the text the model reads security
    • Tool “arena_get_mayer_multiple” rewrote its description, which is the text the model reads security
    • Tool “arena_get_mayer_multiple_history” rewrote its description, which is the text the model reads security
    • Tool “arena_get_platform_activity” rewrote its description, which is the text the model reads security
    • Tool “arena_get_sentiment” rewrote its description, which is the text the model reads security
    • Tool “arena_get_sth_cost_basis” rewrote its description, which is the text the model reads security
    • Tool “arena_get_strategy_performance_by_regime” rewrote its description, which is the text the model reads security
    • Tool “arena_get_winners” rewrote its description, which is the text the model reads security
  • 4 Sept 26 0
    • Server version: 1.11.0 → 1.12.0 functional
    • New tool “arena_get_chart” functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Probed https://tradingstrategies.work/api/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=tradingstrategies.work CN=YR2,O=Let's Encrypt,C=US 13 Aug 2026 11 Nov 2026 RSA 2048 SHA256-RSA 5442a8d8b30b88368572e4f5ac96a700497
SANs: tradingstrategies.work
CN=YR2,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA 4ebd24947e24d394802d84a52fd5b319
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of tradingstrategies.work. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
work. present 16252 8 Verified
tradingstrategies.work. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer error="invalid_token", error_description="No authorization provided", resource_metadata="https://tradingstrategies.work/.well-known/oauth-protected-resource/api/mcp"

Bearer error="invalid_token", error_description="No authorization provided", resource_metadata="https://tradingstrategies.work/.well-known/oauth-protected-resource/api/mcp"
Header Value
strict-transport-security max-age=31536000; includeSubDomains
content-security-policy frame-ancestors 'self'
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy strict-origin-when-cross-origin
permissions-policy camera=(), microphone=(), geolocation=()

Protected resource metadata

Document https://tradingstrategies.work/.well-known/oauth-protected-resource/api/mcp
Retrieved Yes
Resource https://tradingstrategies.work/api/mcp
Authorisation server https://vfplckrqtskcrdclmzdn.supabase.co/auth/v1

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://tradingstrategies.work/api/mcp Verified 200
http (plaintext) http://tradingstrategies.work/api/mcp HTTPS enforced 308 https://tradingstrategies.work/api/mcp
MCP tools · 89 exposed · ~25,407 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
arena_get_sentiment ~111

DEPRECATED — renamed to arena_get_platform_activity: the endpoint measures platform activity (what is being backtested on Backtesting Arena). Same payload plus deprecation fields; this alias will be removed after 2026-11-15. Use arena_get_platform_activity. For market sentiment use arena_get_fear_greed, arena_get_funding_rate, arena_get_altcoin_season or arena_get_pulse. [Free tier]

NameTypeReqDescription
periodstringAggregation window. Default '7d'.

No output schema declared.

No examples provided.

arena_get_shared_backtest ~116

What is in this shared backtest link? Fetches a backtest that someone published via a share link, addressed by its share_id — no ownership and no Pro tier required, which is what makes it the right tool when a user pastes a /shared/backtests URL. Returns the same result shape as arena_get_backtest (config plus aggregate metrics). Use arena_get_backtest instead for the user's own runs. [Free tier]

NameTypeReqDescription
share_idstringyesPublic share id from /shared/backtests URL.

No output schema declared.

No examples provided.

arena_get_signal_context ~534

Should I take this entry? Answers it for one (strategy, pair, interval) in ONE call instead of seven. Aligns what each entry filter historically did to this strategy (arena_get_strategy_filter_effect) with where that filter stands TODAY (bull-market gauge, altcoin-season signal, volatility phase, 200-week trend for BTC): `filters[].blocks_this_entry` says which filter would sit this entry out, with the measured worst-loss / return deltas next to it. Adds the current signal state (anticipated is always false — before candle close there is no signal), an `edge_vs_benchmark` block gated by the MEASURED noise floor (a gap below the floor is a measurement artifact, not a finding), a `contradictions` block (e.g. Pulse risk-off while the macro regime reads risk-on — reported, never resolved), and measured invalidation zones (pivot clusters, 200-week SMA; BTC only). `detail`: 'headline' (default) returns the statement, three key numbers and only the decisive filters; 'full' adds every variant, the raw pulse/macro/filter-effect blocks. Every source can fail independently — sources_used / sources_unavailable make the basis auditable; the answer never silently narrows. Returns a plain-language `statement` with its `confidence` and the reason for that confidence — state it, do not hedge it further; the payload carries its own scope note. Compose further with arena_get_strategy_performance_by_regime (WHEN has this worked) and arena_is_distinguishable. [Free tier]

NameTypeReqDescription
detailstring'headline' (default): statement + key numbers + decisive filters. 'full': every measured variant plus the raw source blocks.
intervalstringDefault '1w'. Candle interval: '1d' daily, '2d'/'3d' multi-day, '1w' weekly, '1M' monthly. Multi-day candles (2d/3d) are anchored to the Unix epoch, so one of n possible alignments is used. Measured…
pairstringyesPair, e.g. 'BTCUSDT'. Case-insensitive.
strategystringyesStrategy key, e.g. 'rsi_sma'. See arena_list_strategies.

No output schema declared.

No examples provided.

arena_get_signal_events ~375

When did which classic top/bottom signal actually flip? Event log of discrete transitions across 13 declared signals: bullmarket_stage_1..5 (20W/50W-MA stages), pulse_band, hash_ribbons, mvrv_z_regime, mayer_band, nupl_zone, pi_cycle_cross, golden_death_cross, price_vs_200wma. Each event: from/to state, occurred_at (day of the flip) vs event_date (day it became CONFIRMED — dwelled signals confirm after min_dwell days; use event_date for any forward evaluation, occurred_at carries look-ahead), declared threshold params, btc_close and drawdown_from_ath_to_date_pct (vs the ATH up to that day, never a later one). The window is capped in SIZE but free in POSITION: end_date moves it anywhere in the reconstructable history (coverage block names per-signal start, measured). Events are RECONSTRUCTIONS from today's stored series under declared rules — not what a live observer necessarily saw, and not forecasts: the log includes every rule that stayed silent through the October 2025 top. Filter with `signal`. [Free tier]

NameTypeReqDescription
daysintegerNumber of days back from today (auto-clamped by tier — Free=30, Pro=365, Power=3650).
end_datestringLast day of the window (YYYY-MM-DD, inclusive). Positions the tier-capped window anywhere in history — e.g. end_date=2025-10-31 with days=60 reads the flips around the October 2025 top. Omit for a wi…
signalstringRestrict to one signal key (see signals_available in the response). Unknown key ⇒ invalid_input naming the allowed set.

No output schema declared.

No examples provided.

arena_get_signal_status ~219

Is this strategy signalling buy or sell right now? Current signal-status (green/yellow/red) for a strategy on a pair+interval. Backed by the daily check-signals cron — needs at least one user with an active Ampel on this combination. [Free tier]

NameTypeReqDescription
intervalstringyesCandle interval: '1d' daily, '2d'/'3d' multi-day, '1w' weekly, '1M' monthly. Multi-day candles (2d/3d) are anchored to the Unix epoch, so one of n possible alignments is used. Measured on our own cor…
pairstringyesTrading pair / symbol.
strategystringyesStrategy key, e.g. 'rsi_sma'.

No output schema declared.

No examples provided.

arena_get_spot_price ~89

Current BTC, ETH and SOL spot price — what is Bitcoin (or ETH/SOL) worth right now? Live USDT-quoted last price plus 24h change %, high and low from Binance. Use this to anchor the connector’s own analytics (cycle, historical-analog, gem scores) with the current market price instead of switching to web search mid-analysis. [Free tier]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

arena_get_stablecoin_supply ~188

Aggregate stablecoin supply (crypto-liquidity proxy) — is the liquidity impulse turning or accelerating? macro_regime only gives the 30d delta; this exposes the trend: current supply, 30d/90d change (USD + %) plus a compact time series so direction and speed are visible, not just a single delta. Read `impulse` for what the supply change is doing — four states (accelerating / decelerating / reversal / flat). The neighbouring `acceleration_usd` is the signed difference last-30d minus prior-30d and gets LARGE exactly when the trend reverses, while the older boolean `accelerating` requires the same direction AND a bigger magnitude; a reversal therefore shows a big `acceleration_usd` next to `accelerating: false`. Source DefiLlama peggedUSD. [Free tier]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

arena_get_sth_cost_basis ~262

What did recent buyers pay on average — and how far is spot from that? Latest BTC short-term-holder cost basis (realized price of coins younger than ~155 days, BRK brk_sth_realized_price), derived STH-MVRV (spot ÷ STH cost basis), an in_loss flag, plus ±1σ/±2σ bands: basis × exp(±k·σ), σ of ln(price ÷ basis) over a 730-day ROLLING window (sigma_method/sigma_window_days travel in the payload; similar construction to public STH band charts, own convention — not a rebuild). band_zone names the state (above/below basis, beyond ±2σ); sth_mvrv_percentile is the rolling 730d rank. Measured band coverage (2026-08-25, full history): 32.1% of days outside ±1σ (near the Gaussian 31.7%), 7.4% outside ±2σ (wider than the Gaussian 4.6% — fat tails); the bands are descriptive geometry (the measured coverage above tells you how literally to take them). On-chain context you weigh with the percentile field. [Free tier]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

arena_get_strategy_filter_effect ~366

What would each entry filter have changed for this strategy? Per-(strategy, asset, interval) filter-effect analysis. Returns baseline-stats (no filters) + each observed filter-variant's stats with cagr_delta / drawdown_delta / win_rate_delta vs the time-overlap-matched baseline + best_by_cagr pick (null with best_by_cagr_reason when every variant is low_data or none beats the baseline — no pick below the data gate) + not_applicable_filters list (e.g. altcoin_season excluded on BTC-pair). Baseline and each variant carry their aggregation `window` (from/to + avg_run_years) — CAGR is time-normalized, so identical trade sets over different windows legitimately produce different CAGR. Based on REAL backtest aggregations — not theoretical 2^5 permutations. Use this to answer 'Which filters would improve my backtest for X on Y?'. [Free tier]

NameTypeReqDescription
assetstringyesPair / symbol (e.g. BTCUSDT). Case-insensitive.
intervalstringDefault '1w'. Candle interval: '1d' daily, '2d'/'3d' multi-day, '1w' weekly, '1M' monthly. Multi-day candles (2d/3d) are anchored to the Unix epoch, so one of n possible alignments is used. Measured…
strategystringyesStrategy key (see arena_get_strategies).

No output schema declared.

No examples provided.

arena_get_strategy_insights ~378

Which strategy and interval combinations actually performed? Aggregated backtest performance per (strategy × interval) cell. If `strategy` AND `interval` provided, returns detail with per-asset breakdown + param variants. Otherwise returns the matrix. Free tier is limited to the same strategies that are free in the backtester itself (rsi_sma, golden_cross, rsi_ob_os, bnh_fixed, dca_reference); the response then carries `plan_capped: true` plus `plan_cap_note`, so a short matrix is never mistaken for a thin database. Detail mode on a Pro-only strategy returns 403 rather than a silently empty answer. API Pro and Power receive every cell. [Free: 5 strategies / Pro+: full]

NameTypeReqDescription
asset_typestringRestrict to one asset class.
assets_modestring'top10' restricts to top-10 pairs by run-count.
intervalstringDetail mode: interval. Candle interval: '1d' daily, '2d'/'3d' multi-day, '1w' weekly, '1M' monthly. Multi-day candles (2d/3d) are anchored to the Unix epoch, so one of n possible alignments is used.…
min_runsintegerMatrix mode: minimum runs per cell. Default 5.
ref_strategystringBenchmark reference. Default 'bh'.
strategystringDetail mode: strategy key (used together with `interval`).

No output schema declared.

No examples provided.

arena_get_strategy_performance ~370

How did this exact strategy, asset and interval perform? Aggregated backtest performance for ONE specific (strategy, asset, interval) combination. Returns run_count, avg_cagr, avg_win_rate, avg_drawdown, effective_years, vs_buy_hold comparison (beats_buy_hold, cagr_delta) and an `evidence` block declaring the gate machine-readably (gate_applies_to: stats.run_count, threshold 5 runs, benchmark value, aggregation data window). For multi-strategy overview use arena_get_strategy_insights. Use this to answer 'How does strategy X perform on asset Y?'. [Free tier]

NameTypeReqDescription
assetstringyesCrypto pair / symbol (e.g. BTCUSDT, ETHUSDT). Case-insensitive.
asset_typestringOptional asset class filter to disambiguate (e.g. when same pair-name exists in two classes).
intervalstringDefault '1w'. Candle interval: '1d' daily, '2d'/'3d' multi-day, '1w' weekly, '1M' monthly. Multi-day candles (2d/3d) are anchored to the Unix epoch, so one of n possible alignments is used. Measured…
ref_strategystringBenchmark reference. Default 'bh' (Buy & Hold).
strategystringyesStrategy key (e.g. rsi_sma, golden_cross). See arena_get_strategies for valid keys.

No output schema declared.

No examples provided.

arena_get_strategy_performance_by_regime ~478

In which macro regime has this strategy worked? Historical backtest performance for ONE (strategy, asset, interval) combination SPLIT BY macro market regime (sweet_spot / late_cycle_warning / crisis / recovery — classified at each trade's entry date), PLUS the CURRENT live regime so you can align the buckets yourself. You get the per-regime numbers to weigh directly (per-bucket verdicts live in the per-cell tools, where the pool is stable). Each regime bucket returns trades, trades_per_config (trade counts pool ALL parameter-variant configs — see config_count), win_rate, avg_pnl_pct (per-trade return, not annualized), reward_risk_ratio (per-trade mean/stddev, NOT annualized Sharpe), share_of_time_pct (calendar-day-weighted — each regime observation counts the days until the next one, so the mixed weekly/daily cadence of the regime history does not skew the share) and a rating. The `benchmark` block anchors the payload with the combination's buy-and-hold CAGR (identical to arena_get_strategy_performance vs_buy_hold — without that anchor, regime avg_pnl_pct is a trajectory, not an excess). For a decision-grade view compose with arena_get_strategy_filter_effect and arena_is_distinguishable. [Free tier]

NameTypeReqDescription
assetstringyesCrypto pair / symbol (e.g. BTCUSDT, ETHUSDT). Case-insensitive.
asset_typestringOptional asset class filter to disambiguate identical pair-names.
intervalstringDefault '1w'. Candle interval: '1d' daily, '2d'/'3d' multi-day, '1w' weekly, '1M' monthly. Multi-day candles (2d/3d) are anchored to the Unix epoch, so one of n possible alignments is used. Measured…
strategystringyesStrategy key (e.g. rsi_sma, golden_cross). See arena_get_strategies.

No output schema declared.

No examples provided.

arena_get_taker_imbalance ~227

Are taker buys or taker sells dominating? Daily SPOT taker-buy share for a Binance pair: taker-buy volume divided by total volume, one value per UTC day (0..1; 0.5 = balanced aggressor flow, above 0.5 taker buys dominate). Derived ratio only — raw volumes are not redistributed. This is SPOT aggressor flow, not futures positioning — for leverage positioning use arena_get_funding_rate_history. Returns the series ascending plus latest, window_mean and n_days; the forming day is excluded (its share still moves). Window via `days`, capped by tier — the `range` block declares requested/granted. [Free 30d / Pro 365d / Power unlimited]

NameTypeReqDescription
daysintegerNumber of days back from today (auto-clamped by tier — Free=30, Pro=365, Power=3650).
pairstringBinance spot pair, e.g. 'BTCUSDT' (default), 'ETHUSDT', 'SOLUSDT'.

No output schema declared.

No examples provided.

arena_get_trend_channels ~404

Where does price sit inside its trend channel? Mechanically fitted trend channels for a pair: log-linear regression over close plus 1σ/2σ bands, computed over three fixed windows at once (90/180/365 bars, not selectable) — three side by side show whether a channel is robust or an artifact of the window choice, and `agreement.consistent` states which it is. `r_squared_percentile` ranks the fit against all same-size windows on this pair, so an R² comes with its placement instead of standing alone. Where history is too short the window is omitted and listed in `windows_unavailable` with a reason — never estimated from fewer bars; below 500 bars (1d) / 150 (1w) the raw values still come but `percentile` is null rather than a rounded number from too small a sample. Pairs listed within the last few months (the tokenized equities and ETFs) therefore return `data_sufficient: false` and an empty channel list — that is the answer, not an error. Set `interval` to '1w' for the weekly view; note that a window is counted in bars, so 365 on '1w' means 365 weeks and most pairs do not reach it. Band edges describe past dispersion around the regression line. Related: arena_get_key_levels (pivot clusters), arena_get_btc_market_structure (trend flips and their base rate), arena_get_historical_analog (whether a condition like the current one ever paid). [Free tier]

NameTypeReqDescription
intervalstringDefault '1d'. On '1w' a 365-bar window means 365 weeks — most pairs do not reach it and it is reported as unavailable.
pairstringPair, e.g. "BTCUSDT" (default), "ETHUSDT", "PAXGUSDT". Full history is used regardless of listing date.

No output schema declared.

No examples provided.

arena_get_universe ~140

Which pairs are in this universe? Returns one pair universe in full: its id, label, selection rule and the complete list of pairs it currently contains. Use it to see what you are about to test BEFORE handing a universe_id to arena_run_universe_backtest, or to resolve a universe into explicit pairs. For the list of available universes call arena_list_universes. Universes reflect the CURRENT membership — they are not point-in-time, so a backtest over them carries survivorship bias for the earlier years. [Free tier]

NameTypeReqDescription
universe_idstringyesUniverse id, e.g. 'top-10-crypto'.

No output schema declared.

No examples provided.

arena_get_volatility_history ~691

How volatile has Bitcoin been? Daily Bitcoin volatility time series: realized volatility (30d & 90d, √252-annualized, close-to-close) and ATR% (Wilder EMA-14, captures intraday range + gaps), on the same scale. Ranks come in two flavours answering different questions: `rvRank`/`atrPctAnnRank` expand from the start of history and are look-ahead-free, but they include BTC's structural volatility decline; `rvRankRolling`/`atrPctAnnRankRolling` rank against a trailing 2-year window, which removes that trend from the comparison. History reaches back to 2009 via a stitched pre-Binance close series; ATR is null before the Binance era because no daily high/low exists that far back (see meta.coverage). Use `from`/`to` for a specific window instead of pulling everything and discarding it, and `granularity`/`fields` to keep long ranges affordable. For long ranges pass `schema_version: "2026-08"` (rounds floats; opt-in until the default flips 2026-11-01) plus `fields: "minimal"` and `meta: "minimal"` — every response carries a `size` block with `chars_before`/`chars_after`/`saved_pct` measuring the saving for YOUR call. Free tier: last 365 days. Related: arena_get_volatility_phases (current phase per pair), arena_get_iv_snapshot (implied vs. this realized — same RV method, but its realized_vol_30d is computed at snapshot time BEFORE that date has traded, so on fresh breakout days the two can differ; this series uses completed closes and is the one to trust for finished days), arena_get_cycle (regime context). [Free tier]

NameTypeReqDescription
daysintegerNumber of most recent days to return. Free tier capped at 365; API Pro unlimited. Ignored when from/to are given.
fieldsstringDefault full. 'minimal' returns date, close, rv, rvRank, rvRankRolling, atrPctAnnRank, atrPctAnnRankRolling only — measured saving 18–20 % of characters (full-history series, 2026-07-31; the `size` b…
fromstringISO date (YYYY-MM-DD), inclusive. Start of the window. Free tier still only sees the last 365 days.
granularitystringDefault daily. weekly/monthly keep the LAST observation of each period (a state, not an average).
metastringDefault full. 'minimal' drops params/params_hash/warmup, which are only useful on the first call.
schema_versionstringDefault '2026-07' (unchanged output). '2026-08' rounds floats to 2 decimals (ranks 1) and reports the saving. Default flips 2026-11-01.
tostringISO date (YYYY-MM-DD), inclusive. End of the window. Defaults to the latest bar.

No output schema declared.

No examples provided.

arena_get_volatility_insights ~183

Does this strategy work better in calm or wild markets? Breaks realized strategy performance down by VOLATILITY PHASE (low / normal / high) per asset and timeframe, so you can see whether an edge only exists in one volatility regime. Answers "when does this work", not "does this work" — for the overall verdict use arena_get_strategy_insights, for the macro-regime cut arena_get_strategy_performance_by_regime, and for the raw volatility time series arena_get_volatility_history. Cells below min_trades are suppressed rather than shown as noise. [API Pro tier]

NameTypeReqDescription
asset_typestringFilter by asset class, e.g. 'crypto'. Omit for all.
min_tradesintegerMinimum trades a cell needs to be reported. Default 20 — lowering it buys coverage with noise.

No output schema declared.

No examples provided.

arena_get_volatility_phases ~153

Is this pair calm or wild right now? Current ATR-based volatility phase (low/normal/high/expansion) per tracked pair, updated daily at 08:00 UTC. This is a single current state — for the time series behind it use arena_get_volatility_history, and for what the phase implies for strategy choice use arena_get_volatility_recommendations. Filter with `pair` when you only care about one asset instead of pulling all of them. [Free tier]

NameTypeReqDescription
asset_typestringFilter by asset class. Omit for all.
pairstringFilter to a single pair, e.g. "BTCUSDT". Omit for all tracked pairs.

No output schema declared.

No examples provided.

arena_get_volatility_recommendations ~162

Which strategies suit the current volatility phase? Top-3 by historical win-rate for that phase on a given pair. Phase comes from the latest snapshot (arena_get_volatility_phases); minimum 20 trades per phase required for inclusion. Answers "which strategies did well in a phase like the current one?" — a historical ranking of what held up in comparable phases. Related: arena_get_volatility_phases (the phase itself), arena_get_edge_reports (filter effects with verdicts), validate_strategy (evidence check on a concrete configuration). [API Pro tier]

NameTypeReqDescription
asset_typestringAsset class of the pair
pairstringyesCrypto asset pair, e.g. "BTCUSDT", "ETHUSDT"

No output schema declared.

No examples provided.

arena_get_winners ~187

What are the strongest backtest results on the platform? Public leaderboard: the highest-CAGR backtest results across all users, with anonymized usernames, pair, strategy, interval and period. Answers "what has scored best on this platform so far". A top-of-leaderboard entry is the winner of a large search — pair it with arena_get_robustness_field or validate_strategy to see how much of the edge survives outside its winning cell. For the user's own runs use arena_list_backtests. [Free tier]

NameTypeReqDescription
asset_classstringAsset class filter. Default 'crypto' (D14-separated leaderboard).
limitintegerHow many entries to return, max 100 (default 100).
strategystringRestrict the leaderboard to one strategy key, e.g. 'rsi_sma'. Omit for all strategies.

No output schema declared.

No examples provided.

arena_is_distinguishable ~458

Do these two CAGR figures actually differ? Check before ranking them. Pass the two values as `a` and `b` (gross CAGR in percent, same basis) plus `axes` — which arbitrary choices went into them — and the tool returns whether their gap clears the MEASURED noise floor of those choices, along with the floor itself, the dominant axis, and the probe + date it was measured on. `axes` accepts: grid_phase (how a multi-day candle grid is aligned to the Unix epoch; exists only on 2d/3d), parameter_choice (neighbouring parameter settings — by far the largest axis), window_edges (shifting the start date), pair_selection (which pairs made it into the universe). Pass ALL axes that genuinely varied; the floor is their maximum, not their sum. Optionally set `interval` to the candle interval so the floor can be sharpened where an axis was measured per interval — passing grid_phase together with a non-multi-day `interval` is a hard error, because that axis does not exist there. `label_a` and `label_b` are optional display names for the two values and are echoed back inside the explanation, so a multi-way comparison stays readable. Read-only, no market data touched. [Free tier]

NameTypeReqDescription
anumberyesFirst value — gross CAGR in percent (e.g. 33.1 for +33.1%).
axesarrayyesWhich arbitrary choices differ between a and b. Pass every one that genuinely varied — omitting an axis makes the answer look more certain than it is.
bnumberyesSecond value, same unit and same basis as a.
intervalstringCandle interval, if known (e.g. '1d', '2d', '3d', '1w'). Sharpens the floor where an axis was measured per interval. Passing grid_phase with a non-multi-day interval is an error, not a rounding detai…
label_astringOptional name for a, echoed in the explanation.
label_bstringOptional name for b, echoed in the explanation.

No output schema declared.

No examples provided.

arena_list_backtests ~343

Which backtests have I run? Lists the backtest runs belonging to the authenticated user — newest first, with id, strategy, pair, interval, date range and headline metrics per run. Use it to find a run_id, then call arena_get_backtest for its detail or arena_get_backtest_trades for the individual trades. Only your OWN runs; for the public cross-user leaderboard use arena_get_winners. Paginated via limit + offset. [API Pro tier]

NameTypeReqDescription
asset_typestringFilter by asset class, e.g. 'crypto'. Omit for all.
intervalstringFilter by candle interval; omit for all. Candle interval: '1d' daily, '2d'/'3d' multi-day, '1w' weekly, '1M' monthly. Multi-day candles (2d/3d) are anchored to the Unix epoch, so one of n possible al…
limitintegerPage size, max 100, default 50.
offsetintegerRows to skip for paging; default 0.
pairstringFilter by pair symbol, e.g. BTCUSDT. Omit for all.
strategystringFilter by strategy key, e.g. 'rsi_sma'. Omit for all.

No output schema declared.

No examples provided.

arena_list_knowledge ~72

What knowledge objects exist here? Discover what Knowledge Objects exist: lists all published types + their subjects (with min_tier, api_path, seo_slug, latest as_of). Use this BEFORE arena_get_knowledge to learn valid type/subject pairs instead of guessing. New types appear automatically. [Free tier]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

arena_list_onchain_series ~111

Which on-chain series are available? Lists all 65 available Bitcoin Research Kit (BRK) on-chain series across the groups pilot, sentiment, mining, supply, cointime, activity, liquidity (e.g. MVRV, NUPL, SOPR, Realized-Price, Mayer, Puell, STH/LTH SOPR, Hash-Ribbons). Returns id + label + group. Use the id with arena_get_onchain_latest / _history. [Free tier]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

arena_list_strategies ~164

Which strategies can I backtest here? Lists all backtest strategies (key, label, plan, supported asset classes, primary indicators). Filterable by asset class and plan. Use this before calling arena_run_backtest to discover valid strategy names. Entries deprecated for an asset class stay listed (historical results depend on them) and carry deprecated_for + deprecation {since, reason} — do NOT call arena_run_backtest or validate_strategy for those combinations, they return 400. [Free tier]

NameTypeReqDescription
asset_classstringFilter to strategies supporting this asset class (crypto or tokenized_rwa).
langstringLocalized names/taglines. Default 'en'.
planstringFilter to strategies of this plan tier.

No output schema declared.

No examples provided.

arena_list_subscriptions ~83

Which alerts do I have running? Returns every ACTIVE subscription belonging to the current API key: id, type, trigger configuration, delivery method and expiry. Use it to see what is already running before creating a duplicate, and to get the subscription_id that arena_cancel_subscription needs. Does not return fired updates — that is arena_check_subscription_updates. [API Pro tier]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

arena_list_universes ~61

Which asset universes can I test against? Lists all crypto asset universes (BTC, top-10 crypto, top-50 crypto, etc.) — the underlying pair-sets used by custom-report and universe-backtest endpoints. [Free tier]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

arena_quote_report ~265

What would a custom report cost? Get a pricing quote for a custom report (universe-backtest PDF + Excel) without committing to a purchase. Returns price, universe size + preview, excluded pairs, and filter config. Crypto universes use top-N tiers (top-10 … top-250) or a custom pair list. [API Pro tier]

NameTypeReqDescription
asset_typestringAsset class; currently 'crypto' only (default).
custom_pairsarrayExplicit pair list — required when universe_tier='custom', ignored otherwise.
discount_codestringOptional retention-discount code.
intervalstringyesCandle interval the report is computed on: '1d', '1w' or '1M'.
period_labelstringyesHistory covered by the report. Longer periods cross more market regimes and cost more compute.
strategystringyesStrategy key (use arena_list_strategies for valid values).
strategy_paramsobjectStrategy parameters applied across the whole universe; omit for audited defaults.
universe_tieryes'top-10' / 'top-50' / 'top-100' / 'top-250' (crypto) or 'custom' with customPairs[].

No output schema declared.

No examples provided.

arena_run_backtest ~650

How would this strategy have performed? Run ONE strategy on ONE pair over a date range and get the full result: CAGR, total return, max drawdown, win-rate, trade count, Buy & Hold comparison, net-of-fees figures, and a run_id for later retrieval. Synchronous, typically 3–10s. Use this when the user wants a concrete result for a specific setup. For several strategies side by side use arena_compare_strategies; for many pairs at once use arena_run_universe_backtest; to judge whether an EXISTING result is trustworthy rather than produce a new one, use validate_strategy or arena_get_robustness_field. Filters are optional and only remove entries; run once without them for the baseline. Read result.benchmark before comparing cagr to buyhold_cagr: warmup or a late listing can shorten the strategy window, and matches_strategy_window:false means the two figures are annualized over DIFFERENT periods — in that case benchmark.strategy_window carries the like-for-like buy-and-hold over the window the strategy actually traded, and THAT is the one to compare against. Per-day quota: Pro=50, Power=500. [API Pro tier]

NameTypeReqDescription
asset_typestringyesAsset class. Use 'crypto' unless you are explicitly backtesting a tokenized real-world asset. Note: tokenized stocks/ETFs/gold trade AS crypto pairs (e.g. spybUSDT, qqqbUSDT) — there is no separate s…
capitalnumberStarting capital in quote currency. Default 10000. Affects absolute figures only, not CAGR or win-rate.
date_fromstringyesStart date, YYYY-MM-DD. Earlier than the pair listing is clamped to the first available candle.
date_tostringEnd date, YYYY-MM-DD. Default: today.
filtersobjectOptional entry filters (Pro+). Each one only ever REMOVES entries — filters never create trades. Omit for the unfiltered baseline.
intervalstringyesCandle interval: '1d' daily, '2d'/'3d' multi-day, '1w' weekly, '1M' monthly. Multi-day candles (2d/3d) are anchored to the Unix epoch, so one of n possible alignments is used. Measured on our own cor…
pairstringyesCrypto pair symbol, e.g. BTCUSDT, ETHUSDT, SOLUSDT.
paramsobjectStrategy-specific parameters, e.g. { rsi_period: 14 }. Omit to use the audited defaults — changing them without a reason is how overfitting starts.
strategystringyesStrategy key — use arena_list_strategies to find valid keys.

No output schema declared.

No examples provided.

arena_run_grid_backtest ~834

Would a grid bot have made money here? Simulate a GRID BOT (buy-low / sell-high ladder inside a fixed price range) on historical candles. Returns final value, return %, CAGR, trade count, fees paid and a Buy & Hold comparison. This is a different machine from the strategy backtester: grid bots earn from oscillation inside a range, not from trend — for signal-based strategies use arena_run_backtest instead. The result depends heavily on the range you choose (low_price / high_price); a range the price left early makes the bot idle, so treat range choice as part of the hypothesis, not a detail — arena_suggest_grid_range proposes a defensible range. Each run is saved to your account (the returned id is the run_id); publish a public snapshot page with arena_share_grid_backtest. grid_mode picks neutral (default) or long. Optional leverage (2/3/5, grid_mode long only, Pro) with funding_mode (conservative default / historical BTCUSDT / none): simulates an isolated-margin futures long grid — margin = total_investment, the grid trades margin × leverage, funding accrues daily on the open position, liquidation is checked per candle at the low. It simulates, it does not recommend: the result can be a total loss of the margin. Free tier limited to BTCUSDT/ETHUSDT. Per-day quota: Free=5, Pro=50, Power=500. [Free / Pro / Power tier]

NameTypeReqDescription
end_datestringyesSimulation end, YYYY-MM-DD.
entry_pricenumberOptional price at which the bot starts; default is the first close in the range.
fee_ratenumberyesPer-trade fee fraction, e.g. 0.001 for 0.1% (Binance spot taker).
funding_modestringOnly with leverage > 1. 'conservative' (default): flat 0.05%/day on the open position. 'historical': recorded daily average of three exchanges, BTCUSDT from 2019-09-08 only — otherwise falls back to…
grid_countintegeryesNumber of grid levels between low_price and high_price (2–200). More levels = more, smaller trades = more fees.
grid_modestring'neutral' (default): starts half in coins, buys and sells around the entry. 'long': starts 100% in cash, buys dips below the entry, sells on recovery — required for leverage.
grid_typestringyesLevel spacing: 'arithmetic' = equal price steps, 'geometric' = equal percentage steps (usually the better fit for crypto).
high_pricenumberyesUpper bound of the grid range, in quote currency. Above it the bot is fully in cash and stops selling. Must exceed low_price.
leveragenumberOptional, default 1 (spot grid, unchanged). 2/3/5 = isolated-margin long grid (grid_mode must be long; Pro). Adds liquidated, liquidation_time/price, funding_cost_usd and max_notional_exposure to the…
low_pricenumberyesLower bound of the grid range, in quote currency. Below it the bot is fully invested and stops buying.
pairstringyesCrypto pair symbol, e.g. BTCUSDT. Free tier: BTCUSDT or ETHUSDT only.
start_datestringyesSimulation start, YYYY-MM-DD.
stop_loss_pricenumberOptional: liquidate the whole grid and stop once price falls to this level.
take_profit_pricenumberOptional: liquidate the whole grid and stop once price rises to this level.
total_investmentnumberyesCapital in USDT spread across the grid; min 100.

No output schema declared.

No examples provided.

arena_run_universe_backtest ~752

Does this strategy hold up across a whole universe? Runs it against every pair in the universe. Pair cap depends on your API tier: Pro 50, Power 250 — Power covers crypto-top-250 in ONE job, and a single job keeps the ranking on one pair set (merging results across different pair sets measures pair selection, not strategy quality). THIS CALL IS ASYNCHRONOUS AND RETURNS NOTHING BUT A job_id: the result is NOT in this response. You MUST poll arena_get_job_status until status is 'completed'; estimated_seconds in the create-response says how long to budget. Provide either universe_id (call arena_list_universes) OR explicit pairs[]. Benchmarks bnh_fixed and dca_reference are accepted here — run one of them over the SAME universe and interval alongside: an excess over buy-and-hold is only readable next to the buy-and-hold value itself, which can be negative. beats_bh_count compares each pair's cagr against the LIKE-FOR-LIKE buy-and-hold — the benchmark measured over the window the strategy actually traded, not from the requested start. A long warmup or a pair listed after date_from shifts that start, and comparing across two different windows is a handicap, not a benchmark. The old pairing is still reported as beats_bh_count_requested_window, and pairs_with_window_offset says on how many pairs the two can differ at all; per-pair, buyhold_cagr_strategy_window and benchmark_matches_window carry the same distinction. PERSISTENCE: universe results live ONLY in the job response (api_jobs.result). They are deliberately not written to backtest_runs, so they carry no filter_binding and no coin-denominated history, and you will not find them later via arena_list_backtests — copy what you need out of the job result. Per-day quota: Pro=5, Power=50. [API Pro tier]

NameTypeReqDescription
capitalnumberStarting capital in quote currency. Default 10000. Affects absolute figures only, not CAGR or win-rate.
date_fromstringyesStart date, YYYY-MM-DD. Earlier than the pair listing is clamped to the first available candle.
date_tostringEnd date, YYYY-MM-DD. Default: today.
filtersobjectOptional entry filters (Pro+). Each one only ever REMOVES entries — filters never create trades. Omit for the unfiltered baseline.
intervalstringyesCandle interval: '1d' daily, '2d'/'3d' multi-day, '1w' weekly, '1M' monthly. Multi-day candles (2d/3d) are anchored to the Unix epoch, so one of n possible alignments is used. Measured on our own cor…
pairsarrayExplicit pair list. Hard schema limit 250; the effective cap is your tier (Pro 50, Power 250). Use instead of universe_id.
paramsobjectStrategy-specific parameters applied to EVERY pair in the universe. Omit for audited defaults.
strategystringyesStrategy key — call arena_list_strategies.
universe_idstringPre-curated universe — call arena_list_universes for valid IDs. Capped by tier (Pro 50, Power 250); a larger universe is rejected rather than silently truncated.

No output schema declared.

No examples provided.

arena_share_grid_backtest ~153

Want a public link for a grid result? Publishes a read-only snapshot page (with OG preview image) for one of YOUR saved grid backtest runs and returns its URL. Pass the run_id you got back from arena_run_grid_backtest (every authenticated run is saved automatically). The page shows the numbers the engine actually computed — this tool takes no result values, so shared pages cannot carry fabricated figures. Shares are permanent snapshots; language picks the page copy (en default). [Free tier]

NameTypeReqDescription
languagestringPage language of the share. Default 'en'.
run_idstringyesId of one of your saved grid backtest runs (returned by arena_run_grid_backtest).

No output schema declared.

No examples provided.

arena_status ~100

Am I connected, and what can this key do? Returns auth status (key kind: oauth connector or bearer API key, tier), server version, current UTC time, and the rate-limit state (hour/day used, remaining, reset) WITHOUT consuming extra quota beyond this call itself. Call this first when other tools fail: it separates auth problems (reconnect), tier problems (upgrade) and rate limits (wait) from real outages. [Free tier]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

arena_subscribe_bullmarket_stage ~267

Notify me when the bull-market stage count changes? Tracks the Bullmarket-Ampel active stage count (0–5). Optional direction filter (up/down/any) plus specific stages of interest. For the current stage count without subscribing, call arena_get_bullmarket_ampel. Creates a standing subscription; it does not return a value now — collect fired updates with arena_check_subscription_updates (polling) or receive them by webhook, and end it with arena_cancel_subscription. For the CURRENT value instead of a change notification, call the matching read tool. [API Pro tier and up — max 3 active subscriptions for Pro, 20 for Power]

NameTypeReqDescription
delivery_methodstringHow updates reach you: 'polling' (default — collect via arena_check_subscription_updates) or 'webhook' (we POST to your URL).
directionstringFilter to direction. Default 'any'.
expires_atstringISO-8601 timestamp after which the subscription auto-deactivates. Omit to keep it active until cancelled.
stagesarraySpecific stages of interest. Default: any change.
webhook_urlstringHTTPS endpoint we POST to. Required when delivery_method=webhook, ignored otherwise.

No output schema declared.

No examples provided.

arena_subscribe_cycle_changes ~244

Notify me when the cycle band changes? Bands: (capitulation → risk-off → neutral → constructive → euphoric). Optional bands filter restricts to specific target bands. For the current band without subscribing, call arena_get_cycle. Creates a standing subscription; it does not return a value now — collect fired updates with arena_check_subscription_updates (polling) or receive them by webhook, and end it with arena_cancel_subscription. For the CURRENT value instead of a change notification, call the matching read tool. [API Pro tier and up — max 3 active subscriptions for Pro, 20 for Power]

NameTypeReqDescription
bandsarrayFilter to bands of interest. Default: any change triggers.
delivery_methodstringHow updates reach you: 'polling' (default — collect via arena_check_subscription_updates) or 'webhook' (we POST to your URL).
expires_atstringISO-8601 timestamp after which the subscription auto-deactivates. Omit to keep it active until cancelled.
webhook_urlstringHTTPS endpoint we POST to. Required when delivery_method=webhook, ignored otherwise.

No output schema declared.

No examples provided.

arena_subscribe_pulse_changes ~268

Notify me when market heat crosses a threshold? Fires when the daily 0–100 Arena-Pulse score crosses threshold_above (upward) or threshold_below (downward). At least one threshold is required. For the current score without subscribing, call arena_get_pulse. Creates a standing subscription; it does not return a value now — collect fired updates with arena_check_subscription_updates (polling) or receive them by webhook, and end it with arena_cancel_subscription. For the CURRENT value instead of a change notification, call the matching read tool. [API Pro tier and up — max 3 active subscriptions for Pro, 20 for Power]

NameTypeReqDescription
delivery_methodstringHow updates reach you: 'polling' (default — collect via arena_check_subscription_updates) or 'webhook' (we POST to your URL).
expires_atstringISO-8601 timestamp after which the subscription auto-deactivates. Omit to keep it active until cancelled.
threshold_abovenumberFire when score rises across this value.
threshold_belownumberFire when score falls across this value.
webhook_urlstringHTTPS endpoint we POST to. Required when delivery_method=webhook, ignored otherwise.

No output schema declared.

No examples provided.

arena_subscribe_signal_alerts ~308

Notify me when this signal flips? Fires when an existing Ampel-Config's signal flips (BUY ↔ SELL). Prerequisite: the user must have created that ampel-config in the web UI (`/dashboard/ampel`) — pass its UUID here; this tool cannot create one. Optional signal_types filter narrows to BUY-only or SELL-only. For the current signal state without subscribing, call arena_get_signal_status. Creates a standing subscription; it does not return a value now — collect fired updates with arena_check_subscription_updates (polling) or receive them by webhook, and end it with arena_cancel_subscription. For the CURRENT value instead of a change notification, call the matching read tool. [API Pro tier and up — max 3 active subscriptions for Pro, 20 for Power]

NameTypeReqDescription
ampel_config_idstringyesUUID einer existierenden ampel_configs-Row im gleichen User-Account.
delivery_methodstringHow updates reach you: 'polling' (default — collect via arena_check_subscription_updates) or 'webhook' (we POST to your URL).
expires_atstringISO-8601 timestamp after which the subscription auto-deactivates. Omit to keep it active until cancelled.
signal_typesarrayOptional filter. Default: both BUY and SELL fire.
webhook_urlstringHTTPS endpoint we POST to. Required when delivery_method=webhook, ignored otherwise.

No output schema declared.

No examples provided.

arena_suggest_grid_range ~411

Which price range should my grid bot use? Answers the question arena_run_grid_backtest deliberately leaves open (its own description says: treat range choice as part of the hypothesis). Returns TWO independent range suggestions side by side: iv_anchored (BTCUSDT/ETHUSDT only — sized from option-implied volatility, Deribit DVOL Index; the methodically grounded answer) and recent_volatility (7 trading days of realized volatility before anchor_date — the method exchange auto-modes use, available for all pairs). When both exist and disagree strongly, the options market expects a different volatility regime than the recent past showed — that disagreement is information. Output field names (low_price, high_price, grid_count, grid_type) map 1:1 onto arena_run_grid_backtest inputs. Inputs: pair (required), anchor_date, sigma_mult (IV range width in sigmas, default 1.5), dte (IV horizon in days, default 30). For a historical backtest set anchor_date to your start_date so the volatility range matches the entry, not today; iv_anchored always reflects the latest IV snapshot regardless of anchor_date. Free tier limited to BTCUSDT/ETHUSDT (same gate as the grid backtest itself). [Free tier]

NameTypeReqDescription
anchor_datestringYYYY-MM-DD. The realized-volatility range is built from the 7 days BEFORE this date — set it to your backtest start_date. Default: today.
dteintegerTarget horizon in days for the IV range. Default 30 (matches the 30d IV tenor).
pairstringyesCrypto pair symbol, e.g. BTCUSDT. Free tier: BTCUSDT or ETHUSDT only.
sigma_multnumberIV range width in sigma multiples. Default 1.5 (covers ~87% of log-normal moves); larger = wider range, fewer range exits, less oscillation capture.

No output schema declared.

No examples provided.

validate_strategy ~351

Does this strategy survive an honest test? Backtest a trading strategy honestly — look-ahead-aware validation with Deflated-Sharpe-Ratio / multiple-testing correction (Bailey & López de Prado). Returns an EVIDENCE verdict (insufficient_evidence | anecdote | failed_oos | passed_oos) plus metrics, flags and caveats — NOT a buy/sell recommendation. Call this before acting on a strategy or signal list. Accepts a named catalog strategy (type=rules), a timestamped BUY/SELL signal list (signal_list), or a timestamped trade list (trade_list). Checks: realistic next-bar fills (look-ahead/optimism), net of cost, out-of-sample split, and a hard 30-round-trip sample gate (under 30 is always "anecdote"). Not reproducible via generic backtest tools that ignore overfitting. [API Pro tier]

NameTypeReqDescription
costsobjectTrading costs. Default 10 bps (crypto) / 5 bps (else) — a gross-only claim usually shrinks once these apply.
marketobjectyesWhich market the claim is about — prices are re-fetched from here, not taken from you.
oosobjectHow the claim is tested out-of-sample. Omit for the default split — the out-of-sample part is what separates a finding from a fit.
strategyobjectyesThe claim being validated — supply exactly one of: a catalog strategy (type=rules), your signals (type=signal_list) or your finished trades (type=trade_list).
windowobjectyesPeriod over which the claim is checked.

No output schema declared.

No examples provided.

Common questions

What is the Backtesting Arena MCP server?

Backtesting Arena is an MCP server listed in the public MCP registry as io.github.Schoasch/backtesting-arena. Crypto backtesting & Bitcoin cycle analytics. Point-in-time, DSR-corrected, look-ahead-aware. This page covers its hosted endpoint (https://tradingstrategies.work/api/mcp).

Is the Backtesting Arena MCP server safe to use?

Backtesting Arena scores 84 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Backtesting Arena MCP server expose?

Backtesting Arena exposes 89 tools: arena_get_pulse, arena_get_cycle, arena_get_spot_price, arena_get_stablecoin_supply, arena_get_etf_flows, and 84 more. Their descriptions and schemas cost roughly 25,407 tokens of context every time the server is loaded.

Does the Backtesting Arena MCP server require authentication?

Yes. Backtesting Arena asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the Backtesting Arena MCP server still maintained?

Backtesting Arena is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.