Skip to main content

TradingView Alerts & Webhooks

CrossTrade is a webhook-based middleware: TradingView fires an alert, the alert hits your CrossTrade webhook URL, CrossTrade parses the message, and forwards the order to NT8. This page covers how to set up alerts, why alerts might not reach NT8, TradingView's quirks, and the flow end-to-end.

How does the TradingView-to-NT8 flow actually work?

TradingView alert → CrossTrade webhook URL → NT8 add-on → Order executed

TradingView is the trigger. When an alert fires on TV, TV sends a webhook POST to the URL you configured on the alert. CrossTrade captures that request on its servers, validates the payload, and hands the order off to NT8 via the NinjaScript API and the Automated Trading Interface (ATI). Average CrossTrade-side turnaround from "alert received at our front door" to "handed off to NT8" is around 30–40ms.

CrossTrade does not have visibility into your TradingView — it can only see what arrives at the webhook URL.

What's the difference between my webhook URL and my secret key?

  • Webhook URL: your unique CrossTrade endpoint, like https://app.crosstrade.io/v1/send/xxx/yyy. Think of it as your home address. You paste this into the TradingView alert's Notifications tab (Webhook URL field).
  • Secret key: validates each request, included inside the alert message body as key=...;. Think of it as the key to get in. Never share it.

Both values live on your CrossTrade dashboard and on https://app.crosstrade.io/user/my-account. Only one key works per webhook URL — you cannot include multiple key= lines in a single alert.

How do I set up a TradingView alert to send to CrossTrade?

  1. Create or edit a TradingView alert.
  2. In the Notifications tab, enable Webhook URL and paste your CrossTrade webhook URL.
  3. In the Message box, paste a CrossTrade-formatted alert message (semicolon-separated key=value pairs, not JSON).
  4. For strategies, the Condition dropdown should be set to Alert function calls only (or "Order fills and function calls") — see below for details.
  5. Save the alert.

TradingView requires 2-factor authentication on your account before it will allow webhooks — this is a TV requirement, not a CrossTrade one. You also need at least TradingView's Essentials plan; the free TradingView plan does not allow webhooks.

Full walkthrough: https://crosstrade.io/docs/getting-started/tradingview-alerts

Does CrossTrade work with TradingView's free plan?

No. TradingView only allows webhook alerts on paid plans (Essentials and above). TV's Free plan cannot send webhooks, so it cannot drive CrossTrade. You also need real-time data on TradingView for the strategy to fire on time — delayed data will produce delayed alerts.

CrossTrade's own free trial is fully functional, but you still need a TV paid plan to receive alerts from TV.

For a TradingView strategy alert, which "Condition" option should I pick?

Select Alert function calls only (or the combined "Order fills and function calls"). This fires alerts based on alert() or strategy.entry/exit calls that have an alert_message parameter. Selecting "Order fills only" alone typically prefills a TV-formatted description that is not CrossTrade-compatible.

If your alert message box still shows the default TradingView text like order \{\{strategy.order.action\}\} @ \{\{strategy.order.contracts\}\} filled on \{\{ticker\}\}, clear it — CrossTrade cannot parse that, you will get Improperly formatted request.

What is the "Any alert() function call" option for?

That condition fires when Pine Script calls the alert() function. It's used when you write a custom indicator that calls alert(payload, alert.freq_once_per_bar_close) from Pine. CrossTrade will receive whatever string you passed to alert(), so your payload must be the full CrossTrade-formatted message.

There's a blog post on transforming indicator alerts: https://crosstrade.io/blog/transform-tradingview-indicator-alerts/

What's the difference between writing the payload in Pine Script vs. in the TV alert Message box?

User preference — both work.

  • Message box: paste the full CrossTrade payload into the alert's Message field directly. Simple, but you can't use logic there. The \{\{strategy.order.action\}\} and \{\{strategy.order.contracts\}\} variables get filled in by TV.
  • Pine Script alert_message: build the payload as a string inside your strategy using strategy.entry("Long", strategy.long, alert_message=msg), then put only \{\{strategy.order.alert_message\}\} (plus key=...;) in the Message box. This lets you send different payloads per alert condition (entry vs. exit, long vs. short) and pass dynamic values like stops based on ATR.

For strategies with only one alert trigger, writing everything into strategy.order.alert_message inside Pine is the most flexible. There's a walkthrough at https://crosstrade.io/blog/how-to-automate-tradingview-strategies-with-crosstrade/.

My TradingView alert fired but nothing shows up in CrossTrade. Why?

If the alert does not appear on https://app.crosstrade.io/user/history, CrossTrade never received it — which means TV never sent it. Check, in order:

  1. The webhook URL is set on the alert. Open the alert and verify the Notifications tab has your correct CrossTrade URL. This is the #1 cause.
  2. The alert was re-saved after edits. TV alerts do not automatically update when you change settings on the underlying indicator or strategy. Open the alert, click the Condition dropdown, and pick the newest instance of your indicator/strategy from the bottom of the list. Then save.
  3. The webhook URL was typed/pasted correctly (no truncated trailing character).
  4. The alert is still active (not paused or stopped).

Even a malformed payload would still show up in Alert History with an error — so if there is truly nothing in Alert History, it's a TradingView-side configuration issue, not a CrossTrade issue.

How do I test an alert without waiting for a signal?

Use the Manual Trader (formerly "Command Tester") on your CrossTrade dashboard. Click Send to NT8 on a basic PLACE command. This simulates exactly what happens when TV sends a webhook — alert lands at CrossTrade, gets validated, gets forwarded to NT8.

Note: you cannot test TV replacement variables from the Manual Trader. Anything with double curly braces like \{\{strategy.order.action\}\} only gets filled in by TradingView itself, so if you paste those into the Manual Trader you'll get Replacement \{\{variables\}\} can only be used from inside TradingView. Use hard-coded values (action=BUY;, qty=1;) when testing from the dashboard.

Where do I see alert history?

The Alert History page is the source of truth for everything that reached CrossTrade:

https://app.crosstrade.io/user/history

Every alert that hit your webhook is logged there, with its full payload, received timestamp, sent-to-NT8 timestamp, and the response (success or the specific error). If you're asking support "why did my alert fail?", the Alert History Order ID is what lets support look up the exact request.

Can I trigger an alert on one instrument that executes on a different instrument?

Yes. The instrument that triggers the TradingView alert has no relationship to the instrument CrossTrade sends to NT8. Whatever you set in the alert message's instrument=...; line is what NT8 trades.

You could trigger an NQ trade from a BTC chart, or anything else. Common use: chart on the continuous ES1! but trade the micro MES 06-25.

Can one TradingView alert place orders on multiple NT8 accounts?

Yes — separate accounts with commas in the account= field:

account=Sim101,Sim102,Sim103;

The alert will be replicated 1-for-1 to each listed account. Quantities and other fields are the same across all accounts — you cannot set different qty per account in one alert. If you need different quantities or directions per account, use separate alerts or the NT8-side Trade Copier.

More info: https://crosstrade.io/docs/webhooks/advanced-options/multi-account-placement

Can one alert send to multiple CrossTrade accounts (multiple webhooks)?

No. Each TradingView alert has one webhook URL and must contain exactly one key=. If you have two CrossTrade accounts (e.g. running two separate VPS's with two separate NT8s), create two separate TradingView alerts — one per webhook URL, each with its matching secret key.

Including two key= lines in one alert will fail with "Secret key is missing, invalid, or inactive."

Why are my alerts delayed — CrossTrade, TradingView, or my machine?

Almost always TradingView. CrossTrade's own time-to-execution (alert received → handed off to NT8) is typically 30–40ms. There is no meaningful way to speed that up further — you're hitting HTTP propagation limits.

TradingView, on the other hand, plots the trigger time, not the sent time. If TV is overloaded, an alert can sit in their queue for several seconds before being sent out of their Oregon servers. To diagnose:

  • Compare the TV alert log trigger time with the "Received" timestamp on CrossTrade's Alert History.
  • The gap between those two is pure TradingView latency.
  • The "Sent" timestamp minus "Received" on Alert History is CrossTrade's handle time (usually tens of milliseconds).

If you are seeing 5–30 second delays to CrossTrade, that's a TV-side issue and CrossTrade has no control over it. Email support@crosstrade.io with an Order ID and they can confirm from XT-side logs.

Things you can do on your side: run NT8 on a wired connection (not Wi-Fi), use a Chicago-based VPS to shorten the NT8 leg, and make sure your machine's clock is synced. TradingView servers are in Oregon, CrossTrade's are in Chicago — the path is TV Oregon → XT Chicago → your NT8, then back to Chicago for execution through NT8's infrastructure.

How many alerts per minute will TradingView allow?

TradingView rate-limits the number of alerts within a window (reportedly around 3 per minute on most plans). If your strategy fires on a very fast timeframe (e.g. Renko on 15s/30s bars) you may hit TV's throttle and see "Stopped - Triggered too often" on the alert.

If you need to prevent rapid-fire duplicates on CrossTrade's side, use a rate_limit=X/seconds; field with an id=YourRateLimitName; in the alert. See https://crosstrade.io/docs/webhooks/advanced-options/rate-limiting.

Can I fire alerts from more than one TradingView strategy into the same account?

Yes, as many as you want, but be careful with overlap. If Strategy A and Strategy B are both sending to the same NT8 account on the same instrument, a close from A will close the entire position including B's contracts — NT8 has no concept of "which strategy owns which contracts". Running multiple strategies on the same instrument/account is playing with fire.

Options:

  • Separate strategies to different accounts (or different instruments) and use the Trade Copier if needed.
  • Use trading windows to run Strategy A in Window 1 and Strategy B in Window 2.
  • Use remote_strategy_id=xyz; tagging if/when that feature is available.

Running multiple strategies on different instruments in the same account is safe. See https://crosstrade.io/docs/getting-started/complete-guides/running-multiple-strategies.

Does each strategy condition need its own alert?

Depends on the strategy type:

  • Stop-and-reverse strategies (always long or short) can use a single alert with action=\{\{strategy.order.action\}\}; — TV will supply BUY or SELL dynamically.
  • Strategies that go long/short/flat usually need multiple alerts or a Pine-scripted strategy.order.alert_message that sends different payloads for entry vs. exit.
  • Proprietary/closed-source indicators sometimes only give one alert message box and force you to use dynamic variables — you're at the mercy of how the author wrote the trigger conditions.

Indicators are generally more flexible than strategies for alerting because they can expose multiple alert conditions (long entry, long exit, short entry, short exit). If you have access to Pine Script, writing the payload into strategy.order.alert_message is the most powerful approach.

What if I change my indicator or strategy settings — do the alerts update?

No. This trips up a lot of people. TradingView alerts are bound to the instance of the indicator/strategy that existed when the alert was created. Changing settings later does not update existing alerts — the alert keeps firing against the old settings.

To update: open the alert, click the Condition dropdown, and select the newest instance of the indicator/strategy (it appears at the bottom of the list). Then save. Or delete the alert and create a fresh one.

What does Improperly formatted request mean?

CrossTrade could not parse the alert message. Common causes:

  • Missing = or ; somewhere (every line needs a trailing semicolon).
  • The default TradingView text (e.g. order \{\{strategy.order.action\}\} @ \{\{strategy.order.contracts\}\} filled on \{\{ticker\}\}) is still in the Message box along with your CrossTrade payload — clear it out, only CrossTrade-formatted text should be there.
  • The alert is firing with an empty message because \{\{strategy.order.alert_message\}\} is being used but the underlying Pine Script never assigned a value to it (or the trigger is an indicator, not a strategy).
  • JSON-style formatting pasted in from another tool like TradersPost or PMT — CrossTrade does not use JSON.

Find the Order ID in Alert History and the expanded entry will show the exact payload CrossTrade received, which usually pinpoints the issue.

Why am I seeing \{\{strategy.order.alert_message\}\} as the literal text in my alert?

That variable only gets replaced when the alert is fired by a TradingView strategy (not an indicator) that has set alert_message= on a strategy.entry / strategy.exit / strategy.close / strategy.order call.

Two common causes of the literal text coming through:

  1. You're using an indicator (not a strategy) with that variable — TV won't replace it. Use the indicator's alert conditions and paste a full CrossTrade payload into the Message box, or switch to the XT Alert Builder, or use an indicator call to alert(msg, ...).
  2. You have a strategy but its Pine code doesn't populate alert_message, or the alert's Condition dropdown is pointed at old settings.

Re-save the alert after confirming the condition is a strategy and the script populates alert_message.

Does CrossTrade understand TradingView's dynamic variables?

CrossTrade sees only what TradingView substitutes in before sending. The substitution happens on TV's side — CrossTrade has no way to interpret \{\{...\}\} itself.

Commonly used:

  • \{\{strategy.order.action\}\} — resolves to BUY or SELL from the strategy logic.
  • \{\{strategy.order.contracts\}\} — resolves to the contract count the strategy used.
  • \{\{strategy.market_position\}\} / \{\{strategy.prev_market_position\}\} — used for Strategy Sync.
  • \{\{ticker\}\} — the symbol triggering the alert.
  • \{\{close\}\} — the last bar's close price; useful to build dynamic limit prices.
  • \{\{strategy.order.alert_message\}\} — your custom per-order payload, set in Pine.

Full list and examples: https://crosstrade.io/docs/getting-started/tradingview-alerts/dynamic-variables

Why did my alert arrive with no message / a blank payload?

Usually the same \{\{strategy.order.alert_message\}\} issue above: the variable is in the Message box but the Pine Script never populated it, so TV sent an empty string.

Another case: you set the alert Condition to "Any alert() function call" but your Pine Script calls alert("") on some condition, or calls alert() with a string that was built from an out-of-scope variable that resolved to nothing. Check Pine Logs against what CrossTrade received.

Can I signal-check the Pine Script by watching what CrossTrade actually received?

Yes — every successful and failed alert in Alert History includes the exact raw payload that came over the wire. If your Pine logs say qty=2 but Alert History shows QTY = 1, you're looking at a Pine-side variable scoping issue (the variable being referenced in the payload string is not the one you think it is). Compare the two and you'll find the discrepancy.

Do I need to keep TradingView open for alerts to fire?

No. TradingView alerts live on TV's servers — once saved, they fire regardless of whether you have TV open on any device. You do, however, need NT8 running with the CrossTrade add-on connected to actually receive the execution.

Is there a way for CrossTrade to read signals off the chart (indicator plots, arrows)?

No. CrossTrade is entirely webhook-based. If TradingView doesn't fire an alert, CrossTrade can't do anything. Some indicators are known to plot signals on the chart without firing alert conditions — there's nothing CrossTrade can do in that case.

The usual workaround for indicators with chart markers but no clean alert conditions is the XT Alert Builder, which wraps plotted indicator outputs into alerts CrossTrade can consume. See https://crosstrade.io/docs/getting-started/tradingview-alerts/xt-alert-builder.

Can I reverse a signal's direction (BUY becomes SELL) through an alert setting?

Not through the alert message body. You'd have to invert the direction in Pine Script (or use the Trade Copier's fade/invert setting for leader→follower).

Can CrossTrade prop firms detect that trades came from an automated webhook?

No. CrossTrade submits orders through NT8's NinjaScript API as if they were placed normally. Prop firms cannot distinguish CrossTrade-driven executions from manual ones. This is a key reason CrossTrade is NT8-desktop-only — connecting to Tradovate API or similar would be detectable.

What about the WealthCharts / AlgoPro / AlgoBox / RedAlgo / QuantVue / LuxAlgo / etc. indicator I'm using — will it work?

Yes, almost always. Any indicator or strategy that exposes an alert Message box on TradingView can send to CrossTrade. How flexible your setup is depends on how many alert conditions the author exposes:

  • Single alert Message box that force-uses dynamic variables → limited, usually fine for simple BUY/SELL.
  • Multiple per-condition inputs for different CrossTrade payloads (long entry, long exit, short entry, short exit) → most flexible.
  • No alert conditions exposed at all → you can't automate it.

If you have an indicator that plots buy/sell arrows but only exposes one generic alert, the XT Alert Builder is the tool to bridge the gap.

I was using TradersPost / PickMyTrade / 3Commas — what do I need to change for CrossTrade?

Most of those services use JSON. CrossTrade uses plain-text semicolon-separated key=value; pairs. You must clear the JSON/other-format payload out of the alert Message and replace it with a CrossTrade-formatted payload. The webhook URL also needs to be changed to your CrossTrade URL.

Payload examples are on the dashboard under Command Examples and in the docs at https://crosstrade.io/docs/webhooks/examples-and-use-cases.

Can I update contract rollover automatically in alerts?

Yes — use TradingView's continuous contract format in the instrument field:

instrument=MNQ1!;
instrument=ES1!;

CrossTrade auto-converts MNQ1!, MNQU5, MNQ SEP25, and MNQ 09-25 formats to the NT8 front month based on your NT8 instrument-settings preference (numeric or month abbreviation). Using MNQ1! means you never have to update alerts when contracts roll.

Caveat: TradingView rolls continuous contracts based on volume (when the next contract's daily volume exceeds the current's), while NT8 uses CME's calendar. On rollover days these can disagree by a day or two. If you've updated your NT8 database to the new contract but TV is still on the old one, you may see mismatches. Some traders prefer to hardcode the NT8 format (e.g. MNQ 03-26) for a week across the roll and then switch back to MNQ1!.

What's the minimum I need to paste into the TradingView alert Message box?

For a market buy with hard-coded values:

key=your-secret-key;
command=PLACE;
account=sim101;
instrument=MNQ1!;
action=BUY;
qty=1;
order_type=MARKET;
tif=DAY;

For a strategy where TV supplies BUY/SELL and contract count dynamically:

key=your-secret-key;
command=PLACE;
account=sim101;
instrument=MNQ1!;
action=\{\{strategy.order.action\}\};
qty=\{\{strategy.order.contracts\}\};
order_type=MARKET;
tif=DAY;

Every line ends with a semicolon. Do not wrap in braces or quotes. The dashboard has ready-to-paste examples under Command Examples / Education.

Can I send comments / notes in the alert so I can identify them later?

Yes, use the notes= field:

notes=Hi ho! Hi ho! It's off to work we go!;

Notes show up in Alert History and the NT8 Activity Log. Do not use comment= — that isn't a recognized field and will cause Improperly formatted request. If you want per-alert Pine variable identifiers (e.g. the strategy name), do notes=\{\{strategy.order.comment\}\};.

Commented-out lines in your alert (lines starting with // or similar) are stripped in transit and won't show on the CrossTrade side.

I see Secret key is missing, invalid, or inactive — what's wrong?

Four usual causes:

  1. You're missing key= entirely. The alert needs key=your-secret-key; as one of the lines.
  2. The key is wrong (e.g. you pasted the webhook URL fragment as the key, or used another account's key).
  3. There's a typo — copy it fresh from the dashboard, do not hand-type.
  4. Two key= lines are present, which is invalid.

Keys are also sanitized out of public debug views by CrossTrade — that's intentional, never share your key publicly.

My alert shows Success in Alert History but nothing happened in NT8 — what does that mean?

Success on the CrossTrade side means CrossTrade accepted the payload and handed it off to NT8. What happens after that is in NT8's hands. If nothing actually placed:

  • Check NT8 Control Panel > Logs for red errors (common ones: data feed not connected, ATM template name mismatch, quantity mismatch between alert and ATM template, account rejected the order).
  • Check NT8 Control Panel > Connections — make sure the relevant data feed is connected.
  • If using prop accounts with multiple feeds, ensure Multi-Provider mode is on.
  • Verify the account= name exactly matches what NT8 shows in its master account list.
  • Confirm the instrument format matches NT8's settings (numeric ES 06-25 vs. month-abbreviation ES JUN25).

Silent failures (order submitted but no fill shown) often mean a data feed issue or a prop firm restriction.

Why do I see Improperly formatted request only sometimes for the same alert?

If a strategy alert is failing intermittently and falling back to its default TV text on some triggers, the underlying Pine Script is not assigning alert_message= on every branch. Either one condition uses strategy.entry(...) without an alert_message, or a variable used in building the message is out of scope on some bars.

Check the Pine Logs panel on TV for what the script actually sends per bar, and compare against what CrossTrade received in Alert History.

Will my alerts keep firing if NT8 / my PC is off?

TradingView will still fire alerts — they live on TV's servers. CrossTrade will still receive them and log them. But NT8 needs to be running with the CrossTrade add-on connected for orders to actually place. If NT8 is offline, the alert will be logged at CrossTrade with an error that the connection is not available.

If a request does not reach CrossTrade in the first place (for instance during a TV outage), it's dropped — TV does not re-send queued alerts after connectivity returns.