Checks crypto trading claims on real data: leverage, drawdown, stop-loss, seasonality, luck.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Whether spreading the entry would have helped, measured. One amount into a coin over a window (90, 365 or 730 days): all of it on day one, or equal instalments weekly or monthly. Both start the same day, move the same money and are valued on the same day, started on every day of the history. You get how often spreading ended ahead, the middle result of each, and the worst start day of each — which is what spreading actually buys and the half nobody shows. Spot tape, no fees, dead coins included. Use for dollar-cost averaging versus lump sum on one coin. For claims about particular days or months use best_days_check or calendar_check; for the fall after a single buy, drawdown_check.
Ticker or full pair. An unknown one comes back with the list we hold and the ones left out.
The window, in days: 90, 365 or 730.
How often a slice goes in: weekly or monthly. Defaults to weekly.
Whether spreading the entry would have helped, measured. One amount into a coin over a window (90, 365 or 730 days): all of it on day one, or equal instalments weekly or monthly. Both start the same day, move the same money and are valued on the same day, started on every day of the history. You get how often spreading ended ahead, the middle result of each, and the worst start day of each — which is what spreading actually buys and the half nobody shows. Spot tape, no fees, dead coins included. Use for dollar-cost averaging versus lump sum on one coin. For claims about particular days or months use best_days_check or calendar_check; for the fall after a single buy, drawdown_check.
| Argument | Type | Description |
|---|---|---|
| coin* | string | Ticker or full pair. An unknown one comes back with the list we hold and the ones left out. |
| days* | number | The window, in days: 90, 365 or 730. |
| instalments* | string | How often a slice goes in: weekly or monthly. Defaults to weekly. |
{
"type": "object",
"examples": [
{
"coin": "btc",
"days": 365
}
],
"required": [
"coin",
"days",
"instalments"
],
"properties": {
"coin": {
"type": "string",
"description": "Ticker or full pair. An unknown one comes back with the list we hold and the ones left out."
},
"days": {
"enum": [
90,
365,
730
],
"type": "number",
"description": "The window, in days: 90, 365 or 730."
},
"instalments": {
"enum": [
"weekly",
"monthly"
],
"type": "string",
"default": "weekly",
"description": "How often a slice goes in: weekly or monthly. Defaults to weekly."
}
},
"description": "The coin and the window you want compared."
}The 'miss the ten best days and you get nothing' claim, measured on both sides. The same window of a coin lived four ways: all of it, without its N best days, without its N worst days, and without either, from every start day of the history. You also get how many of those best days landed within a week of a worst one, which is what decides whether the claim means anything. Backtest on spot daily candles, dead coins included. Use when someone argues for staying invested because missing the best days ruins returns, or for timing the market to dodge the worst ones. Which weekday or month does best is calendar_check.
| Argument | Type | Description |
|---|---|---|
| coin* | string | Ticker or full pair. An unknown one comes back with the list we hold and the ones left out. |
| days* | number | Window in days: 90, 365 or 730. |
| best_days* | number | How many days are missed: 1, 5, 10 or 20. Defaults to 10, the number in the claim. |
{
"type": "object",
"examples": [
{
"coin": "btc",
"days": 365,
"best_days": 10
}
],
"required": [
"coin",
"days",
"best_days"
],
"properties": {
"coin": {
"type": "string",
"description": "Ticker or full pair. An unknown one comes back with the list we hold and the ones left out."
},
"days": {
"enum": [
90,
365,
730
],
"type": "number",
"description": "Window in days: 90, 365 or 730."
},
"best_days": {
"enum": [
1,
5,
10,
20
],
"type": "number",
"default": 10,
"description": "How many days are missed: 1, 5, 10 or 20. Defaults to 10, the number in the claim."
}
},
"description": "The coin, the window, and how many days you would miss."
}'Uptober'. 'Mondays dip'. 'Sell in May'. Any calendar claim on 34 coins, measured against chance. With seven days one has to come first, so the answer is a permutation test: the SAME returns dealt out at random hundreds of times, and how often chance alone produces a bucket that good. Plus how many times the bucket really happened - October is 279 days of bitcoin but nine Octobers - and the round-trip cost. Nine years of daily candles. Tests whether one day of the week, month of the year or hour of the day really beats the rest for a coin. Use for seasonality claims (Uptober, Monday dips, Sell in May). For the claim about missing the market's best days use best_days_check; for when to spread an entry, averaging_in_check.
| Argument | Type | Description |
|---|---|---|
| coin* | string | Ticker or full pair. An unknown one comes back with the list we hold and the ones left out. |
| calendar* | string | day_of_week, month_of_year or hour_of_day. The hourly one exists for the 16 coins we hold hourly candles for. |
{
"type": "object",
"examples": [
{
"coin": "btc",
"calendar": "month_of_year"
}
],
"required": [
"coin",
"calendar"
],
"properties": {
"coin": {
"type": "string",
"description": "Ticker or full pair. An unknown one comes back with the list we hold and the ones left out."
},
"calendar": {
"enum": [
"day_of_week",
"month_of_year",
"hour_of_day"
],
"type": "string",
"description": "day_of_week, month_of_year or hour_of_day. The hourly one exists for the 16 coins we hold hourly candles for."
}
},
"description": "The coin and which calendar: weekday, month or hour."
}Two or three coins side by side, every check at once: for each, how often a buy fell 30% or more before the window was out and where the middle one ended, how often a leveraged month ended with nothing, whether spreading the entry won, how often a stop-loss sold a buy that ended in profit, and how much it moves with bitcoin. Nothing is ranked and no coin is called better. Spot and perpetual tapes, fees charged. Use when two or three coins are being compared or chosen between. For one coin or one question the specific check gives more detail: drawdown_check, leverage_survival, averaging_in_check, stop_loss_check, diversification_check.
| Argument | Type | Description |
|---|---|---|
| days* | number | 90, 365 (default) or 730. |
| coins* | string | Two or three tickers, comma-separated: BTC,ETH,SOL. Kept in the order sent. |
| leverage* | number | For the leverage row. Default 25. |
{
"type": "object",
"examples": [
{
"coins": [
"btc",
"eth"
]
}
],
"required": [
"coins",
"days",
"leverage"
],
"properties": {
"days": {
"enum": [
90,
365,
730
],
"type": "number",
"default": 365,
"description": "90, 365 (default) or 730."
},
"coins": {
"type": "string",
"description": "Two or three tickers, comma-separated: BTC,ETH,SOL. Kept in the order sent."
},
"leverage": {
"type": "number",
"default": 25,
"description": "For the leverage row. Default 25."
}
},
"description": "The coins, and optionally the window and the leverage."
}Whether copying the top traders works, measured. Accounts in the top 10% or 1% of Hyperliquid one month, by return or by dollar profit: how many were in the top again the next month, next to chance, how many fell to the bottom instead, and how many made money the month you would have copied them for, next to every active account. 4,000 accounts sampled at random, not today's leaders; about 30 month pairs. Use when someone proposes copying top traders, a leaderboard or signal leaders. Takes no account address. To place one specific return on the leaderboard use leaderboard_rank_check; to ask whether luck explains a record, overfitting_odds.
| Argument | Type | Description |
|---|---|---|
| top_pct* | number | 10 (default) or 1. 0.1 is read as 10. |
| ranked_by* | string | return (default) or profit. |
{
"type": "object",
"examples": [
{}
],
"required": [
"ranked_by",
"top_pct"
],
"properties": {
"top_pct": {
"enum": [
10,
1
],
"type": "number",
"default": 10,
"description": "10 (default) or 1. 0.1 is read as 10."
},
"ranked_by": {
"enum": [
"return",
"profit"
],
"type": "string",
"default": "return",
"description": "return (default) or profit."
}
},
"description": "Which ranking and which top group. Both optional."
}Diversification check: how many independent bets a basket of coins really is. Give the coins (and optionally the window: 90, 365 or 730 days): you get the average correlation between the pairs on real daily returns, the number of independent bets it works out to, each coin's correlation with bitcoin — and what the equal-weight basket did on the days bitcoin closed 3% or more down: how often it fell too, by how much, and its worst such day. Dead coins included. Use when a basket of two or more coins is called diversified or hedged. For one coin use drawdown_check; for two or three coins side by side on every check, coin_comparison.
| Argument | Type | Description |
|---|---|---|
| days* | number | Window ending on the last day of the data: 90, 365 or 730. Defaults to 365. |
| coins* | array | Tickers or full pairs, e.g. ["BTC", "ETH", "SOL"]. A comma-separated string also works. One we do not hold comes back with the list. |
{
"type": "object",
"examples": [
{
"coins": [
"btc",
"eth"
]
}
],
"required": [
"coins",
"days"
],
"properties": {
"days": {
"enum": [
90,
365,
730
],
"type": "number",
"default": 365,
"description": "Window ending on the last day of the data: 90, 365 or 730. Defaults to 365."
},
"coins": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tickers or full pairs, e.g. [\"BTC\", \"ETH\", \"SOL\"]. A comma-separated string also works. One we do not hold comes back with the list."
}
},
"description": "The basket you want measured."
}Drawdown check: what it cost to collect the return you were shown. The coin is bought at the close of every day of its history and held for the period you name: you get the drawdown from the entry before the period was out, the share of starts that fell 30% and 50%, the days spent under water, how it ended — and, among the starts that ended in profit, the drawdown they sat through first. Spot tape, no fees, coins that died included. Use when a return is quoted for holding a coin ("BTC did +150% in a year") and you want the fall endured on the way. With leverage use leverage_survival; to test a stop that cuts the fall, stop_loss_check.
| Argument | Type | Description |
|---|---|---|
| coin* | string | Ticker or full pair. An unknown one comes back with the list we hold and the ones left out. |
| days* | number | How long it is held: 30, 90, 365 or 730. |
{
"type": "object",
"examples": [
{
"coin": "btc",
"days": 365
}
],
"required": [
"coin",
"days"
],
"properties": {
"coin": {
"type": "string",
"description": "Ticker or full pair. An unknown one comes back with the list we hold and the ones left out."
},
"days": {
"enum": [
30,
90,
365,
730
],
"type": "number",
"description": "How long it is held: 30, 90, 365 or 730."
}
},
"description": "The hold you want opened on every day there has been."
}How much company a return has. Send a return (+340%) and a window (day, week, month or all time) and get how many accounts on Hyperliquid's whole public leaderboard did the same or better, out of how many traded, its percentile, and the median account next to it. Every row of the exchange's own table, refreshed daily; the denominator is the accounts that traded, not the ones that sat idle. Use when a trader or an ad quotes a return ("+340% this month") and you want to know how rare it is. Hyperliquid accounts only. Whether last month's top accounts stay on top is copy_trading_check; whether luck explains a win rate, overfitting_odds.
| Argument | Type | Description |
|---|---|---|
| window* | string | day, week, month (default) or allTime. |
| return_pct* | number | In percent: 340 means +340%. |
{
"type": "object",
"examples": [
{
"return_pct": 340
}
],
"required": [
"return_pct",
"window"
],
"properties": {
"window": {
"enum": [
"day",
"week",
"month",
"allTime"
],
"type": "string",
"default": "month",
"description": "day, week, month (default) or allTime."
},
"return_pct": {
"type": "number",
"description": "In percent: 340 means +340%."
}
},
"description": "The return you were shown, and over what window."
}What a leveraged trade actually did, opened on every single day of the history instead of the one day that worked. Give coin, side, leverage and holding period: you get the share of those days that ended liquidated, the median outcome, the best day, and what the same coin did with no leverage at all. Real perpetual tape, with the funding that was actually paid charged daily and eating into margin. Coins that blew up included. Use when the question involves leverage, perpetuals or liquidation. For the fall an unleveraged holder sits through use drawdown_check; for two or three coins at once, coin_comparison.
| Argument | Type | Description |
|---|---|---|
| coin* | string | Ticker or full pair. An unknown one comes back with the list we hold and the ones we do not. |
| days* | number | How long it is held: 1, 7, 30 or 90. |
| side | string | long or short. Defaults to long. |
| leverage* | number | 2, 3, 5, 10, 20, 25, 50 or 100. |
{
"type": "object",
"examples": [
{
"coin": "BTC",
"days": 30,
"leverage": 25
}
],
"required": [
"coin",
"leverage",
"days"
],
"properties": {
"coin": {
"type": "string",
"description": "Ticker or full pair. An unknown one comes back with the list we hold and the ones we do not."
},
"days": {
"enum": [
1,
7,
30,
90
],
"type": "number",
"description": "How long it is held: 1, 7, 30 or 90."
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"default": "long",
"description": "long or short. Defaults to long."
},
"leverage": {
"enum": [
2,
3,
5,
10,
20,
25,
50,
100
],
"type": "number",
"description": "2, 3, 5, 10, 20, 25, 50 or 100."
}
},
"description": "The leveraged trade you want opened on every day there has been."
}Overfitting check: how many attempts plain chance needs to produce the track record you were shown. Give the wins, the losses and how many versions were tried: you get the exact binomial odds of one try reaching it, the odds once somebody shows you the best of N, and how many tries would make it an even bet. Arithmetic only — no market data, no model, no opinion. A 62% win rate over 100 trades is one thing on the first try, nothing on the fiftieth. Use when you are shown a win rate, a backtest or a signal channel's record and need to know whether luck explains it. Needs no coin. For what a named rule did on real prices use strategy_grid_lookup; to place a return among real accounts, leaderboard_rank_check.
| Argument | Type | Description |
|---|---|---|
| wins* | number | Winning trades. |
| tries | number | How many versions were tried before this one was shown to you. Defaults to 1, which is almost never true. |
| losses | number | Losing trades. Give this or trades. |
| trades* | number | Total trades. |
| baseline | number | Probability a single trade wins by chance. Defaults to 0.5. |
{
"type": "object",
"examples": [
{
"wins": 62,
"tries": 20,
"losses": 38
}
],
"required": [
"wins",
"trades"
],
"properties": {
"wins": {
"type": "number",
"description": "Winning trades."
},
"tries": {
"type": "number",
"default": 1,
"description": "How many versions were tried before this one was shown to you. Defaults to 1, which is almost never true."
},
"losses": {
"type": "number",
"description": "Losing trades. Give this or trades."
},
"trades": {
"type": "number",
"description": "Total trades."
},
"baseline": {
"type": "number",
"default": 0.5,
"description": "Probability a single trade wins by chance. Defaults to 0.5."
}
},
"description": "The track record you were shown, and how much searching went into finding it."
}Whether a stop-loss would have helped, measured. The same buy of a coin, held 30, 90, 365 or 730 days, with a stop 5, 10, 15, 20 or 30% below the entry and without one, started on every day of the history. The stop fires on the day's low, not its close, and fees are charged to both. You get how often it fired, how often it sold a buy that would have ended in profit, and the worst case of each. Spot tape, dead coins included. Use when asked whether a stop-loss protects a spot buy-and-hold. For leveraged positions, where liquidation is the stop, use leverage_survival; for a rule with a stop and a take-profit, strategy_grid_lookup.
| Argument | Type | Description |
|---|---|---|
| coin* | string | Ticker or full pair. An unknown one comes back with the list we hold and the ones left out. |
| days* | number | Holding period in days: 30, 90, 365 or 730. |
| stop* | number | How far below the entry, in percent: 5, 10, 15, 20 or 30. 0.05 is read as 5. |
{
"type": "object",
"examples": [
{
"coin": "btc",
"days": 365,
"stop": 5
}
],
"required": [
"coin",
"days",
"stop"
],
"properties": {
"coin": {
"type": "string",
"description": "Ticker or full pair. An unknown one comes back with the list we hold and the ones left out."
},
"days": {
"enum": [
30,
90,
365,
730
],
"type": "number",
"description": "Holding period in days: 30, 90, 365 or 730."
},
"stop": {
"enum": [
5,
10,
15,
20,
30
],
"type": "number",
"description": "How far below the entry, in percent: 5, 10, 15, 20 or 30. 0.05 is read as 5."
}
},
"description": "The coin, how long you meant to hold, and the stop."
}Backtest lookup: what one exact version of a strategy actually did. Buy-the-dip and the moving-average cross, every combination of their knobs, computed over nine years of real prices with the exchange's fees charged both ways — sixteen coins, three of which died. Give the coin and the numbers and you get the return, the trades, the worst drawdown, and what buying and holding did over the same window. Read from a file you can download. Use when someone quotes a specific dip-buying or moving-average rule ("buy 10% dips, take 5%") and you want its real backtest. For leverage use leverage_survival; for a stop on a plain buy-and-hold, stop_loss_check; to judge a win rate you were shown, overfitting_odds.
| Argument | Type | Description |
|---|---|---|
| coin* | string | BTC, ETH, SOL, DOGE, PEPE, SRM… ticker or full pair. Ask with an unknown one and the answer lists the sixteen we hold. |
| drop | number | dip only: how far below its recent high to buy, in %. |
| fast | number | cross only: fast average. |
| slow | number | cross only: slow average. |
| stop | number | dip only: stop loss, in %. |
| hours | number | dip only: give up after this many hours. |
| family |
| string |
| dip (buy when it falls) or cross (moving average crossover). Defaults to dip. |
| target | number | dip only: take profit, in %. |
| candles | string | cross only: 1d or 4h. |
{
"type": "object",
"examples": [
{
"coin": "btc"
}
],
"required": [
"coin"
],
"properties": {
"coin": {
"type": "string",
"description": "BTC, ETH, SOL, DOGE, PEPE, SRM… ticker or full pair. Ask with an unknown one and the answer lists the sixteen we hold."
},
"drop": {
"type": "number",
"description": "dip only: how far below its recent high to buy, in %."
},
"fast": {
"type": "number",
"description": "cross only: fast average."
},
"slow": {
"type": "number",
"description": "cross only: slow average."
},
"stop": {
"type": "number",
"description": "dip only: stop loss, in %."
},
"hours": {
"type": "number",
"description": "dip only: give up after this many hours."
},
"family": {
"enum": [
"dip",
"cross"
],
"type": "string",
"default": "dip",
"description": "dip (buy when it falls) or cross (moving average crossover). Defaults to dip."
},
"target": {
"type": "number",
"description": "dip only: take profit, in %."
},
"candles": {
"enum": [
"1d",
"4h"
],
"type": "string",
"description": "cross only: 1d or 4h."
}
},
"description": "Which exact version of the strategy you want looked up."
}