Call this server's tools from your browser. Nothing to install.
https://tradingcalc.io/api/mcp
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.
primitive.average_entry Read-only
Calculate the weighted average entry price from multiple buy/sell fills (DCA): the bare number only, no breakeven or per-fill breakdown. Use when user asks only "what's my average entry?" and wants just that figure. Each fill is { price, quantity } here (workflow.run_dca_entry calls the same field size). For breakeven and a per-level summary too, use workflow.run_dca_entry instead. Returns: averagePrice, totalSize, totalCost.
Object with a "fills" array, e.g. { "fills": [{ "price": 60000, "quantity": 0.5 }, { "price": 58000, "quantity": 1 }] }
Trading pair symbol, e.g. BTCUSDT
linear = USDT-margined, average is the arithmetic mean (default). inverse = coin-margined, average is the harmonic mean (fill quantity is USD notional).
Exchange identifier (optional)
Tools (77)
Tool list last changed Oct 25, 2026.
primitive.average_entry
Calculate the weighted average entry price from multiple buy/sell fills (DCA): the bare number only, no breakeven or per-fill breakdown. Use when user asks only "what's my average entry?" and wants just that figure. Each fill is { price, quantity } here (workflow.run_dca_entry calls the same field size). For breakeven and a per-level summary too, use workflow.run_dca_entry instead. Returns: averagePrice, totalSize, totalCost.
read-only
Argument
Type
Description
input*
object
Object with a "fills" array, e.g. { "fills": [{ "price": 60000, "quantity": 0.5 }, { "price": 58000, "quantity": 1 }] }
symbol*
string
Trading pair symbol, e.g. BTCUSDT
contractType
string
linear = USDT-margined, average is the arithmetic mean (default). inverse = coin-margined, average is the harmonic mean (fill quantity is USD notional).
exchangeCode
string
Exchange identifier (optional)
Input schema (JSON)
{
"type": "object",
"required": [
"symbol",
"input"
],
"properties": {
"input": {
"type": "object",
"required": [
"fills"
],
"properties": {
"fills": {
"type": "array",
"items": {
"type": "object",
"required": [
"price",
"quantity"
],
"properties": {
"price": {
"type": "number",
"description": "Fill price"
},
"quantity": {
"type": "number",
"description": "Fill quantity"
}
}
},
"minItems": 1,
"description": "Buy/sell fills to average, each with a price and a quantity (at least 1)"
}
},
"description": "Object with a \"fills\" array, e.g. { \"fills\": [{ \"price\": 60000, \"quantity\": 0.5 }, { \"price\": 58000, \"quantity\": 1 }] }"
},
"symbol": {
"type": "string",
"description": "Trading pair symbol, e.g. BTCUSDT"
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined, average is the arithmetic mean (default). inverse = coin-margined, average is the harmonic mean (fill quantity is USD notional)."
},
"exchangeCode": {
"type": "string",
"description": "Exchange identifier (optional)"
}
}
}
primitive.hedge_ratio
Calculate the short perpetual futures position size needed to hedge a spot holding. USDT-linear only: sizes and costs are in USD, there is no contractType and no coin-margined (inverse) mode. Use when user asks "how much should I short to hedge my BTC?" or "what margin do I need for a 100% hedge?". Returns: hedgeNotional, requiredMargin, estimatedFundingCost.
read-only
Argument
Type
Description
leverage
number
Leverage on the perp short. Default 1.
spotSize*
number
Spot position value in USDT
hedgeRatio
number
Percentage of spot to hedge, e.g. 100 for full hedge, 50 for half. Default 100.
fundingRatePct
number
Current 8h funding rate as percentage, e.g. 0.01. Used for cost estimate.
Input schema (JSON)
{
"type": "object",
"required": [
"spotSize"
],
"properties": {
"leverage": {
"type": "number",
"description": "Leverage on the perp short. Default 1."
},
"spotSize": {
"type": "number",
"description": "Spot position value in USDT"
},
"hedgeRatio": {
"type": "number",
"description": "Percentage of spot to hedge, e.g. 100 for full hedge, 50 for half. Default 100."
},
"fundingRatePct": {
"type": "number",
"description": "Current 8h funding rate as percentage, e.g. 0.01. Used for cost estimate."
}
}
}
system.pubkey
Return the ECDSA P-256 public key (PEM + JWK) and canonical signing format used to sign tool responses, so results can be verified offline without calling back to TradingCalc. Every tools/call result includes a signed second content block when signing is configured; also available at GET /api/mcp/pubkey.
Run the full regression suite: 46 canonical test vectors (linear and inverse/coin-margined) across all 12 calculators, and return a pass/fail report with counts and timestamp. Useful as a health check before relying on results in production workflows.
Should-I-average-down check: for an already-open position, compares adding more at a worse price against the always-available alternative of buying the same final total size fresh at today's price. Returns the new blended average entry, liquidation price and breakeven (before vs. after), margin_added (the actual cash/margin required for the add at this leverage, not the full notional), and three risk figures at your stop-loss: existing_risk (what you already risk, before adding), pyramid_risk (what you'd risk after adding), and clean_entry_risk (what a fresh entry at add_price for the same total size would risk). risk_penalty_pct is how much MORE than that fresh-entry alternative you're risking - for any genuine average-down (add_price worse than existing_entry_price) pyramid_risk is provably always greater than clean_entry_risk. liquidation_before_stop is true when the new liquidation price sits at or beyond your own stop-loss, meaning the exchange would force-close the position before the stop-loss ever triggers. Use when user asks "should I add to this losing position?" or "what does averaging down actually cost me here?".
read-only
Argument
Type
Description
mmr
number
Maintenance margin rate (default 0.005)
side*
string
Trade direction: "long" or "short"
add_size*
number
Additional size being considered, same unit convention as existing_size
leverage*
number
Leverage multiplier
workflow.run_black_scholes
Theoretical European option price and Greeks (delta, gamma, theta, vega, rho) from Black-Scholes, given manual spot/strike/days-to-expiry/volatility/risk-free-rate inputs: no live data fetch. The live variant is workflow.run_black_scholes_live, which applies when checking a real Deribit BTC/ETH instrument, since that variant also reports how far the instrument's actual quoted price sits from what this formula implies. Prices are USD-denominated (the universal convention); callPriceCoin/putPriceCoin additionally divide by spot to match Deribit's own coin-settled quoting convention. Use when user asks "what should this option be worth at X% IV?" or wants raw Greeks for a hypothetical. Returns: callPriceUsd/putPriceUsd, callPriceCoin/putPriceCoin, deltaCall/deltaPut, gamma, vegaPerPct (per 1 vol point), thetaCallPerDay/thetaPutPerDay, rhoCallPerPct/rhoPutPerPct (per 1 rate point).
read-only
Argument
Type
Description
spot*
number
Underlying spot price, USD
strike*
number
Strike price, USD
daysToExpiry*
number
Calendar days until expiry (can be fractional)
volatilityPct*
number
Annualized implied volatility in percentage points, e.g. 60 for 60%
riskFreeRatePct
number
Risk-free rate in percentage points. Default 0: standard crypto-options convention.
workflow.run_black_scholes_live
Black-Scholes theoretical price and Greeks for a REAL, live Deribit BTC/ETH option instrument: pulls that instrument's own spot, strike, days to expiry, and implied volatility from Deribit, then reports how far Deribit's actual quoted mark price sits from what Black-Scholes implies at that IV (priceDiscrepancyPct). This is the trust-check tool: "is this exchange's quoted price consistent with its own volatility assumption?", not an estimate, a live formula cross-check. Use when user gives a specific instrument name (e.g. "BTC-27FEB27-90000-C") and asks "is this option fairly priced?" or "what are the Greeks on this contract?". Returns everything workflow.run_black_scholes does, plus instrumentName, currency, optionType, deribitMarkPriceCoin, deribitMarkIvPct, bsPriceCoin, priceDiscrepancyPct, available (false + error if the instrument name doesn't resolve).
read-only
Argument
Type
Description
instrumentName*
string
Exact Deribit instrument name, e.g. BTC-27FEB27-90000-C. Get one from Deribit's options chain; this tool does not browse the chain, it prices one named instrument.
riskFreeRatePct
number
Risk-free rate in percentage points. Default 0: standard crypto-options convention.
Input schema (JSON)
{
"type": "object",
"required": [
"instrumentName"
],
"properties": {
"instrumentName": {
"type": "string",
"description": "Exact Deribit instrument name, e.g. BTC-27FEB27-90000-C. Get one from Deribit's options chain; this tool does not browse the chain, it prices one named instrument."
},
"riskFreeRatePct": {
"type": "number",
"description": "Risk-free rate in percentage points. Default 0: standard crypto-options convention."
}
}
}
workflow.run_bonding_curve
Pump.fun-style bonding curve calculator: exact tokens received for a buy, price impact, and graduation progress. Pure constant-product math (Uniswap V2 style) using pump.fun's official virtual-reserve constants: no live lookup needed, works for any token still on the curve (not yet graduated to a real AMM pool). Use when user asks "how many tokens do I get buying X SOL on this curve?" or "will this buy graduate the token?". Returns: tokensOut, priceImpactPct, progressPctBefore/After, willGraduate, partialFill (true if the buy exceeds remaining curve capacity).
read-only
Argument
Type
Description
solToSpend*
number
SOL amount for this buy
solRaisedSoFar*
number
SOL already raised on the curve so far (0 for a brand-new token)
Input schema (JSON)
{
"type": "object",
"required": [
"solRaisedSoFar",
"solToSpend"
],
"properties": {
"solToSpend": {
"type": "number",
"description": "SOL amount for this buy"
},
"solRaisedSoFar": {
"type": "number",
"description": "SOL already raised on the curve so far (0 for a brand-new token)"
}
}
}
workflow.run_breakeven_planning
Calculate the break-even exit price that covers all trading fees: this alone, nothing else. Use when user asks only "what price do I need to just break even?" and nothing more. If the user also gave a stop/target or wants a full trade-safety check, use workflow.run_risk_reward or workflow.run_pre_trade_check instead; both already include this breakeven figure plus more. Returns: breakevenPrice, totalFees.
read-only
Argument
Type
Description
side*
string
Trade direction: "long" or "short"
sizeBase*
number
Position size: base asset qty for linear, USD contracts for inverse
entryPrice*
number
Entry price (positive)
feeOpenPct
number
Opening fee fraction, default 0.0002
feeClosePct
number
Closing fee fraction, default 0.0005
contractType
string
linear = USDT-margined (default), inverse = coin-margined. For inverse, totalFees is returned in the base coin.
Market Profile breakout acceptance: did price accept (hold) beyond the value area / range, or reject back inside (fakeout)? Optional buy/sell delta. Use for "did the break above VAH get accepted?". Returns: state, accepted (boolean), direction, confidence, key_levels (VAH/VAL/VPOC), scenario_framing, invalidation level. Candles come from the venue when candles[] is omitted (past sessions are cached, so repeats are fast); supplying candles[] makes the run network-free and reproducible. session_date must be a completed UTC session, before today; a session with no candles returns an error.
read-only
Argument
Type
Description
venue*
string
Exchange to fetch candles from when candles[] not supplied
candles
array
Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied)
timeframe
string
Candle timeframe (default 15m)
instrument*
string
Symbol, e.g. BTCUSDT
prev_candles
array
Optional OHLCV for the previous session
session_date*
string
Session date YYYY-MM-DD (UTC); must be before today (a completed session)
workflow.run_carry_trade
Delta-neutral carry trade (funding arbitrage) analysis, with a profitable/marginal/loss verdict on top of the same math primitive.funding_arb uses. Compared with primitive.funding_arb, this one adds output for the case where a plain-English verdict is wanted, not just the raw numbers. Use when user asks "is this carry trade worth it?": long on exchange A, short on exchange B, collect the funding rate spread. Returns: netYieldPct, grossProfit, netProfit, breakevenDays, verdict (profitable/marginal/loss).
read-only
Argument
Type
Description
notional*
number
Position notional in USDT
hold_days*
number
Hold duration in days
interval_hours
number
Hours between funding payments, one interval for both legs (default 8; 1 for hourly venues; 4 or 2 on some symbols). A leg paid on another interval is entered as its rate times (this interval / its own interval).
transfer_fee_pct
number
One-way transfer fee % (default 0.1)
funding_rate_long*
number
Funding rate on long exchange per interval (decimal)
funding_rate_short*
number
Funding rate on short exchange per interval (decimal)
workflow.run_cointegration
Engle-Granger two-step cointegration test for a pair of price series: do they share a long-run equilibrium relationship (their spread is stationary/mean-reverting)? The standard pairs-trading signal test. Returns the cointegrating regression's hedge ratio (beta) and an ADF t-statistic on the residuals, compared against 1%/5%/10% critical values. Use when user asks "are these two assets cointegrated?" or "is this a valid pairs trade?". Returns: alpha, beta (hedge ratio), t_stat, critical_values, cointegrated (booleans at each significance level).
read-only
Argument
Type
Description
x*
array
Second price series, same length and dates as y
y*
array
First price series (the dependent variable in the cointegrating regression)
Input schema (JSON)
{
"type": "object",
"required": [
"y",
"x"
],
"properties": {
"x": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 20,
"description": "Second price series, same length and dates as y"
},
"y": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 20,
"description": "First price series (the dependent variable in the cointegrating regression)"
}
}
}
workflow.run_compound_funding
Project capital growth from reinvesting perpetual futures funding income (compounding carry). Use when user asks "how much will I make compounding 0.01% funding for 90 days?" or "what's my APY on this carry position?". Funding received is split by reinvestPct (the rest is withdrawn and still counts as earned); funding paid comes out of capital in full, and the capital never goes below 0. Returns: finalCapital, totalWithdrawn, endValue, totalEarned, totalEarnedPct, annualizedAPY, dailyEarnings, snapshots.
read-only
Argument
Type
Description
reinvestPct
number
Percentage of funding received that is reinvested each interval, 0-100 (the rest is withdrawn and counts as earned; funding paid always comes out of capital). 100 = full compounding. Default 100.
durationDays*
number
Number of days to project, up to 3650
intervalHours
number
Hours between funding payments, the period fundingRatePct covers, a whole number of hours that divides 24. Default 8; 1 on Hyperliquid, dYdX, Kraken and Backpack (per-hour rates); 4 or 2 on some symbols.
fundingRatePct*
number
Funding rate per interval as percentage, e.g. 0.01 for 0.01%
initialCapital*
number
Starting capital in USDT
Input schema (JSON)
workflow.run_covered_call_protective_put
Covered call (long the coin + short a call against it, for yield) or protective put (long the coin + long a put, for downside insurance) on a Deribit BTC/ETH position. Returns the standard annualized-yield metric (premium ÷ 1 coin, annualized by 365/daysToExpiry) up front: that number doesn't depend on any price scenario. Also returns the USD value of the combined position at a given scenario price: covered call caps upside at strike + premium×scenarioPrice (the premium's own coin-denominated value still scales with price, unlike a textbook USD-settled cap); protective put floors value at strike×(1−premium), which is the true minimum across every possible settlement price, not just an approximation. Use when user asks "what annualized yield do I get selling covered calls on my BTC?" or "how much does insuring my BTC with a put cost me?". Returns: staticYieldPct, annualizedYieldPct, valueAtScenarioUsd, breakevenPrice (covered_call only), floorValueUsd (protective_put only), vsHoldingUsd (vs. just holding the coin).
read-only
Argument
Type
Description
strike*
number
Option strike, USD
currency
string
Underlying coin. Default BTC.
quantity*
number
Coin units held / contracts (1:1 covered)
strategy*
string
"covered_call" (hold the coin, sell a call against it) or "protective_put" (hold the coin, buy a put as insurance)
spotEntry
workflow.run_cross_venue_arbitrage
Checks 2-5 quotes for the SAME real-world binary bet across venues (or manually-supplied probabilities) for a guaranteed, direction-independent arbitrage: buy "Yes" at whichever venue quotes it cheapest, buy "No" at whichever venue quotes "Yes" most expensively (its own "No" price is assumed to be 1 minus its own "Yes" price, the standard complementary-binary convention). Reports isArbitrage, the cost to lock in $1 of guaranteed payout, guaranteed profit and ROI for a given stake, and which side to buy where. feePctPerLeg is an optional per-leg trading-fee rate that can and does erase a real-looking spread - reported honestly via isArbitrage rather than always showing a positive number. Use when user asks "can I arbitrage this bet across venues?" or "is there a risk-free profit here?". The caller asserts the venues quote the same bet; this tool does not verify that.
read-only
Argument
Type
Description
quotes
array
Live mode: one entry per venue, 2-5 total. Provide this OR manualProbabilitiesPct, not both.
stakeUsd*
number
Total capital to deploy across both legs
feePctPerLeg
number
Optional per-leg trading-fee rate, e.g. 0.02 for 2% (default 0)
manualProbabilitiesPct
array
Manual mode: 2-5 probabilities (0.01-99.99) already known for the same bet across different venues, when you don't want a live fetch. Provide this OR quotes, not both.
Input schema (JSON)
workflow.run_crypto_profit
Profit or loss on a spot crypto trade (coins bought and sold outright, no leverage, no funding) after both fees. Give exactly one of investment (total cash spent, buy fee included) or quantity (coins bought). Each fee is a fraction of that fill's trade value (0.001 = 0.1%): the buy fee is paid on top of the coins' cost, the sell fee comes out of the sale value. For a leveraged perpetual futures position see workflow.run_pnl_planning. Use when user asks "I bought BTC at $X, what is my profit if I sell at $Y?" or "what price do I need to sell at to break even after fees?". Returns: quantity, totalCost, proceeds, totalFees, profit, roiPct and priceChangePct (fractions), priceMultiple, breakevenSellPrice, annualizedReturnPct (a fraction, only when holdingDays is given and is at least 30, null otherwise: annualizing a shorter hold gives meaningless figures).
read-only
Argument
Type
Description
buyPrice*
number
Price paid per coin, in the quote currency (e.g. 60000 for BTC in USD)
quantity
number
Number of coins bought (e.g. 0.5). Give this or investment, not both
buyFeePct
number
Buy fee as a fraction of the trade value, 0 to 0.05 (0.001 = 0.1%). Default 0
sellPrice*
number
Price per coin at the sale, or the price to test, same currency
investment
number
Total cash spent on the buy, buy fee included (e.g. 1000). Give this or quantity, not both
workflow.run_dca_entry
DCA entry planner: weighted average entry price, breakeven, and per-level contribution from multiple fill prices and sizes. Each fill is { price, size } here (primitive.average_entry calls the same field quantity). Compared with primitive.average_entry, this one adds output for the case where breakeven or the per-level breakdown is also wanted, not just the bare average. Use when user bought at several prices and asks "what's my average entry?" or "where is my DCA breakeven?". Returns: averageEntry, breakeven, per-level summary.
read-only
Argument
Type
Description
side*
string
Trade direction: "long" or "short"
entries*
array
Fills to average (2 to 20). Each: { price, size }, e.g. [{ "price": 60000, "size": 0.5 }, { "price": 58000, "size": 1 }]. Size is base-asset quantity for linear, USD notional (contracts) for inverse.
contractType
string
linear = USDT-margined (default), inverse = coin-margined. Each fill's size is USD notional (contracts) for inverse; averageEntry is then the harmonic mean of fill prices, not the arithmetic mean.
fee_open_pct
number
Open fee rate (default 0.0002)
fee_close_pct
number
Close fee rate (default 0.0005)
Input schema (JSON)
workflow.run_dsr
Deflated Sharpe Ratio (Bailey & Lopez de Prado): given how many strategy variants you tried (and how correlated they are), what Sharpe ratio would the *best of N* clear by luck alone, and does your actual strategy still clear that higher bar? Use when user asks "is my backtested Sharpe ratio real, or did I get lucky trying many variants?" or "how many independent trials does this really represent?". Provide either trial_sharpes[] (the N trials' own observed Sharpe ratios, most rigorous) or n_trials (+ optional avg_correlation to correct for correlated trials via Kish's design effect). Two limits to know. n_trials assumes the paper's illustrative case (trial Sharpes with mean 0 and variance 1, in per-period units), which is a very high bar for a low-frequency series: the threshold is about 1.6 at N=10, 2.5 at N=100 and 3.3 at N=1000, while a daily series has a per-period Sharpe of order 0.05, so dsr comes out effectively 0; use trial_sharpes there. trial_sharpes centers the threshold on the trials' own mean Sharpe plus their dispersion times the expected-maximum factor; this answers "does my strategy beat the best of N trials drawn from the spread I observed", not the zero-skill-null variant (mean fixed at 0) used in some texts; the two thresholds differ by exactly the trials' mean Sharpe. Returns: expected_max_sharpe (the luck-alone threshold), dsr (probability your strategy's true Sharpe exceeds it, 0-1), n_trials_effective.
read-only
Argument
Type
Description
returns*
array
The candidate strategy's own return series
n_trials
number
Number of strategy variants tried, if trial_sharpes were not tracked individually. Assumes trial Sharpes with mean 0 and variance 1 (per-period units): too strict for daily series, prefer trial_sharpes there.
trial_sharpes
workflow.run_evt_tail_risk
Extreme Value Theory tail risk (Peaks-Over-Threshold): fits a Generalized Pareto Distribution to the losses beyond a high threshold via Grimshaw's (1993) profile-likelihood MLE, then extrapolates VaR/Expected Shortfall at the requested confidence, without assuming a normal distribution. Use when user asks "what's my tail VaR without assuming normality?" or "how fat is my loss tail, really?". Complements workflow.run_var_cvar (parametric, normal-distribution VaR/CVaR) for exactly the fat-tailed-return case that assumption understates. threshold_percentile (default 90) sets which percentile of the loss distribution (losses = -returns) becomes the threshold u; confidence must be deep enough into the fitted tail (1-confidence < the threshold's own exceedance rate) or the call throws. Returns: threshold, n_exceedances, exceedance_rate, xi (GPD shape: 0=exponential tail, >0=heavy/fat tail, <0=bounded tail; values <= -1 are excluded from the fit domain as a known non-regular/unbounded-likelihood case, Smith 1985), beta (GPD scale), xi_asymptotically_normal (false when xi<=-0.5: the fit is still valid but the usual MLE confidence-interval theory doesn't apply, per that same Smith 1985 result), var, es (null when xi>=1, where Expected Shortfall is mathematically undefined).
read-only
Argument
Type
Description
returns*
array
Return series, one value per period, at least 100 values (POT needs real sample depth in the tail)
confidence
number
VaR/ES confidence level, 0-1 exclusive. Default 0.99. Must satisfy 1-confidence < the threshold's own exceedance rate.
threshold_percentile
number
Percentile (0-100 exclusive) of the loss distribution used as the POT threshold u. Default 90.
workflow.run_exit_target
Calculate the exact exit price needed to hit a target PnL or ROE percentage. Use when user asks "at what price do I take profit to make $500?" or "where should I set TP for 20% ROE?". Returns: targetExitPrice.
read-only
Argument
Type
Description
side*
string
Trade direction: "long" or "short"
leverage*
number
Leverage multiplier
sizeBase*
number
Position size in base asset
entryPrice*
number
Entry price
feeOpenPct
number
Opening fee fraction, default 0.0002
targetMode*
string
"pnl" = target in USDT, "roe" = target in %
feeClosePct
number
Closing fee fraction, default 0.0005
targetValue*
number
Target value (USDT/coin for pnl mode, or %)
workflow.run_forex_average_entry
Size-weighted average entry price across multiple forex fills: plain arithmetic mean, since forex has no coin-margined analog requiring the harmonic mean the crypto average_entry tool uses for inverse contracts. Use when user asks "what's my average entry after these fills?". Returns: totalUnits, totalCost, avgEntry.
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
fills*
array
Fills to average, each with a price and a size in base-currency units
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"fills"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"fills": {
"type": "array",
"items": {
"type": "object",
"required": [
"price",
"units"
],
"properties": {
"price": {
"type": "number",
"description": "Fill price"
},
"units": {
"type": "number",
"description": "Fill size in base-currency units"
}
}
},
"description": "Fills to average, each with a price and a size in base-currency units"
}
}
}
workflow.run_forex_breakeven
Breakeven price for a forex position accounting for spread and round-trip commission, in pips and in price. Commission is quoted per standard lot (100,000 units) and expressed in the pair's own quote currency; because both commission and pip value scale with lot size, the commission-in-pips figure is independent of position size by construction. Use when user asks "where's my true breakeven after spread and commission?". Returns: pipSize, commissionPips, totalCostPips, breakevenPrice.
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
side*
string
Trade direction: "long" or "short"
entryPrice*
number
Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD
spreadPips*
number
Spread at entry, in pips
commissionPerLotRoundTrip
number
Round-trip commission per standard lot, in the pair's own quote currency. Default 0 (pure-spread broker model).
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"side",
"entryPrice",
"spreadPips"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"entryPrice": {
"type": "number",
"description": "Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD"
},
"spreadPips": {
"type": "number",
"description": "Spread at entry, in pips"
},
"commissionPerLotRoundTrip": {
"type": "number",
"description": "Round-trip commission per standard lot, in the pair's own quote currency. Default 0 (pure-spread broker model)."
}
}
}
workflow.run_forex_correlation
Correlation coefficient and minimum-variance hedge ratio between two price series of matching length, computed on daily % returns (not raw price levels, which would give spuriously high correlation between two unrelated but both-trending series). hedgeRatio follows Hull's standard futures-hedging formula: cov(returns1,returns2)/var(returns2), "how many units of series 2 per unit of series 1 minimizes the combined position's variance." No live data fetch: supply the two price series directly. The live variant is workflow.run_forex_correlation_live, which has both series fetched automatically for two named pairs. Use when user already has two price series and wants their statistical relationship. Returns: n, correlation (-1 to 1), hedgeRatio.
read-only
Argument
Type
Description
rates1*
array
First price series, chronological order, one price per date
rates2*
array
Second price series, chronological order, same length and same dates as rates1
Input schema (JSON)
{
"type": "object",
"required": [
"rates1",
"rates2"
],
"properties": {
"rates1": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 5,
"description": "First price series, chronological order, one price per date"
},
"rates2": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 5,
"description": "Second price series, chronological order, same length and same dates as rates1"
}
}
}
workflow.run_forex_correlation_live
Correlation coefficient and minimum-variance hedge ratio between two forex pairs, fetched live: historical daily rates for both pairs over the given lookback window (frankfurter.app's daily ECB reference time series, business days only), aligned by matching date, computed on daily % returns. hedgeRatio follows Hull's standard futures-hedging formula: "how many units of pair2 per unit of pair1 minimizes the combined position's variance." Use when user asks "how correlated are EUR/USD and GBP/USD?" or "what hedge ratio should I use between these two pairs?". Returns: n (overlapping trading days used), correlation (-1 to 1), hedgeRatio, available (false + error if either pair has no data, or too few dates overlap).
read-only
Argument
Type
Description
days
integer
Calendar days to look back, 14-365. Default 30. Business-day-only data means fewer actual points than this number.
pair1*
string
First currency pair in BASE/QUOTE format, e.g. "EUR/USD"
pair2*
string
Second currency pair in BASE/QUOTE format, e.g. "GBP/USD"
Input schema (JSON)
{
"type": "object",
"required": [
"pair1",
"pair2"
],
"properties": {
"days": {
"type": "integer",
"description": "Calendar days to look back, 14-365. Default 30. Business-day-only data means fewer actual points than this number."
},
"pair1": {
"type": "string",
"description": "First currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"pair2": {
"type": "string",
"description": "Second currency pair in BASE/QUOTE format, e.g. \"GBP/USD\""
}
}
}
workflow.run_forex_currency_converter
Converts an amount between currencies using a manually supplied rate: no live data fetch. The live variant is workflow.run_forex_currency_converter_live, which has the rate fetched automatically. Use when user already knows the exact rate they want applied. Returns: converted.
read-only
Argument
Type
Description
rate*
number
Exchange rate to apply (1 unit of source currency = rate units of target currency)
amount*
number
Amount in the source currency
Input schema (JSON)
{
"type": "object",
"required": [
"amount",
"rate"
],
"properties": {
"rate": {
"type": "number",
"description": "Exchange rate to apply (1 unit of source currency = rate units of target currency)"
},
"amount": {
"type": "number",
"description": "Amount in the source currency"
}
}
}
workflow.run_forex_currency_converter_live
Converts an amount between currencies using a live FX rate: TrueFX for its 10 quoted majors (genuinely live tick data), frankfurter.app daily ECB reference rate as the fallback for every other currency pair (30 total). Use when user asks "what's $X worth in EUR?" or any currency conversion where the rate itself isn't already known. Returns: converted, rate, source (truefx/frankfurter/identity), asOf, available (false + error if no rate could be found for that pair).
Free margin and margin level % from account equity and used margin: equity/usedMargin*100, the same stop-out proximity metric every forex platform shows. Returns null (not Infinity) when usedMargin is 0, meaning no open position. Use when user asks "how close am I to a margin call?" or "what's my free margin?". Returns: freeMargin, marginLevelPct.
read-only
Argument
Type
Description
equity*
number
Account equity (balance + floating P&L)
usedMargin*
number
Margin currently locked by open positions. 0 if none.
Input schema (JSON)
{
"type": "object",
"required": [
"equity",
"usedMargin"
],
"properties": {
"equity": {
"type": "number",
"description": "Account equity (balance + floating P&L)"
},
"usedMargin": {
"type": "number",
"description": "Margin currently locked by open positions. 0 if none."
}
}
}
workflow.run_forex_margin_required
Notional and margin required for a forex position, in the pair's own quote currency: no live FX rate needed. Never built for Phase 1 of this domain since a margin figure has no natural currency-neutral form the way pip value does. The live variant is workflow.run_forex_margin_required_live, which applies when the account currency differs from the pair's quote currency. Use when user asks "how much margin do I need for X lots of EUR/USD at 50:1?". Returns: notionalQuote, marginQuote, base, quote.
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
price*
number
Entry or current price
units*
number
Position size in base-currency units
leverage*
number
Leverage multiplier, e.g. 50 for 50:1
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"units",
"price",
"leverage"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"price": {
"type": "number",
"description": "Entry or current price"
},
"units": {
"type": "number",
"description": "Position size in base-currency units"
},
"leverage": {
"type": "number",
"description": "Leverage multiplier, e.g. 50 for 50:1"
}
}
}
workflow.run_forex_margin_required_live
Notional and margin required for a forex position, converted to a given account currency via a live FX rate (same TrueFX/frankfurter.app source as workflow.run_forex_pip_value_live). Use when user asks "how much margin do I need in my account currency?" and the account currency differs from the pair's own quote currency. Returns everything workflow.run_forex_margin_required does, plus accountCurrency, notionalAccount, marginAccount, fxRate, fxSource, available (false + error if no rate could be found).
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
price*
number
Entry or current price
units*
number
Position size in base-currency units
leverage*
number
Leverage multiplier, e.g. 50 for 50:1
accountCurrency*
string
3-letter account currency code, e.g. "GBP"
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"units",
"price",
"leverage",
"accountCurrency"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"price": {
"type": "number",
"description": "Entry or current price"
},
"units": {
"type": "number",
"description": "Position size in base-currency units"
},
"leverage": {
"type": "number",
"description": "Leverage multiplier, e.g. 50 for 50:1"
},
"accountCurrency": {
"type": "string",
"description": "3-letter account currency code, e.g. \"GBP\""
}
}
}
workflow.run_forex_pip_value
Value of 1 pip for a given forex pair and position size, in that pair's own quote currency (e.g. EUR/USD's pip value comes back in USD, USD/JPY's in JPY): no live FX rate needed, since a pair's pip value is naturally denominated in its own quote currency. Pip size is 0.0001 for non-JPY pairs, 0.01 for JPY-quoted pairs, a universal market convention verified against real broker documentation, not broker-specific. The live variant is workflow.run_forex_pip_value_live, which applies when the account currency differs from the pair's quote currency. Use when user asks "what's 1 pip worth on X lots of EUR/USD?". Returns: pipSize, pipValueQuote, base, quote.
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
units*
number
Position size in base-currency units (1 standard lot = 100,000, mini = 10,000, micro = 1,000, nano = 100)
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"units"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"units": {
"type": "number",
"description": "Position size in base-currency units (1 standard lot = 100,000, mini = 10,000, micro = 1,000, nano = 100)"
}
}
}
workflow.run_forex_pip_value_live
Value of 1 pip for a forex pair and position size, converted to a given account currency via a live FX rate: TrueFX for its 10 quoted majors (genuinely live tick data), frankfurter.app daily ECB reference rate as the fallback for every other currency (30 total). Use when user asks "what's 1 pip worth in my account currency?" and the account currency differs from the pair's own quote currency (if it matches, workflow.run_forex_pip_value alone is enough, no live fetch needed). Returns everything workflow.run_forex_pip_value does, plus accountCurrency, pipValueAccount, fxRate, fxSource (truefx/frankfurter/identity), available (false + error if no rate could be found for that currency).
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
units*
number
Position size in base-currency units
accountCurrency*
string
3-letter account currency code, e.g. "GBP"
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"units",
"accountCurrency"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"units": {
"type": "number",
"description": "Position size in base-currency units"
},
"accountCurrency": {
"type": "string",
"description": "3-letter account currency code, e.g. \"GBP\""
}
}
}
workflow.run_forex_pnl
Profit or loss for a closed or hypothetical forex trade, in pips and in the pair's own quote currency, long or short. Use when user asks "what did I make/lose on this trade?" or "what would X pips be worth on Y lots?". Returns: pips (signed, positive favors the position taken), pnlQuote.
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
side*
string
Trade direction: "long" or "short"
units*
number
Position size in base-currency units
exitPrice*
number
Exit price, same quote convention as the entry price
entryPrice*
number
Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"side",
"entryPrice",
"exitPrice",
"units"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"units": {
"type": "number",
"description": "Position size in base-currency units"
},
"exitPrice": {
"type": "number",
"description": "Exit price, same quote convention as the entry price"
},
"entryPrice": {
"type": "number",
"description": "Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD"
}
}
}
workflow.run_forex_position_size_live
Position size (units and standard lots) from a risk amount and stop distance, in a given account currency, via a live FX rate to convert pip value into that currency (same TrueFX/frankfurter.app source as the other forex _live tools). Never has a meaningful account-currency-agnostic form: sizing a position from a risk budget genuinely requires knowing what 1 pip is worth in the currency that budget is denominated in. Use when user asks "how many lots should I trade to risk $X on this setup?". Returns: stopDistancePips, units, lots, pipValuePerUnitAccount, fxRate, fxSource, available (false + error if entry equals stop, or if no rate could be found).
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
stopPrice*
number
Stop-loss price, same quote convention as the entry price
entryPrice*
number
Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD
riskAmount*
number
Amount to risk, in accountCurrency
accountCurrency*
string
3-letter account currency code, e.g. "USD"
Input schema (JSON)
workflow.run_forex_risk_reward
Risk and reward distance in pips from entry/stop/target, and the resulting ratio (reward/risk): a raw number, not a verdict. ratio is null when the stop sits exactly at entry (no risk distance), and also when validSetup is false (stop/target on the wrong side of entry for the given side, e.g. a long with its stop above entry) - check validSetup before trusting the ratio. Use when user asks "what's my risk/reward on this setup?". Returns: riskPips, rewardPips, validSetup, ratio.
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
side*
string
Trade direction: "long" or "short"
stopPrice*
number
Stop-loss price, same quote convention as the entry price
entryPrice*
number
Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD
targetPrice*
number
Take-profit price, same quote convention as the entry price
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"side",
"entryPrice",
"stopPrice",
"targetPrice"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"stopPrice": {
"type": "number",
"description": "Stop-loss price, same quote convention as the entry price"
},
"entryPrice": {
"type": "number",
"description": "Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD"
},
"targetPrice": {
"type": "number",
"description": "Take-profit price, same quote convention as the entry price"
}
}
}
workflow.run_forex_scenario
PnL across a range of hypothetical price moves (in pips, signed by actual price direction, not pre-adjusted for side), for a single forex position size, long or short. Use when user asks "what if price moves X pips in either direction?". Returns: scenarios[] (deltaPips, exitPrice, pnlQuote).
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
side*
string
Trade direction: "long" or "short"
units*
number
Position size in base-currency units
deltasPips*
array
Hypothetical price moves in pips, e.g. [-50, 0, 50]
entryPrice*
number
Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"side",
"entryPrice",
"units",
"deltasPips"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"units": {
"type": "number",
"description": "Position size in base-currency units"
},
"deltasPips": {
"type": "array",
"items": {
"type": "number"
},
"description": "Hypothetical price moves in pips, e.g. [-50, 0, 50]"
},
"entryPrice": {
"type": "number",
"description": "Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD"
}
}
}
workflow.run_forex_swap_cost
Total swap/rollover cost (or credit) for holding a forex position overnight, in the pair's own quote currency: no live FX rate needed. Swap rates are broker-set with no free live feed available, so swapPerLotPerNight is always a manual input (quoted per standard lot, matching how commission is quoted in workflow.run_forex_breakeven), not fetched. Negative = cost (you pay), positive = credit (you receive). The live variant is workflow.run_forex_swap_cost_live, which applies when the account currency differs from the pair's quote currency. Use when user asks "how much will holding this position overnight cost me?". Returns: lots, totalSwapQuote, base, quote.
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
units*
number
Position size in base-currency units
nights*
integer
Number of nights the position is held
swapPerLotPerNight*
number
Swap rate per standard lot (100,000 units) per night, in the pair's quote currency. Negative = cost, positive = credit. Broker-set: get this from the user's broker platform, there is no live source for it.
Input schema (JSON)
{
"type": "object",
"required": [
"pair",
"units",
"swapPerLotPerNight",
"nights"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"units": {
"type": "number",
"description": "Position size in base-currency units"
},
"nights": {
"type": "integer",
"description": "Number of nights the position is held"
},
"swapPerLotPerNight": {
"type": "number",
"description": "Swap rate per standard lot (100,000 units) per night, in the pair's quote currency. Negative = cost, positive = credit. Broker-set: get this from the user's broker platform, there is no live source for it."
}
}
}
workflow.run_forex_swap_cost_live
Total swap/rollover cost (or credit) for holding a forex position overnight, converted to a given account currency via a live FX rate (same TrueFX/frankfurter.app source as the other forex _live tools). swapPerLotPerNight is still always a manual input: swap rates are broker-set, with no free live feed available for them. Use when user asks "how much will holding this position overnight cost me in my account currency?" and it differs from the pair's own quote currency. Returns everything workflow.run_forex_swap_cost does, plus accountCurrency, totalSwapAccount, fxRate, fxSource, available (false + error if no rate could be found).
read-only
Argument
Type
Description
pair*
string
Currency pair in BASE/QUOTE format, e.g. "EUR/USD"
units*
number
Position size in base-currency units
nights*
integer
Number of nights the position is held
accountCurrency*
string
3-letter account currency code, e.g. "GBP"
swapPerLotPerNight*
number
Swap rate per standard lot per night, in the pair's quote currency. Negative = cost, positive = credit.
Input schema (JSON)
workflow.run_funding_arbitrage
Calculate funding rate arbitrage profit: annualized yield, net profit, and breakeven days for a long/short basis trade across two exchanges: the bare numbers only, no plain-English verdict. For the same math plus a profitable/marginal/loss verdict, use workflow.run_carry_trade instead. Use when user asks "is this funding arb worth it?" or "how many days to break even on transfer fees?". Returns: netProfitUsdt, annualizedYieldPct, breakevenDays.
read-only
Argument
Type
Description
durationDays*
number
Holding period in days
positionSize*
number
Position size in USDT
intervalHours
number
Hours between funding payments, one interval for both legs. Default 8; 1 on Hyperliquid, dYdX, Kraken and Backpack (per-hour rates); 4 or 2 on some symbols. A leg paid on another interval is entered as its rate times (this interval / its own interval).
transferFeePct
number
One-time transfer/setup fee as percentage, e.g. 0.1 for 0.1%
longFundingRate*
number
Funding rate on long side (% per interval, positive = you pay)
shortFundingRate*
number
Funding rate on short side (% per interval, positive = you receive)
workflow.run_funding_breakeven
Price move needed to cover funding cost + fees over a holding period. Use when user asks "how much does BTC need to move for me to profit after funding?" or "is funding killing my edge on this trade?". Returns: breakevenWithFunding, breakevenWithoutFunding, requiredMovePct.
read-only
Argument
Type
Description
side*
string
Trade direction: "long" or "short"
size*
number
Position size in base currency
hold_hours*
number
Hold duration in hours
entry_price*
number
Entry price
contractType
string
linear = USDT-margined (default), inverse = coin-margined. size is USD notional (contracts) for inverse; notional/funding_cost/fee_total/total_carry_cost come back denominated in the base coin.
fee_open_pct
number
Open fee rate (default 0.0002)
funding_rate*
number
Funding rate per funding interval (decimal, e.g. 0.0001)
workflow.run_funding_cost
Calculate the total funding cost (or income) for holding a perpetual futures position. Use when user asks "how much funding will I pay holding X days?" or "is funding eating my profit?". Returns: totalCost (positive = you pay, negative = you receive; in the coin for inverse), costPerDay, annualPct, totalPeriods, breakevenShift (size of the price move whose PnL equals the funding: up for a positive rate, down for a negative one, for either side).
read-only
Argument
Type
Description
days*
number
Number of days to hold
side*
string
Trade direction: "long" or "short"
sizeBase*
number
Position size in base asset
entryPrice*
number
Entry price
fundingRate*
number
Funding rate per funding interval as a fraction, e.g. 0.0001 (per 8h unless intervalHours says otherwise)
contractType
string
linear = USDT-margined (default), inverse = coin-margined. For inverse, sizeBase is USD contracts and cost figures come out in the base coin.
intervalHours
workflow.run_garch
GARCH(1,1) volatility model, fit by maximum likelihood on a return series: estimates omega/alpha/beta (the variance-persistence parameters) and forecasts next-period volatility. Use when user asks "what's my GARCH volatility forecast?" or "how persistent is volatility in this return series?". This is a backward-looking statistical fit, not a market prediction guarantee. Returns: mu, omega, alpha, beta, persistence (alpha+beta), unconditional_vol, forecast_vol, loglikelihood.
read-only
Argument
Type
Description
returns*
array
Return series, one value per period, at least 50 values (GARCH needs real sample depth to identify persistence)
Input schema (JSON)
{
"type": "object",
"required": [
"returns"
],
"properties": {
"returns": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 50,
"description": "Return series, one value per period, at least 50 values (GARCH needs real sample depth to identify persistence)"
}
}
}
workflow.run_hurst_exponent
Hurst exponent via rescaled-range (R/S) analysis: is this return/price series trending/persistent (H>0.5, a move tends to be followed by a move in the same direction), mean-reverting/anti-persistent (H<0.5), or consistent with a random walk (H~0.5)? Use when user asks "is this asset trending or mean-reverting?" or "does this series show long-range dependence?". Takes a return series, not raw price levels. Returns: hurst, interpretation (trending/mean_reverting/random_walk), window_sizes, rs_values.
Impermanent loss for a liquidity-pool position: compares providing liquidity against simply holding the same tokens, at a manually-supplied entry and current price. Two modes: full_range (standard 50/50 constant-product pool, the textbook 2*sqrt(k)/(1+k)-1 closed form) or concentrated (a Uniswap-V3-style position confined to [lowerPrice, upperPrice] - IL is always worse than full_range for the same price move when the range is tight, and the position is fully single-asset, no longer earning fees, once price exits the range). impermanentLossPct is always <= 0 and is measured relative to the quote token (dimensionless, exact regardless of what the quote token is); the optional dollar figures additionally assume the quote token's own USD price stayed roughly stable (true for a stablecoin-quoted pool). Use when user asks "how much am I losing to impermanent loss?" or "is this LP position still worth it after fees?". Returns: impermanentLossPct, lpValueMultiplier, hodlValueMultiplier, inRange, lossUsd/netResultUsd (null unless depositValueUsd given).
read-only
Argument
Type
Description
mode
string
Default full_range.
entryPrice*
number
Base token's price in quote-token terms when liquidity was deposited
lowerPrice
number
Range lower bound - required for concentrated mode, must be below entryPrice
upperPrice
number
Range upper bound - required for concentrated mode, must be above entryPrice
currentPrice
workflow.run_impermanent_loss_live
Live variant of workflow.run_impermanent_loss: fetches each token's current live USD price (Solana or any of 5 EVM chains) and derives currentPrice as their ratio, instead of it being supplied manually. entryPrice stays a manual, historical input (a fact the caller must supply, not something a live quote should overwrite), same convention as every other live-capable tool in this product. Use when the caller has the pool's two token addresses but doesn't already know the current price ratio. Returns the same fields as workflow.run_impermanent_loss, plus currentPrice, baseSymbol, quoteSymbol, routable (false + error if either token's price can't be resolved).
read-only
Argument
Type
Description
mode
string
Default full_range.
baseMint*
string
Address of the base token
baseChain
string
Chain of the base (volatile) token. Default solana.
quoteMint*
string
Address of the quote token
entryPrice*
number
Base token's price in quote-token terms when liquidity was deposited (manual - a historical fact)
lowerPrice
number
Range lower bound - required for concentrated mode
workflow.run_implied_volatility
Solves for the volatility that makes Black-Scholes reproduce an observed option price (Newton-Raphson with a bisection fallback for cases where vega is too flat to converge, e.g. deep ITM/OTM or very short-dated). Checks the price against its no-arbitrage bounds first and refuses to solve (converged: false + error) rather than return a garbage number when the price is impossible for the given spot/strike/rate. Use when user asks "what IV does this option price imply?" or gives a market price and wants the volatility, not the reverse. Returns: impliedVolatilityPct, iterations, method (newton-raphson/bisection), converged, identifiable, warning, priceAtSolution. identifiable is false when many volatilities reproduce the price (deep ITM, far OTM): warning then says the returned volatility is one of them. When converged is false, identifiable is false and error explains.
read-only
Argument
Type
Description
spot*
number
Underlying spot price, USD
strike*
number
Strike price, USD
optionType*
string
Option type: "call" or "put"
daysToExpiry*
number
Calendar days until expiry (can be fractional)
targetPriceUsd*
number
The observed option price, USD, to solve the implied volatility from
workflow.run_kelly_frontier
Kelly growth-security frontier (MacLean, Ziemba & Blazenko 1992): for a strategy compounding at a fraction lambda of full Kelly, the probability wealth ever falls to a fraction alpha of its starting value is P = alpha^(2/lambda-1). Provide either lambda_fraction (to compute that probability) or max_probability (to solve for the largest lambda that keeps the ruin probability at or below it). Use when user asks "if I bet half-Kelly, what's my chance of ever losing half my bankroll?" or "what fraction of Kelly keeps my chance of a 50% drawdown under 5%?". Valid lambda range is (0, 2]; beyond 2 the probability is certain (1), not the raw formula value. Returns: probability, lambda_fraction (echoed or solved).
read-only
Argument
Type
Description
alpha*
number
Fraction of starting capital, 0-1 exclusive (e.g. 0.5 = "ever falls to half my starting bankroll")
lambda_fraction
number
Fraction of full Kelly being bet (1 = full Kelly, 0.5 = half Kelly). Provide this OR max_probability, not both.
max_probability
number
Target ceiling on the ruin probability, 0-1 exclusive. Provide this to solve for the safe lambda_fraction instead of supplying it directly.
Input schema (JSON)
{
"type": "object",
"required": [
"alpha"
],
"properties": {
"alpha": {
"type": "number",
"description": "Fraction of starting capital, 0-1 exclusive (e.g. 0.5 = \"ever falls to half my starting bankroll\")"
},
"lambda_fraction": {
"type": "number",
"description": "Fraction of full Kelly being bet (1 = full Kelly, 0.5 = half Kelly). Provide this OR max_probability, not both."
},
"max_probability": {
"type": "number",
"description": "Target ceiling on the ruin probability, 0-1 exclusive. Provide this to solve for the safe lambda_fraction instead of supplying it directly."
}
}
}
workflow.run_liquidation_safety
Calculate the liquidation price for an isolated-margin futures position with one flat maintenance margin rate (mmr, which you supply from your exchange's tier). It is a generic flat-rate model, for linear and inverse alike, not any one exchange's engine: no tiered maintenance amounts, no liquidation fee, no cross-margin (shared collateral) logic, so it does not apply to cross-margin accounts and can differ from an exchange's own figure. Use when user asks "where will I get liquidated?" or "how close is my liq price?". Returns: liquidationPrice, distancePct (how far from entry).
Compares two tokens' live market caps (Solana or any of 5 EVM chains; the two tokens can be on different chains) and projects what an investment would be worth if the first token's market cap matched the second's. Narrative-agnostic ("if X reaches Y's market cap"): works for any token pair, not tied to one hype cycle or one chain. A snapshot ratio, not a forecast: assumes fixed supply on both sides. Use when user asks "what if this token reaches [other token]'s market cap?". Returns: multiplier, projectedValueUsd, projectedPriceUsd, profitUsd, comparable (false + error if either market cap can't be resolved).
read-only
Argument
Type
Description
tokenMint*
string
Address of the token you hold or are evaluating (base58 for Solana, 0x... for EVM chains)
tokenChain
string
Chain of the token you hold. Default solana.
compareToMint*
string
Address of the token whose market cap to compare against
investmentUsd*
number
Investment amount in USD
compareToChain
string
Chain of the comparison token. Default solana. Can differ from tokenChain.
Input schema (JSON)
{
"type": "object",
"required": [
"tokenMint",
"compareToMint",
"investmentUsd"
],
"properties": {
"tokenMint": {
"type": "string",
"description": "Address of the token you hold or are evaluating (base58 for Solana, 0x... for EVM chains)"
},
"tokenChain": {
"enum": [
"solana",
"ethereum",
"base",
"bsc",
"arbitrum",
"polygon"
],
"type": "string",
"description": "Chain of the token you hold. Default solana."
},
"compareToMint": {
"type": "string",
"description": "Address of the token whose market cap to compare against"
},
"investmentUsd": {
"type": "number",
"description": "Investment amount in USD"
},
"compareToChain": {
"enum": [
"solana",
"ethereum",
"base",
"bsc",
"arbitrum",
"polygon"
],
"type": "string",
"description": "Chain of the comparison token. Default solana. Can differ from tokenChain."
}
}
}
workflow.run_market_implied_odds
Reads Kalshi's full live BTC or ETH year-end price ladder (a set of mutually-exclusive prediction markets covering the whole price range) and reports what the market itself implies: the median (50th-percentile) price bucket, the single most-likely (mode) bucket, and the probability of ending the year at or above any real bucket boundary. Deliberately does not compute an expected value or interpolate inside a bucket: the top/bottom buckets are open-ended, so any point estimate there would need an invented assumption; every number this tool returns traces back to one live, sourced price. Use when user asks "what does the market think BTC will be worth by year end?" or "what are the odds ETH ends the year above $X?". Returns: buckets[] (label, floor, cap, probabilityPct), medianBucketLabel, modeBucketLabel, vigPct, probabilityAtOrAbovePct + snappedThresholdUsd (only when thresholdUsd is supplied).
read-only
Argument
Type
Description
coin
string
Which coin's year-end ladder to read. Default BTC.
thresholdUsd
number
Optional price threshold: returns the probability of ending the year at or above the nearest real bucket boundary at or below this value.
Input schema (JSON)
{
"type": "object",
"required": [],
"properties": {
"coin": {
"enum": [
"BTC",
"ETH"
],
"type": "string",
"description": "Which coin's year-end ladder to read. Default BTC."
},
"thresholdUsd": {
"type": "number",
"description": "Optional price threshold: returns the probability of ending the year at or above the nearest real bucket boundary at or below this value."
}
}
}
workflow.run_max_leverage
Calculate the maximum safe leverage based on account size, max acceptable drawdown, and asset daily volatility. Use when user asks "what's the max leverage I should use on BTC?" or "how much leverage is safe given 3% daily volatility?". Returns: maxLeverage (maxDrawdownPct / (volatilityPct + mmr x 100), rounded down to 0.1, never below 1x), marginAtRisk (accountSize x maxDrawdownPct / 100, in USDT), safeMargin (USDT) and liquidationBuffer (percent). maxDrawdownPct and volatilityPct are percents (10 means 10%); mmr is a fraction (0.005 is 0.5%).
read-only
Argument
Type
Description
mmr
number
Maintenance margin rate, default 0.005 (0.5%)
accountSize*
number
Total account size in USDT
volatilityPct*
number
Expected daily price volatility as percentage, e.g. 3 for 3%
maxDrawdownPct*
number
Maximum acceptable drawdown as percentage, e.g. 10 for 10%
Input schema (JSON)
{
"type": "object",
"required": [
"accountSize",
"maxDrawdownPct",
"volatilityPct"
],
"properties": {
"mmr": {
"type": "number",
"description": "Maintenance margin rate, default 0.005 (0.5%)"
},
"accountSize": {
"type": "number",
"description": "Total account size in USDT"
},
"volatilityPct": {
"type": "number",
"description": "Expected daily price volatility as percentage, e.g. 3 for 3%"
},
"maxDrawdownPct": {
"type": "number",
"description": "Maximum acceptable drawdown as percentage, e.g. 10 for 10%"
}
}
}
workflow.run_odds_converter
Converts one probability into decimal odds, American odds, and breakeven win rate: either from a manually supplied probability, or from one market read live from Kalshi, Polymarket, ADI Predictstreet, Limitless, or Myriad (five independent crypto-price prediction market venues, all public keyless market data). One market on one venue per call; it does not compare prices across venues (to compare the same bet on two or more venues, see workflow.run_spread_reader). When a Kalshi, Polymarket, Limitless, or Myriad source is supplied, also returns the vig (the exchange's built-in edge), computed from the market's own YES+NO prices, not estimated; ADI Predictstreet's crypto contracts currently have no live trading volume on any venue, so this returns available:false with an explanation rather than a fake price (use workflow.run_window_fair_value for a theoretical price on those instead). Use when user asks "what odds does a 35% probability work out to?" or "what's the vig on this Kalshi/Polymarket/Limitless/Myriad market?". Provide exactly one of probability/kalshiTicker/polymarketSlug/adiSymbol/limitlessSlug/myriadSlug. Returns: probability, decimalOdds, americanOdds, breakevenWinRatePct, vigPct (null unless a live two-sided source was used), source (manual/kalshi/polymarket/adi/limitless/myriad), identifier, label.
read-only
Argument
Type
Description
adiSymbol
string
An ADI Predictstreet market symbol (e.g. BTC1D-20260920T0000). Currently always returns available:false; these contracts have no live trading volume yet.
myriadSlug
string
A Myriad Markets market slug, from the market URL (e.g. eth-at-three-digits-when-bitcoin-goes-below-50k), to fetch a live price from. On-chain (Abstract L2); not every market has a Yes/No outcome, some are multi-outcome ladders.
probability
workflow.run_open_analysis
Market Profile open analysis: where and how price opened vs the prior session value area. Use for "how did BTC open today?" / "what does the open imply for the session?". Returns: open_location, open_type (OD/OTD/ORR/OAIR) with description/implication, confidence, key_levels (VAH/VAL/VPOC/IB), tails (session-high/low rejection tails and single prints), scenario_framing (bullish/bearish/neutral), invalidation level. Candles come from the venue when candles[] is omitted (past sessions are cached, so repeats are fast); supplying candles[] makes the run network-free and reproducible. session_date must be a completed UTC session, before today; a session with no candles returns an error.
read-only
Argument
Type
Description
venue*
string
Exchange to fetch candles from when candles[] not supplied
candles
array
Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied)
timeframe
string
Candle timeframe (default 15m)
instrument*
string
Symbol, e.g. BTCUSDT
prev_candles
array
Optional OHLCV for the previous session
session_date*
string
Session date YYYY-MM-DD (UTC); must be before today (a completed session)
workflow.run_options_payoff
Payoff, P&L, and breakeven price for a single-leg Deribit BTC/ETH option (long or short call/put) at a given scenario price at expiry. Deribit BTC/ETH options are coin-settled: premium, P&L, and the max profit/loss caps come back denominated in the base coin (BTC/ETH), not USD; a scenarioPnlUsd convenience field converts the coin P&L back to USD at the scenario price. Coin settlement means a long call's upside is capped (max profit = 1 − premium per unit, not unlimited) while a long put's upside is technically unbounded as price falls toward zero, the mirror image of a USD-settled option's payoff shape, not a bug. Use when user asks "what does my BTC call/put pay off at price X?" or "where's my breakeven on this option?". Returns: intrinsicPerUnitCoin, scenarioPnlCoin, scenarioPnlUsd, breakevenPrice, maxLossCoin/maxProfitCoin (null = unbounded), isProfitable.
read-only
Argument
Type
Description
strike*
number
Strike price in USD
currency
string
Underlying coin. Default BTC.
position*
string
Option position: "long" (bought) or "short" (sold)
quantity*
number
Number of contracts (Deribit BTC/ETH options have contract_size 1.0, so this is coin-denominated size)
optionType*
string
Option type: "call" or "put"
workflow.run_orderbook_impact
Order-book "walk the book" impact/capacity: given order-book levels (price, size in base-asset units) and EITHER a target notional or an impact budget in bps, computes VWAP and price impact for that size, or (via bisection) the largest notional that stays inside the impact budget. Use when user asks "what's my price impact if I trade $X" or "how much can I trade before impact exceeds Y bps". side="buy" walks the asks, side="sell" walks the bids; impact is measured from the book's own mid ((best_bid+best_ask)/2) and is always a positive "cost in bps" number regardless of side. Returns: mid_price, spread_bps, vwap, impact_bps - both null when EITHER the loaded book doesn't cover the requested notional (book_sufficient=false flags this specific case) OR the notional involved is ~0 (book_sufficient stays true then; happens for a near-zero notional_usd, or in capacity mode when even an infinitesimal trade already exceeds impact_budget_bps, in which case max_notional itself resolves to 0) - and in capacity mode, max_notional plus capacity_is_lower_bound (true if the ENTIRE supplied book was consumed within budget, meaning true market capacity may exceed what was supplied - this tool only sees the levels given to it).
read-only
Argument
Type
Description
asks*
array
Ask levels as [price, size_base] pairs, any order
bids*
array
Bid levels as [price, size_base] pairs, any order
side*
string
"buy" walks the asks, "sell" walks the bids
notional_usd
number
workflow.run_pnl_planning
Calculate net PnL, ROE, fees and gross profit/loss for a futures trade. Use when user asks "what's my profit/loss on this trade?" Returns: grossPnl, fees, netPnl, netPnlUsdt, roe (%), maxLossBound (only non-null for an inverse/coin-margined short: the finite ceiling on net coin-denominated loss as price rises without limit, (size/entryPrice)×(1+feeOpenPct) - includes the opening fee, since it survives the exit-price-to-infinity limit while the closing fee vanishes - null for every other side/contractType combination, which either has no such bound or a trivial one).
read-only
Argument
Type
Description
side*
string
Trade direction
size*
number
Position size: base asset qty for linear, USD contracts for inverse
exitPrice*
number
Exit price (positive)
entryPrice*
number
Entry price (positive)
feeOpenPct
number
Opening fee as fraction, e.g. 0.0002 = 0.02%
feeClosePct
number
Closing fee as fraction
contractType
string
workflow.run_portfolio_risk
Aggregates risk across multiple open positions in one call: total notional, total P&L, total margin in use, margin usage as a % of account balance (if given), and which single position sits closest to liquidation. Each position is computed through the same canonical PnL/liquidation math as the single-position tools, then rolled up. Linear (USDT-margined) positions sum into one USD total; inverse (coin-margined) positions are grouped by settlement coin instead, since a BTC-margined P&L cannot be summed with an ETH-margined one without a live conversion rate. Returns a verdict: healthy / watch / reduce / critical, driven by the closest liquidation distance and margin usage. Use when user asks "how exposed am I across all my positions?" or "which of my positions is closest to liquidation?". Position size follows the product-wide convention: base-asset quantity for linear, USD notional (contracts) for inverse.
read-only
Argument
Type
Description
positions*
array
Open positions to aggregate (1 to 50). Each: { side, entry_price, mark_price, size, leverage }, plus optional fees, mmr, contractType, coin, label.
account_balance
number
Optional account balance in USD, used to compute margin_usage_pct: linear margin plus every inverse position's own margin marked to market at its mark_price, all as one USD total
Input schema (JSON)
{
"type": "object",
"required": [
"positions"
],
"properties": {
"positions": {
"type": "array",
"items": {
"type": "object",
"required": [
"side",
"entry_price",
"mark_price",
"size",
"leverage"
],
"properties": {
"mmr": {
"type": "number",
"description": "Maintenance margin rate (default 0.005)"
},
"coin": {
"type": "string",
"description": "Settlement coin, required when contractType is inverse (e.g. \"BTC\", \"ETH\")"
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"size": {
"type": "number",
"description": "Position size: base-asset quantity for linear, USD notional (contracts) for inverse"
},
"label": {
"type": "string",
"description": "Optional label to identify this position in the response (defaults to \"Position N\")"
},
"leverage": {
"type": "number",
"description": "Leverage multiplier"
},
"mark_price": {
"type": "number",
"description": "Current mark/last price"
},
"entry_price": {
"type": "number",
"description": "Entry price"
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined (default), inverse = coin-margined (e.g. Bybit BTCUSD)"
},
"fee_open_pct": {
"type": "number",
"description": "Open fee rate (default 0.0002)"
},
"fee_close_pct": {
"type": "number",
"description": "Close fee rate (default 0.0005)"
}
}
},
"maxItems": 50,
"minItems": 1,
"description": "Open positions to aggregate (1 to 50). Each: { side, entry_price, mark_price, size, leverage }, plus optional fees, mmr, contractType, coin, label."
},
"account_balance": {
"type": "number",
"description": "Optional account balance in USD, used to compute margin_usage_pct: linear margin plus every inverse position's own margin marked to market at its mark_price, all as one USD total"
}
}
}
workflow.run_portfolio_tearsheet
Core risk/return tearsheet from a single return series: annualized return (compounded, not linear) and volatility, Sharpe (plain + Lo 2002-corrected + Pezier-White skew/kurtosis-adjusted), Sortino, max drawdown, Calmar ratio, the drawdown-ratio cluster (Ulcer Index/Martin ratio, Pain Index/Pain ratio, Burke ratio + modified), Omega-Sharpe ratio, Upside Potential Ratio, skewness, kurtosis, Probabilistic Sharpe Ratio, win rate, best/worst single-period return. Use when user asks for a full risk summary/report on a strategy or portfolio's returns, not just one metric. Returns all of the above in one call. Returns are decimals (0.02 is 2%), at least 3 periods; the call returns an error when the series never draws down (Calmar undefined) or no period falls below mar (Sortino undefined).
read-only
Argument
Type
Description
mar
number
Minimum acceptable return for the Sortino ratio, same periodicity as returns (default 0)
returns*
array
Return series, one value per period
benchmark_sharpe
number
Benchmark Sharpe ratio for the PSR figure, same periodicity as returns (default 0)
periods_per_year
number
Periods per year for annualization (default 365). Any number from 1 to 100 million, e.g. 365.25.
Input schema (JSON)
{
"type": "object",
"required": [
"returns"
],
"properties": {
"mar": {
"type": "number",
"description": "Minimum acceptable return for the Sortino ratio, same periodicity as returns (default 0)"
},
"returns": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 3,
"description": "Return series, one value per period"
},
"benchmark_sharpe": {
"type": "number",
"description": "Benchmark Sharpe ratio for the PSR figure, same periodicity as returns (default 0)"
},
"periods_per_year": {
"type": "number",
"maximum": 100000000,
"minimum": 1,
"description": "Periods per year for annualization (default 365). Any number from 1 to 100 million, e.g. 365.25."
}
}
}
workflow.run_position_sizing
Calculate the correct position size given a maximum risk in USDT and a stop-loss price. Use when user asks "how many coins should I buy?" or "size my position so I risk exactly $X". Returns: positionSize (base), positionUsdt, marginRequired.
read-only
Argument
Type
Description
side*
string
Trade direction: "long" or "short"
leverage
number
Leverage, default 1
riskUsdt*
number
Maximum acceptable loss in USDT
stopLoss*
number
Stop-loss price
entryPrice*
number
Entry price
feeOpenPct
number
Opening fee fraction, default 0.0002
feeClosePct
number
Closing fee fraction, default 0.0005
contractType
string
linear = USDT-margined (default), inverse = coin-margined. For inverse, sizeQuote is USD contracts and margin is returned in the base coin.
workflow.run_pre_trade_check
Full pre-trade decision card: orchestrates position sizing, breakeven, liquidation, and funding cost in one call. Use when user describes a full trade setup and asks "should I take this trade?" or "run the numbers on this setup". Provide exchange+symbol to fetch live funding rate automatically. For an R:R-graded verdict on an entry, stop and target, see workflow.run_risk_reward. Returns: positionSize, breakeven, liquidationPrice, fundingCost, overnightBreakevenShift, verdict.
read-only
Argument
Type
Description
mmr
number
Maintenance margin rate, default 0.005
side*
string
Trade direction: "long" or "short"
symbol
string
Perpetual symbol, e.g. "BTCUSDT".
exchange
string
Exchange code, e.g. "binance" or "bybit". Used to fetch the live funding rate if funding_rate is omitted, and to set funding_interval_hours when that is omitted (1 for Hyperliquid, dYdX, Kraken and Backpack, whose rates are per hour; pass funding_interval_hours: 8 if you supply a rate that is per 8 hours). With funding_rate omitted and fetched live, funding_interval_hours is ignored and the interval the exchange reports for the symbol is used.
leverage*
number
Leverage multiplier
risk_pct*
number
workflow.run_prediction_market_edge
Compares your own probability estimate for an event against a prediction market's price (manual entry, or a live Kalshi ticker, Limitless slug, or Myriad slug) and sizes a bet using fractional Kelly criterion bet sizing (default: quarter-Kelly, a standard conservative haircut on full Kelly, stated explicitly as a convention). Returns zero recommended stake whenever your probability doesn't exceed the market's price: no edge, no bet. Use when user asks "does this bet have edge?" or "how much should I stake given my probability estimate vs the market's?". Provide exactly one of marketProbabilityPct/kalshiTicker/limitlessSlug/myriadSlug. Returns: edgePct, evPerDollarStaked, fullKellyFraction, cappedKellyFraction, recommendedStakeUsd, verdict (skip_this_one/think_twice/worth_the_risk/take_it).
read-only
Argument
Type
Description
myriadSlug
string
A Myriad Markets market slug to fetch the market probability from live instead of supplying it manually. Not every market has a Yes/No outcome.
bankrollUsd*
number
Bankroll available for this bet, in USD
kalshiTicker
string
A Kalshi market ticker to fetch the market probability from live instead of supplying it manually.
limitlessSlug
string
A Limitless Exchange market slug to fetch the market probability from live instead of supplying it manually.
kellyFractionCap
number
workflow.run_price_consensus
Cross-exchange agreement check for one perpetual futures price: fetches the same asset USDT/USDC-margined perpetual from a reference set of 7 liquid exchanges (Binance, Bybit, OKX, Gate, KuCoin, Hyperliquid, MEXC; the chosen one is compared against the rest) and reports the median of the others, the spread across all, and how far the chosen exchange sits from that median. Says the exchanges disagree instead of guessing: status is agree (under 0.25%), warn (0.25% to 1%), diverge (1% or more) or insufficient (fewer than 3 other exchanges returned a comparable contract; inverse, dated and unlisted contracts are not compared, and that is not a verdict on the price). Use before acting on a live price: "is this Bybit BTC price in line with the market?" Symbol is the perp symbol as that exchange names it (e.g. BTCUSDT on bybit, ETH-USDT-SWAP on okx). Returns: status, summary, median, peerMedian, spreadPct, deviationPct, sources, quotes (price per exchange), thresholds_pct, as_of.
read-only
Argument
Type
Description
symbol*
string
That exchange's own perpetual symbol, e.g. BTCUSDT (bybit/binance), ETH-USDT-SWAP (okx), BTCUSDC (hyperliquid)
exchange*
string
Exchange code of the price being checked, e.g. bybit, binance, okx, gate, kucoin, hyperliquid, mexc
Input schema (JSON)
{
"type": "object",
"required": [
"exchange",
"symbol"
],
"properties": {
"symbol": {
"type": "string",
"description": "That exchange's own perpetual symbol, e.g. BTCUSDT (bybit/binance), ETH-USDT-SWAP (okx), BTCUSDC (hyperliquid)"
},
"exchange": {
"type": "string",
"description": "Exchange code of the price being checked, e.g. bybit, binance, okx, gate, kucoin, hyperliquid, mexc"
}
}
}
workflow.run_risk_parity
Risk-parity (equal or custom risk contribution) portfolio weights for N assets: given a covariance matrix (or N return series to compute one from), finds long-only weights where each asset contributes its target share of total portfolio risk. Use when user asks "what weights give each asset equal risk contribution?" or "how do I risk-parity-weight this portfolio?". A portfolio-construction calculation, not a buy/sell recommendation. Returns: weights, risk_contributions (should match risk_budgets exactly at convergence), portfolio_volatility.
read-only
Argument
Type
Description
returns
array
One return series per asset (2+ assets, all series the same length). Provide this OR covariance, not both.
covariance
array
Direct NxN covariance matrix, if not supplying returns[][] directly.
risk_budgets
array
Target risk share per asset, one per asset (need not sum to 1, normalized internally). Default: equal (1/N each).
Input schema (JSON)
{
"type": "object",
"properties": {
"returns": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "number"
}
},
"description": "One return series per asset (2+ assets, all series the same length). Provide this OR covariance, not both."
},
"covariance": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "number"
}
},
"description": "Direct NxN covariance matrix, if not supplying returns[][] directly."
},
"risk_budgets": {
"type": "array",
"items": {
"type": "number"
},
"description": "Target risk share per asset, one per asset (need not sum to 1, normalized internally). Default: equal (1/N each)."
}
}
}
workflow.run_risk_reward
Full risk:reward analysis: takes a trade with entry, stop, AND target (all three). Calculates R:R ratio, position size, liquidation price, breakeven, and P&L at both stop and target. Returns a verdict: strong (3:1+) / good (2:1+) / marginal / poor, specifically graded on the R:R ratio. For a full setup check tied to a live exchange/symbol (including funding cost), see workflow.run_pre_trade_check; its verdict covers overall setup safety, not just R:R. Use when user asks "is this trade worth taking?" or "what's my risk reward on this setup?".
read-only
Argument
Type
Description
mmr
number
Maintenance margin rate (default 0.005)
side*
string
Trade direction: "long" or "short"
leverage*
number
Leverage multiplier
risk_pct*
number
Max risk as % of account
stop_loss*
number
Stop-loss price
entry_price*
number
Entry price
take_profit*
number
Take-profit price
workflow.run_scale_out
Scale-out planner: P&L, ROI, and cumulative P&L for each partial exit level. Use when user wants to take profit at multiple targets: "close 30% at $90k, 30% at $95k, 40% at $100k, what's my total P&L?". Returns: per-level pnl, weightedAvgExitPrice, totalRoi.
read-only
Argument
Type
Description
side*
string
Trade direction: "long" or "short"
exits*
array
Partial exit levels (2 to 10). Each: { price, pct }, e.g. [{ "price": 90000, "pct": 30 }, { "price": 95000, "pct": 70 }]; the pct values must not sum to more than 100.
total_size*
number
Total position size in base currency
entry_price*
number
Entry price
contractType
string
linear = USDT-margined (default), inverse = coin-margined. total_size is USD notional (contracts) for inverse, and per-level pnl comes back denominated in the base coin.
fee_open_pct
number
Open fee rate (default 0.0002)
fee_close_pct
number
Close fee rate (default 0.0005)
workflow.run_scenario_planning
Run a scenario analysis: compute PnL for multiple price-change percentages at once. Use when user asks "show me my P&L if BTC moves -10%, -5%, +5%, +10%". Returns: array of { deltaPct, exitPrice, netPnl, roe }.
read-only
Argument
Type
Description
side*
string
Trade direction: "long" or "short"
size*
number
Position size in base asset
deltasPct*
array
List of price change percentages, e.g. [-10, -5, 0, 5, 10]. Must be at least -100 (exactly -100 only for linear contracts; inverse contracts need more than -100)
entryPrice*
number
Entry price
feeOpenPct
number
Opening fee fraction
feeClosePct
number
Closing fee fraction
contractType
string
linear = USDT-margined (default), inverse = coin-margined. For inverse, size is USD contracts and pnl/fees come out in the base coin.
Input schema (JSON)
workflow.run_session_structure
Market Profile day-type classifier: trend / balance / neutral_trend / normal / normal_var, from TPO, initial balance, range extension and value migration. Use for "is this a trend day or a balance day?". Returns: structure (the day-type label), description, bias, key_signals, key_levels (VAH/VAL/VPOC/IB/session high-low), tails (session-high/low rejection tails and single prints), scenario_framing, invalidation level. Candles come from the venue when candles[] is omitted (past sessions are cached, so repeats are fast); supplying candles[] makes the run network-free and reproducible. session_date must be a completed UTC session, before today; a session with no candles returns an error.
read-only
Argument
Type
Description
venue*
string
Exchange to fetch candles from when candles[] not supplied
candles
array
Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied)
timeframe
string
Candle timeframe (default 15m)
instrument*
string
Symbol, e.g. BTCUSDT
prev_candles
array
Optional OHLCV for the previous session
session_date*
string
Session date YYYY-MM-DD (UTC); must be before today (a completed session)
workflow.run_sharpe_stats
Sharpe ratio with the Lo (2002) serial-correlation-aware annualization correction, computed in its lag-1 form rather than the full multi-lag sum (the naive sqrt(periods_per_year) scaling overstates or understates the true annualized Sharpe when returns are autocorrelated), plus the Probabilistic Sharpe Ratio (Bailey & Lopez de Prado): the probability the true Sharpe exceeds a benchmark, adjusted for the sample's skewness/kurtosis and length, not just its point estimate. Use when user asks "what's my real annualized Sharpe, not the naive one?" or "how confident can I be this Sharpe ratio is actually good?". Returns: sharpe_period, sharpe_annualized_naive, sharpe_annualized_lo, autocorrelation_lag1, psr, skewness, kurtosis.
read-only
Argument
Type
Description
returns*
array
Return series, one value per period
benchmark_sharpe
number
Benchmark Sharpe ratio for the PSR test, same periodicity as returns (default 0)
periods_per_year
number
Periods per year for annualization (default 365, crypto convention - trades every day). Any number from 1 to 100 million, e.g. 365.25.
Input schema (JSON)
{
"type": "object",
"required": [
"returns"
],
"properties": {
"returns": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 3,
"description": "Return series, one value per period"
},
"benchmark_sharpe": {
"type": "number",
"description": "Benchmark Sharpe ratio for the PSR test, same periodicity as returns (default 0)"
},
"periods_per_year": {
"type": "number",
"maximum": 100000000,
"minimum": 1,
"description": "Periods per year for annualization (default 365, crypto convention - trades every day). Any number from 1 to 100 million, e.g. 365.25."
}
}
}
workflow.run_spread_payoff
Payoff, breakeven(s), and max profit/loss for a Deribit BTC/ETH vertical spread (2 legs, same option type, opposite direction, e.g. a bull call spread) or an iron condor/butterfly (4 legs: 2 calls + 2 puts) at a scenario price. Coin-settled, and the max profit/loss are genuinely NOT the flat, textbook USD-settled values: because each leg's own payoff is divided by the settlement price, (1) a debit vertical spread's peak payoff occurs exactly at its short strike, not "anywhere beyond it" - and its profit is a finite WINDOW that closes again at a high enough price, decaying back toward a full loss of the premium paid, and (2) an iron condor/butterfly's max loss is genuinely UNBOUNDED toward price->0 (maxLossCoin: null) if it has a put wing, unlike the "capped at wing width" USD-settled result - only the call side is actually bounded. Use when user asks about a bull/bear call/put spread, vertical spread, iron condor, or iron butterfly, e.g. "what's my max loss on this BTC call spread?" or "where do my iron condor breakevens sit?". Returns: structureType (vertical_spread/iron_condor/iron_butterfly, inferred from the legs given), netDebitCoin (negative = credit received), scenarioPayoffCoin, scenarioPnlCoin/Usd, breakevenPrices (0-3, ascending), maxLossCoin/maxProfitCoin (null = unbounded), isProfitable.
read-only
Argument
Type
Description
legs*
array
Exactly 2 legs (same option type, opposite position - a vertical spread) or 4 legs (2 calls + 2 puts - an iron condor/butterfly). Each leg: { optionType: call|put, position: long|short, strike: number, premiumCoin: number }.
currency
string
Underlying coin. Default BTC.
quantity*
number
Number of spread/condor units
workflow.run_spread_reader
Reads the same real-world bet's live price from 2-5 prediction-market venues at once (Kalshi, Polymarket, ADI Predictstreet, Limitless, Myriad) in a single call and reports the spread between the cheapest and most expensive. Takes every venue's identifier together in quotes[], for example one Kalshi ticker and one Polymarket slug for the same bet, and returns the venue with the lowest yes midpoint price, before fees and depth. The caller supplies each venue's own identifier for what they've confirmed is the same underlying bet; this tool never auto-matches events across venues, only reads and compares prices for identifiers you provide. For the odds, breakeven win rate or vig of a single market, see workflow.run_odds_converter. Use when user asks "is this bet priced differently on Kalshi vs Polymarket?" or "which venue has the best price on this?". Returns: quotes[] (venue, identifier, label, probabilityPct, available, error), availableCount, cheapestVenue, mostExpensiveVenue, spreadPct (percentage points, null if fewer than 2 quotes resolved).
read-only
Argument
Type
Description
quotes*
array
One entry per venue you want to compare: 2 to 5 total, all in this one call (a Kalshi ticker and a Polymarket slug for the same bet are two entries). Each must genuinely be the same real-world bet; this tool does not verify that for you.
Input schema (JSON)
{
"type": "object",
"required": [
"quotes"
],
"properties": {
"quotes": {
"type": "array",
"items": {
"type": "object",
"required": [
"venue",
"identifier"
],
"properties": {
"venue": {
"enum": [
"kalshi",
"polymarket",
"adi",
"limitless",
"myriad"
],
"type": "string",
"description": "Prediction-market venue this quote comes from"
},
"identifier": {
"type": "string",
"description": "Kalshi ticker, Polymarket slug, ADI Predictstreet symbol, Limitless slug, or Myriad slug, matching the venue field."
}
}
},
"maxItems": 5,
"minItems": 2,
"description": "One entry per venue you want to compare: 2 to 5 total, all in this one call (a Kalshi ticker and a Polymarket slug for the same bet are two entries). Each must genuinely be the same real-world bet; this tool does not verify that for you."
}
}
}
workflow.run_straddle_strangle
Payoff, P&L, and both breakeven prices for a long or short straddle/strangle (a call + a put on the same Deribit BTC/ETH underlying, both legs the same direction) at a scenario price. A straddle is callStrike === putStrike; any callStrike > putStrike makes it a strangle, same formula either way. Coin-settled like workflow.run_options_payoff: a long position's max loss is the flat total premium paid (between the strikes, both legs worthless); max profit is technically unbounded, dominated by the put leg's payoff as price falls toward zero. Use when user asks about a straddle or strangle, e.g. "what does a BTC straddle pay off if price barely moves?" or "where are my breakevens on this strangle?". Returns: combinedIntrinsicCoin, scenarioPnlCoin, scenarioPnlUsd, upperBreakevenPrice, lowerBreakevenPrice, maxLossCoin/maxProfitCoin (null = unbounded), isStraddle, isProfitable.
read-only
Argument
Type
Description
currency
string
Underlying coin. Default BTC.
position*
string
Option position: "long" (bought) or "short" (sold)
quantity*
number
Number of straddle/strangle units (both legs sized equally)
putStrike*
number
Put leg strike, USD. Must be <= callStrike.
callStrike*
number
Call leg strike, USD. Equal to putStrike for a straddle, higher for a strangle.
workflow.run_swap_price_impact
Live price-impact quote for a Solana token swap: routed through Jupiter (the same aggregator real swaps use) across every pool it knows about, not a single-pool estimate. Works in both directions: side "sell" (default) sells a token into USDC or SOL, side "buy" spends USDC or SOL to buy the token. Use when user asks "how much slippage will I eat swapping X tokens?", "what will I actually get if I sell N tokens?" or "what do I get buying this token with 500 SOL?". Returns: side, outputAmount (quote asset when selling, tokens when buying), priceImpactPct, effectivePrice (quote asset per token in both directions), marketPriceUsd, liquidityUsd, routable (false + error if the size can't be routed at all).
read-only
Argument
Type
Description
mint*
string
Solana mint address of the token being sold or bought (base58)
side
string
sell: sell the token for outputAsset (default). buy: spend outputAsset to buy the token.
amount*
number
Amount to swap, in human units (not raw base units): tokens when side is sell, units of outputAsset to spend when side is buy
outputAsset
string
The quote asset: received when selling, paid with when buying. Default USDC.
Input schema (JSON)
{
"type": "object",
"required": [
"mint",
"amount"
],
"properties": {
"mint": {
"type": "string",
"description": "Solana mint address of the token being sold or bought (base58)"
},
"side": {
"enum": [
"sell",
"buy"
],
"type": "string",
"description": "sell: sell the token for outputAsset (default). buy: spend outputAsset to buy the token."
},
"amount": {
"type": "number",
"description": "Amount to swap, in human units (not raw base units): tokens when side is sell, units of outputAsset to spend when side is buy"
},
"outputAsset": {
"enum": [
"USDC",
"SOL"
],
"type": "string",
"description": "The quote asset: received when selling, paid with when buying. Default USDC."
}
}
}
workflow.run_token_risk_check
Token rug-pull MECHANISM check for a Solana token (mint address): can the deployer still mint supply, freeze wallets, pull liquidity, swap metadata, or has RugCheck flagged a known scam pattern (e.g. copycat token)? Fetches live facts from RugCheck (GoPlus as fallback) and returns a transparently-weighted composite score. Deliberately does NOT score holder concentration or "whale dump" impact: those are properties of any liquid market (a legit protocol's top holders are routinely treasury/vesting/exchange wallets), not rug signals; they are returned separately as informational market_context. Use when user asks "is this token a rug pull?" or "is [token] safe to buy?". This is a sourced, timestamped read of public facts, not a safety guarantee. Returns: score (0-100), verdict (clean/caution/high_risk/red_flags), verdict_summary, components breakdown, facts, market_context, sources.
Return "unsmoothing" for infrequently-marked/illiquid or appraisal-based series: Getmansky-Lo-Makarov (2004) MA(2) smoothing index plus Blundell-Ward (1987) AR(1) volatility inflation, two complementary models answering "this return series looks smoother than it really is; what's the true volatility?". Use when user asks "how much is appraisal smoothing understating my real volatility?" or "what's my de-smoothed Sharpe ratio?". Returns: glm_theta (MA(2) weights), glm_smoothing_index (xi, 1=no smoothing, down to 1/3 for max MA(2) smoothing), glm_true_volatility_multiplier, glm_converged (false if the fit may be unreliable - treat that result with caution), bw_alpha (AR(1) coefficient = lag-1 autocorrelation, can be negative), bw_smoothing_detected (false when alpha<=0: no evidence of smoothing, bw_volatility_multiplier is then pinned to 1 with no correction applied rather than a misleading below-1 value), bw_volatility_multiplier, and each model's own true_stdev estimate.
read-only
Argument
Type
Description
returns*
array
The observed (possibly smoothed) return series, at least 20 values
Market Profile value-area migration across sessions: is value migrating up, down, or overlapping (directional conviction vs balance)? Use for "is value moving higher day over day?". Returns: state, direction, migration_pct, key_levels (current vs. prior session VAH/VAL/VPOC), tails (session-high/low rejection tails and single prints), scenario_framing, invalidation level. Candles come from the venue when candles[] is omitted (past sessions are cached, so repeats are fast); supplying candles[] makes the run network-free and reproducible. session_date must be a completed UTC session, before today; a session with no candles returns an error.
read-only
Argument
Type
Description
venue*
string
Exchange to fetch candles from when candles[] not supplied
candles
array
Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied)
timeframe
string
Candle timeframe (default 15m)
instrument*
string
Symbol, e.g. BTCUSDT
prev_candles
array
Optional OHLCV for the previous session
session_date*
string
Session date YYYY-MM-DD (UTC); must be before today (a completed session)
workflow.run_var_cvar
Parametric Value at Risk (VaR) and Conditional VaR / Expected Shortfall (CVaR), the variance-covariance method (assumes normally distributed returns), plus Modified VaR (Cornish-Fisher skew/kurtosis correction, Boudt/Peterson/Croux) when a return series is supplied. Supply either a return series or a mean/stdev pair directly, at a confidence level. Output is at the same periodicity as the input (no automatic annualization) - a daily return series gives a daily VaR/CVaR. Use when user asks "what's my VaR at 95%/99%?", "what's my expected shortfall on this position?", or "does my Sharpe/VaR estimate need a fat-tails correction?". Returns: var, cvar (both positive loss magnitudes; cvar >= var always), z, mean, stdev, skewness, excess_kurtosis (both null unless 3+ returns were supplied), var_modified (skew/kurtosis-adjusted VaR; null when skewness is, OR when this series' skew/kurtosis are too extreme for the Cornish-Fisher expansion to be a valid quantile - skewness/excess_kurtosis are still returned in that case).
read-only
Argument
Type
Description
mean
number
Mean return, if not supplying returns[] directly
stdev
number
Standard deviation of returns, if not supplying returns[] directly
returns
array
Return series (e.g. daily % returns as decimals). Provide this OR mean+stdev, not both.
confidence
number
Confidence level, 0-1 exclusive (default 0.95)
Input schema (JSON)
{
"type": "object",
"properties": {
"mean": {
"type": "number",
"description": "Mean return, if not supplying returns[] directly"
},
"stdev": {
"type": "number",
"description": "Standard deviation of returns, if not supplying returns[] directly"
},
"returns": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 2,
"description": "Return series (e.g. daily % returns as decimals). Provide this OR mean+stdev, not both."
},
"confidence": {
"type": "number",
"description": "Confidence level, 0-1 exclusive (default 0.95)"
}
}
}
workflow.run_wallet_flag_check
Checks a wallet address (Solana or any of 5 EVM chains) against independent flag databases: GoPlus (malicious-address categories, all chains), Webacy (address analysis + sanctions check, all chains), and ScamSniffer (public phishing/drainer blacklist, EVM chains only), and returns each source's own facts separately, never merged into one invented score. Use when user asks "is this wallet address flagged?" or "is it safe to send to this address?". A clean result means "nothing found in these databases," not a certified-safe verdict. Returns: goplus (flags[], categoriesChecked), webacyGeneral (overallRisk, dprk/hack/ofacSanctioned, exchangeLabel), webacySanctions (status), scamSniffer (flagged; not applicable on Solana). Each source has an `available` flag: false + error if that source failed independently.
read-only
Argument
Type
Description
chain
string
Chain of the wallet address. Default solana.
walletAddress*
string
Wallet address (base58 for Solana, 0x... for EVM chains)
Theoretical fair value for a time-windowed crypto up/down contract (the shape ADI Predictstreet and Kalshi-style daily crypto markets use: pays out based on whether the settlement price finishes at/above or below a reference price pinned at window open, by a fixed close time): a cash-or-nothing digital option, priced with the standard N(d2) formula. It gives the probability at the close time only, not the probability of touching a level at any point before it (first passage). Time convention: a year is 365 days. Use this when there's no live market price to read (e.g. a venue's contract has real terms but zero trading volume) instead of a live-market odds tool. Volatility is a required manual input; there is no live implied-vol market on these contracts to pull it from. Use when user asks "what should this up/down contract be worth?" or "what's the fair probability BTC finishes above $X in N minutes?". Returns: d1, d2, probAbovePct, probBelowPct, fairPriceAboveCents, fairPriceBelowCents (cents convention, directly comparable to how these venues quote a contract).
read-only
Argument
Type
Description
currentPrice*
number
Current spot price of the coin, in USD.
volatilityPct*
number
Annualized volatility, in percentage points (e.g. 50 for 50%). Required; no live source for this on these contracts.
minutesToClose*
number
Minutes remaining until the window closes/settles.
referencePrice*
number
add_price*
number
Proposed price to add at - also treated as today's current price for the fresh-entry comparison
stop_loss*
number
Stop-loss price (must be below add_price for a long, above it for a short - the position should already be closed otherwise)
contractType
string
linear = USDT-margined (default), inverse = coin-margined. Risk figures come back denominated in the base coin for inverse.
fee_open_pct
number
Open fee rate (default 0.0002)
existing_size*
number
Size already held: base-asset quantity for linear, USD notional (contracts) for inverse
fee_close_pct
number
Close fee rate (default 0.0005)
existing_entry_price*
number
Entry price of the position already held
Input schema (JSON)
{
"type": "object",
"required": [
"side",
"existing_entry_price",
"existing_size",
"add_price",
"add_size",
"stop_loss",
"leverage"
],
"properties": {
"mmr": {
"type": "number",
"description": "Maintenance margin rate (default 0.005)"
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"add_size": {
"type": "number",
"description": "Additional size being considered, same unit convention as existing_size"
},
"leverage": {
"type": "number",
"description": "Leverage multiplier"
},
"add_price": {
"type": "number",
"description": "Proposed price to add at - also treated as today's current price for the fresh-entry comparison"
},
"stop_loss": {
"type": "number",
"description": "Stop-loss price (must be below add_price for a long, above it for a short - the position should already be closed otherwise)"
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined (default), inverse = coin-margined. Risk figures come back denominated in the base coin for inverse."
},
"fee_open_pct": {
"type": "number",
"description": "Open fee rate (default 0.0002)"
},
"existing_size": {
"type": "number",
"description": "Size already held: base-asset quantity for linear, USD notional (contracts) for inverse"
},
"fee_close_pct": {
"type": "number",
"description": "Close fee rate (default 0.0005)"
},
"existing_entry_price": {
"type": "number",
"description": "Entry price of the position already held"
}
}
}
Input schema (JSON)
{
"type": "object",
"required": [
"spot",
"strike",
"daysToExpiry",
"volatilityPct"
],
"properties": {
"spot": {
"type": "number",
"description": "Underlying spot price, USD"
},
"strike": {
"type": "number",
"description": "Strike price, USD"
},
"daysToExpiry": {
"type": "number",
"description": "Calendar days until expiry (can be fractional)"
},
"volatilityPct": {
"type": "number",
"description": "Annualized implied volatility in percentage points, e.g. 60 for 60%"
},
"riskFreeRatePct": {
"type": "number",
"description": "Risk-free rate in percentage points. Default 0: standard crypto-options convention."
}
}
}
include_delta
boolean
Include buy/sell delta analysis (default true)
value_area_rule
number
Value-area fraction 0.5–0.9 (default 0.70)
Input schema (JSON)
{
"type": "object",
"required": [
"instrument",
"venue",
"session_date"
],
"properties": {
"venue": {
"enum": [
"binance",
"bybit"
],
"type": "string",
"description": "Exchange to fetch candles from when candles[] not supplied"
},
"candles": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied)"
},
"timeframe": {
"enum": [
"1m",
"5m",
"15m",
"30m"
],
"type": "string",
"description": "Candle timeframe (default 15m)"
},
"instrument": {
"type": "string",
"description": "Symbol, e.g. BTCUSDT"
},
"prev_candles": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional OHLCV for the previous session"
},
"session_date": {
"type": "string",
"description": "Session date YYYY-MM-DD (UTC); must be before today (a completed session)"
},
"include_delta": {
"type": "boolean",
"description": "Include buy/sell delta analysis (default true)"
},
"value_area_rule": {
"type": "number",
"description": "Value-area fraction 0.5–0.9 (default 0.70)"
}
}
}
Input schema (JSON)
{
"type": "object",
"required": [
"notional",
"funding_rate_long",
"funding_rate_short",
"hold_days"
],
"properties": {
"notional": {
"type": "number",
"description": "Position notional in USDT"
},
"hold_days": {
"type": "number",
"description": "Hold duration in days"
},
"interval_hours": {
"type": "number",
"maximum": 24,
"minimum": 0.25,
"description": "Hours between funding payments, one interval for both legs (default 8; 1 for hourly venues; 4 or 2 on some symbols). A leg paid on another interval is entered as its rate times (this interval / its own interval)."
},
"transfer_fee_pct": {
"type": "number",
"description": "One-way transfer fee % (default 0.1)"
},
"funding_rate_long": {
"type": "number",
"description": "Funding rate on long exchange per interval (decimal)"
},
"funding_rate_short": {
"type": "number",
"description": "Funding rate on short exchange per interval (decimal)"
}
}
}
{
"type": "object",
"required": [
"initialCapital",
"fundingRatePct",
"durationDays"
],
"properties": {
"reinvestPct": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Percentage of funding received that is reinvested each interval, 0-100 (the rest is withdrawn and counts as earned; funding paid always comes out of capital). 100 = full compounding. Default 100."
},
"durationDays": {
"type": "number",
"maximum": 3650,
"description": "Number of days to project, up to 3650",
"exclusiveMinimum": 0
},
"intervalHours": {
"enum": [
1,
2,
3,
4,
6,
8,
12,
24
],
"type": "number",
"description": "Hours between funding payments, the period fundingRatePct covers, a whole number of hours that divides 24. Default 8; 1 on Hyperliquid, dYdX, Kraken and Backpack (per-hour rates); 4 or 2 on some symbols."
},
"fundingRatePct": {
"type": "number",
"description": "Funding rate per interval as percentage, e.g. 0.01 for 0.01%"
},
"initialCapital": {
"type": "number",
"description": "Starting capital in USDT",
"exclusiveMinimum": 0
}
}
}
*
number
Price you acquired/value the underlying coin at, USD; used for the covered-call breakeven vs. cost basis
premiumCoin*
number
Premium received (covered_call) or paid (protective_put) per contract, in the base coin
daysToExpiry*
number
Calendar days until expiry; used to annualize the yield/cost
scenarioPrice*
number
Underlying price in USD to evaluate the combined position's value at
Input schema (JSON)
{
"type": "object",
"required": [
"strategy",
"spotEntry",
"strike",
"premiumCoin",
"daysToExpiry",
"quantity",
"scenarioPrice"
],
"properties": {
"strike": {
"type": "number",
"description": "Option strike, USD"
},
"currency": {
"enum": [
"BTC",
"ETH"
],
"type": "string",
"description": "Underlying coin. Default BTC."
},
"quantity": {
"type": "number",
"description": "Coin units held / contracts (1:1 covered)"
},
"strategy": {
"enum": [
"covered_call",
"protective_put"
],
"type": "string",
"description": "\"covered_call\" (hold the coin, sell a call against it) or \"protective_put\" (hold the coin, buy a put as insurance)"
},
"spotEntry": {
"type": "number",
"description": "Price you acquired/value the underlying coin at, USD; used for the covered-call breakeven vs. cost basis"
},
"premiumCoin": {
"type": "number",
"description": "Premium received (covered_call) or paid (protective_put) per contract, in the base coin"
},
"daysToExpiry": {
"type": "number",
"description": "Calendar days until expiry; used to annualize the yield/cost"
},
"scenarioPrice": {
"type": "number",
"description": "Underlying price in USD to evaluate the combined position's value at"
}
}
}
{
"type": "object",
"required": [
"stakeUsd"
],
"properties": {
"quotes": {
"type": "array",
"items": {
"type": "object",
"required": [
"venue",
"identifier"
],
"properties": {
"venue": {
"enum": [
"kalshi",
"polymarket",
"adi",
"limitless",
"myriad"
],
"type": "string",
"description": "Prediction-market venue this quote comes from"
},
"identifier": {
"type": "string",
"description": "Kalshi ticker, Polymarket slug, ADI Predictstreet symbol, Limitless slug, or Myriad slug, matching the venue field."
}
}
},
"maxItems": 5,
"minItems": 2,
"description": "Live mode: one entry per venue, 2-5 total. Provide this OR manualProbabilitiesPct, not both."
},
"stakeUsd": {
"type": "number",
"description": "Total capital to deploy across both legs"
},
"feePctPerLeg": {
"type": "number",
"description": "Optional per-leg trading-fee rate, e.g. 0.02 for 2% (default 0)"
},
"manualProbabilitiesPct": {
"type": "array",
"items": {
"type": "number"
},
"maxItems": 5,
"minItems": 2,
"description": "Manual mode: 2-5 probabilities (0.01-99.99) already known for the same bet across different venues, when you don't want a live fetch. Provide this OR quotes, not both."
}
}
}
sellFeePct
number
Sell fee as a fraction of the trade value, 0 to 0.05 (0.001 = 0.1%). Default 0
holdingDays
number
Optional: days the coins were held; 30 or more also returns the annualized return
Input schema (JSON)
{
"type": "object",
"required": [
"buyPrice",
"sellPrice"
],
"properties": {
"buyPrice": {
"type": "number",
"description": "Price paid per coin, in the quote currency (e.g. 60000 for BTC in USD)"
},
"quantity": {
"type": "number",
"description": "Number of coins bought (e.g. 0.5). Give this or investment, not both"
},
"buyFeePct": {
"type": "number",
"description": "Buy fee as a fraction of the trade value, 0 to 0.05 (0.001 = 0.1%). Default 0"
},
"sellPrice": {
"type": "number",
"description": "Price per coin at the sale, or the price to test, same currency"
},
"investment": {
"type": "number",
"description": "Total cash spent on the buy, buy fee included (e.g. 1000). Give this or quantity, not both"
},
"sellFeePct": {
"type": "number",
"description": "Sell fee as a fraction of the trade value, 0 to 0.05 (0.001 = 0.1%). Default 0"
},
"holdingDays": {
"type": "number",
"description": "Optional: days the coins were held; 30 or more also returns the annualized return"
}
}
}
{
"type": "object",
"required": [
"side",
"entries"
],
"properties": {
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"entries": {
"type": "array",
"items": {
"type": "object",
"required": [
"price",
"size"
],
"properties": {
"size": {
"type": "number",
"description": "Fill size"
},
"price": {
"type": "number",
"description": "Fill price"
}
}
},
"maxItems": 20,
"minItems": 2,
"description": "Fills to average (2 to 20). Each: { price, size }, e.g. [{ \"price\": 60000, \"size\": 0.5 }, { \"price\": 58000, \"size\": 1 }]. Size is base-asset quantity for linear, USD notional (contracts) for inverse."
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined (default), inverse = coin-margined. Each fill's size is USD notional (contracts) for inverse; averageEntry is then the harmonic mean of fill prices, not the arithmetic mean."
},
"fee_open_pct": {
"type": "number",
"description": "Open fee rate (default 0.0002)"
},
"fee_close_pct": {
"type": "number",
"description": "Close fee rate (default 0.0005)"
}
}
}
array
Observed Sharpe ratios of all N trials tried, if tracked. Takes priority over n_trials if both are given.
avg_correlation
number
Average pairwise correlation between trials, 0-1 (default 0 = independent). Only used with n_trials; lowers the effective trial count via Kish's design effect.
Input schema (JSON)
{
"type": "object",
"required": [
"returns"
],
"properties": {
"returns": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 3,
"description": "The candidate strategy's own return series"
},
"n_trials": {
"type": "number",
"description": "Number of strategy variants tried, if trial_sharpes were not tracked individually. Assumes trial Sharpes with mean 0 and variance 1 (per-period units): too strict for daily series, prefer trial_sharpes there."
},
"trial_sharpes": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 2,
"description": "Observed Sharpe ratios of all N trials tried, if tracked. Takes priority over n_trials if both are given."
},
"avg_correlation": {
"type": "number",
"description": "Average pairwise correlation between trials, 0-1 (default 0 = independent). Only used with n_trials; lowers the effective trial count via Kish's design effect."
}
}
}
Input schema (JSON)
{
"type": "object",
"required": [
"returns"
],
"properties": {
"returns": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 100,
"description": "Return series, one value per period, at least 100 values (POT needs real sample depth in the tail)"
},
"confidence": {
"type": "number",
"description": "VaR/ES confidence level, 0-1 exclusive. Default 0.99. Must satisfy 1-confidence < the threshold's own exceedance rate."
},
"threshold_percentile": {
"type": "number",
"description": "Percentile (0-100 exclusive) of the loss distribution used as the POT threshold u. Default 90."
}
}
}
contractType
string
linear = USDT-margined (default), inverse = coin-margined. For inverse, pnl-mode targetValue and outputs are in the base coin.
{
"type": "object",
"required": [
"pair",
"entryPrice",
"stopPrice",
"riskAmount",
"accountCurrency"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"stopPrice": {
"type": "number",
"description": "Stop-loss price, same quote convention as the entry price"
},
"entryPrice": {
"type": "number",
"description": "Entry price in the pair's own quote terms, e.g. 1.0850 for EUR/USD"
},
"riskAmount": {
"type": "number",
"description": "Amount to risk, in accountCurrency"
},
"accountCurrency": {
"type": "string",
"description": "3-letter account currency code, e.g. \"USD\""
}
}
}
{
"type": "object",
"required": [
"pair",
"units",
"swapPerLotPerNight",
"nights",
"accountCurrency"
],
"properties": {
"pair": {
"type": "string",
"description": "Currency pair in BASE/QUOTE format, e.g. \"EUR/USD\""
},
"units": {
"type": "number",
"description": "Position size in base-currency units"
},
"nights": {
"type": "integer",
"description": "Number of nights the position is held"
},
"accountCurrency": {
"type": "string",
"description": "3-letter account currency code, e.g. \"GBP\""
},
"swapPerLotPerNight": {
"type": "number",
"description": "Swap rate per standard lot per night, in the pair's quote currency. Negative = cost, positive = credit."
}
}
}
Input schema (JSON)
{
"type": "object",
"required": [
"positionSize",
"longFundingRate",
"shortFundingRate",
"durationDays"
],
"properties": {
"durationDays": {
"type": "number",
"description": "Holding period in days"
},
"positionSize": {
"type": "number",
"description": "Position size in USDT"
},
"intervalHours": {
"type": "number",
"maximum": 24,
"minimum": 0.25,
"description": "Hours between funding payments, one interval for both legs. Default 8; 1 on Hyperliquid, dYdX, Kraken and Backpack (per-hour rates); 4 or 2 on some symbols. A leg paid on another interval is entered as its rate times (this interval / its own interval)."
},
"transferFeePct": {
"type": "number",
"description": "One-time transfer/setup fee as percentage, e.g. 0.1 for 0.1%"
},
"longFundingRate": {
"type": "number",
"description": "Funding rate on long side (% per interval, positive = you pay)"
},
"shortFundingRate": {
"type": "number",
"description": "Funding rate on short side (% per interval, positive = you receive)"
}
}
}
fee_close_pct
number
Close fee rate (default 0.0005)
funding_interval_hours
number
Hours per funding payment, the period funding_rate covers: 8 (default), 1 on Hyperliquid, dYdX, Kraken and Backpack (per-hour rates), 4 or 2 on some symbols of Binance, Bybit, OKX, Gate, KuCoin, MEXC, Aster and Phemex
Input schema (JSON)
{
"type": "object",
"required": [
"side",
"entry_price",
"size",
"funding_rate",
"hold_hours"
],
"properties": {
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"size": {
"type": "number",
"description": "Position size in base currency"
},
"hold_hours": {
"type": "number",
"description": "Hold duration in hours"
},
"entry_price": {
"type": "number",
"description": "Entry price"
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined (default), inverse = coin-margined. size is USD notional (contracts) for inverse; notional/funding_cost/fee_total/total_carry_cost come back denominated in the base coin."
},
"fee_open_pct": {
"type": "number",
"description": "Open fee rate (default 0.0002)"
},
"funding_rate": {
"type": "number",
"description": "Funding rate per funding interval (decimal, e.g. 0.0001)"
},
"fee_close_pct": {
"type": "number",
"description": "Close fee rate (default 0.0005)"
},
"funding_interval_hours": {
"type": "number",
"maximum": 24,
"minimum": 0.25,
"description": "Hours per funding payment, the period funding_rate covers: 8 (default), 1 on Hyperliquid, dYdX, Kraken and Backpack (per-hour rates), 4 or 2 on some symbols of Binance, Bybit, OKX, Gate, KuCoin, MEXC, Aster and Phemex"
}
}
}
number
Hours between funding payments, which is the period fundingRate covers. Default 8 (3 payments a day); 1 on Hyperliquid, dYdX, Kraken and Backpack, 4 or 2 on some symbols of Binance, Bybit, OKX, Gate, KuCoin, MEXC, Aster and Phemex.
Input schema (JSON)
{
"type": "object",
"required": [
"side",
"sizeBase",
"entryPrice",
"fundingRate",
"days"
],
"properties": {
"days": {
"type": "number",
"description": "Number of days to hold"
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"sizeBase": {
"type": "number",
"description": "Position size in base asset"
},
"entryPrice": {
"type": "number",
"description": "Entry price"
},
"fundingRate": {
"type": "number",
"description": "Funding rate per funding interval as a fraction, e.g. 0.0001 (per 8h unless intervalHours says otherwise)"
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined (default), inverse = coin-margined. For inverse, sizeBase is USD contracts and cost figures come out in the base coin."
},
"intervalHours": {
"type": "number",
"maximum": 24,
"minimum": 0.25,
"description": "Hours between funding payments, which is the period fundingRate covers. Default 8 (3 payments a day); 1 on Hyperliquid, dYdX, Kraken and Backpack, 4 or 2 on some symbols of Binance, Bybit, OKX, Gate, KuCoin, MEXC, Aster and Phemex."
}
}
}
*
number
Base token's current price in quote-token terms
feesEarnedUsd
number
Optional trading fees earned so far in USD (default 0), folded into netResultUsd alongside lossUsd
depositValueUsd
number
Optional: USD value deposited at entry, to also report dollar-denominated lpValueUsd/hodlValueUsd/lossUsd
Input schema (JSON)
{
"type": "object",
"required": [
"entryPrice",
"currentPrice"
],
"properties": {
"mode": {
"enum": [
"full_range",
"concentrated"
],
"type": "string",
"description": "Default full_range."
},
"entryPrice": {
"type": "number",
"description": "Base token's price in quote-token terms when liquidity was deposited"
},
"lowerPrice": {
"type": "number",
"description": "Range lower bound - required for concentrated mode, must be below entryPrice"
},
"upperPrice": {
"type": "number",
"description": "Range upper bound - required for concentrated mode, must be above entryPrice"
},
"currentPrice": {
"type": "number",
"description": "Base token's current price in quote-token terms"
},
"feesEarnedUsd": {
"type": "number",
"description": "Optional trading fees earned so far in USD (default 0), folded into netResultUsd alongside lossUsd"
},
"depositValueUsd": {
"type": "number",
"description": "Optional: USD value deposited at entry, to also report dollar-denominated lpValueUsd/hodlValueUsd/lossUsd"
}
}
}
quoteChain
string
Chain of the quote token. Default solana.
upperPrice
number
Range upper bound - required for concentrated mode
feesEarnedUsd
number
Optional trading fees earned so far in USD (default 0)
depositValueUsd
number
Optional: USD value deposited at entry
Input schema (JSON)
{
"type": "object",
"required": [
"entryPrice",
"baseMint",
"quoteMint"
],
"properties": {
"mode": {
"enum": [
"full_range",
"concentrated"
],
"type": "string",
"description": "Default full_range."
},
"baseMint": {
"type": "string",
"description": "Address of the base token"
},
"baseChain": {
"enum": [
"solana",
"ethereum",
"base",
"bsc",
"arbitrum",
"polygon"
],
"type": "string",
"description": "Chain of the base (volatile) token. Default solana."
},
"quoteMint": {
"type": "string",
"description": "Address of the quote token"
},
"entryPrice": {
"type": "number",
"description": "Base token's price in quote-token terms when liquidity was deposited (manual - a historical fact)"
},
"lowerPrice": {
"type": "number",
"description": "Range lower bound - required for concentrated mode"
},
"quoteChain": {
"enum": [
"solana",
"ethereum",
"base",
"bsc",
"arbitrum",
"polygon"
],
"type": "string",
"description": "Chain of the quote token. Default solana."
},
"upperPrice": {
"type": "number",
"description": "Range upper bound - required for concentrated mode"
},
"feesEarnedUsd": {
"type": "number",
"description": "Optional trading fees earned so far in USD (default 0)"
},
"depositValueUsd": {
"type": "number",
"description": "Optional: USD value deposited at entry"
}
}
}
riskFreeRatePct
number
Risk-free rate in percentage points. Default 0: standard crypto-options convention.
Probability as a decimal 0-1 (e.g. 0.35). Use this OR one of the live sources below, not both.
kalshiTicker
string
A Kalshi market ticker (e.g. KXBTCY-27JAN0100-T149999.99) to fetch a live price from. One market only; for the same bet on several venues use workflow.run_spread_reader.
limitlessSlug
string
A Limitless Exchange market slug, from the market URL (e.g. btc-up-or-down-5-min-1790249100), to fetch a live price from. On-chain (Base), mostly short-duration (5min/15min/daily) crypto up/down contracts.
polymarketSlug
string
A Polymarket market slug, from the market URL (e.g. will-bitcoin-reach-100k-in-september-2026), to fetch a live price from. One market only; for the same bet on several venues use workflow.run_spread_reader.
Input schema (JSON)
{
"type": "object",
"required": [],
"properties": {
"adiSymbol": {
"type": "string",
"description": "An ADI Predictstreet market symbol (e.g. BTC1D-20260920T0000). Currently always returns available:false; these contracts have no live trading volume yet."
},
"myriadSlug": {
"type": "string",
"description": "A Myriad Markets market slug, from the market URL (e.g. eth-at-three-digits-when-bitcoin-goes-below-50k), to fetch a live price from. On-chain (Abstract L2); not every market has a Yes/No outcome, some are multi-outcome ladders."
},
"probability": {
"type": "number",
"description": "Probability as a decimal 0-1 (e.g. 0.35). Use this OR one of the live sources below, not both."
},
"kalshiTicker": {
"type": "string",
"description": "A Kalshi market ticker (e.g. KXBTCY-27JAN0100-T149999.99) to fetch a live price from. One market only; for the same bet on several venues use workflow.run_spread_reader."
},
"limitlessSlug": {
"type": "string",
"description": "A Limitless Exchange market slug, from the market URL (e.g. btc-up-or-down-5-min-1790249100), to fetch a live price from. On-chain (Base), mostly short-duration (5min/15min/daily) crypto up/down contracts."
},
"polymarketSlug": {
"type": "string",
"description": "A Polymarket market slug, from the market URL (e.g. will-bitcoin-reach-100k-in-september-2026), to fetch a live price from. One market only; for the same bet on several venues use workflow.run_spread_reader."
}
}
}
value_area_rule
number
Value-area fraction 0.5–0.9 (default 0.70)
Input schema (JSON)
{
"type": "object",
"required": [
"instrument",
"venue",
"session_date"
],
"properties": {
"venue": {
"enum": [
"binance",
"bybit"
],
"type": "string",
"description": "Exchange to fetch candles from when candles[] not supplied"
},
"candles": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied)"
},
"timeframe": {
"enum": [
"1m",
"5m",
"15m",
"30m"
],
"type": "string",
"description": "Candle timeframe (default 15m)"
},
"instrument": {
"type": "string",
"description": "Symbol, e.g. BTCUSDT"
},
"prev_candles": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional OHLCV for the previous session"
},
"session_date": {
"type": "string",
"description": "Session date YYYY-MM-DD (UTC); must be before today (a completed session)"
},
"value_area_rule": {
"type": "number",
"description": "Value-area fraction 0.5–0.9 (default 0.70)"
}
}
}
premiumCoin*
number
Premium paid/received per contract, in the base coin (matches Deribit's own quoted price, e.g. 0.02 BTC); must be < 1 for a call
scenarioPrice*
number
Underlying price in USD to evaluate the payoff at
Input schema (JSON)
{
"type": "object",
"required": [
"optionType",
"position",
"strike",
"premiumCoin",
"quantity",
"scenarioPrice"
],
"properties": {
"strike": {
"type": "number",
"description": "Strike price in USD"
},
"currency": {
"enum": [
"BTC",
"ETH"
],
"type": "string",
"description": "Underlying coin. Default BTC."
},
"position": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Option position: \"long\" (bought) or \"short\" (sold)"
},
"quantity": {
"type": "number",
"description": "Number of contracts (Deribit BTC/ETH options have contract_size 1.0, so this is coin-denominated size)"
},
"optionType": {
"enum": [
"call",
"put"
],
"type": "string",
"description": "Option type: \"call\" or \"put\""
},
"premiumCoin": {
"type": "number",
"description": "Premium paid/received per contract, in the base coin (matches Deribit's own quoted price, e.g. 0.02 BTC); must be < 1 for a call"
},
"scenarioPrice": {
"type": "number",
"description": "Underlying price in USD to evaluate the payoff at"
}
}
}
Target notional to walk the book for. Provide this OR impact_budget_bps, not both.
impact_budget_bps
number
Max acceptable impact in bps; solves for the largest notional within it. Provide this OR notional_usd, not both.
Input schema (JSON)
{
"type": "object",
"required": [
"bids",
"asks",
"side"
],
"properties": {
"asks": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "number"
},
"maxItems": 2,
"minItems": 2
},
"description": "Ask levels as [price, size_base] pairs, any order"
},
"bids": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "number"
},
"maxItems": 2,
"minItems": 2
},
"description": "Bid levels as [price, size_base] pairs, any order"
},
"side": {
"enum": [
"buy",
"sell"
],
"type": "string",
"description": "\"buy\" walks the asks, \"sell\" walks the bids"
},
"notional_usd": {
"type": "number",
"description": "Target notional to walk the book for. Provide this OR impact_budget_bps, not both."
},
"impact_budget_bps": {
"type": "number",
"description": "Max acceptable impact in bps; solves for the largest notional within it. Provide this OR notional_usd, not both."
}
}
}
linear = USDT-margined (default), inverse = coin-margined. For inverse, pnl/fees are returned in the base coin, not USDT.
Input schema (JSON)
{
"type": "object",
"required": [
"side",
"entryPrice",
"exitPrice",
"size"
],
"properties": {
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction"
},
"size": {
"type": "number",
"description": "Position size: base asset qty for linear, USD contracts for inverse"
},
"exitPrice": {
"type": "number",
"description": "Exit price (positive)"
},
"entryPrice": {
"type": "number",
"description": "Entry price (positive)"
},
"feeOpenPct": {
"type": "number",
"description": "Opening fee as fraction, e.g. 0.0002 = 0.02%"
},
"feeClosePct": {
"type": "number",
"description": "Closing fee as fraction"
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined (default), inverse = coin-margined. For inverse, pnl/fees are returned in the base coin, not USDT."
}
}
}
Expected hold time in hours for overnight shift calc. Default 8.
entry_price*
number
Entry price (positive)
contractType
string
linear = USDT-margined (default), inverse = coin-margined (e.g. Bybit BTCUSD). All returned figures (notional, margin, risk_amount, funding_cost_*) stay USD-denominated either way; recommended_size is USD notional (contracts) for inverse.
fee_open_pct
number
Opening fee fraction, default 0.0002
funding_rate
number
Funding rate per funding interval as decimal, e.g. 0.0001. If omitted, fetched live from exchange.
fee_close_pct
number
Closing fee fraction, default 0.0005
account_balance*
number
Total account balance in USDT
funding_interval_hours
number
Hours per funding payment, the period funding_rate covers: 8 on most venues, 1 on Hyperliquid, dYdX, Kraken and Backpack, 4 or 2 on some symbols of Binance, Bybit, OKX, Gate, KuCoin, MEXC, Aster and Phemex. When funding_rate is omitted and fetched live (exchange and symbol given), any value passed here is ignored: the interval of that symbol as the exchange reports it is used (else the exchange default). Omitted otherwise: when you pass funding_rate yourself, the exchange default (1 for hourly venues, else 8), so pass funding_interval_hours for a symbol that pays every 4 or 2 hours.
Input schema (JSON)
{
"type": "object",
"required": [
"side",
"entry_price",
"stop_loss",
"account_balance",
"risk_pct",
"leverage"
],
"properties": {
"mmr": {
"type": "number",
"description": "Maintenance margin rate, default 0.005"
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"symbol": {
"type": "string",
"description": "Perpetual symbol, e.g. \"BTCUSDT\"."
},
"exchange": {
"type": "string",
"description": "Exchange code, e.g. \"binance\" or \"bybit\". Used to fetch the live funding rate if funding_rate is omitted, and to set funding_interval_hours when that is omitted (1 for Hyperliquid, dYdX, Kraken and Backpack, whose rates are per hour; pass funding_interval_hours: 8 if you supply a rate that is per 8 hours). With funding_rate omitted and fetched live, funding_interval_hours is ignored and the interval the exchange reports for the symbol is used."
},
"leverage": {
"type": "number",
"description": "Leverage multiplier"
},
"risk_pct": {
"type": "number",
"description": "Risk as % of balance, e.g. 1.0 = 1%"
},
"stop_loss": {
"type": "number",
"description": "Stop-loss price (positive)"
},
"hold_hours": {
"type": "number",
"description": "Expected hold time in hours for overnight shift calc. Default 8."
},
"entry_price": {
"type": "number",
"description": "Entry price (positive)"
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined (default), inverse = coin-margined (e.g. Bybit BTCUSD). All returned figures (notional, margin, risk_amount, funding_cost_*) stay USD-denominated either way; recommended_size is USD notional (contracts) for inverse."
},
"fee_open_pct": {
"type": "number",
"description": "Opening fee fraction, default 0.0002"
},
"funding_rate": {
"type": "number",
"description": "Funding rate per funding interval as decimal, e.g. 0.0001. If omitted, fetched live from exchange."
},
"fee_close_pct": {
"type": "number",
"description": "Closing fee fraction, default 0.0005"
},
"account_balance": {
"type": "number",
"description": "Total account balance in USDT"
},
"funding_interval_hours": {
"type": "number",
"maximum": 24,
"minimum": 0.25,
"description": "Hours per funding payment, the period funding_rate covers: 8 on most venues, 1 on Hyperliquid, dYdX, Kraken and Backpack, 4 or 2 on some symbols of Binance, Bybit, OKX, Gate, KuCoin, MEXC, Aster and Phemex. When funding_rate is omitted and fetched live (exchange and symbol given), any value passed here is ignored: the interval of that symbol as the exchange reports it is used (else the exchange default). Omitted otherwise: when you pass funding_rate yourself, the exchange default (1 for hourly venues, else 8), so pass funding_interval_hours for a symbol that pays every 4 or 2 hours."
}
}
}
Fraction of full Kelly to actually stake, 0.01-1. Default 0.25 (quarter-Kelly).
yourProbabilityPct*
number
Your own probability estimate, 0.01-99.99
marketProbabilityPct
number
The market's probability (price), 0.01-99.99. Use this OR one of the live sources below, not both.
Input schema (JSON)
{
"type": "object",
"required": [
"yourProbabilityPct",
"bankrollUsd"
],
"properties": {
"myriadSlug": {
"type": "string",
"description": "A Myriad Markets market slug to fetch the market probability from live instead of supplying it manually. Not every market has a Yes/No outcome."
},
"bankrollUsd": {
"type": "number",
"description": "Bankroll available for this bet, in USD"
},
"kalshiTicker": {
"type": "string",
"description": "A Kalshi market ticker to fetch the market probability from live instead of supplying it manually."
},
"limitlessSlug": {
"type": "string",
"description": "A Limitless Exchange market slug to fetch the market probability from live instead of supplying it manually."
},
"kellyFractionCap": {
"type": "number",
"description": "Fraction of full Kelly to actually stake, 0.01-1. Default 0.25 (quarter-Kelly)."
},
"yourProbabilityPct": {
"type": "number",
"description": "Your own probability estimate, 0.01-99.99"
},
"marketProbabilityPct": {
"type": "number",
"description": "The market's probability (price), 0.01-99.99. Use this OR one of the live sources below, not both."
}
}
}
contractType
string
linear = USDT-margined (default), inverse = coin-margined (e.g. Bybit BTCUSD). position_size/notional are USD notional (contracts) for inverse; pnl_at_stop/pnl_at_target come back denominated in the base coin.
{
"type": "object",
"required": [
"side",
"entry_price",
"total_size",
"exits"
],
"properties": {
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"exits": {
"type": "array",
"items": {
"type": "object",
"required": [
"price",
"pct"
],
"properties": {
"pct": {
"type": "number",
"description": "% of total_size to exit here"
},
"price": {
"type": "number",
"description": "Exit price for this level"
}
}
},
"maxItems": 10,
"minItems": 2,
"description": "Partial exit levels (2 to 10). Each: { price, pct }, e.g. [{ \"price\": 90000, \"pct\": 30 }, { \"price\": 95000, \"pct\": 70 }]; the pct values must not sum to more than 100."
},
"total_size": {
"type": "number",
"description": "Total position size in base currency"
},
"entry_price": {
"type": "number",
"description": "Entry price"
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined (default), inverse = coin-margined. total_size is USD notional (contracts) for inverse, and per-level pnl comes back denominated in the base coin."
},
"fee_open_pct": {
"type": "number",
"description": "Open fee rate (default 0.0002)"
},
"fee_close_pct": {
"type": "number",
"description": "Close fee rate (default 0.0005)"
}
}
}
{
"type": "object",
"required": [
"side",
"entryPrice",
"size",
"deltasPct"
],
"properties": {
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Trade direction: \"long\" or \"short\""
},
"size": {
"type": "number",
"description": "Position size in base asset"
},
"deltasPct": {
"type": "array",
"items": {
"type": "number"
},
"description": "List of price change percentages, e.g. [-10, -5, 0, 5, 10]. Must be at least -100 (exactly -100 only for linear contracts; inverse contracts need more than -100)"
},
"entryPrice": {
"type": "number",
"description": "Entry price"
},
"feeOpenPct": {
"type": "number",
"description": "Opening fee fraction"
},
"feeClosePct": {
"type": "number",
"description": "Closing fee fraction"
},
"contractType": {
"enum": [
"linear",
"inverse"
],
"type": "string",
"description": "linear = USDT-margined (default), inverse = coin-margined. For inverse, size is USD contracts and pnl/fees come out in the base coin."
}
}
}
value_area_rule
number
Value-area fraction 0.5–0.9 (default 0.70)
Input schema (JSON)
{
"type": "object",
"required": [
"instrument",
"venue",
"session_date"
],
"properties": {
"venue": {
"enum": [
"binance",
"bybit"
],
"type": "string",
"description": "Exchange to fetch candles from when candles[] not supplied"
},
"candles": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied)"
},
"timeframe": {
"enum": [
"1m",
"5m",
"15m",
"30m"
],
"type": "string",
"description": "Candle timeframe (default 15m)"
},
"instrument": {
"type": "string",
"description": "Symbol, e.g. BTCUSDT"
},
"prev_candles": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional OHLCV for the previous session"
},
"session_date": {
"type": "string",
"description": "Session date YYYY-MM-DD (UTC); must be before today (a completed session)"
},
"value_area_rule": {
"type": "number",
"description": "Value-area fraction 0.5–0.9 (default 0.70)"
}
}
}
scenarioPrice*
number
Underlying price in USD to evaluate the payoff at
Input schema (JSON)
{
"type": "object",
"required": [
"legs",
"quantity",
"scenarioPrice"
],
"properties": {
"legs": {
"type": "array",
"items": {
"type": "object",
"required": [
"optionType",
"position",
"strike",
"premiumCoin"
],
"properties": {
"strike": {
"type": "number",
"description": "USD"
},
"position": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Option position: \"long\" (bought) or \"short\" (sold)"
},
"optionType": {
"enum": [
"call",
"put"
],
"type": "string",
"description": "Option type: \"call\" or \"put\""
},
"premiumCoin": {
"type": "number",
"description": "Premium per contract, in the base coin"
}
}
},
"maxItems": 4,
"minItems": 2,
"description": "Exactly 2 legs (same option type, opposite position - a vertical spread) or 4 legs (2 calls + 2 puts - an iron condor/butterfly). Each leg: { optionType: call|put, position: long|short, strike: number, premiumCoin: number }."
},
"currency": {
"enum": [
"BTC",
"ETH"
],
"type": "string",
"description": "Underlying coin. Default BTC."
},
"quantity": {
"type": "number",
"description": "Number of spread/condor units"
},
"scenarioPrice": {
"type": "number",
"description": "Underlying price in USD to evaluate the payoff at"
}
}
}
scenarioPrice*
number
Underlying price in USD to evaluate the payoff at
putPremiumCoin*
number
Put leg premium per contract, in the base coin
callPremiumCoin*
number
Call leg premium per contract, in the base coin (e.g. 0.02 BTC)
Input schema (JSON)
{
"type": "object",
"required": [
"position",
"callStrike",
"putStrike",
"callPremiumCoin",
"putPremiumCoin",
"quantity",
"scenarioPrice"
],
"properties": {
"currency": {
"enum": [
"BTC",
"ETH"
],
"type": "string",
"description": "Underlying coin. Default BTC."
},
"position": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Option position: \"long\" (bought) or \"short\" (sold)"
},
"quantity": {
"type": "number",
"description": "Number of straddle/strangle units (both legs sized equally)"
},
"putStrike": {
"type": "number",
"description": "Put leg strike, USD. Must be <= callStrike."
},
"callStrike": {
"type": "number",
"description": "Call leg strike, USD. Equal to putStrike for a straddle, higher for a strangle."
},
"scenarioPrice": {
"type": "number",
"description": "Underlying price in USD to evaluate the payoff at"
},
"putPremiumCoin": {
"type": "number",
"description": "Put leg premium per contract, in the base coin"
},
"callPremiumCoin": {
"type": "number",
"description": "Call leg premium per contract, in the base coin (e.g. 0.02 BTC)"
}
}
}
value_area_rule
number
Value-area fraction 0.5–0.9 (default 0.70)
lookback_sessions
number
Sessions to compare, 1–5 (default 1)
Input schema (JSON)
{
"type": "object",
"required": [
"instrument",
"venue",
"session_date"
],
"properties": {
"venue": {
"enum": [
"binance",
"bybit"
],
"type": "string",
"description": "Exchange to fetch candles from when candles[] not supplied"
},
"candles": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional OHLCV for the session; omit to fetch from venue (reproducible + 0 COGS when supplied)"
},
"timeframe": {
"enum": [
"1m",
"5m",
"15m",
"30m"
],
"type": "string",
"description": "Candle timeframe (default 15m)"
},
"instrument": {
"type": "string",
"description": "Symbol, e.g. BTCUSDT"
},
"prev_candles": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional OHLCV for the previous session"
},
"session_date": {
"type": "string",
"description": "Session date YYYY-MM-DD (UTC); must be before today (a completed session)"
},
"value_area_rule": {
"type": "number",
"description": "Value-area fraction 0.5–0.9 (default 0.70)"
},
"lookback_sessions": {
"type": "number",
"description": "Sessions to compare, 1–5 (default 1)"
}
}
}
The reference/pinned price the contract resolves against (the window's open price, or a stated strike).
riskFreeRatePct
number
Risk-free rate in percentage points. Default 0: negligible for these short windows.
Input schema (JSON)
{
"type": "object",
"required": [
"currentPrice",
"referencePrice",
"minutesToClose",
"volatilityPct"
],
"properties": {
"currentPrice": {
"type": "number",
"description": "Current spot price of the coin, in USD."
},
"volatilityPct": {
"type": "number",
"description": "Annualized volatility, in percentage points (e.g. 50 for 50%). Required; no live source for this on these contracts."
},
"minutesToClose": {
"type": "number",
"description": "Minutes remaining until the window closes/settles."
},
"referencePrice": {
"type": "number",
"description": "The reference/pinned price the contract resolves against (the window's open price, or a stated strike)."
},
"riskFreeRatePct": {
"type": "number",
"description": "Risk-free rate in percentage points. Default 0: negligible for these short windows."
}
}
}