How to Automate TradingView Alerts to Tradovate
Tradovate is the default execution platform behind an Apex evaluation and a supported option at Topstep. TradingView generates the signal but can't place the order itself — here's the webhook bridge that closes the gap.
TradingView can chart a Pine Script strategy and fire an alert the instant its conditions are met, but it has no way to place an order at a broker on its own. Getting from a chart signal to a live fill in a Tradovate evaluation account needs a webhook bridge in the middle — this walks through that exact setup using TradersPost, with PickMyTrade as a documented alternative.
What's needed before starting
- A TradingView plan that supports webhooks — Essential or higher; the free plan doesn't expose the webhook field on an alert
- An Apex or Topstep evaluation on Tradovate — log in at least once beforehand to confirm the environment is active
- A TradersPost account — the bridge that accepts the webhook and routes it to Tradovate. PickMyTrade is a valid alternative covered in our PickMyTrade + Apex setup guide
- A Pine Script strategy with alert conditions wired up — either through
strategy.entry()/strategy.exit()or a standalonealertcondition()
Step 1: Set up the webhook in TradersPost
- Create an account at TradersPost — an entry-level plan covers a single broker connection, enough for one evaluation
- Under Brokers → New Connection, select Tradovate and complete the OAuth flow, making sure the Apex or Topstep evaluation account is the one selected — not a separate live account
- Under Strategies → New Strategy, set the symbol (e.g.
MESorMNQ), quantity, and order type — TradersPost maps the generic contract symbol to the correct front-month code automatically - Once saved, TradersPost generates a webhook URL in the form
https://webhooks.traderspost.io/trading/webhook/<uuid>/<token>. Copy it for Step 3
Step 2: Wire the Pine Script alert
There are two ways to emit an alert TradersPost can parse, depending on how the script is built.
Option A: strategy.entry / strategy.exit (recommended)
With strategy.entry() and strategy.exit() calls, set the TradingView alert condition to
"Order fills only" and use the built-in order alert message. A payload shape like this works cleanly with
TradersPost:
{
"ticker": "{{ticker}}",
"action": "{{strategy.order.action}}",
"quantity": {{strategy.position_size}},
"price": {{close}},
"sentiment": "{{strategy.market_position}}"
} Option B: standalone alertcondition()
If the script fires alerts through alertcondition() instead of strategy calls, define each condition
manually and wire a separate TradingView alert per direction:
longCond = ta.crossover(ta.ema(close, 9), ta.ema(close, 21))
shortCond = ta.crossunder(ta.ema(close, 9), ta.ema(close, 21))
alertcondition(longCond, title = "Long Entry", message = '{"ticker":"MES","action":"buy","quantity":1}')
alertcondition(shortCond, title = "Short Entry", message = '{"ticker":"MES","action":"sell","quantity":1}') Each alertcondition() needs its own TradingView alert, all pointed at the same TradersPost webhook URL.
Step 3: Create the TradingView alert
- Right-click the chart and select Add Alert, or press
Alt+A - Under Condition, select the strategy name and Order fills only (for Option A), or the specific
alertconditionname (for Option B) - Under Notifications, check Webhook URL and paste the TradersPost URL from Step 1
- In Message, paste the JSON payload from Step 2 — TradingView expands the placeholders at fire time
- Set expiration well into the future — TradingView alerts expire by default, and a lapsed one means missed signals with no warning
- Click Create
Prop firm compliance checklist
Before running any of this on a live Apex or Topstep evaluation, confirm the Pine Script includes:
- A kill switch input — a manual toggle that blocks new entries without closing existing positions
- A session filter — restricts trading to regular hours and avoids holding through overnight sessions most evaluations disallow
- Bar-close entries —
calc_on_every_tick = falsein the strategy declaration, so entries fire on confirmed closes rather than intrabar ticks - An EOD flatten — force-closes all positions before market close, which both Apex and Topstep evaluations expect
- A daily loss limit — a coded halt once realized-plus-unrealized loss crosses a threshold, mirroring the account's actual drawdown mechanic at the strategy level
Free code snippets covering each of these are available in our Pine Script snippets library.
Common issues and fixes
- Alert fires but no order appears in Tradovate. Check the TradersPost webhook log first — every received payload shows a success or error status there. A malformed JSON payload (a missing quote, a wrong field name) is the usual cause; validate it with a free JSON linter before re-pasting.
- Order fills at an unexpected price. Usually means the alert fired on an intrabar tick rather than bar close. Confirm
calc_on_every_tick = falseand set the TradingView alert to fire "Once per bar close." - Duplicate fills. The alert is set to "Once per bar" instead of "Order fills only." Switching the condition to fills-only usually resolves it.
- Symbol not found in Tradovate. Tradovate uses specific front-month contract codes internally; TradersPost handles the rollover mapping automatically as long as the generic symbol (e.g.
MES) is used in the strategy configuration rather than a dated code.