Alert error messages
Look up any PineHook alert error by its message or HTTP status, see where it appears, and fix it, from validation errors to plan limits and EA messages.
Last updated: 2026-10-20
When PineHook refuses an alert or a trade, the reason shows up in one or more of four places. TradingView's alert log shows the HTTP response, Signal Logs shows the alert's row, the Rejected panel in Signal Logs lists every refusal with its full message, and on MT5 the Experts tab and EA support log show messages from the EA itself. Search this page for the words in your message to find its cause and fix.
PineHook can only record a refusal in Signal Logs when the alert carries a valid license key that belongs to an active license. If the key is missing, mistyped or inactive, the refusal is only visible in TradingView's alert log.
HTTP status codes#
| Status | What it means | Where to look |
|---|---|---|
| 200 | Accepted. Check the status field in the response body too: blocked means a later check refused it, and duplicate means it repeated an alert from the last 12 seconds | Signal Logs |
| 400 | The alert is malformed or a value is invalid. Messages about a single parameter start with Signal rejected - malformed parameters: | TradingView alert log, Signal Logs and the Rejected panel |
| 401 | Authentication failed. The license key is unknown, inactive or expired. Close and cancel commands still get through on an inactive license | TradingView alert log only |
| 402 | A plan feature is not available, such as delay= on Trial | TradingView alert log, Signal Logs and the Rejected panel |
| 413 | Request entity too large. The alert is over 2,048 bytes. Shorten the comment or other long text | TradingView alert log only |
| 429 | A rate or capacity limit was reached | TradingView alert log, and Signal Logs for most limits |
| 503 | Failed to update symbol filter. A server-side problem that a retry won't fix. Contact support | TradingView alert log, Signal Logs and the Rejected panel |
For what these codes mean on any webhook receiver, including the 415 that strict JSON receivers return, see TradingView webhook error codes.
Blocked alerts in Signal Logs#
A blocked alert returns HTTP 200, so TradingView shows it as delivered even though no trade was placed. Signal Logs labels the row with one of these reasons.
| Reason | What happened | What to do |
|---|---|---|
missing_auth | Signal Authentication is on and the alert has no auth= (Authentication required) | Add auth=PASSWORD to every alert for that license |
invalid_auth | The auth= password is wrong or longer than 72 characters (Invalid authentication) | Match the password set in the dashboard. It is case-sensitive |
verification_error | PineHook could not check the password and refused the alert to be safe (Authentication verification error) | Contact support. This isn't a setup problem |
symbol_filtered | The symbol is on your blacklist or missing from your whitelist (Symbol EURUSD is blocked (in blacklist) or (not in whitelist)) | Send eaon=SYMBOL, change the filter, or add inline eaon=SYMBOL to the alert |
symbol_filter | The EA refused the alert because the symbol was disabled when it ran (EA disabled for EURUSD) | Re-enable the symbol. After an emergency stop, send eaon,ALL |
filter_list_too_long | The change would put more than 100 symbols in your filter. The filter is left unchanged | Use the opposite mode: eaoffexcept for a short allow-list, or eaonexcept for a short block-list |
rate_limited / rate_limited_daily | Your account's per-minute or daily alert limit is used up | Send fewer alerts or wait for the reset. Close and cancel commands are never refused by these limits |
pending_order_ceiling | You already have the maximum number of unfilled pending orders on this license: 5 on Trial, 50 on paid plans | Cancel unfilled orders or wait for them to fill or expire |
queue_ceiling_per_license | 50 delayed alerts are already waiting for this license | Send clearqueue, or wait for them to run |
queue_full | The license's delivery queue is full, usually because the EA has been offline for a long time | Reconnect the EA |
active_hours | The alert arrived outside your Active Hours | Adjust Active Hours in your settings |
account_filter | A minbalance, minequity, minfreemargin or minmarginlevel check failed when the entry ran | Check the account values against the alert |
daily_dd | The drawdown guard refused the entry | See risk management in your trading settings |
position_limit | A long or short lot or equity limit, or your plan's strategies-per-symbol allowance, refused the entry | Review your position limits or close a strategy on that symbol |
news_filter | The entry fell inside the news filter window | Wait for the window to pass |
recovery_expired / recovery_notify | An alert held while the EA was offline was not replayed on reconnect | Check your missed-alert recovery setting |
hedging_disabled / hedging_unavailable | Allow Hedging blocked the entry, or could not check it | See hedging entry protection |
When an entry fails at the broker instead, the row shows Failed with the EA's own message. Common ones contain not enough money or margin (insufficient margin), invalid stops or stops level (stop too close to price), exceeds maxspread_pips or Slippage protection rejected the entry (spread too wide), and requote or a broker retcode such as 10006. Trade errors explains how to fix each one.
Validation errors#
These return HTTP 400 and are recorded in the Rejected panel, which highlights the parameter at fault. The wording below is the message itself, so search for the part that doesn't change.
Format and required fields#
| Message | Fix |
|---|---|
Invalid license key format - expected XXXX-XXXX-XXXX-XXXX | Copy the key from the Licenses page instead of retyping it |
Missing 'license', Missing 'action' or Missing 'symbol' | Add the field. In CSV the order is license key, command, symbol |
Signals require 3 fields: LICENSE,action,SYMBOL or at least 2 fields | Send at least the license key, the command and, for most commands, a symbol |
Wrong field order: '{value}' looks like a command but is in the symbol position | Put the license key first, the command second and the symbol third |
Unknown command '{command}' - did you mean '{suggestion}'? | Use the suggested command, or check the command list |
canceldelay was renamed to 'clearqueue' | Replace canceldelay with clearqueue. Nothing else changes |
Invalid symbol '{symbol}'. Symbols must be 1-20 characters using A-Z, 0-9, and the separators . - _ | Remove slashes and spaces, for example EURUSD instead of EUR/USD. A separator can't start, end or repeat |
Invalid JSON or Empty request body | Check the JSON in the alert message, or that the message isn't empty |
Duplicate parameter '{name}' | Remove the repeated parameter |
'{field}' has no value ... parameters must be written as name=value | Write it as name=value or remove it |
Unrecognized parameter - did you mean '{suggestion}'? or Unknown parameter '{param}' for {command} command | Fix the spelling. One unknown parameter rejects the whole alert |
Invalid value '{value}' for {param} - not a valid number (also must be a finite number or non-ASCII characters not allowed) | Use a plain number with standard digits |
{param} out of allowed range {bounds} | Use a value inside the range shown |
Position size#
| Message | Fix |
|---|---|
Position sizing is required | Add one sizing parameter, such as size_lots=0.1 |
Conflicting position sizing parameters | Keep exactly one sizing parameter |
Invalid size_lots={value}. Must be greater than 0 or Implausibly large (max 100000) | Use a positive, realistic size |
Invalid size_pct={value}. Must be > 0 and <= 100 | Use a percentage above 0 and up to 100 |
size_pct requires a stop loss to calculate position size (also size_pct_equity and size_dollar) | Add sl_pips, sl_price or sl_pct |
Stop loss and take profit#
| Message | Fix |
|---|---|
Conflicting stop loss parameters or Conflicting take profit parameters | Use only one of the pips, price or percent forms |
sl_price=0 is not valid or tp_price=0 is not valid | Use a positive price, or leave the parameter out. modify accepts 0 to remove a level |
Invalid sl_pips={value}. Must be a positive distance (also tp_pips, sl_pct, tp_pct) | Use a positive distance |
{param} is empty, so no stop loss would be set | Give it a number or remove it |
Invalid sl_pct={value} for a BUY. A stop loss at or beyond 100% of entry | Use a value below 100, or pips or a price |
Take profit (tp_price=...) must be above entry price (or below for sells, and the stop-loss versions) | Put the stop and target on the correct side of the entry price |
Cannot combine a single take profit ... with multi-TP targets | Use the single value or the ladder, not both |
Pending orders#
| Message | Fix |
|---|---|
{COMMAND} requires an entry level: price=..., price_pips=..., or price_pct=... | Add one entry level |
Conflicting entry parameters | Keep one of price, price_pips and price_pct |
{COMMAND} price={value} is not valid | Use a positive entry price |
BUYAT picks limit-vs-stop by comparing the entry to the market, so it needs an absolute price= | Use price=, or use buylimit or buystop instead |
Conflicting expiry parameters: expiry (seconds) and expiry_time (datetime) | Keep one |
expiry must be between 0 and 315360000 seconds or expiry_time must be in the future and within the 10-year platform maximum | Use an expiry within 10 years. A bare time is read as UTC |
Invalid expiry_time '{value}': must be an ISO 8601 datetime | Write it as 2030-01-15T14:30:00Z. An offset needs a colon, as in +03:00 |
Multi-target TP/SL#
| Message | Fix |
|---|---|
Gap detected in TP target numbering | Number the levels from 1 without gaps |
Multi-TP close percentages must sum to 100% (also Multi-SL) | Make the percentages add up to 100, or use fixed lots |
TP{n} close percentage must be greater than 0 | Give the level a share above 0, or remove it |
TP{n} has a close amount but no level distance | Add pips, price or pct to that level in the JSON array |
TP{n}_lots must be positive or must be a finite number | Use a positive number of lots |
TP{n} has a level but no close percentage or lots specified | Add tp{n}_close or tp{n}_lots |
Conflicting TP close formats | Use percentages or lots on every level of a side, not a mix |
Too many TP/SL targets | Use up to 10 levels, numbered tp1 to tp10 |
Invalid compact TP syntax | Write levels as pips:close_pct separated by ; |
Trailing stop and breakeven#
| Message | Fix |
|---|---|
trail command requires a distance parameter | Add distance_pips, distance_pct or distance_atr |
Conflicting trailing stop parameters | Keep one distance type |
Conflicting step parameters | Use trail_step with pips, or trail_pct_step with percent |
trail_step={value} is invalid. Must be greater than 0 | Use a positive step, or leave it out |
Conflicting trail trigger parameters | Keep one of trail_trigger, trail_trigger_pct and trail_trigger_price |
Conflicting breakeven trigger parameters or Conflicting breakeven offset parameters | Keep one trigger and one offset type |
Invalid value '{value}' for distance_atr - must be between 0.1 and 20.0 | Use an ATR multiplier from 0.1 to 20 |
Invalid value '{value}' for trail_atr_timeframe | Use M1, M5, M15, M30, H1, H4, D1, W1 or MN1 |
'{field}' cannot be negative | Use a positive value. Only be_offset_pips and be_offset_pct may be negative |
Closing positions and modifying trades#
| Message | Fix |
|---|---|
Invalid close_pct={value}. Must be between 0 (exclusive) and 100 (inclusive) | Use a value above 0 and up to 100 |
Invalid close_lots={value}. Must be greater than 0 | Use a positive volume |
Conflicting partial close parameters: close_pct, close_lots | Use one of them |
close_pct is empty, which would close the whole position | Give it a number or remove it |
Invalid minprofit={value}. Must be >= 0 (also maxloss) | Use 0 or a positive number of pips |
The 'close' parameter is no longer supported | Use close_pct or close_lots |
Modify command requires at least one SL/TP parameter | Add the level you want to change |
Cannot combine 'order_type' with 'direction' on modify command | Use direction for positions or order_type for pending orders |
Timing, strategies and tickets#
| Message | Fix |
|---|---|
delay must be between 0 and 86400 seconds | Use up to 24 hours |
Invalid value '{value}' for closetime - must be between 1 and 2592000 seconds | Use 1 second to 30 days |
Invalid magic {value}: must be between 0 and 2147483647 or must be a whole number | Use a whole number in range |
magic=ALL is a filter wildcard or symbol=ALL is a filter wildcard | Entries need a real magic number and symbol |
ticket is not supported by closecancelall or by closealleaoff | Send separate ticketed commands, or remove the ticket |
Ticket IDs (ticket= and new_ticket=) cannot be used with Netting or Exchange accounts | Remove the ticket and manage the position by symbol |
ticket= and new_ticket= need the updated PineHook EA | Install the latest EA and reconnect |
Invalid ticket: ticket must be 1 to 32 characters or ticket values beginning with 'PH-' are reserved by PineHook | Use letters, numbers, ., _ and -, starting with a letter or number |
HTTP 409 for a ticket= | The ticket is unknown, already closed, shares a net position, has no confirmed broker position yet, or disagrees with your magic=. Check the ticket in Signal Logs |
PineHook cannot resolve this license's Default Magic for a symbol-scoped clearqueue | Add magic=N or magic=ALL, or send clearqueue without a symbol |
'active_start' is no longer supported in signals | Remove it and set Active Hours in your settings |
EA control commands#
| Message | Fix |
|---|---|
Symbol required for eaon. Use a symbol or ALL. (also eaoff) | Add a symbol, or ALL |
eaoffexcept requires at least one symbol. (also eaonexcept) | List the symbols, separated by ; |
Invalid symbol in eaon/eaoff. Use a valid symbol or ALL. | Correct the symbol. On a trade alert, the trade doesn't run either |
Plan and rate limits#
| Message | Status | Fix |
|---|---|---|
Delayed signals require a paid plan. Upgrade to use delay=. | 402 | Remove delay= or upgrade |
Your account's signal rate limit has been reached ({N} signals per minute) | 429 | Wait a minute or send fewer alerts. The limit is shared by all your licenses |
Your account's daily signal limit has been reached ({N} signals per day) | 429 | Wait for the 24-hour reset |
Live pending-order limit reached ({current}/{max}) | 429 | Cancel unfilled orders, or give pending orders an expiry |
license_queue_full: Delayed-signal queue is full for this license | 429 | Send clearqueue, or wait for queued alerts to run |
license_queue_full | 429 | The EA has fallen behind or is offline. Reconnect it |
queue_full: Delayed-signal queue is at system capacity | 429 | A platform-wide safety limit was reached. Try again shortly |
Too many cancel/close-all commands in a short window; the account is already flat. | 429 | Nothing to do. One sweep already cancels everything that matches |
Too many failed attempts. Try again later. | 429 | Too many unknown license keys came from one IP address. Fix the key and wait about five minutes |
Messages from the EA#
The EA writes these to the MetaTrader Experts tab and its support log after it receives an alert. Most also appear on the alert's Signal Logs row.
| Message | What it means | What to do |
|---|---|---|
Partial close: X of Y positions closed on SYMBOL (also closeallprofit, closeallloss, closecancelall) | Some matching positions could not be closed, or the broker only partly filled a close | Check the Experts tab for the broker's reason and send the close again for what remains |
Partial cancel: X of Y BUY orders deleted on SYMBOL (also cancelall). Newer EAs add - first refusal: <reason> (<code>) | The broker refused to delete some pending orders. The reason and MT5 return code after first refusal say why | Fix what the reason names (for example, wait for the market to open), then retry or cancel the orders in MetaTrader |
close_lots ... could not close any position ... below the broker minimum lot | The requested close volume is too small for the broker | Raise close_lots or use close_pct |
EA disabled for SYMBOL | The symbol filter or an emergency stop refused the command | Re-enable the symbol, or send eaon,ALL after an emergency stop |
EA disabled (close result: ...) | closealleaoff disabled the EA, but some closes failed | Close what's left in MetaTrader, then send eaon,ALL when ready |
Symbol 'X' not found at this broker | The symbol, after any mapping, isn't in your Market Watch | Fix the symbol or your broker symbol mapping |
[Trail] STOPS_LEVEL violation, skipping SL update, will retry (also [Breakeven]) | The new stop would be too close to price for the broker | Nothing. The EA retries as price moves |
[Trail] ATR handle not ready, skipping this tick | The ATR indicator is still warming up | Nothing. Trailing starts once ATR is ready |
'direction=long' is a HEDGING-only feature and is ignored on NETTING accounts | A netting account has one position per symbol | Leave out direction= on netting accounts |
Duplicate signal | The EA already handled this alert | Nothing |
Trade rejected: Broker spread exceeded your pips limit (or percent limit) | The spread was wider than your maxspread_pips or maxspread_pct when the entry ran | Wait for a calmer market, or raise the limit. See slippage protection |
Trade rejected: Price moved too far from the alert reference | Price had moved further from marketprice than your limit allows, so the alert was late | Check the alert's delivery time, or raise the limit |
Slippage protection rejected the entry (TRADE_SPREAD_PIPS) (cTrader) | The same spread gate refused the entry on cTrader. Other codes are TRADE_SPREAD_PCT, TRADE_MARKETPRICE_DEV_PIPS and TRADE_MARKETPRICE_DEV_PCT | As above |
Multi-TP/SL stop too close to market for SYMBOL | A take-profit or stop level is inside the broker's minimum stop distance, so the EA refused to open the trade | Move every level further from the market and resend |
Multi-TP{n} is on the WRONG SIDE of market or resolves to a price <= 0 | A level is on the wrong side of the entry, or a percentage is too large | A buy's targets go above entry and its stops below, and a sell is the reverse |
MultiTPSL: WARNING ... calc_lots=0, will not partial-close | A percentage of a small position rounds below the broker's minimum volume | Use fixed lots, or larger percentages |
TP{n} close FAILED ... retcode= | The broker refused a partial close | Read the broker's reason. Filling-mode codes such as 10025 or 10030 usually clear on the next attempt |
MultiTPSL: restored ladder ... dropped | The position flipped direction, so its old ladder no longer applies | Send a new ladder for the new direction |
A close that finds no matching position is not an error. The row shows Executed with nothing closed, so check the magic number, symbol and direction against your open positions.