Skip to main content

FAQ's

Frequently Asked Questions

How do I get started with CrossTrade?

Start with a CrossTrade account (free trial at crosstrade.io/signup) and a TradingView account with 2FA enabled (required for webhooks). For the default NinjaTrader destination, install the CrossTrade NT8 Add-On via Tools > Import > NinjaScript Add-On, enable the Automated Trading Interface under Tools > Options, restart NT8, log in with your CrossTrade credentials, and connect NinjaTrader to at least one live data feed (sim, prop, or broker; Level 1 data is sufficient). For destination=tradovate, link a Tradovate identity under My Account > Brokers; NinjaTrader, a desktop Add-On, and personal Tradovate market-data entitlement are not required. From there, create a TradingView alert with your CrossTrade payload in the message field and your webhook URL in the notifications tab, then test in simulation or Tradovate Demo first.

How do I upgrade to a new version of the CrossTrade NT8 Add-On?

Step 1: Close any open CrossTrade NT8 Add-On windows in NinjaTrader. Step 2: Go to Tools > Remove NinjaScript Assembly. Select the CrossTrade Add-On and click Remove. Step 3: Go to Tools > Import > NinjaScript Add-On and select the new version. Step 4: Restart NinjaTrader. Download the latest version at crosstrade.io/download.

My secret key shows as "missing, invalid, or inactive."

The most common causes are invisible characters or trailing spaces picked up during copy-paste. Go to your My Account page (app.crosstrade.io/user/my-account), re-copy the key fresh, and make sure your alert format is key=your-key; with the semicolon at the end. If the key is definitely correct and formatted properly, email support@crosstrade.io so the team can look up your account directly. This can't be diagnosed without account access.

NT8 says there is a path error when importing the add-on (or crashes during import).

This is almost always caused by NinjaTrader being installed in a OneDrive-synced folder. OneDrive interferes with NT8's file paths during import. Quick fix (manual install): unzip the CrossTrade download file, open a separate file explorer window to Documents\NinjaTrader 8\bin\Custom\, drag the unzipped files into that folder (click Replace if prompted), start NT8 and click Yes on the compilation prompt. Permanent fix: reinstall NinjaTrader outside of OneDrive entirely. This prevents the issue from recurring with any NinjaScript add-on, not just CrossTrade.

LIVE: Unable to connect to the remote server (logon failed)

This can happen after updating NT8 to a newer version. To resolve: open Command Prompt (search 'command prompt' in the Windows start menu), type ipconfig /flushdns and hit Enter, then restart NinjaTrader.

NinjaTrader keeps randomly disconnecting.

Random disconnects are usually caused by broker-side connection drops, internet instability, Windows sleep/power settings, or automatic Windows updates. NT8 itself can also cycle connections during extended sessions. CrossTrade v1.12+ includes two features that handle this automatically. Auto-Reconnect monitors your broker connections and automatically restores them when they drop unexpectedly. It waits a configurable delay before attempting to reconnect, retries up to 5 times, and stops to prevent infinite loops. Data Watchdog catches a subtler problem: your connection shows Connected but the price data has silently stopped updating. The Watchdog monitors a reference instrument's price feed and triggers a reconnect when data goes stale, and pauses automatically when the market is closed. Both features work together: when the Watchdog detects stale data, it delegates the reconnect to Auto-Reconnect. Other things to check: disable Windows automatic updates on your trading machine or VPS, make sure power settings don't allow sleep/hibernate, and reduce the number of open charts if NT8 is sluggish (all charts run on a single thread regardless of CPU cores).

What format do I use for the instrument name in my alert?

CrossTrade accepts multiple formats. NinjaTrader formats: ES 06-25, NQ JUN25, MNQ 06-25. TradingView continuous contract format: ES1!, NQ1!, MNQ1!. If you use a TV continuous contract symbol like ES1!, CrossTrade automatically converts it to whatever format your NinjaTrader instrument database expects. This is the recommended approach because it avoids manual updates at contract rollover. You can also hard-code the contract if you prefer (e.g., instrument=ES 06-25;), but you'll need to update every alert when the contract rolls. The instrument in your alert doesn't have to match the chart that triggered it. You can have an ES chart trigger a trade in NQ. Just set instrument=NQ1!; in the payload.

Do I need to update my contract month manually at rollover?

If you're using hard-coded contract months (e.g., instrument=ES 06-25;), yes, you need to update every alert when the contract rolls. If you use TradingView continuous contract symbols (e.g., instrument=ES1!;), CrossTrade auto-converts to the active front-month using your NT8 instrument database settings. One caveat with continuous contracts: during the rollover transition, TradingView shifts to the new front-month only after the new contract's volume surpasses the old one. If you update your NT8 database before TV has shifted, there can be a brief mismatch. Recommend either hard-coding or waiting until you confirm TV has rolled before updating NT8.

Can I trigger an alert on one instrument and execute a trade on a different one?

Yes. The instrument line in your alert payload has no connection to the chart or condition that triggered the alert on TradingView. You can have an ES chart fire an alert that executes a trade in NQ, MNQ, or any other instrument. Just set the instrument= field to whatever you want NT8 to trade.

How do I place a limit order instead of a market order?

Set order_type=LIMIT; and specify the price with limit_price=. See the example below. The limit price can be an absolute price level (limit_price=5250.50;), a tick offset (limit_price=-10 ticks; for 10 ticks below current price), a percentage offset (limit_price=-0.5%;), or a dollar value (limit_price=-$50;). If you place a buy limit above the current price (or sell limit below), it fills immediately since you're crossing the spread. As of v1.12, if you attach TP/SL brackets to a limit order, the brackets are held until the entry actually fills. If the limit never fills and gets canceled, the brackets are discarded: no orphaned orders.

My alert shows "improperly formatted request."

The payload is either missing required fields or has incompatible content. Check your Alert History on the web dashboard (app.crosstrade.io/user/alert-history) to see the exact payload that was received. Common causes: missing semicolon at the end of a line; leftover default text from TradingView still in the message box (delete ALL default text before pasting your payload); misspelled field name (e.g., ordertype instead of order_type); missing a required field for the command type (PLACE requires key, command, account, instrument, action, qty, order_type, tif).

My alert shows "account not found."

The account name in your alert doesn't match any connected account in NinjaTrader. Account names are exact: Sim101 is not sim101 is not sim is not SIM101. Open the Accounts tab in NinjaTrader and check the exact name. Use that exact string in your account= field. For prop firm accounts, the name is usually something like APEX_12345 or DEMO12345678; check NT8 for the precise format.

Should I use a TradingView strategy or indicator with CrossTrade?

If your Pine Script starts with strategy(...), it's a strategy. If it starts with indicator(...), it's an indicator. Strategies give you dynamic variables like {{strategy.order.action}} and {{strategy.order.contracts}}, plus position state variables for Strategy Sync. The downside: TV strategies require offsetting actions (every entry must have an exit), and the {{strategy.order.action}} variable only outputs BUY or SELL with no built-in way to distinguish entries from exits. Indicators give you full control. You create separate alerts for buy and sell conditions, hardcode the action and quantity, and there's no offsetting requirement. The tradeoff is no dynamic variables for action or quantity. Rule of thumb: if your logic does clean entries and exits with position tracking, a strategy with Strategy Sync works well. If it does stop-and-reverse or you want maximum simplicity, an indicator with flatten_first=true; is usually easier. If you're an end-user of a third-party script and didn't write the Pine code, indicators are almost always the simpler path.

Can I use an AI assistant (ChatGPT, Claude, etc.) to set up my alerts?

Yes. CrossTrade publishes a guide written specifically for AI assistants at crosstrade.io/ai/automate-tradingview.md. Copy the whole file into your AI chat (or give the AI the URL), paste your Pine Script or the script's name alongside it, and ask it to build your alert. The AI will identify whether your script is a strategy or an indicator, which alert mechanism it uses (alertcondition, alert() function calls, or order fills), whether it can be automated at all, and then produce your exact TradingView alert settings and CrossTrade payload. If your script is closed-source, the guide tells the AI what questions to ask you about the alert dialog instead. Always test the result on a Sim or Demo account first.

What does strategy.order.alert_message do and how is it different from other variables?

{{strategy.order.alert_message}} is a passthrough variable. It carries whatever text you set inside your Pine Script's strategy.entry() / strategy.exit() calls via the alert_message= parameter. TradingView delivers that exact string when the order fills. If you're authoring your own Pine Script, this is how you trigger a CrossTrade alert: build the full CrossTrade payload as a string in Pine, pass it in via alert_message=msg, then in the TradingView alert dialog set Condition to "Order fills only" and Message to {{strategy.order.alert_message}}. The benefit is per-signal customization: calculated SL/TP from tick math, asymmetric long/short payloads, qty derived from ATR. None of that is expressible from the alert dialog itself. If you don't build the payload in Pine, the variable is empty and the alert fails. In that case (third-party scripts, indicators someone else wrote, built-in TradingView strategies), paste the CrossTrade payload directly into the alert dialog and use individual variables like {{strategy.order.action}} and {{strategy.order.contracts}} instead.

I changed my TradingView strategy settings but the alert is still using the old values.

TradingView alerts snapshot your strategy's settings at the time the alert is created. If you change the strategy's inputs after creating the alert (different SMA length, different risk parameters, etc.), the alert keeps using the old values. TV doesn't warn you about this. The fix: delete the old alert, then create a new one. The new alert will use your current settings.

Why is CrossTrade receiving the wrong quantity from my Pine Script?

This is almost always one of two issues. Stale alert: you changed a script input (like contracts per trade from 1 to 2) but your existing alert is still running on the old settings. Your chart and Pine Logs will show the new value, but the alert is a frozen copy of the old settings. Fix: delete the old alert and create a new one. Variable scope in Pine Script: a variable calculated inside an if block may be na or holding a stale value when the alert() function executes. Fix: use the input variable directly in your payload string instead of a locally calculated variable. Input variables have global scope and are always accessible with the correct value.

Can take_profit and stop_loss be used with TradingView strategy variables?

Yes. You can use dynamic values from Pine Script for TP/SL levels. The negative sign requirement for stop loss offsetting was removed. CrossTrade now auto-corrects the sign direction based on your position side. One caveat: if you're running a stop-and-reverse strategy (constantly flipping long↔short without going flat), you can't use Strategy Sync because the position never reaches flat. For S&R strategies, remove the sync logic and use flatten_first=true; instead.

What's the difference between flatten_first, require_market_position, and out_of_sync?

These features solve different problems. flatten_first=true; is an action: it closes any existing position and cancels pending orders for the instrument, then proceeds with your new order. Use when you always want to enter from a clean slate. require_market_position=flat; is a gate: it checks the selected NT8 or Tradovate account and blocks the alert entirely if the position isn't in the required state (flat, long, short, or combinations like flat/long). Use when you want to prevent new entries while a position is open. Does not close anything, just rejects the signal. out_of_sync=flatten; is a recovery mechanism, part of Strategy Sync. When TradingView's expected position state doesn't match the destination account's actual state, this determines what happens: wait (block and do nothing), flatten (close the position to reset), resync (auto-correct to match TV), or ignore (proceed anyway). max_positions=1; is a guard: it blocks alerts if you already have any position open on the account, regardless of instrument. You can combine them. For example, flatten_first=true; with require_market_position=flat; means: only enter if the account is flat (no existing position to flatten), but if for some reason a position exists, flatten it first. The require_market_position check happens before flatten_first.

Does require_market_position apply per-instrument or per-account?

Per-instrument. If you have an open NQ position and an ES alert comes in with require_market_position=flat;, the ES order will go through because the ES position is flat. The NQ position doesn't affect it. If you want to limit total positions across all instruments on the account, use max_positions=1; (or whatever your limit is); that's account-wide. You can also check for combined states: require_market_position=flat,long; means "proceed if the position is either flat or already long." This is useful for adding to a position in one direction while blocking entries in the other.

How does Strategy Sync work?

Strategy Sync keeps the selected NinjaTrader or Tradovate account aligned with TradingView's strategy position. Include sync_strategy, market_position, prev_market_position, and out_of_sync in the alert. CrossTrade compares TradingView's expected position with the destination account before the entry proceeds. Direct Tradovate Strategy Sync runs server-side and does not require NinjaTrader or the Add-On.

Why am I getting out-of-sync warnings?

Your TradingView strategy and destination account position have drifted apart. Common causes: you manually closed a position while the TV strategy was running; a TradingView alert was missed or delayed (TV server load, connectivity); a target or stop fill TV doesn't know about (an ATM close on NT8, or a broker-side bracket fill on Tradovate); the CrossTrade NT8 Add-On lost connection during a critical signal. This is exactly what Strategy Sync is designed to detect. The warning is informational: it tells you the system caught and handled the mismatch. With out_of_sync=flatten;, the destination position gets reset to flat and both sides wait for the next clean entry. With out_of_sync=resync;, CrossTrade automatically submits a corrective order to align the position. Check your Alert History: it shows what TV expected vs. what the account had, so you can see exactly where the drift occurred.

How do I set up stop-and-reverse automation?

Stop-and-reverse means flipping directly from long to short (or vice versa) without going flat in between. Use flatten_first=true;. See the example below. When a BUY alert fires, flatten_first closes any existing short position, then opens the long. When SELL fires, it closes the long and opens the short. Do NOT use Strategy Sync for stop-and-reverse strategies. S&R strategies never go flat (there's no distinct entry/exit; every signal is both), which breaks the sync state machine. Use flatten_first without sync instead.

My ATM template isn't being applied: no error, nothing happens.

This is almost always a quantity mismatch. The qty in your alert must exactly match the total contract count saved in the ATM template. If the ATM is configured for 2 contracts (e.g., 2 targets at 1 contract each) and your alert sends qty=1, NinjaTrader silently fails. No error, no log entry, just nothing happens. This is an NT8 behavior, not a CrossTrade limitation. Also check: the template name in strategy=YourATMName; is spelled exactly right (case-sensitive, spaces included); the template file actually exists in Documents\NinjaTrader 8\templates\AtmStrategy\; NinjaTrader is not installed in a OneDrive-synced folder; in Chart Trader properties, ATM selection is set to 'Select active ATM strategy on order submission'.

What are orphaned orders and how do I prevent them?

Orphaned orders are bracket orders (TP/SL) left active in the market after the parent position is closed by something other than the brackets themselves: a manual close, an Account Manager flatten, a strategy exit signal, etc. If price hits one of these orphaned orders, it opens a new unintended position. Prevent them by using flatten_first=true; on your entry alerts. This cancels any pending orders for the instrument before placing the new entry, ensuring every trade starts with a clean slate. This is especially important when using ATM templates.

How do I cancel pending orders via webhook?

Use command=CANCELORDERS; with the account and optionally the instrument. See the examples below. Note: when canceling by instrument, the instrument format must match the format of the original order. If your NT8 settings use numeric date format, use ES 06-25 not ES JUN25.

How do I send one alert to multiple accounts?

List the account names comma-separated in the account field (e.g., account=Sim101,APEX_12345,APEX_67890;). Every listed account receives the same order with the same quantity. Each account executes independently: if one account fails (disconnected, blocked by require_market_position, etc.), the others still proceed. If you need different position sizes per account, use the Trade Copier instead. It supports per-follower sizing ratios and instrument replacement.

Can I run multiple strategies on the same instrument and account?

NinjaTrader tracks one net position per instrument per account. No CrossTrade feature changes this. If Strategy A is long and Strategy B sends a short signal on the same instrument in the same account, the signals will conflict. strategy_tag prevents one strategy from modifying another strategy's position, but it does NOT create separate virtual positions. It's a lock, not a partition. The cleanest solution is separate accounts per strategy. If you must share an account, use require_market_position=flat; on each strategy so only one can hold a position at a time, and accept that they'll take turns rather than trade simultaneously.

How do I set up the Trade Copier?

Open the Trade Copier for your active platform on the web dashboard. Click Add Copier, select a leader account (the one that initiates trades), select one or more follower accounts, choose a copy mode, set the position sizing ratio (e.g., 1x, 0.5x, 2x between leader and follower), and toggle the copier ON. NinjaTrader supports Add-On-backed Order mode (copies when the order is placed, which is faster) and Execution mode (copies when the order fills, which is safer for prop firms). The NT8 copier works independently of webhooks: you can trade manually, through a webhook, or through a local NT8 strategy, and followers will copy. Its Auto-Sync engine checks follower alignment every few seconds and corrects drift automatically; if you manually close a follower position while auto-sync is running, it will re-enter to match the leader. The Tradovate Copier runs server-side instead, with nothing to keep running on your machine. Its order mode is generally available and mirrors CrossTrade webhook commands (manual Tradovate trades are not seen), while fill-driven execution mode, which also copies manual Tradovate trades, is still in beta.

How do I set up daily profit/loss limits?

Use the Account Manager for your platform. Either way you create a monitor per account, set your loss threshold (e.g., -$1,500) and profit threshold (e.g., $2,000), choose what happens when each is hit (flatten the account, disable alerts, closing only, or do nothing), and optionally set an end-of-day flatten time. The Account Manager requires a Pro plan on both brokers, and in fast markets slippage between detection and flatten is possible, so set your loss threshold with a buffer below your firm's actual limit. On NinjaTrader 8 the monitor polls each account's session P/L every 2.5 seconds through the Add-On, so NinjaTrader must be running, and the account must be flat at session start (6 PM ET). On Tradovate the monitor evaluates on CrossTrade's servers as account activity happens, with a background refresh at least about every 10 seconds when idle, so no Add-On is involved and your computer can be off.

Can I set multiple trading windows?

At the alert level, you can set one window per alert using start_time and end_time fields in the payload. Times are in US/Eastern (e.g., start_time=9:30 AM; end_time=4:00 PM;). You can also add closing_only_after=3:30 PM; to only allow closing orders after a certain time within your window. For multiple windows per account, you need the NT8 Account Manager (Pro plan), which supports multiple time-based rules at the account level. Workaround for Standard plan: create separate alerts, each with its own start_time and end_time, pointed at different TradingView conditions or the same condition.

Do I need a Pro plan for prop firm accounts?

Standard includes webhook commands and alert-level advanced options. Pro adds Account Manager, Trade Copier, API access, and account-level controls. NinjaTrader orders use the NT8 SDK. Tradovate orders use CrossTrade's cloud OAuth route and Tradovate Web API, with native broker-hosted brackets and trailing orders. For prop firm evaluations, confirm the firm's automation and copying rules before connecting either destination. Pricing at crosstrade.io/pricing.

How much slippage should I expect? How fast is CrossTrade?

CrossTrade's internal processing, from receiving your alert to passing the order instructions to NinjaTrader, averages around 34 milliseconds. Total end-to-end latency includes three segments: TradingView → CrossTrade (variable; TV fires alerts from their servers, and delays can occur at the top of the hour and during major news events when their server load increases); CrossTrade processing (~34ms average); NinjaTrader → Broker (depends on your internet connection, PC specs, and the broker's execution speed). Slippage on a market order depends primarily on TV delivery speed and market volatility at the moment of execution. CrossTrade can't control what happens outside its processing window. The Account Manager's P/L monitoring checks every 2.5 seconds; this is a separate polling mechanism and not related to alert/order processing speed.

My alert isn't getting to NinjaTrader.

Work through this diagnostic path. Check Alert History first (app.crosstrade.io/user/alert-history). If the alert appears there, CrossTrade received it; the status and error message will tell you why it didn't reach NT8. If it's NOT in Alert History at all: your webhook URL is wrong (re-copy it from your My Account page); TradingView didn't fire the alert (check TV's alert log); your CrossTrade subscription may be inactive. If it shows Success in Alert History but nothing happened in NT8: make sure the CrossTrade NT8 Add-On is open and logged in; verify you're connected to a live data feed (not just 'Connected'; check the data is actually flowing); check if the instrument is valid (not an expired contract); check the CrossTrade NT8 Add-On's log in NinjaTrader for any local errors. If it shows an error in Alert History: 'Improperly formatted request' (formatting issue); 'Account not found' (account name mismatch); 'Outside trading window'; 'Signal blocked' or 'Kill switch'; 'Rate limit' (too many signals for the configured rate).

Can I use the CrossTrade API to place orders programmatically?

Yes. The API uses the same command structure as webhooks. POST your payload to the webhook endpoint with Content-Type: text/plain and the same key=value format. The API also exposes REST endpoints for account data (cashValue, netLiquidation, unrealizedPnL, margins), positions (current positions across all accounts), orders (active and historical orders), executions (fill history), and quotes (real-time market data for any instrument on your connected feeds). Pro plan required for API access.

What is rate_limit and how do I prevent duplicate orders?

Rate limiting controls how frequently alerts with the same ID are accepted. It prevents duplicate or rapid-fire alerts from executing multiple times. rate_limit=1; with id=mystrategy; allows one alert with ID 'mystrategy' per 60 seconds (default). If a second alert with the same ID arrives within that window, it's blocked. Advanced formats: rate_limit=1; (1 request per 60 seconds, the default), rate_limit=1/120; (1 request per 120 seconds), rate_limit=3/900; (3 requests per 15 minutes). For preventing duplicate entries specifically (e.g., an indicator that fires the same condition on multiple bars), require_market_position=flat; is usually more appropriate: it blocks any entry while you're already in a position.

Can I trade stocks, forex, or crypto with CrossTrade, not just futures?

Yes. Connect a broker that supports the asset class (IBKR or Schwab for stocks, for example) in NinjaTrader, and change the instrument in your alert to the appropriate ticker. Most CrossTrade examples use futures because that's what most users trade, so you'll need to adapt the instrument names. Broker connection guides at crosstrade.io/blog/tag/how-to.

Code examples

Limit order with tick offset:

order_type=LIMIT;
limit_price=5250.50;

Stop-and-reverse payload using flatten_first:

key=your-secret-key;
command=PLACE;
account=Sim101;
instrument=ES1!;
action=BUY;
qty=1;
order_type=MARKET;
tif=DAY;
flatten_first=true;

Cancel all orders in an account:

key=your-secret-key;
command=CANCELORDERS;
account=Sim101;

Cancel orders for a specific instrument:

key=your-secret-key;
command=CANCELORDERS;
account=Sim101;
instrument=ES 06-25;

Cancel all orders across all accounts:

key=your-secret-key;
command=CANCELALLORDERS;