Backtesting Arena
REMOTE · TRADINGSTRATEGIES.WORK · SCANNED SEP 21
Crypto backtesting & Bitcoin cycle analytics. Point-in-time, DSR-corrected, look-ahead-aware.
Available components
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
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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
claude mcp add --transport http schoasch-backtesting-arena 'https://tradingstrategies.work/api/mcp'
{
"mcpServers": {
"schoasch-backtesting-arena": {
"url": "https://tradingstrategies.work/api/mcp"
}
}
} {
"servers": {
"schoasch-backtesting-arena": {
"type": "http",
"url": "https://tradingstrategies.work/api/mcp"
}
}
} [mcp_servers.schoasch-backtesting-arena] url = "https://tradingstrategies.work/api/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"schoasch-backtesting-arena": {
"type": "remote",
"url": "https://tradingstrategies.work/api/mcp",
"enabled": true
}
}
} openclaw mcp add schoasch-backtesting-arena --url 'https://tradingstrategies.work/api/mcp' --transport streamable-http
mcp_servers:
schoasch-backtesting-arena:
url: "https://tradingstrategies.work/api/mcp" {
"McpServers": {
"schoasch-backtesting-arena": {
"Transport": "http",
"Url": "https://tradingstrategies.work/api/mcp"
}
}
} assistant mcp add schoasch-backtesting-arena -t streamable-http -u 'https://tradingstrategies.work/api/mcp'
{
"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.
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
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 |
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 →
arena_get_sentiment Get Sentiment Dashboard (DEPRECATED — renamed) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| period | string | – | Aggregation window. Default '7d'. |
No output schema declared.
No examples provided.
arena_get_shared_backtest Get Public 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]
| Name | Type | Req | Description |
|---|---|---|---|
| share_id | string | yes | Public share id from /shared/backtests URL. |
No output schema declared.
No examples provided.
arena_get_signal_context Signal Context — filters vs. today, in one call ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| detail | string | – | 'headline' (default): statement + key numbers + decisive filters. 'full': every measured variant plus the raw source blocks. |
| interval | string | – | Default '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… |
| pair | string | yes | Pair, e.g. 'BTCUSDT'. Case-insensitive. |
| strategy | string | yes | Strategy key, e.g. 'rsi_sma'. See arena_list_strategies. |
No output schema declared.
No examples provided.
arena_get_signal_events Get Signal Transition Events (top/bottom indicators) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Number of days back from today (auto-clamped by tier — Free=30, Pro=365, Power=3650). |
| end_date | string | – | Last 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… |
| signal | string | – | Restrict 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 Get Signal Status (Ampel) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| interval | string | yes | 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 on our own cor… |
| pair | string | yes | Trading pair / symbol. |
| strategy | string | yes | Strategy key, e.g. 'rsi_sma'. |
No output schema declared.
No examples provided.
arena_get_spot_price Get BTC/ETH/SOL 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 Get Stablecoin Supply Trend ~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 Get BTC Short-Term-Holder Cost Basis (latest) ~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 Get Strategy Filter Effect Snapshot (per Asset) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset | string | yes | Pair / symbol (e.g. BTCUSDT). Case-insensitive. |
| interval | string | – | Default '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… |
| strategy | string | yes | Strategy key (see arena_get_strategies). |
No output schema declared.
No examples provided.
arena_get_strategy_insights Get Strategy Insights Matrix or Detail ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | – | Restrict to one asset class. |
| assets_mode | string | – | 'top10' restricts to top-10 pairs by run-count. |
| interval | string | – | Detail 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_runs | integer | – | Matrix mode: minimum runs per cell. Default 5. |
| ref_strategy | string | – | Benchmark reference. Default 'bh'. |
| strategy | string | – | Detail mode: strategy key (used together with `interval`). |
No output schema declared.
No examples provided.
arena_get_strategy_performance Get Strategy Performance Snapshot (per Asset) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset | string | yes | Crypto pair / symbol (e.g. BTCUSDT, ETHUSDT). Case-insensitive. |
| asset_type | string | – | Optional asset class filter to disambiguate (e.g. when same pair-name exists in two classes). |
| interval | string | – | Default '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_strategy | string | – | Benchmark reference. Default 'bh' (Buy & Hold). |
| strategy | string | yes | Strategy 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 Get Regime-Aware Strategy Performance ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset | string | yes | Crypto pair / symbol (e.g. BTCUSDT, ETHUSDT). Case-insensitive. |
| asset_type | string | – | Optional asset class filter to disambiguate identical pair-names. |
| interval | string | – | Default '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… |
| strategy | string | yes | Strategy key (e.g. rsi_sma, golden_cross). See arena_get_strategies. |
No output schema declared.
No examples provided.
arena_get_taker_imbalance Get Spot Taker Buy/Sell 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]
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Number of days back from today (auto-clamped by tier — Free=30, Pro=365, Power=3650). |
| pair | string | – | Binance spot pair, e.g. 'BTCUSDT' (default), 'ETHUSDT', 'SOLUSDT'. |
No output schema declared.
No examples provided.
arena_get_trend_channels Get Log-Linear Regression Channels (90/180/365 bars) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| interval | string | – | Default '1d'. On '1w' a 365-bar window means 365 weeks — most pairs do not reach it and it is reported as unavailable. |
| pair | string | – | Pair, e.g. "BTCUSDT" (default), "ETHUSDT", "PAXGUSDT". Full history is used regardless of listing date. |
No output schema declared.
No examples provided.
arena_get_universe Get Universe Detail ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| universe_id | string | yes | Universe id, e.g. 'top-10-crypto'. |
No output schema declared.
No examples provided.
arena_get_volatility_history Get BTC Volatility History (RV + ATR%) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Number of most recent days to return. Free tier capped at 365; API Pro unlimited. Ignored when from/to are given. |
| fields | string | – | Default 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… |
| from | string | – | ISO date (YYYY-MM-DD), inclusive. Start of the window. Free tier still only sees the last 365 days. |
| granularity | string | – | Default daily. weekly/monthly keep the LAST observation of each period (a state, not an average). |
| meta | string | – | Default full. 'minimal' drops params/params_hash/warmup, which are only useful on the first call. |
| schema_version | string | – | Default '2026-07' (unchanged output). '2026-08' rounds floats to 2 decimals (ranks 1) and reports the saving. Default flips 2026-11-01. |
| to | string | – | ISO 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 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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | – | Filter by asset class, e.g. 'crypto'. Omit for all. |
| min_trades | integer | – | Minimum 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 Get Live Volatility Phase Snapshots ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | – | Filter by asset class. Omit for all. |
| pair | string | – | Filter to a single pair, e.g. "BTCUSDT". Omit for all tracked pairs. |
No output schema declared.
No examples provided.
arena_get_volatility_recommendations Get Strategy Recommendations for Current Volatility Phase ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | – | Asset class of the pair |
| pair | string | yes | Crypto asset pair, e.g. "BTCUSDT", "ETHUSDT" |
No output schema declared.
No examples provided.
arena_get_winners Get Winners List (Top 100 CAGR) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset_class | string | – | Asset class filter. Default 'crypto' (D14-separated leaderboard). |
| limit | integer | – | How many entries to return, max 100 (default 100). |
| strategy | string | – | Restrict the leaderboard to one strategy key, e.g. 'rsi_sma'. Omit for all strategies. |
No output schema declared.
No examples provided.
arena_is_distinguishable Is this difference real — or smaller than the measurement noise? ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| a | number | yes | First value — gross CAGR in percent (e.g. 33.1 for +33.1%). |
| axes | array | yes | Which 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. |
| b | number | yes | Second value, same unit and same basis as a. |
| interval | string | – | Candle 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_a | string | – | Optional name for a, echoed in the explanation. |
| label_b | string | – | Optional name for b, echoed in the explanation. |
No output schema declared.
No examples provided.
arena_list_backtests List Your 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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | – | Filter by asset class, e.g. 'crypto'. Omit for all. |
| interval | string | – | Filter 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… |
| limit | integer | – | Page size, max 100, default 50. |
| offset | integer | – | Rows to skip for paging; default 0. |
| pair | string | – | Filter by pair symbol, e.g. BTCUSDT. Omit for all. |
| strategy | string | – | Filter by strategy key, e.g. 'rsi_sma'. Omit for all. |
No output schema declared.
No examples provided.
arena_list_knowledge List Knowledge Objects (catalog) ~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 List Available BRK On-Chain 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 List Available Trading 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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset_class | string | – | Filter to strategies supporting this asset class (crypto or tokenized_rwa). |
| lang | string | – | Localized names/taglines. Default 'en'. |
| plan | string | – | Filter to strategies of this plan tier. |
No output schema declared.
No examples provided.
arena_list_subscriptions List Active Live-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 List Asset 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 Quote a Custom 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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | – | Asset class; currently 'crypto' only (default). |
| custom_pairs | array | – | Explicit pair list — required when universe_tier='custom', ignored otherwise. |
| discount_code | string | – | Optional retention-discount code. |
| interval | string | yes | Candle interval the report is computed on: '1d', '1w' or '1M'. |
| period_label | string | yes | History covered by the report. Longer periods cross more market regimes and cost more compute. |
| strategy | string | yes | Strategy key (use arena_list_strategies for valid values). |
| strategy_params | object | – | Strategy parameters applied across the whole universe; omit for audited defaults. |
| universe_tier | – | yes | 'top-10' / 'top-50' / 'top-100' / 'top-250' (crypto) or 'custom' with customPairs[]. |
No output schema declared.
No examples provided.
arena_run_backtest Run a New 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]
| Name | Type | Req | Description |
|---|---|---|---|
| asset_type | string | yes | Asset 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… |
| capital | number | – | Starting capital in quote currency. Default 10000. Affects absolute figures only, not CAGR or win-rate. |
| date_from | string | yes | Start date, YYYY-MM-DD. Earlier than the pair listing is clamped to the first available candle. |
| date_to | string | – | End date, YYYY-MM-DD. Default: today. |
| filters | object | – | Optional entry filters (Pro+). Each one only ever REMOVES entries — filters never create trades. Omit for the unfiltered baseline. |
| interval | string | yes | 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 on our own cor… |
| pair | string | yes | Crypto pair symbol, e.g. BTCUSDT, ETHUSDT, SOLUSDT. |
| params | object | – | Strategy-specific parameters, e.g. { rsi_period: 14 }. Omit to use the audited defaults — changing them without a reason is how overfitting starts. |
| strategy | string | yes | Strategy key — use arena_list_strategies to find valid keys. |
No output schema declared.
No examples provided.
arena_run_grid_backtest Run a Grid-Trading 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]
| Name | Type | Req | Description |
|---|---|---|---|
| end_date | string | yes | Simulation end, YYYY-MM-DD. |
| entry_price | number | – | Optional price at which the bot starts; default is the first close in the range. |
| fee_rate | number | yes | Per-trade fee fraction, e.g. 0.001 for 0.1% (Binance spot taker). |
| funding_mode | string | – | Only 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_count | integer | yes | Number of grid levels between low_price and high_price (2–200). More levels = more, smaller trades = more fees. |
| grid_mode | string | – | '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_type | string | yes | Level spacing: 'arithmetic' = equal price steps, 'geometric' = equal percentage steps (usually the better fit for crypto). |
| high_price | number | yes | Upper bound of the grid range, in quote currency. Above it the bot is fully in cash and stops selling. Must exceed low_price. |
| leverage | number | – | Optional, 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_price | number | yes | Lower bound of the grid range, in quote currency. Below it the bot is fully invested and stops buying. |
| pair | string | yes | Crypto pair symbol, e.g. BTCUSDT. Free tier: BTCUSDT or ETHUSDT only. |
| start_date | string | yes | Simulation start, YYYY-MM-DD. |
| stop_loss_price | number | – | Optional: liquidate the whole grid and stop once price falls to this level. |
| take_profit_price | number | – | Optional: liquidate the whole grid and stop once price rises to this level. |
| total_investment | number | yes | Capital in USDT spread across the grid; min 100. |
No output schema declared.
No examples provided.
arena_run_universe_backtest Run Backtest on a Pair Universe (async) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| capital | number | – | Starting capital in quote currency. Default 10000. Affects absolute figures only, not CAGR or win-rate. |
| date_from | string | yes | Start date, YYYY-MM-DD. Earlier than the pair listing is clamped to the first available candle. |
| date_to | string | – | End date, YYYY-MM-DD. Default: today. |
| filters | object | – | Optional entry filters (Pro+). Each one only ever REMOVES entries — filters never create trades. Omit for the unfiltered baseline. |
| interval | string | yes | 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 on our own cor… |
| pairs | array | – | Explicit pair list. Hard schema limit 250; the effective cap is your tier (Pro 50, Power 250). Use instead of universe_id. |
| params | object | – | Strategy-specific parameters applied to EVERY pair in the universe. Omit for audited defaults. |
| strategy | string | yes | Strategy key — call arena_list_strategies. |
| universe_id | string | – | Pre-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 Share a 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]
| Name | Type | Req | Description |
|---|---|---|---|
| language | string | – | Page language of the share. Default 'en'. |
| run_id | string | yes | Id of one of your saved grid backtest runs (returned by arena_run_grid_backtest). |
No output schema declared.
No examples provided.
arena_status Connection, Auth & Quota 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 Subscribe to Bullmarket-Ampel Stage Changes ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| delivery_method | string | – | How updates reach you: 'polling' (default — collect via arena_check_subscription_updates) or 'webhook' (we POST to your URL). |
| direction | string | – | Filter to direction. Default 'any'. |
| expires_at | string | – | ISO-8601 timestamp after which the subscription auto-deactivates. Omit to keep it active until cancelled. |
| stages | array | – | Specific stages of interest. Default: any change. |
| webhook_url | string | – | HTTPS endpoint we POST to. Required when delivery_method=webhook, ignored otherwise. |
No output schema declared.
No examples provided.
arena_subscribe_cycle_changes Subscribe to BTC Cycle Band 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]
| Name | Type | Req | Description |
|---|---|---|---|
| bands | array | – | Filter to bands of interest. Default: any change triggers. |
| delivery_method | string | – | How updates reach you: 'polling' (default — collect via arena_check_subscription_updates) or 'webhook' (we POST to your URL). |
| expires_at | string | – | ISO-8601 timestamp after which the subscription auto-deactivates. Omit to keep it active until cancelled. |
| webhook_url | string | – | HTTPS endpoint we POST to. Required when delivery_method=webhook, ignored otherwise. |
No output schema declared.
No examples provided.
arena_subscribe_pulse_changes Subscribe to Arena-Pulse Score Threshold Crossings ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| delivery_method | string | – | How updates reach you: 'polling' (default — collect via arena_check_subscription_updates) or 'webhook' (we POST to your URL). |
| expires_at | string | – | ISO-8601 timestamp after which the subscription auto-deactivates. Omit to keep it active until cancelled. |
| threshold_above | number | – | Fire when score rises across this value. |
| threshold_below | number | – | Fire when score falls across this value. |
| webhook_url | string | – | HTTPS endpoint we POST to. Required when delivery_method=webhook, ignored otherwise. |
No output schema declared.
No examples provided.
arena_subscribe_signal_alerts Subscribe to Strategy 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]
| Name | Type | Req | Description |
|---|---|---|---|
| ampel_config_id | string | yes | UUID einer existierenden ampel_configs-Row im gleichen User-Account. |
| delivery_method | string | – | How updates reach you: 'polling' (default — collect via arena_check_subscription_updates) or 'webhook' (we POST to your URL). |
| expires_at | string | – | ISO-8601 timestamp after which the subscription auto-deactivates. Omit to keep it active until cancelled. |
| signal_types | array | – | Optional filter. Default: both BUY and SELL fire. |
| webhook_url | string | – | HTTPS endpoint we POST to. Required when delivery_method=webhook, ignored otherwise. |
No output schema declared.
No examples provided.
arena_suggest_grid_range Suggest a 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]
| Name | Type | Req | Description |
|---|---|---|---|
| anchor_date | string | – | YYYY-MM-DD. The realized-volatility range is built from the 7 days BEFORE this date — set it to your backtest start_date. Default: today. |
| dte | integer | – | Target horizon in days for the IV range. Default 30 (matches the 30d IV tenor). |
| pair | string | yes | Crypto pair symbol, e.g. BTCUSDT. Free tier: BTCUSDT or ETHUSDT only. |
| sigma_mult | number | – | IV 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 Validate a strategy/signal (honest backtest) ~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]
| Name | Type | Req | Description |
|---|---|---|---|
| costs | object | – | Trading costs. Default 10 bps (crypto) / 5 bps (else) — a gross-only claim usually shrinks once these apply. |
| market | object | yes | Which market the claim is about — prices are re-fetched from here, not taken from you. |
| oos | object | – | How 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. |
| strategy | object | yes | The claim being validated — supply exactly one of: a catalog strategy (type=rules), your signals (type=signal_list) or your finished trades (type=trade_list). |
| window | object | yes | Period over which the claim is checked. |
No output schema declared.
No examples provided.
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.