Skip to Content
f1owdocs
Tool reference

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.

Research & riskresearch_trade_planPOST /research/trade-planx402 · $0.05 / callRead-onlyMCP App

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

NameTypeDescription
symbolrequiredbodystringCoin symbol, e.g. "ETH".
entryrequiredbodynumberPlanned entry price
stoprequiredbodynumberStop-loss price (below entry = long, above = short)
targetbodynumberOptional take-profit price
account_sizebodynumberOptional 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_percentbodynumberOptional percent of the account lost if the stop is hit, e.g. 1; only with account_size
leveragebodynumberOptional 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_atbodystringWhen 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_typebodystringHow 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
venuebodystringOptional 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_bpsbodynumberOptional 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_bpsbodynumberOptional maker fee per fill in bps (negative for a rebate). Overrides the venue's.
hold_hoursbodynumberOptional 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.

Loading interactive view…
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"
}

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

On this page