Docs · Automation

Webhook Automation. Chart To Broker.

Everything between a TradingView alert and a filled order: provider choice, alert configuration, payload reference, and the verification steps that catch problems before money is live.

Webhook & Broker Setup

Live Execution Setup.

This is where almost every setup ticket comes from — and the fix is nearly always the same one step. Read the non-negotiable item first, then follow the exact setup for your provider. Bracket prices are computed on the strategy side and embedded in every alert, so there's nothing to parse on the bridge.

Non-negotiable: fill in BOTH Auth Token and Account IDIn the strategy's 🔗 Webhook & Broker input group, fill in Auth Token / API Key and Account ID (for PickMyTrade, CrossTrade, and Custom Template — TradersPost authenticates by URL, so its fields grey out). If either is blank, the alert still fires — but the payload goes out with empty credentials and your broker bridge silently drops it with no error shown anywhere. This is the single biggest cause of "my alerts aren't firing / nothing reaches my broker." Fill both, every time, before you create the alert.

Pre-flight checklist — run through this BEFORE creating any live alert

  • TradingView plan is Essential or higher and 2FA is enabled on your account
  • You loaded the strategy on a chart, not just the indicators (check the bottom panel for the Strategy Tester tab)
  • Chart timeframe matches what you've validated in backtest, or you've imported a preconfigured layout from Discord (see Shared Layouts)
  • Your routing provider account (PickMyTrade, TradersPost, CrossTrade, or a Custom Template bridge) is connected to a broker — paper or live, but connected
  • The broker account you'll route to has enough buying power for at least 1 contract of your target symbol
  • Auth Token / API Key and Account ID are both filled in the strategy's Webhook & Broker inputs (PickMyTrade / CrossTrade / Custom Template — TradersPost leaves them blank and authenticates by URL) — this is the #1 thing people forget
  • You've configured the rest of the input panel (Preset, Contracts, Prop Firm Settings, Webhook Provider)
  • You've run at least one Strategy Tester report on the chart timeframe and reviewed the results
  • You know your daily loss cap in dollars and your max contracts per trade
  • You have a plan for what to do if the strategy halts mid-day (it will if your circuit breaker trips)

How signals flow from chart to broker

TradingView Strategy fires on bar close. Alert built with bracket prices embedded.
Routing Bridge PickMyTrade · TradersPost · CrossTrade · Custom Template receives the payload, translates to broker.
Broker Tradovate · Rithmic · TopstepX · TradeStation · IB · NinjaTrader 8 (via CrossTrade) · prop-firm sim.

Alert condition — by provider

v7.4 ships four built-in providers in the Webhook Provider dropdown: PickMyTrade, TradersPost, CrossTrade, and Custom Template. All four use the same alert ConditionAny alert() function call with an empty Message box:

ProviderTradingView Alert ConditionMessage box
PickMyTradeAny alert() function callleave empty
TradersPostAny alert() function callleave empty
CrossTradeAny alert() function callleave empty
Custom TemplateAny alert() function callleave empty
TradersPost is built in (since v7.3 — verified end to end in v7.4)TradersPost is a native Webhook Provider — select it in the dropdown, set the TradingView Condition to Any alert() function call, leave the Message box empty, and paste your TradersPost webhook URL in the Notifications tab. It authenticates through that URL, so the Auth Token and Account ID fields stay blank (they grey out automatically). Already running TradersPost the old way — their JSON with Order fills only? That still works; switch to the built-in whenever you're ready (see the TradersPost setup section below).

Per-provider field mapping

What goes in the strategy's Auth Token / API Key and Account ID inputs, by provider:

ProviderAuth Token / API Key →Account ID →Broker bracket
PickMyTradeyour PMT tokenyour exact account number (Tradovate or Rithmic)native, broker-side
TradersPost— leave blank (greys out)— leave blank (greys out)full, broker-side*
CrossTradeyour CrossTrade keyyour NinjaTrader account name(s), comma-separatedfixed bracket, or ATM template (NT-side trail)
Custom Templatefills the {token} placeholderfills the {account} placeholderdepends on template

*TradersPost authenticates through your webhook URL, so the Auth Token and Account ID fields stay blank — they grey out automatically. Paradox builds the full bracket (market entry + take-profit + stop / stop-limit / trailing) into the payload it sends, so the position is protected broker-side.

Provider setup

Not sure which one? Tradovate account (most prop firms) → PickMyTrade. Rithmic account → PickMyTrade + your Rithmic connection name. NinjaTrader 8 → CrossTrade. Already on CrossTrade with Tradovate → CrossTrade with Destination = Tradovate. Anything else → TradersPost or Custom Template.

PickMyTrade Primary recommendation for futures

Best for: futures traders running Tradovate, Rithmic, TopstepX (ProjectX), TradeStation, Interactive Brokers, TradeLocker, or Match-Trader. Native broker-side bracket support.

  1. Sign in at app.pickmytrade.io and link your broker. Supported: Tradovate · Rithmic · Interactive Brokers · TradeStation · ProjectX (TopstepX) · TradeLocker · Match-Trader · Binance · Bybit.
  2. In the strategy's 🔗 Webhook & Broker inputs, set Webhook Provider = PickMyTrade.
  3. Set Auth Token / API Key = your PMT token, and Account ID = your exact account number (copy it from PMT — see "Account ID" below). Both must be filled.
  4. On a Rithmic account (v7.4)? Fill the Rithmic Connection Name field in the PickMyTrade section — exactly as it appears in your PMT dashboard (e.g. RITHMIC1). The full bracket, adaptive trailing stop, and multi-account all carry natively. On Tradovate? Leave it blank — your payload is unchanged.
  5. Copy the webhook URL from your PickMyTrade strategy detail page:
    • Multi-broker accounts: https://api.pickmytrade.io/v2/add-trade-data-latest
    • Tradovate-only: https://api.pickmytrade.trade/v2/add-trade-data-latest
    Your token travels in the JSON body the strategy emits — not in the URL. The older app.pickmytrade.com/webhook/... format is deprecated and silently fails.
  6. In TradingView: create the alert → Condition = your strategy + Any alert() function callNotifications tab → enable Webhook URL → paste the PMT endpoint. Leave the Message box empty.
  7. Test in PickMyTrade's paper mode first. Confirm the order appears in PMT's order log AND your broker's paper account.

Nothing to configure on Tradovate. PMT executes through the Tradovate API. The only requirement is that the account is connected inside PickMyTrade — you do not log into Tradovate or set anything up there.

Multiple accounts (v7.3). Enter several account numbers in Account ID, comma-separated, and a single alert fires every one of them — e.g. run your eval and funded accounts side by side. Each must be an exact account number connected inside PickMyTrade.

TradersPost Built-in as of v7.3 — URL-authenticated

Best for: traders on a TradersPost-supported broker (NinjaTrader, Tradovate, TradeStation, and more). As of v7.3 the strategy builds the full bracket for you — no JSON to paste.

  1. Sign in at traderspost.io, connect your broker(s), and create a strategy. Copy its webhook URL: https://webhooks.traderspost.io/trading/webhook/<id>/<token>.
  2. In the strategy's 🔗 Webhook & Broker inputs, set Webhook Provider = TradersPost. The Auth Token and Account ID fields grey out — TradersPost authenticates through the webhook URL, so leave them blank.
  3. In TradingView: create the alert → Condition = your strategy + Any alert() function callNotifications tab → enable Webhook URL → paste the TradersPost URL. Leave the Message box empty — the strategy supplies the full order (market entry + take-profit + stop; stop-limit and trailing supported).
  4. Confirm reception in TradersPost's paper mode before going live. For safety in week one, enable "Disable Auto Submit" so you approve each fire manually.

Verified end to end (v7.4). We audited the entire TradersPost path against their official spec. Two TradersPost-side settings worth checking: keep the "Use signal take profit / stop loss" boxes CHECKED (unchecked = your brackets get silently ignored), and near contract rollover use the exact contract symbol (like MNQZ2026) — TradersPost switches front-month on its own schedule, which can differ from TradingView's. Also good to know: TradersPost's trailing stop trails from entry at your full stop distance, broker-side — a simpler trail than the chart's adaptive one, so live trail exits won't mirror the backtest tick for tick. That's expected.

Migrating from QuantLynk? QuantLynk is retired. Flatten any open QuantLynk-managed position, switch Webhook Provider to TradersPost (or PickMyTrade), and re-create your alert. Already using TradersPost's older order-fills method? It still works — see the legacy note below.

CrossTrade NinjaTrader 8 — built in as of v7.4

Best for: NinjaTrader 8 traders. CrossTrade is a native provider as of v7.4 (Paradox) and v1.5 (Kairos) — no more hand-building custom templates for NinjaTrader.

  1. Sign in to your CrossTrade account and copy your API key. Make sure the CrossTrade add-on is connected to NinjaTrader 8 (or use the beta Tradovate cloud destination — no desktop software needed).
  2. In the strategy's 🔗 Webhook & Broker inputs, set Webhook Provider = CrossTrade.
  3. Set Auth Token / API Key = your CrossTrade key, and Account ID = your NinjaTrader account name(s) — comma-separated for multiple accounts, one alert fires them all.
  4. Pick your bracket mode. Fixed bracket (default): every entry ships with its target + stop, held at NinjaTrader at the chart's exact prices. ATM mode (the trailing stop): enter the name of your saved NinjaTrader ATM template and NinjaTrader runs your stop, target, and a tick-level auto-trail on its own — even if your connection drops mid-trade. The dashboard's Trail row shows the exact trigger/distance numbers to copy into the template. One rule: your Contracts setting must match the template's contract count.
  5. Exit Mirror is on by default — when the chart closes a trade, NinjaTrader closes with it and cancels leftover orders. Leave it on unless you have a specific reason not to.
  6. On Tradovate through CrossTrade (beta)? Set Destination = Tradovate and orders route through CrossTrade's cloud, fixed bracket included. ATM templates are NinjaTrader-only — on Tradovate the algo auto-falls back to the fixed bracket.
  7. In TradingView: create the alert → Condition = your strategy + Any alert() function callNotifications tab → enable Webhook URL → paste your CrossTrade webhook URL. Leave the Message box empty.
  8. Test on a NinjaTrader sim account first. Confirm the entry, bracket, and an exit-mirror close all arrive.

Strategy tagging is automatic. Every order carries a strategy tag, so Paradox's trades stay in their own lane — other bots on the same NinjaTrader account can't touch them, and Paradox won't touch theirs. Running Kairos on the same account? Each algo keeps its own tag.

Custom Template Any other bridge

For any bridge not built in, set Webhook Provider = Custom Template and paste your bridge's exact JSON into the Custom Template field, using the strategy's single-brace placeholders. The strategy substitutes each one at fire time:

  • {symbol} · {action} (buy / sell / flatten) · {qty} · {price}
  • {tp_price} · {sl_price} — absolute bracket prices · {tp_offset} · {sl_offset} — distances in points
  • {token} — fed by your Auth Token / API Key input · {account} — fed by your Account ID input

Flatten Word field. The Flatten Word input controls the exact word the strategy puts in {action} when it closes a position (time-exit, session end, or stop). Set it to whatever your bridge expects for a close — e.g. close, exit, or flat. If your bridge ignores closes, that almost always means the Flatten Word doesn't match what it's looking for.

TradersPost — legacy order-fills method Existing setups only

As of v7.3, TradersPost is a built-in provider (see the TradersPost section above) and that's the recommended path for new setups. If you're already running TradersPost the old way, that method still works:

  1. Sign in at traderspost.io, connect your broker(s), and create a strategy. Copy its webhook URL: https://webhooks.traderspost.io/trading/webhook/<id>/<token>.
  2. In TradingView: Condition = your strategy + Order fills only. Paste the TradersPost URL into Webhook URL, and paste TradersPost's own JSON template (shown on your TradersPost strategy page) into the Message box.
  3. Use TradersPost's Send Test button to confirm reception before going live. For safety in week one, enable "Disable Auto Submit" so you approve each fire manually.

Switching to built-in? Change Webhook Provider to TradersPost, set the Condition to Any alert() function call, and clear the Message box — the strategy then supplies the payload. Don't mix methods: never pick "Order fills and alert() function calls," which doubles every fire.

Where the webhook URL goes

In the TradingView alert dialog, open the Notifications tab → enable Webhook URL → paste your provider's endpoint there. Do not paste it in the Message box (that box is for the payload, which the strategy fills for the built-in providers). For PickMyTrade, copy the endpoint from your strategy detail page in PMT — it's the api.pickmytrade.io/v2/add-trade-data-latest address (or the .trade variant for Tradovate-only accounts).

Account ID must be your exact broker accountA wrong or mistyped Account ID returns "Account Id Not Found" and the order never places. For PickMyTrade, copy your exact Tradovate account number straight from PMT (your connected-account list shows it) and paste it into the strategy's Account ID input — don't retype it from memory.

TradingView plan requirements

Minimum plan: EssentialWebhook alerts (the Webhook URL field) are available on TradingView's Essential plan and above — Pro and Pro+ are fine too. The free plan does NOT include webhook alerts. Alert quotas: Essential 20 · Pro 100 · Premium 400 · Ultimate 2,000. Open-ended alert expiration (no 60-day timer) requires Premium or Ultimate; on lower tiers, alerts expire after ~2 months and must be renewed. 2FA must be enabled on your TradingView account before webhooks will deliver.

Creating the alert — step by step

For the four built-in providers (PickMyTrade, TradersPost, CrossTrade, Custom Template), this is the whole flow. The Condition is Any alert() function call and the Message stays empty — the strategy supplies the payload, bracket prices and all.

  1. Open a chart with the Paradox strategy loaded — not just the indicators. Strategies fire alerts on entries/exits; indicators only fire on visual conditions you wire up manually.
  2. Make sure Auth Token / API Key and Account ID are both filled in the strategy's Webhook & Broker inputs (see the non-negotiable note at the top). Skip this and the order goes out with empty credentials.
  3. Click the Alerts button (bell icon) in TradingView, then Create Alert.
  4. In the Condition dropdown (first field), select the strategy's exact name — e.g. Paradox Algo Strategy v7.4 or Kairos Scalper [ParadoxAlgo], matching what appears in your Indicators → Invite-Only Scripts list.
  5. In the second field, select . (All four built-in providers use this. Only the legacy TradersPost order-fills path differs — see the TradersPost sections above.)
  6. Open the Notifications tab, enable Webhook URL, and paste your provider's endpoint there.
  7. Leave the Message field empty — the strategy injects its own JSON payload via alert() with bracket prices, ticker, and direction already filled in. Do not paste a template here (that's only for the TradersPost order-fills path).
  8. Set the alert Expiration to Open-ended (Premium/Ultimate) or the longest available on your plan. Re-create when it expires.
  9. Click Create. Verify the alert appears in the Alerts panel with a green dot (active).
  10. Test once in your provider's paper/sandbox mode before going live. Use RequestBin or Webhook.site to inspect the raw payload if anything looks off.
The three things that must be right(1) Credentials set for your provider — Auth Token AND Account ID filled for PickMyTrade / CrossTrade / Custom Template (TradersPost authenticates by URL, so those fields stay blank). (2) Condition = Any alert() function call with an empty Message for all built-in providers; only the legacy TradersPost order-fills path uses Order fills only + JSON — never "Order fills and alert() function calls," which doubles fires. (3) Webhook URL pasted in the Notifications tab. Get those three right and the alert reaches your broker.
Webhook Reference

Understanding the PMT Payload.

If you inspect the JSON PickMyTrade receives, a few fields won't match the Pine script — and that's correct. Here's what the strategy sends versus what PMT adds on its own side, so you can tell a real issue from a non-issue.

What the strategy sends vs what PMT adds

The strategy emits a compact payload. PickMyTrade then adds its own internal fields on its side before routing to the broker — these are not from the Pine script, and seeing them does not mean the script is broken:

FieldAdded byWhat it is
symbol · action · quantityStrategythe order itself
dollar_tp · dollar_slStrategybracket distance from entry, in points
token · accountStrategyyour Auth Token and Account ID
full_closedPMTPMT's internal close flag
order_typePMTPMT's order-type field
main_token_typePMTPMT account/token classifier
tif · gtd_in_secondPMTPMT time-in-force fields
On "diagnostic" claimsIf anyone points at full_closed, order_type, main_token_type, tif, or gtd_in_second as proof the script has bugs — those are PickMyTrade's own internal fields, added on PMT's side, not emitted by the Pine script. They're supposed to be there.

tp and sl showing 0 is correct

If you see tp: 0 and sl: 0 in the payload, that's intentional — the bracket is sent the other way. There are two methods:

  • Absolute-price method: tp / sl would carry exact prices. The strategy does not use this path for PMT — hence the zeros.
  • Distance method (what's used): the bracket is sent via dollar_tp and dollar_sl — the distance from entry in points. PMT builds the bracket as entry ± that distance. So tp: 0 / sl: 0 alongside non-zero dollar_tp / dollar_sl is exactly right.

Order type

Entries are market orders — confirmed in live testing. The strategy enters at market on the confirmed signal, and PMT attaches the bracket (from dollar_tp / dollar_sl) on the broker side.