Signal format
The complete signal syntax. Send these fields from any source, TradingView, Telegram, REST API, and Signalync parses them into a normalized signal.
Overview
Signalync accepts two payload formats: a compact key=value comma-separated string and a standard JSON object. Both are sent to the same inbound endpoint, POST /api/inbound/{sourceAuthKey} , and produce the same normalized signal internally.
The comma-separated format is ideal for TradingView alert messages and Telegram bots because it is short and easy to type. The JSON format is preferred when calling the REST API directly or building custom integrations, since it is explicit and typed. Every parameter available in one format is available in the other. The minimum required fields in either format are symbol and action; everything else is optional.
Case-insensitive
EURUSD, eurusd, and EurUsd are all equivalent.Quick examples
Basic buy with stop loss and take profit
EURUSD,buy,vol=0.1,sl_pips=50,tp_pips=100signalSell with risk-based sizing and multi-level TP
XAUUSD,sell,vol_pctbal_loss=1,sl_pips=40,tp1_pips=40,tp2_pips=80,tp3_pips=120signalPending buy limit order
EURUSD,buylimit,entry_price=1.0750,vol=0.2,sl_pips=30,tp_pips=90signalTrailing stop with breakeven
GBPUSD,sell,vol_dollar=100,sl_pips=40,tp_pips=120,trail_trigger=30,trail_distance=15,be_trigger=20signalSame signal as JSON (REST API)
{
"symbol": "EURUSD",
"action": "buy",
"volume": 0.1,
"volumeType": "lots",
"sl": 50,
"slType": "pips",
"tp": 100,
"tpType": "pips",
"comment": "MyStrategy"
}jsonParameter reference
Every field accepted by the signal parser. Use the comma-separated name in text-format signals and the JSON key when sending JSON.
| Parameter | Type | Required? | Description | Example |
|---|---|---|---|---|
| symbol | string | Yes | Trading instrument. Case-insensitive. | EURUSD |
| action | string | Yes | Order direction or type. See action reference. | buy |
| comment | string | No | Strategy label attached to the trade. Used for grouping, filtering close orders, and broker order history. | comment=MyStrat |
| vol | number | No | Fixed lot size. | vol=0.1 |
| vol_lots | number | No | Explicit fixed lots alias for vol. | vol_lots=0.5 |
| vol_pctbal | number | No | % of account balance converted to lots. | vol_pctbal=2 |
| vol_pcteq | number | No | % of account equity converted to lots. | vol_pcteq=1.5 |
| vol_dollar | number | No | Risk in account currency. Requires a stop loss to calculate lot size. | vol_dollar=100 |
| vol_pctbal_loss | number | No | % of balance to risk. Requires a stop loss. | vol_pctbal_loss=2 |
| vol_pcteq_loss | number | No | % of equity to risk. Requires a stop loss. | vol_pcteq_loss=1 |
| sl_pips | number | No | Stop loss distance in pips from entry. | sl_pips=50 |
| sl_price | number | No | Stop loss at an absolute price level. | sl_price=1.0800 |
| sl_percent | number | No | Stop loss as a % move from entry price. | sl_percent=1.5 |
| tp_pips | number | No | Take profit distance in pips from entry. | tp_pips=100 |
| tp_price | number | No | Take profit at an absolute price level. | tp_price=1.1000 |
| tp_percent | number | No | Take profit as a % move from entry price. | tp_percent=2 |
| tp1 / tp2 / tp3 | number | No | Multi-level take profit values. Inherit type from tp1 if suffix is omitted. | tp1=50,tp2=100,tp3=150 |
| pct1 / pct2 / pct3 | number | No | Partial close % at each TP level. Defaults to even distribution if omitted. | pct1=50,pct2=30,pct3=20 |
| entry_pips | number | No | Pending order entry distance in pips from current price. | entry_pips=50 |
| entry_price | number | No | Pending order entry at an absolute price. | entry_price=1.0900 |
| entry_percent | number | No | Pending order entry as % from current price. | entry_percent=0.5 |
| trail_trigger | number | No | Activate trailing after X pips in profit. | trail_trigger=30 |
| trail_distance | number | No | Trail SL X pips behind the current price. | trail_distance=15 |
| trail_step | number | No | Only move the trailing SL when price moves at least X pips. | trail_step=5 |
| be_trigger | number | No | Move SL to entry after X pips in profit. | be_trigger=20 |
| be_offset | number | No | Lock in X pips of profit when moving SL to breakeven. | be_offset=2 |
| pct | number | No | Close X% of the open position. Used with close actions. | pct=50 |
| pct_lots | number | No | Close an exact lot amount instead of a percentage. | pct_lots=0.5 |
| exop | flag | No | Exit Opposite, close positions in the opposite direction without opening a new one. | EURUSD,buy,exop |
| exent | flag | No | Exit and Enter, close opposite positions then open the new position. | EURUSD,buy,exent |
Volume types
Seven volume parameters give you full control over position sizing. Only one should be specified per signal.
Fixed lots
vol=0.1 or vol_lots=0.1, trade exactly 0.1 lots regardless of account balance.
EURUSD,buy,vol=0.1,sl_pips=50,tp_pips=100signalPercent of balance
vol_pctbal=2, the EA calculates lots such that 2% of account balance is used as nominal position value. No stop loss required.
EURUSD,buy,vol_pctbal=2,tp_pips=80signalRisk-based sizing
vol_dollar=100, vol_pctbal_loss=2, and vol_pcteq_loss=1 all compute lot size from the maximum acceptable loss on the trade. All three require a stop loss (sl_pips, sl_price, or sl_percent) so the EA can calculate the distance to the stop.
EURUSD,buy,vol_pctbal_loss=1,sl_pips=30,tp_pips=90signalStop loss required for risk-based sizing
vol_dollar, vol_pctbal_loss, or vol_pcteq_loss without a stop loss are rejected with SL_REQUIRED.Stop loss & take profit
Stop loss and take profit can each be specified in three ways, pips, absolute price, or percentage from entry. All six variants (three SL, three TP) can be freely combined.
| Parameter | Meaning | Example |
|---|---|---|
| sl_pips=50 | SL 50 pips from entry | EURUSD,buy,sl_pips=50 |
| sl_price=1.0800 | SL at price 1.0800 | EURUSD,buy,sl_price=1.0800 |
| sl_percent=1.5 | SL 1.5% below entry | XAUUSD,buy,sl_percent=1.5 |
| tp_pips=100 | TP 100 pips from entry | EURUSD,buy,tp_pips=100 |
| tp_price=1.1000 | TP at price 1.1000 | EURUSD,buy,tp_price=1.1000 |
| tp_percent=2 | TP 2% above entry | XAUUSD,buy,tp_percent=2 |
Multi-level take profit
Use tp1, tp2, tp3 (unlimited levels) to close portions of the position at different targets. The type suffix (_pips, _price) is inherited from tp1 if omitted on subsequent levels.
# All three levels interpreted as pips (type inherited from tp1)
EURUSD,buy,vol_pctbal_loss=2,sl_pips=30,tp1_pips=50,tp2=100,tp3=150,pct1=50,pct2=30,pct3=20signalSmart defaults for partial close
pct values, Signalync distributes them evenly (33 / 33 / 34).Pending orders
Use a pending order action when you want the broker to place an order at a future price, not the current market price. The four pending actions are buylimit, selllimit, buystop, and sellstop. All four require an entry price.
| Action | Description |
|---|---|
| buylimit | Place a buy limit order (entry below current price). |
| selllimit | Place a sell limit order (entry above current price). |
| buystop | Place a buy stop order (entry above current price). |
| sellstop | Place a sell stop order (entry below current price). |
Entry parameter
Specify where the pending order should be placed using one of the entry parameters:
# Entry at an absolute price
EURUSD,buylimit,entry_price=1.0750,vol=0.2,sl_pips=30,tp_pips=90
# Entry X pips from the current price
GBPUSD,sellstop,entry_pips=40,vol=0.1,sl_pips=25,tp_pips=75signalExOp and ExEnt flags
Two flags modify how existing positions are handled when a new order signal arrives:
exop, Exit Opposite. Close any positions in the opposite direction before placing the new order. Does not open the new position if opposite positions existed.exent, Exit and Enter. Close opposite positions then open the new position.
# Close any open longs, then open a buy
EURUSD,buy,vol=0.1,sl_pips=50,tp_pips=100,exent,comment=TrendFollowsignalTrailing stop & breakeven
Add a trailing stop or breakeven move to any market order by including the relevant parameters. The MT5 EA handles the ongoing management after the order is placed.
Trailing stop
The trailing stop activates once the trade reaches trail_trigger pips in profit, then trails the stop loss trail_distance pips behind the current price. The optional trail_step prevents the stop from moving on every tick, it only shifts when price moves at least trail_step pips.
GBPUSD,sell,vol=0.1,sl_pips=40,tp_pips=120,trail_trigger=30,trail_distance=15,trail_step=5signalBreakeven
The breakeven move shifts the stop loss to the entry price (optionally locking in be_offset pips) once the trade reaches be_trigger pips in profit.
EURUSD,buy,vol_pctbal_loss=1,sl_pips=30,tp_pips=90,be_trigger=20,be_offset=2signalPartial close
To close part of an open position, use a close action (closebuy, closesell, or closeall) with a pct or pct_lots parameter.
# Close 50% of all open buy positions on XAUUSD
XAUUSD,closebuy,pct=50
# Close exactly 0.5 lots of sell positions, filtered by comment
EURUSD,closesell,pct_lots=0.5,comment=ScalpStrategysignalWithout a pct or pct_lots parameter, the close action closes the entire position.
Action reference
| Action | Description |
|---|---|
| buy / long | Open a buy (long) position at market. |
| sell / short | Open a sell (short) position at market. |
| closebuy / closelong | Close all open buy positions (optionally filtered by comment). |
| closesell / closeshort | Close all open sell positions (optionally filtered by comment). |
| closeall | Close all open positions (optionally filtered by comment). |
| closelongbuy | Close all long positions, then open a new buy. |
| closelongsell | Close all long positions, then open a new sell. |
| closeshortbuy | Close all short positions, then open a new buy. |
| closeshortsell | Close all short positions, then open a new sell. |
| buylimit | Place a buy limit pending order. Requires an entry parameter. |
| selllimit | Place a sell limit pending order. Requires an entry parameter. |
| buystop | Place a buy stop pending order. Requires an entry parameter. |
| sellstop | Place a sell stop pending order. Requires an entry parameter. |
| cancellong | Cancel all pending buy orders. |
| cancelshort | Cancel all pending sell orders. |
Authentication
Every inbound request is authenticated by the Source auth key embedded in the URL. An optional HMAC secret adds a second layer of verification via a request header.
- URL key,
POST /api/inbound/{sourceAuthKey}. The auth key is generated when you create a Source and is the primary credential. Keep it private. - HMAC secret (optional), If the Source has a secret configured, every request must include an
X-Signalync-Secretheader. Requests without a matching header are rejected with401 HMAC_MISMATCH.
secret= query parameter is retired. Use the header approach for HMAC verification. Note that TradingView webhooks cannot send custom headers, so HMAC is only useful for REST API or proxied integrations.Error codes
| Code | Description |
|---|---|
| PARSE_ERROR | Signal payload could not be parsed. |
| MISSING_SYMBOL | No symbol was provided. |
| MISSING_ACTION | No action was provided. |
| UNKNOWN_ACTION | The action value is not recognized. |
| INVALID_VOLUME | Volume is zero, negative, or otherwise invalid. |
| SL_REQUIRED | Risk-based volume sizing was used but no stop loss was provided. |
| INVALID_SOURCE_KEY | The source auth key in the URL was not found. |
| HMAC_MISMATCH | The X-Signalync-Secret header did not match the configured secret. |
| QUOTA_SIGNALS_IN | Monthly signal ingress limit reached. Upgrade or wait for the quota to reset. |
| SOURCE_INACTIVE | The Source is currently disabled. |