Trade Plan Review
Check your entry, stop and target against ATR, perp levels, liquidation distance, fees, slippage and funding. Add account size and risk for sizing, or a placement time to replay a trade from public candles. An interactive ticket in MCP Apps hosts; no orders placed or plans stored.
What it does
Check, review or replay a perp trade setup (entry, stop, optional target), before it is placed or after: the tool for 'check this setup', 'is this trade good' and 'how did my trade do'. Renders an interactive trade ticket. Give the coin, entry and stop; optionally target, leverage, order type, placed_at, and account size with risk percent. Returns reward:risk, the stop's distance in % and 4h ATR, the isolated liquidation price at the leverage (first-tier 0.5% maintenance margin, so the optimistic case), funding per day at the current rate (in % of notional, and in USD when sized), the perp levels around the setup (from flow_levels: volume nodes, value area, liquidation clusters, entries, walls), and named checks: liquidation before the stop, price already through the stop, a stop inside one ATR of noise, a stop just in front of a level a wick would reach for, a level between entry and target, reward:risk under 2:1, costs that pull a 2:1 plan under it, leverage over 10x, and an entry far from live. Costs: fees per fill (a venue's base tier, the default venue unless overridden; override with venue, fee_bps, maker_fee_bps), funding carry over hold_hours at the current rate with the rate's 1y percentile, and, when sized, the slippage of a market exit of the whole size at the stop against today's visible book; they give a net reward:risk, the break-even win rate, and the stop, target and liquidation outcomes in R (and USD and % of account when sized). Everything reads in R and % without an account; give account_size and risk_percent (both or neither) to add the fixed-fractional size, notional and margin. Pass placed_at (when the order was placed) to replay the setup since then from public candles, filling the entry by order_type: a limit fills when price comes to it (or at once if it was already marketable, e.g. a buy limit above the market), a stop entry when price comes through it, a market order at placement; R is measured from the actual fill. Statuses: PENDING, MISSED (target traded before the entry), OPEN with the result and best/worst so far in R, STOPPED, TARGET, or AMBIGUOUS when one candle reached both; plus funding paid while open. Nothing about the plan is stored: the numbers come in, the replay goes out, and planLine is the one-line copy to bring the plan back later. Use it after research_opportunities or flow_levels has suggested a setup; it is a check of the setup, not a signal.
Parameters
| Name | Type | Description |
|---|---|---|
symbolrequiredbody | string | Coin symbol, e.g. "ETH". |
entryrequiredbody | number | Planned entry price |
stoprequiredbody | number | Stop-loss price (below entry = long, above = short) |
targetbody | number | Optional take-profit price |
account_sizebody | number | Optional account equity in USD, with risk_percent: adds the position size, notional and margin. Leave both out when the user didn't give them. |
risk_percentbody | number | Optional percent of the account lost if the stop is hit, e.g. 1; only with account_size |
leveragebody | number | Optional leverage the position is opened at, 1–200, for the liquidation price. Default when sized: the smallest whole leverage that carries the notional; unsized: no liquidation price unless given. |
placed_atbody | string | When the order was placed, as ISO 8601 (e.g. 2026-10-14T12:00:00Z) or unix time, up to 90 days back. Pass it whenever the user says when the trade was placed or opened ('placed 2026-10-12T12:00Z', 'opened yesterday at 14:00'): with it the tool replays the trade and reports filled / stopped / target / open; without it the plan is checked as if not yet placed. |
order_typebody | string | How the entry was placed, for the replay. limit (default): fills when price comes to the entry, or at once if the entry was already on the far side of the market. stop: a breakout trigger that fills when price comes through the entry. market: filled at placement. Omit it when the user hasn't said: if the entry was through the market at placement, one call returns both readings (lifecycle as a limit, alternativeLifecycle as a stop); ask the user which applies rather than calling again. Also sets the entry fee: a resting limit pays maker, anything else taker.limitstopmarket |
venuebody | string | Optional venue whose base-tier fees to apply. Default venue (5 bps taker, 2 bps maker).One of 6 supported exchange ids; see the OpenAPI spec. |
fee_bpsbody | number | Optional taker fee per fill in bps of notional (e.g. 4.5), when the user states their own fee tier. Overrides the venue's. |
maker_fee_bpsbody | number | Optional maker fee per fill in bps (negative for a rebate). Overrides the venue's. |
hold_hoursbody | number | Optional expected holding time in hours, e.g. 72 for three days: prices the funding carry over the hold into the net reward:risk. |
Call it
One API key works for MCP, REST and WebSocket; each call uses one unit. Agents without an account can pay per call with x402.
curl -X POST "https://mcp.f1ow.com/v1/research/trade-plan" \
-H "Authorization: Bearer $F1OW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"symbol":"BTC","entry":70000,"stop":68000,"target":75000,"account_size":10000,"risk_percent":1}'{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "research_trade_plan",
"arguments": {
"symbol": "BTC",
"entry": 70000,
"stop": 68000,
"target": 75000,
"account_size": 10000,
"risk_percent": 1
}
}
}const res = await fetch("https://mcp.f1ow.com/v1/research/trade-plan", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.F1OW_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"symbol":"BTC","entry":70000,"stop":68000,"target":75000,"account_size":10000,"risk_percent":1}),
});
const data = await res.json(); // the tool's result as JSON, typed in the OpenAPI spec
console.log(data);import os, requests
res = requests.post(
"https://mcp.f1ow.com/v1/research/trade-plan",
headers={"Authorization": f"Bearer {os.environ['F1OW_API_KEY']}"},
json={"symbol":"BTC","entry":70000,"stop":68000,"target":75000,"account_size":10000,"risk_percent":1},
)
data = res.json() # the tool's result as JSON, typed in the OpenAPI spec
print(data)// wss://mcp.f1ow.com/v1/ws — subprotocol "jsonrpc-2.0", Authorization: Bearer <key>
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "research_trade_plan",
"arguments": {
"symbol": "BTC",
"entry": 70000,
"stop": 68000,
"target": 75000,
"account_size": 10000,
"risk_percent": 1
}
}
}
// Or push a fresh result whenever it changes (minimum interval 15 s)
{
"jsonrpc": "2.0",
"id": 2,
"method": "subscriptions/subscribe",
"params": {
"name": "research_trade_plan",
"arguments": {
"symbol": "BTC",
"entry": 70000,
"stop": 68000,
"target": 75000,
"account_size": 10000,
"risk_percent": 1
},
"intervalSeconds": 60
}
}# No account: the first call answers 402 with a PAYMENT-REQUIRED challenge;
# an x402 client pays it in USDC on Base and retries.
curl -X POST "https://mcp.f1ow.com/x402/v1/research/trade-plan" \
-H "Content-Type: application/json" \
-d '{"symbol":"BTC","entry":70000,"stop":68000,"target":75000,"account_size":10000,"risk_percent":1}'Sample response
A real response captured 2026-11-13. Interactive is the tool's MCP App rendering it, as Claude, ChatGPT and other MCP Apps hosts show it; here it is read-only. JSON is what REST and WebSocket return, and the structuredContent of an MCP call (trimmed for length), with generatedAt for freshness. Text is the report an MCP client hands to a model.
BTC long setup: entry $70000.00, stop $68000.00, target $75000.00
live $68591.00
1R = 2.86% of entry
size 0.05 units, notional $4k, risk $100
1x (smallest that carries it): liquidation ~$350.0000, margin $4k
reward:risk 2.50:1 gross, 2.39:1 net of costs; break-even win rate 29% (29% gross)
fees 5 bps taker / 2 maker (binance base tier); entry fills as taker; stop-exit slippage 0.1 bps (Hyperliquid book)
at stop $68000.00: -1.03R, -$103 (-1.03% of account)
at target $75000.00: +2.48R, +$248 (+2.48% of account)
funding rate at the 29th percentile of 364 daily closes (1y)
4h ATR $1108.82; stop 1.80 ATR from entry
checks:
[info] Level between entry and target: high volume node (strength 2.0) at 71500.00. Price has to clear it first.
[info] At the current rate this position pays about $0.18 a day in funding.
[info] The target is 3.7σ of the options-implied move over 24h, a tail outcome under that distribution (about 5% touch odds at 2σ); a longer hold or a nearer target fits what options price.
[info] A large gamma strike sits between entry and target at $72000.00: modeled dealer hedging concentrates there (model-dependent, not a barrier).
plan line: f1ow plan · BTC long · entry 70000 · stop 68000 · target 75000 · account 10000 · risk 1%
Options-implied move over 24h (Deribit ATM IV 37.3%, front expiry): ±1σ $1367.07 (±1.95%); stop 1.46σ, target 3.66σ
risk-neutral odds at the 15 Nov 2026 expiry (2.0d, first covering the 24h hold): finish beyond stop 33% (touch roughly up to 66%), beyond target 0% (touch roughly up to 1%){
"accountUsd": 10000,
"atrInterval": "4h",
"atrUsd": 1108.82082107478,
"checks": [
{
"code": "level_before_target",
"severity": "info",
"text": "Level between entry and target: high volume node (strength 2.0) at 71500.00. Price has to clear it first."
},
{
"code": "funding_carry",
"severity": "info",
"text": "At the current rate this position pays about $0.18 a day in funding."
},
{
"code": "options_target_beyond_implied",
"severity": "info",
"source": "options",
"text": "The target is 3.7σ of the options-implied move over 24h, a tail outcome under that distribution (about 5% touch odds at 2σ); a longer hold or a nearer target fits what options price."
},
{
"code": "options_gamma_level_before_target",
"severity": "info",
"source": "options",
"text": "A large gamma strike sits between entry and target at $72000.00: modeled dealer hedging concentrates there (model-dependent, not a barrier)."
}
],
"costs": {
"breakEvenWinRatePct": 29.4821095431008,
"entryFill": "taker",
"feeBasis": "binance base tier",
"grossBreakEvenWinRatePct": 28.5714285714286,
"makerFeeBps": 2,
"netRewardRisk": 2.39188753958759,
"scenarios": [
{
"accountPct": -1.03474764554639,
"ifStopFails": false,
"name": "stop",
"pnlUsd": -103.474764554639,
"priceUsd": 68000,
"r": -1.03474764554639
},
{
"accountPct": 2.475,
"ifStopFails": false,
"name": "target",
"pnlUsd": 247.5,
"priceUsd": 75000,
"r": 2.475
}
],
"stopSlippageBps": 0.0728369254077155,
"stopSlippageComplete": true,
"takerFeeBps": 5
},
"direction": "long",
"entryUsd": 70000,
"fundingBaseline1y": {
"days": 364,
"highPctPerHour": 0.001427125,
"lowPctPerHour": -0.0014655,
"medianPctPerHour": 0.000529875,
"percentile": 28.5714285714286
},
"fundingPctPerDay": 0.005052,
"fundingRateBasis": "OI-weighted across venues",
"fundingRatePctPerHour": 0.0002105,
"fundingUsdPerDay": 0.17682,
"guidance": [],
"levels": [
{
"evidence": "resting",
"kind": "bid_wall",
"outsized": false,
"priceHi": 68625,
"priceLo": 68375,
"strength": 1
},
{
"evidence": "resting",
"kind": "ask_wall",
"outsized": false,
"priceHi": 68875,
"priceLo": 68625,
"strength": 2
},
{
"evidence": "traded",
"kind": "high_volume_node",
"outsized": false,
"priceHi": 68875,
"priceLo": 68625,
"strength": 2
},
{
"evidence": "traded",
"kind": "thin_zone",
"outsized": false,
"priceHi": 70125,
"priceLo": 69625,
"strength": 1
},
{
"evidence": "traded",
"kind": "high_volume_node",
"outsized": false,
"priceHi": 71625,
"priceLo": 71375,
"strength": 2
},
{
"evidence": "traded",
"kind": "value_area_low",
"outsized": false,
"priceHi": 71625,
"priceLo": 71375,
"strength": 2
},
"… 6 more"
],
"leverage": 1,
"leverageAssumed": true,
"liquidationPriceUsd": 350,
"livePriceUsd": 68591,
"maintenanceMarginRate": 0.005,
"marginUsd": 3500,
"planLine": "f1ow plan · BTC long · entry 70000 · stop 68000 · target 75000 · account 10000 · risk 1%",
"rewardRisk": 2.5,
"riskPercent": 1,
"rules": "liquidation = entry × (1 ∓ 1/leverage ± 0.5% maintenance), isolated, before fees; stop inside noise < 1.0 ATR; a level within 0.5 ATR past the stop is one a wick reaches for; reward:risk floor 2:1; high leverage > 10x; far entry > 3 ATR from live; ATR is 14 × 4h",
"sizing": {
"impliedLeverage": 0.35,
"positionNotionalUsd": 3500,
"positionSizeUnits": 0.05,
"riskAmountUsd": 100
},
"sourcesFailed": [],
"stopDistancePct": 2.85714285714286,
"stopUsd": 68000,
"symbol": "BTC",
"targetUsd": 75000,
"options": {
"atmIv": 37.3112471223181,
"holdHours": 24,
"impliedMovePct": 1.95295993254966,
"impliedMoveUsd": 1367.07195278476,
"ivExtrapolatedFromFrontExpiry": true,
"observedAt": "2026-11-13T08:05:16Z",
"provider": "Deribit",
"stopSigma": 1.46298078599736,
"targetSigma": 3.65745196499341,
"gamma": {
"gammaLevelsBetweenEntryAndTarget": [
{
"kind": "large gamma strike",
"price": 72000
}
],
"riskNeutralOdds": {
"expiry": "2026-11-15T08:00:00Z",
"finishBeyondStop": 0.328,
"finishBeyondTarget": 0.003,
"touchApprox": "≈ 2 × finish probability (driftless reflection), capped at 100%"
}
}
},
"generatedAt": "2026-11-13T08:06:21.8273610+00:00"
}Related tools
research_regimeWhat kind of market you are trading in. Seven forces — trend, volatility, cycle, sentiment, leverage stress, ETF liquidity, rotation — each voting with its own reasoning and its own threshold for changing the call.
research_positioningWho is on the other side of your trade. Up to eight reads on one coin — who is crowded, who is fragile, who is trapped — plus the price levels the whole board is watching.
research_opportunitiesA liquidity-qualified major and mid-cap universe screened on crowding, stress, leverage, compression, trend, location and entry quality. Ranked candidates with disclosed setup rules and entry, stop and target geometry — not a forecast or a proven edge.
research_token_viewOne coin, fully assembled. Market data, technicals, on-chain, cited narrative synthesis, catalysts, social, ETF flows and prediction odds — the entire dossier from a single call.
Call Trade Plan Review from your agent
Sign in, get an API key and make your first call in under a minute. No card required.
For agents: this page as Markdown · all docs
Opportunity Scan
A liquidity-qualified major and mid-cap universe screened on crowding, stress, leverage, compression, trend, location and entry quality. Ranked candidates with disclosed setup rules and entry, stop and target geometry — not a forecast or a proven edge.
Token Dossier
One coin, fully assembled. Market data, technicals, on-chain, cited narrative synthesis, catalysts, social, ETF flows and prediction odds — the entire dossier from a single call.