# Trade Plan Review (`research_trade_plan`)

> 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.

- Category: Research & risk
- MCP tool: `research_trade_plan`
- REST: `POST /research/trade-plan`
- MCP App: hosts that support MCP Apps render the result as an interactive view
- x402 price: $0.05 per call (USDC on Base)
- HTML: https://www.f1ow.com/docs/tools/research_trade_plan

## 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 | In | Required | Description |
| --- | --- | --- | --- | --- |
| `symbol` | string | body | yes | Coin symbol, e.g. "ETH". |
| `entry` | number | body | yes | Planned entry price |
| `stop` | number | body | yes | Stop-loss price (below entry = long, above = short) |
| `target` | number | body | no | Optional take-profit price |
| `account_size` | number | body | no | 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_percent` | number | body | no | Optional percent of the account lost if the stop is hit, e.g. 1; only with account_size |
| `leverage` | number | body | no | 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_at` | string | body | no | 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_type` | string | body | no | 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. One of: `limit`, `stop`, `market`. |
| `venue` | string | body | no | 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_bps` | number | body | no | 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_bps` | number | body | no | Optional maker fee per fill in bps (negative for a rebate). Overrides the venue's. |
| `hold_hours` | number | body | no | 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

### cURL

```bash
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}'
```

### MCP

```json
{
  "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
    }
  }
}
```

### TypeScript

```ts
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);
```

### Python

```python
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)
```

### WebSocket

```jsonc
// 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
  }
}
```

### x402

```bash
# 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

Captured 2026-11-13. The JSON is what REST and WebSocket return and the `structuredContent` of an MCP call (trimmed):

```json
{
  "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"
}
```

Over MCP the text report a model reads comes with it:

```text
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%)
```

## Related tools

- [Market Regime](https://www.f1ow.com/docs/tools/research_regime) — What 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.
- [Positioning](https://www.f1ow.com/docs/tools/research_positioning) — Who 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.
- [Opportunity Scan](https://www.f1ow.com/docs/tools/research_opportunities) — 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](https://www.f1ow.com/docs/tools/research_token_view) — 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.
