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#

StatusWhat it meansWhere to look
200Accepted. 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 secondsSignal Logs
400The 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
401Authentication failed. The license key is unknown, inactive or expired. Close and cancel commands still get through on an inactive licenseTradingView alert log only
402A plan feature is not available, such as delay= on TrialTradingView alert log, Signal Logs and the Rejected panel
413Request entity too large. The alert is over 2,048 bytes. Shorten the comment or other long textTradingView alert log only
429A rate or capacity limit was reachedTradingView alert log, and Signal Logs for most limits
503Failed to update symbol filter. A server-side problem that a retry won't fix. Contact supportTradingView 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.

ReasonWhat happenedWhat to do
missing_authSignal Authentication is on and the alert has no auth= (Authentication required)Add auth=PASSWORD to every alert for that license
invalid_authThe auth= password is wrong or longer than 72 characters (Invalid authentication)Match the password set in the dashboard. It is case-sensitive
verification_errorPineHook could not check the password and refused the alert to be safe (Authentication verification error)Contact support. This isn't a setup problem
symbol_filteredThe 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_filterThe 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_longThe change would put more than 100 symbols in your filter. The filter is left unchangedUse the opposite mode: eaoffexcept for a short allow-list, or eaonexcept for a short block-list
rate_limited / rate_limited_dailyYour account's per-minute or daily alert limit is used upSend fewer alerts or wait for the reset. Close and cancel commands are never refused by these limits
pending_order_ceilingYou already have the maximum number of unfilled pending orders on this license: 5 on Trial, 50 on paid plansCancel unfilled orders or wait for them to fill or expire
queue_ceiling_per_license50 delayed alerts are already waiting for this licenseSend clearqueue, or wait for them to run
queue_fullThe license's delivery queue is full, usually because the EA has been offline for a long timeReconnect the EA
active_hoursThe alert arrived outside your Active HoursAdjust Active Hours in your settings
account_filterA minbalance, minequity, minfreemargin or minmarginlevel check failed when the entry ranCheck the account values against the alert
daily_ddThe drawdown guard refused the entrySee risk management in your trading settings
position_limitA long or short lot or equity limit, or your plan's strategies-per-symbol allowance, refused the entryReview your position limits or close a strategy on that symbol
news_filterThe entry fell inside the news filter windowWait for the window to pass
recovery_expired / recovery_notifyAn alert held while the EA was offline was not replayed on reconnectCheck your missed-alert recovery setting
hedging_disabled / hedging_unavailableAllow Hedging blocked the entry, or could not check itSee 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#

MessageFix
Invalid license key format - expected XXXX-XXXX-XXXX-XXXXCopy 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 fieldsSend 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 positionPut 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 bodyCheck 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=valueWrite it as name=value or remove it
Unrecognized parameter - did you mean '{suggestion}'? or Unknown parameter '{param}' for {command} commandFix 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#

MessageFix
Position sizing is requiredAdd one sizing parameter, such as size_lots=0.1
Conflicting position sizing parametersKeep 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 <= 100Use 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#

MessageFix
Conflicting stop loss parameters or Conflicting take profit parametersUse only one of the pips, price or percent forms
sl_price=0 is not valid or tp_price=0 is not validUse 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 setGive it a number or remove it
Invalid sl_pct={value} for a BUY. A stop loss at or beyond 100% of entryUse 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 targetsUse the single value or the ladder, not both

Pending orders#

MessageFix
{COMMAND} requires an entry level: price=..., price_pips=..., or price_pct=...Add one entry level
Conflicting entry parametersKeep one of price, price_pips and price_pct
{COMMAND} price={value} is not validUse 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 maximumUse an expiry within 10 years. A bare time is read as UTC
Invalid expiry_time '{value}': must be an ISO 8601 datetimeWrite it as 2030-01-15T14:30:00Z. An offset needs a colon, as in +03:00

Multi-target TP/SL#

MessageFix
Gap detected in TP target numberingNumber 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 0Give the level a share above 0, or remove it
TP{n} has a close amount but no level distanceAdd pips, price or pct to that level in the JSON array
TP{n}_lots must be positive or must be a finite numberUse a positive number of lots
TP{n} has a level but no close percentage or lots specifiedAdd tp{n}_close or tp{n}_lots
Conflicting TP close formatsUse percentages or lots on every level of a side, not a mix
Too many TP/SL targetsUse up to 10 levels, numbered tp1 to tp10
Invalid compact TP syntaxWrite levels as pips:close_pct separated by ;

Trailing stop and breakeven#

MessageFix
trail command requires a distance parameterAdd distance_pips, distance_pct or distance_atr
Conflicting trailing stop parametersKeep one distance type
Conflicting step parametersUse trail_step with pips, or trail_pct_step with percent
trail_step={value} is invalid. Must be greater than 0Use a positive step, or leave it out
Conflicting trail trigger parametersKeep one of trail_trigger, trail_trigger_pct and trail_trigger_price
Conflicting breakeven trigger parameters or Conflicting breakeven offset parametersKeep one trigger and one offset type
Invalid value '{value}' for distance_atr - must be between 0.1 and 20.0Use an ATR multiplier from 0.1 to 20
Invalid value '{value}' for trail_atr_timeframeUse M1, M5, M15, M30, H1, H4, D1, W1 or MN1
'{field}' cannot be negativeUse a positive value. Only be_offset_pips and be_offset_pct may be negative

Closing positions and modifying trades#

MessageFix
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 0Use a positive volume
Conflicting partial close parameters: close_pct, close_lotsUse one of them
close_pct is empty, which would close the whole positionGive 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 supportedUse close_pct or close_lots
Modify command requires at least one SL/TP parameterAdd the level you want to change
Cannot combine 'order_type' with 'direction' on modify commandUse direction for positions or order_type for pending orders

Timing, strategies and tickets#

MessageFix
delay must be between 0 and 86400 secondsUse up to 24 hours
Invalid value '{value}' for closetime - must be between 1 and 2592000 secondsUse 1 second to 30 days
Invalid magic {value}: must be between 0 and 2147483647 or must be a whole numberUse a whole number in range
magic=ALL is a filter wildcard or symbol=ALL is a filter wildcardEntries need a real magic number and symbol
ticket is not supported by closecancelall or by closealleaoffSend separate ticketed commands, or remove the ticket
Ticket IDs (ticket= and new_ticket=) cannot be used with Netting or Exchange accountsRemove the ticket and manage the position by symbol
ticket= and new_ticket= need the updated PineHook EAInstall the latest EA and reconnect
Invalid ticket: ticket must be 1 to 32 characters or ticket values beginning with 'PH-' are reserved by PineHookUse 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 clearqueueAdd magic=N or magic=ALL, or send clearqueue without a symbol
'active_start' is no longer supported in signalsRemove it and set Active Hours in your settings

EA control commands#

MessageFix
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#

MessageStatusFix
Delayed signals require a paid plan. Upgrade to use delay=.402Remove delay= or upgrade
Your account's signal rate limit has been reached ({N} signals per minute)429Wait 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)429Wait for the 24-hour reset
Live pending-order limit reached ({current}/{max})429Cancel unfilled orders, or give pending orders an expiry
license_queue_full: Delayed-signal queue is full for this license429Send clearqueue, or wait for queued alerts to run
license_queue_full429The EA has fallen behind or is offline. Reconnect it
queue_full: Delayed-signal queue is at system capacity429A platform-wide safety limit was reached. Try again shortly
Too many cancel/close-all commands in a short window; the account is already flat.429Nothing to do. One sweep already cancels everything that matches
Too many failed attempts. Try again later.429Too 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.

MessageWhat it meansWhat 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 closeCheck 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 whyFix 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 lotThe requested close volume is too small for the brokerRaise close_lots or use close_pct
EA disabled for SYMBOLThe symbol filter or an emergency stop refused the commandRe-enable the symbol, or send eaon,ALL after an emergency stop
EA disabled (close result: ...)closealleaoff disabled the EA, but some closes failedClose what's left in MetaTrader, then send eaon,ALL when ready
Symbol 'X' not found at this brokerThe symbol, after any mapping, isn't in your Market WatchFix 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 brokerNothing. The EA retries as price moves
[Trail] ATR handle not ready, skipping this tickThe ATR indicator is still warming upNothing. Trailing starts once ATR is ready
'direction=long' is a HEDGING-only feature and is ignored on NETTING accountsA netting account has one position per symbolLeave out direction= on netting accounts
Duplicate signalThe EA already handled this alertNothing
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 ranWait for a calmer market, or raise the limit. See slippage protection
Trade rejected: Price moved too far from the alert referencePrice had moved further from marketprice than your limit allows, so the alert was lateCheck 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_PCTAs above
Multi-TP/SL stop too close to market for SYMBOLA take-profit or stop level is inside the broker's minimum stop distance, so the EA refused to open the tradeMove every level further from the market and resend
Multi-TP{n} is on the WRONG SIDE of market or resolves to a price <= 0A level is on the wrong side of the entry, or a percentage is too largeA buy's targets go above entry and its stops below, and a sell is the reverse
MultiTPSL: WARNING ... calc_lots=0, will not partial-closeA percentage of a small position rounds below the broker's minimum volumeUse fixed lots, or larger percentages
TP{n} close FAILED ... retcode=The broker refused a partial closeRead the broker's reason. Filling-mode codes such as 10025 or 10030 usually clear on the next attempt
MultiTPSL: restored ladder ... droppedThe position flipped direction, so its old ladder no longer appliesSend 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.