Understanding TradingView Alert JSON
When you create a TradingView alert with a webhook, the "Message" field contains the data sent to your automation platform. This is typically formatted as JSON (JavaScript Object Notation).
Getting the JSON format right is crucial - a single typo can cause your orders to fail.
Basic JSON Structure
JSON consists of key-value pairs enclosed in curly braces:
{
"key1": "value1",
"key2": "value2",
"key3": 123
}
Important Rules
- Keys must be in double quotes:
"symbol"notsymbol - String values need quotes:
"buy"notbuy - Numbers don't need quotes:
123not"123" - No trailing commas: The last item shouldn't have a comma after it
TradingView Placeholder Variables
TradingView provides dynamic variables that get replaced when the alert fires:
Price & Time Variables
| Variable | Description | Example Output |
|----------|-------------|----------------|
| {{ticker}} | Symbol name | ES1!, NQ1! |
| {{exchange}} | Exchange | CME, NYMEX |
| {{close}} | Closing price | 5050.25 |
| {{open}} | Opening price | 5048.00 |
| {{high}} | High price | 5055.00 |
| {{low}} | Low price | 5045.00 |
| {{volume}} | Volume | 15000 |
| {{time}} | Alert time (UTC) | 2025-01-12T14:30:00Z |
| {{timenow}} | Current time | 2025-01-12T14:30:05Z |
Strategy Variables
| Variable | Description | Example Output |
|----------|-------------|----------------|
| {{strategy.order.action}} | Order direction | buy, sell |
| {{strategy.order.contracts}} | Position size | 1, 2, 5 |
| {{strategy.order.price}} | Order price | 5050.25 |
| {{strategy.order.id}} | Order ID | Long Entry |
| {{strategy.order.comment}} | Order comment | My custom comment |
| {{strategy.position_size}} | Current position | 2, -1, 0 |
| {{strategy.prev_market_position}} | Previous position | long, short, flat |
| {{strategy.market_position}} | Current market position | long, short, flat |
Alert Variables
| Variable | Description | Example Output |
|----------|-------------|----------------|
| {{alert.message}} | Custom alert message | Price crossed 5000 |
| {{interval}} | Chart timeframe | 15, 60, D |
| {{syminfo.currency}} | Quote currency | USD |
Common JSON Templates
Basic Order
The simplest format for placing an order:
{
"symbol": "{{ticker}}",
"side": "{{strategy.order.action}}",
"quantity": {{strategy.order.contracts}}
}
With Stop Loss and Take Profit
Add risk management to your orders:
{
"symbol": "{{ticker}}",
"side": "{{strategy.order.action}}",
"quantity": {{strategy.order.contracts}},
"stopLoss": 10,
"stopLossType": "points",
"takeProfit": 20,
"takeProfitType": "points"
}
Using Ticks Instead of Points
For more precise stop/target placement:
{
"symbol": "ESZ4",
"side": "buy",
"quantity": 2,
"stopLoss": 40,
"stopLossType": "ticks",
"takeProfit": 80,
"takeProfitType": "ticks"
}
Using Dollar Amounts
Set stops based on dollar risk:
{
"symbol": "NQZ4",
"side": "sell",
"quantity": 1,
"stopLoss": 200,
"stopLossType": "dollars",
"takeProfit": 400,
"takeProfitType": "dollars"
}
Multi-Account Trading
Execute on multiple accounts simultaneously:
{
"symbol": "{{ticker}}",
"side": "{{strategy.order.action}}",
"quantity": {{strategy.order.contracts}},
"accountIds": ["account1", "account2", "account3"]
}
Close Position
To close an existing position:
{
"symbol": "ESZ4",
"side": "close",
"quantity": 0
}
Flatten All Positions
Close everything on an account:
{
"action": "flatten",
"symbol": "all"
}
Advanced Configurations
Conditional Orders
Include metadata for conditional logic:
{
"symbol": "{{ticker}}",
"side": "{{strategy.order.action}}",
"quantity": {{strategy.order.contracts}},
"conditions": {
"maxDailyLoss": 500,
"maxPositionSize": 5,
"tradingHoursOnly": true
}
}
With Order Comments
Track orders with custom identifiers:
{
"symbol": "{{ticker}}",
"side": "{{strategy.order.action}}",
"quantity": {{strategy.order.contracts}},
"comment": "{{strategy.order.comment}}",
"strategyId": "my-breakout-strategy"
}
Including Price Data
Pass current market data with the order:
{
"symbol": "{{ticker}}",
"side": "{{strategy.order.action}}",
"quantity": {{strategy.order.contracts}},
"triggerPrice": {{close}},
"high": {{high}},
"low": {{low}},
"time": "{{time}}"
}
Common Mistakes to Avoid
1. Missing Quotes Around Strings
❌ Wrong:
{
"symbol": {{ticker}},
"side": buy
}
✅ Correct:
{
"symbol": "{{ticker}}",
"side": "buy"
}
2. Quotes Around Numbers
❌ Wrong:
{
"quantity": "{{strategy.order.contracts}}"
}
✅ Correct:
{
"quantity": {{strategy.order.contracts}}
}
3. Trailing Commas
❌ Wrong:
{
"symbol": "ESZ4",
"side": "buy",
}
✅ Correct:
{
"symbol": "ESZ4",
"side": "buy"
}
4. Invalid Variable Names
❌ Wrong:
{
"side": "{{order.action}}"
}
✅ Correct:
{
"side": "{{strategy.order.action}}"
}
Validating Your JSON
Before using your JSON in a live alert:
Online JSON Validators
Use tools like jsonlint.com to check your syntax.
Test with a Dummy Webhook
- Use a service like webhook.site
- Set it as your webhook URL
- Trigger your alert
- Verify the JSON is formatted correctly
Symbol Mapping
Different platforms use different symbol formats:
| TradingView | Tradovate | Description | |-------------|-----------|-------------| | ES1! | ESZ4 | S&P 500 E-mini | | NQ1! | NQZ4 | Nasdaq E-mini | | CL1! | CLZ4 | Crude Oil | | GC1! | GCZ4 | Gold | | RTY1! | RTYZ4 | Russell 2000 |
Tip: Hardcode the Tradovate symbol instead of using {{ticker}} to avoid mapping issues.
Conclusion
Mastering the TradingView alert JSON format is essential for reliable trading automation. Start with simple templates, validate your JSON before going live, and gradually add complexity as needed.
Need help with your JSON setup? Try RoboQuant - our platform validates your webhook messages automatically.