You’ve got a signal, you hit send, and instead of a fill you see red. A Tradovate order rejected message shows up more often than most traders expect, and the wording rarely explains what actually went wrong. Tradovate routes most of its order flow through CQG’s clearing and risk engine, and CQG alone documents more than 140 distinct reject codes. Most traders only ever run into about 25 of them.
Table of Contents
- Why Does Tradovate Reject Orders in the First Place?
- What Triggers a Margin or Risk-Limit Rejection on Tradovate?
- Why Did Tradovate Reject My Order Price?
- Why Is My Order Rejected Near Contract Expiration or Outside Trading Hours?
- Duplicate Orders, Wash Trades, and Self-Match Rejections
- Why Do API and Webhook Orders Get Rejected?
- Why Does Your Prop Firm Reject Orders That Tradovate Would Allow?
- How Do You Diagnose a Tradovate Rejection in Under a Minute?
- How PickMyTrade Reduces Rejection-Causing Errors
- Frequently Asked Questions
- Conclusion
This isn’t a general troubleshooting post. It’s a working lookup table: every code below comes from CQG’s own API documentation, Tradovate’s community forum, or Tradovate’s help center, and each one comes with the fix that actually clears it. Where I couldn’t confirm Tradovate’s exact on-screen wording, I’ve said so instead of guessing.
Key Takeaways
- Most Tradovate rejections trace back to CQG’s routing layer, covering codes 1013 through 1253 for margin, risk limits, and price bands.
- “Maximum order quantity” and “Liquidation Only” are the two most-reported rejections on Tradovate’s own community forum.
- API and webhook orders fail for different reasons than manual clicks. Expired tokens, session caps, and rate limits cause most of them.
- CME futures volume hit a record 33.2 million contracts a day in May 2026, up 15% year over year, according to CME Group. More volume means more traders hitting these codes for the first time.
Why Does Tradovate Reject Orders in the First Place?
Tradovate doesn’t reject orders at random. The rejection almost always starts one layer down, at CQG, the routing and risk engine Tradovate runs on top of. When an order fails a margin check, a position-limit check, or a price-band check, CQG returns a numeric reject code and a plain-text reason, and Tradovate surfaces that reason inside the Orders module.
Why does that layering matter? Because it tells you who can actually fix the problem. A rejection isn’t a bug in Tradovate’s platform. It’s the risk engine doing exactly what it’s configured to do, whether that configuration comes from your own risk settings, your prop firm’s rules, or the exchange itself. Knowing which layer rejected the order tells you who can fix it: you, your prop firm, or nobody, because the exchange is simply closed.
What Triggers a Margin or Risk-Limit Rejection on Tradovate?
Margin and risk-limit codes are what you’ll hit most, and they all mean roughly the same thing: this order, combined with your open positions, would put more at risk than your account or your prop firm allows. Tradovate’s own community forum shows traders hitting this as a plain message: “Your maximum order quantity has been met. Please change your quantity to place the order.” Sometimes it comes with a specific rule reference, like “Limit: 0 Current: 1. Scope: NQ Rule #555.”
| Code | Message | Fix |
|---|---|---|
| 1013 | Requested trade exceeds the account single trade margin limit | Reduce contract size, or request a risk-limit increase in Account Settings |
| 1014 | Account loss today (open trade equity) is greater than the loss limit | You’ve hit a daily loss limit. Trading is blocked until reset, usually next session |
| 1015 | Margin for this order plus current fills/positions exceeds available cash | Close an existing position first, or add funds/collateral |
| 1016 | Working orders’ worst-case P/L exceeds available margin | Cancel resting orders you don’t need before placing a new one |
| 1017 | Account is in liquidation-only mode | You can only close positions, not open new ones. Contact your broker or prop firm |
| 1101 | Calculated margin for current positions exceeds available funds | Same root cause as 1015. Free up margin or reduce size |
| 1109 | Risk parameters missing for the account | Configuration issue on the account. Contact Tradovate support or your prop firm |
| 1110 | Current account balance is negative | Deposit funds before placing new orders |
| 1124 | Master account has negative purchasing power | Account-level block, usually prop-firm side. Contact your funding provider |
| 1140 / 1141 | Order not within risk parameters set for the firm | Your prop firm’s risk rules, not Tradovate’s. Check their contract or loss limits |
| 1182 | Order not within risk parameters set for the customer’s account | Personal risk settings in Tradovate. Check Risk Settings under Account Settings |
I’ve hit code 1013 and the “maximum order quantity” message more than any other rejection. It almost always happened on days I sized up a trade after a strong morning and forgot my per-trade limit was still set from a smaller account. The fix took about ten seconds once I found it: open Application Settings, click the Accounts tab, then Risk Settings. That screen shows your current max position size, and you can request a change right from there.
Want to set this up correctly before you connect an automated strategy? PickMyTrade’s Tradovate automation guide walks through it step by step.
Why Did Tradovate Reject My Order Price?
These rejections fire when the price you submitted doesn’t make sense to the exchange. Usually it’s a typo, a stale quote, or a tick-size mismatch, not a risk problem. Tradovate even has a dedicated help article for this exact scenario, titled “Order Price Is Outside Bands.”
| Code | Message | Fix |
|---|---|---|
| 1105 | No current ask available | Market is thin or between sessions. Wait for a live quote |
| 1106 | No current bid available | Same as above, on the buy side |
| 1156 | Price is not valid for this instrument | Usually a tick-size violation. ES trades in 0.25 increments, so 4150.10 gets rejected |
| 1180 | Order price is outside the allowed range for the contract | Price band violation. Re-check the current market price before resubmitting |
The single most common trigger is a missing decimal point. Type 415025 instead of 4150.25, and you’ve priced an order tens of thousands of points away from the market. The exchange blocks it instantly. Building automated alerts? This is the exact bug class that breaks TradingView-to-broker webhooks when a strategy script formats price as a raw integer instead of a decimal.

Why Is My Order Rejected Near Contract Expiration or Outside Trading Hours?
Of every rejection category I’ve tracked in my own trading, expired-contract rejections cause the most repeat mistakes. The fix, switching to the front-month contract, doesn’t stop the underlying habit of leaving an alert on a continuous contract symbol from causing it again next quarter.
The exact wording Tradovate uses is: “Liquidation Only. Contract is about to be expired. Please contact the Trade Desk.” It fires when a TradingView alert still points at a continuous contract symbol, like ES1! or NQ1!, instead of the actual front-month contract, like ESU2026, and the underlying contract has entered its expiration window.
| Code | Message | Fix |
|---|---|---|
| 1074 | Specified market is not valid or is closed | Check the exchange calendar. You’re trying to trade during a holiday closure |
| 1076 | Order rejected by exchange officials | Exchange-level block, not fixable from your end. Contact the Trade Desk |
| 1077 | Order is expired | The order’s time-in-force lapsed before it could fill. Resubmit |
| 1080 | Exchange is in trading halt mode | Wait for the halt to lift. Check the exchange status page |
| 1142 | Cannot place order outside omnibus account trading times | Session-hours restriction set by your prop firm or clearing firm |
| 1228 / 1229 | Order exceeds the Last Trading Date (LTD) limit | You’re trading a contract too close to, or past, its expiration date. Roll to the next month |
Rollover is entirely predictable, so why wait to get rejected? Check Tradovate’s own contract rollover schedule before quarterly expiration weeks in March, June, September, and December, and you’ll avoid this one for good.
Duplicate Orders, Wash Trades, and Self-Match Rejections
These rejections aren’t about your account’s risk. They’re about market-integrity rules that apply to everyone. Code 1128, “Cannot save the order because another order with the same Client Order ID already exists,” is a duplicate-order rejection. It’s almost always a software bug: your platform or automation tool sent the same order twice with an identical ID, often after a slow API response made the first attempt look like it failed.
Wash trades are a different, more serious category. Tradovate’s community forum cites CME Rule 534 directly: offsetting buy and sell orders placed to avoid genuine market risk are prohibited, “whether you did know or should have reasonably known.” This most often catches traders running two strategies, or two funded accounts, that unintentionally offset each other on the same instrument. CME’s Self-Match Prevention feature can auto-block matches between commonly-owned accounts before they ever become a rule violation, and it’s worth enabling if you run multiple accounts under one entity.
Why Do API and Webhook Orders Get Rejected?
This category matters most if you trade through a webhook, a bot, or any tool that talks to Tradovate’s API directly instead of through the Trader UI, which includes anyone running TradingView alerts through PickMyTrade. Automated orders fail for infrastructure reasons manual clicks never hit.
| Cause | What you’ll see | Fix |
|---|---|---|
| Access token expired | 401 “Access is denied” | Tradovate access tokens expire roughly every 80 minutes. Call /auth/renewAccessToken, don’t reuse a stale token |
| Cancelling a completed order | 401 “Access is denied” | The order already filled or was archived. Refresh order status before cancelling |
| Too many concurrent connections | 408 “Request Timeout” | Standard subscriptions allow 1 connection, dual allows 2. Logging into the Trader UI while your bot is also connected can trigger this |
| Rate limit exceeded | Requests silently stop processing | Tradovate caps API usage at roughly 5,000 requests/hour. Throttle your polling interval |
| Session limit exceeded | Unstable or dropped API session | Tradovate allows 2 active sessions per account. A 3rd login, phone, browser, or bot, can destabilize the connection |
| Order rate throttle | 1139 “Order rate has exceeded the configured maximum for the account” | Your strategy is firing orders faster than the account’s rate limit. Add a cooldown between signals |
This behavior comes straight from Tradovate’s own developer community, where traders have documented each of these failure modes in detail.
Here’s the pattern worth remembering: manual-trading rejections are almost always about risk, like margin or position size. Automation rejections are almost always about plumbing: auth, connections, request pacing. If your webhook orders keep getting rejected and your manual orders on the same account don’t, stop staring at your risk settings. Start looking at your token refresh logic and your request frequency instead.

Why Does Your Prop Firm Reject Orders That Tradovate Would Allow?
If you’re trading a funded account, you’re stacked under two risk layers: Tradovate and CQG’s exchange-level checks, plus your prop firm’s own contract and drawdown rules. In practice, the second layer rejects orders far more often.
FundedNext’s own help center lists the common causes plainly: an unsigned Tradovate agreement blocking data, contract-size limits (their example is a $25,000 account capped at 2 minis or 20 micros), auto-liquidation after a daily or max-loss breach, and trading outside instrument hours or during holiday closures. Apex works the same way. Micros and minis count equally toward the contract cap, so a trader who sizes a position in micros without checking the combined total can still trip the “maximum order quantity” rejection.
Building or automating a strategy against a funded account? It’s worth reading the contract caps and liquidation rules for your specific prop firm before you connect a bot. PickMyTrade’s guides on automating Apex through Tradovate and the Apex and Tradovate connection walkthrough cover the setup steps that avoid the most common rejections.
How Do You Diagnose a Tradovate Rejection in Under a Minute?
Rather than guessing, Tradovate shows you the exact reason for every rejection if you know where to look. Open the Orders module and double-click the rejected order. The detail view shows the specific rejection message, not just “Rejected.”
From there, work through it in order:
- Read the exact message and match it against the tables above to find the category.
- Check whose rule it is. A personal risk setting, a prop-firm rule, and an exchange rule each need a different fix.
- Margin or size issue? Open Risk Settings under Account Settings and compare your limits to the order size.
- Price issue? Re-check the live quote and your tick size before resubmitting.
- Automation issue? Check your token age, connection count, and request rate before touching your strategy logic.
How PickMyTrade Reduces Rejection-Causing Errors
Most of the rejections in the API and automation table above trace back to one root problem: a webhook or bot sending a malformed, stale, or duplicate order because nothing validated it before it hit Tradovate’s API. PickMyTrade sits between your TradingView alerts and your broker specifically to close that gap. It converts alerts into structured JSON orders, manages token refresh and session handling for you, and routes to Tradovate, Rithmic, TradeLocker, and other supported brokers without you writing or maintaining that plumbing yourself.
That doesn’t eliminate margin or price-band rejections. Those are legitimate risk checks doing their job. But it does remove the entire plumbing category: expired tokens, duplicate client order IDs, and connection-limit errors that have nothing to do with your strategy and everything to do with fragile, homemade automation. Running a DIY webhook script and seeing rejections you can’t explain? PickMyTrade’s pricing page has the current plan details.

Frequently Asked Questions
It means your submitted price falls outside the exchange’s allowed range around the current market price, usually from a decimal-point typo or a tick-size mismatch. Re-check the live quote and confirm your price matches the instrument’s tick increment before you resubmit.
The message is there, it’s just not on the main screen. Double-click the rejected order inside the Orders module to open its detail view, which shows the specific rejection reason instead of a generic “Rejected” status.
Yes, for your own account settings: go to Account Settings and submit a risk-change request. If the rejection cites a firm-level rule instead, codes 1140 or 1141, that limit belongs to your prop firm or clearing firm, and you’ll need to request the change through them directly.
Automated orders fail for infrastructure reasons manual clicks rarely trigger: expired auth tokens roughly every 80 minutes, exceeding the 2-session connection limit, or exceeding the API rate cap. These are plumbing issues, not risk issues, and they need a different fix path entirely.
A Tradovate or CQG rejection, codes like 1013 or 1182, is your broker’s own risk engine blocking the order before it reaches the exchange. A true exchange rejection, like code 1076 or a trading halt, comes from CME itself, and no account setting will fix it.
Conclusion
Most Tradovate rejections aren’t mysterious once you know where to look. Margin and risk-limit codes mean you’re asking for more than your account allows. Price-band codes usually mean a typo. Contract and session codes mean timing. API codes mean plumbing, not strategy. Prop-firm codes mean a second set of rules stacked on top of Tradovate’s own.
The fastest fix is always the same: double-click the rejected order, read the exact message, and match it against the category it belongs to. Bookmark this page. The next time you see red instead of a fill, you’ll know exactly which layer to check first.
If you’re automating your strategy and want to stop debugging plumbing errors altogether, see how PickMyTrade connects TradingView to Tradovate without writing custom webhook code.
Disclaimer:
This content is for informational purposes only and does not constitute financial, investment, or trading advice. Trading and investing in financial markets involve risk, and it is possible to lose some or all of your capital. Always perform your own research and consult with a licensed financial advisor before making any trading decisions. The mention of any proprietary trading firms, brokers, does not constitute an endorsement or partnership. Ensure you understand all terms, conditions, and compliance requirements of the firms and platforms you use.
Also Checkout: Automate TradingView Indicators with Tradovate Using PickMyTrade
