➑️Connect TradingView via Webhook

circle-exclamation

TradingView webhooks allow you to send automated trading alerts directly to external systems. By connecting them to MetaCopier, you can automatically execute and copy trades based on TradingView alerts and Pine Scripts without manual intervention. This guide shows how to set up and use TradingView webhooks with MetaCopier.

circle-info

What is webhook? A webhook is a way for one platform to automatically send information to another platform in real time.

In the case of TradingView and MetaCopier, a webhook allows TradingView to send a message to MetaCopier whenever an alert is triggered. This message can contain trading instructions such as open a trade, close a trade, or modify a position. MetaCopier receives the message and executes the action on the connected trading account automatically.

In simple terms, a webhook acts like a messenger that instantly delivers TradingView alerts to MetaCopier so trades can be executed automatically.

Requirements

To use TradingView webhooks with MetaCopier, you need the following:

  • One trading account connected to MetaCopier

  • A TradingView account

Quick Start

Enable the Feature

On the trading account where you want positions to be opened or closed, add the β€œTradingView Webhook” feature in MetaCopier:

A new window with the TradingView Webhook configuration will open. For now, leave the default settings and save them. Each setting is explained in the Advanced Guide below.

Configure a New Alert

Open the TradingView webhook feature (edit button) and select the Setup Guide at the top.

A new window will open where you will find all the information required for the TradingView webhook.

In TradingView, open the desired chart (in this example, XAUUSD). Then, in the top-right corner, open the Alerts section and create a new alert with the "+" symbol.

A new window will open. The first step is to define the Webhook URL, which is where the alerts will be sent. Open the Notifications tab and enter the URL shown in the MetaCopier Setup Guide into the Webhook URL field.

Switch to the Message tab in TradingView, where you can define how the message sent to MetaCopier will be formatted. The message must be formatted as JSON and includes the instructions for MetaCopier. Below is a simple example that opens a buy position for XAUUSD with 0.1 lot size.

In TradingView, it will look like this. Please make sure that the rectangle containing the JSON message is green. If it is orange, it means the JSON contains formatting errors.

That’s all! Click Create to save the alert and make sure it is active in TradingView.

Once the alert is triggered, MetaCopier will receive the notification and the defined order will be executed on your trading account.

In the Log section in TradingView, you can check the delivery status.

And this is how it looks on the trading account after the webhook has been received.

Webhook examples

Below are some typical JSON messages to help you set up your alerts correctly. As a starting point, we will use the example shown earlier:

To avoid specifying the symbol every time (for example, if you want to reuse the same format on multiple alerts or charts), you can use TradingView placeholders. These placeholders act like variables that TradingView automatically fills with the correct values when the alert is triggered, so you don’t need to hardcode them.

Let’s use the {{ticker}} placeholder to avoid defining the symbol name in every alert:

When the alert is triggered, the symbol will automatically be replaced based on the chart used to create the alert (in our case, XAUUSD).

Now let’s define take profit (TP) and stop loss (SL) values.

This works, but as you can imagine, the TP/SL values are hardcoded and must be defined each time.

To make them dynamic, you have two options:

Let’s now see how to manage existing trades. To be able to modify or close existing trades via webhook, we first need to define a unique identifier when opening a position. This is done using the JSON property tradeKey. For example:

To modify a specific position, you can create an alert with the following content:

And to close it, you can use:

Webhook URL

MetaCopier operates in four regions: New York, London, Berlin, and Singapore. Each region has its own trading API to help minimize latency and improve execution speed.

In the Setup Guide described above, the correct Webhook URL is automatically generated for your trading account and region.

The Webhook URL has the following structure:

Region
Host

New York

api-newyork

London

api-london

Berlin

api-berlin

Singapore

api-singapore

Global

api


Advanced Guide

This section covers all features, configuration options, and advanced usage.

Feature Configuration

All configuration options for the TradingView Webhook feature:

Configuration Reference

Option
Type
Default
Description

enableWebhook

boolean

true

Enable/disable webhook processing

authMethod

string

SECRET

SECRET or HMAC

webhookSecret

string

-

Secret for SECRET auth (min 16, max 64 chars)

hmacSecret

string

auto

Secret for HMAC auth (auto-generated, read-only)

allowedActions

array

all

Allowed actions. Empty = all allowed

allowCloseAll

boolean

false

Enable closeAll action

allowSymbolOnlyClose

boolean

false

Allow close by symbol without filters

maxMatchCount

integer

3

Max positions before requiring force: true (1-100)

ipAllowlist

array

[]

Allowed IPs. Empty = all allowed

requireTimestampForSecret

boolean

false

Require timestamp for SECRET auth

timestampToleranceSeconds

integer

60

Max age of timestamp in seconds (10-300)

dataRetentionDays

integer

30

TTL for stored data (1-90 days)

Authentication Methods

Simple secret in the request body:

Optional Replay Protection

Enable requireTimestampForSecret: true to require timestamp:

Requests with timestamps older than timestampToleranceSeconds are rejected.

HMAC Authentication (Advanced)

For enhanced security using cryptographic signatures:

Signature Calculation:

Where:

  • timestamp = Unix seconds (required, must be numeric)

  • canonicalPayload = JSON with sorted keys, no whitespace, excluding timestamp and signature fields

circle-info

Note: HMAC auth requires a proxy service to compute the signature before sending to MetaCopier.


All Actions

Action
Description

open

Open a new position

close

Close position(s) by matching criteria

modify

Update SL/TP or partial close

closeAll

Close all positions (requires allowCloseAll: true)

store

Store custom data in Database


Open Action

Opens a new position.

Open Fields

Field
Required
Type
Description

symbol

βœ…

string

Trading pair (e.g., EURUSD)

orderType

βœ…

string

Order type (see below)

volume

βœ…

number

Lot size (must be positive)

stopLoss

⬜

number

Stop loss price

takeProfit

⬜

number

Take profit price

openPrice

⬜

number

Entry price (for pending orders)

tradeKey

⬜

string

Unique identifier for this trade (max 20 chars)

magicNumber

⬜

string

Group identifier for strategy

orderId

⬜

string

Strategy order ID from {{strategy.order.id}}

comment

⬜

string

Trade comment (max 20-31 chars depending on broker)

Order Types

Type
Description

buy

Market buy

sell

Market sell

buylimit

Buy limit order

selllimit

Sell limit order

buystop

Buy stop order

sellstop

Sell stop order

circle-info

Order types are case-insensitive.


Close Action

Closes position(s) based on matching criteria.

Match Modes

Mode
Matches By
Description

EXACT

tradeKey

Close specific position(s) from stored mapping

GROUP

magicNumber or orderId

Close positions by strategy group

BULK

symbol

Close all positions for a symbol

circle-info

If matchMode is not provided, it's auto-detected based on which fields you include.

Close by TradeKey (EXACT)

Close by Magic Number (GROUP)

Close by Symbol (BULK)

Close Fields

Field
Type
Description

matchMode

string

EXACT, GROUP, or BULK (auto-detected if omitted)

tradeKey

string

Position identifier (EXACT mode)

magicNumber

string

Strategy identifier (GROUP mode)

orderId

string

Strategy order ID (GROUP mode)

symbol

string

Trading pair (BULK mode)

direction

string

long or short filter (BULK mode)

closeMode

string

first, last, or all (default: all)

force

boolean

Allow closing more than maxMatchCount positions

Close Modes

Value
Description

first

Close oldest position (FIFO)

last

Close newest position (LIFO)

all

Close all matching positions

Force Flag

If more than maxMatchCount positions match, you must either:

  1. Add force: true with explicit matchMode

  2. Add more specific filters

This prevents accidental bulk operations.


Modify Action

Modifies existing position(s).

Partial Close

circle-info

If reduceVolumeBy reduces the position to 0 or below, the position is fully closed.

Modify Fields

Field
Type
Description

matchMode

string

EXACT, GROUP, or BULK (auto-detected)

tradeKey

string

Position identifier (EXACT mode)

magicNumber

string

Strategy identifier (GROUP mode)

orderId

string

Strategy order ID (GROUP mode)

symbol

string

Trading pair (BULK mode)

force

boolean

Allow modifying more than maxMatchCount positions

stopLoss

number

New stop loss price

takeProfit

number

New take profit price

openPrice

number

New price for pending orders

reduceVolumeBy

number

Volume to reduce (partial close)


CloseAll Action

Closes ALL positions on the account.

Requirements:

  • Feature must have allowCloseAll: true

  • Request must have force: true

circle-exclamation

Store Action

Stores custom data from TradingView strategies/indicators.

Field
Required
Type
Description

data

βœ…

object

Any JSON object to store (max 100KB size)

Data is stored in Database with TTL based on dataRetentionDays.

circle-exclamation

Retrieve Stored Data

Use the REST API to fetch stored data:

List all stored data (paginated):

Response:

Get specific data by ID:

Delete specific data:

circle-info

These endpoints require API authentication (not the webhook secret). See REST API documentation for details.


Common Request Fields

Fields available on all actions:

Field
Type
Description

action

string

Action type (required)

secret

string

Webhook secret (for SECRET auth)

signature

string

HMAC signature (for HMAC auth)

timestamp

number/string

Unix seconds or ISO-8601 string

idempotencyKey

string

Prevents duplicate execution

schemaVersion

integer

Schema version (only 1 supported)

Idempotency

Include an idempotencyKey to prevent duplicate executions:

Same key within 5 minutes returns the cached response.

Timestamp Format

Timestamp accepts:

  • Number: Unix seconds (e.g., 1708771200)

  • String: ISO-8601 (e.g., "2024-02-24T12:00:00Z")


Error Codes

Authentication Errors (401)

Code
Description

INVALID_SECRET

Webhook secret doesn't match

INVALID_SIGNATURE

HMAC signature verification failed

TIMESTAMP_EXPIRED

Timestamp outside valid window

TIMESTAMP_MISSING

Timestamp required but not provided

Authorization Errors (403)

Code
Description

WEBHOOK_NOT_ENABLED

Feature not enabled on account

IP_NOT_ALLOWED

Request IP not in allowlist

ACTION_NOT_ALLOWED

Action not in allowed actions list

CLOSE_ALL_NOT_ALLOWED

closeAll requires allowCloseAll: true

SYMBOL_ONLY_NOT_ALLOWED

Symbol-only close requires additional filter

Validation Errors (400)

Code
Description

INVALID_ACTION

Unknown or missing action

INVALID_JSON

JSON parsing failed

INVALID_CONTENT_TYPE

Must be application/json

INVALID_ORDER_TYPE

Unknown order type

INVALID_MATCH_MODE

Unknown matchMode (must be EXACT/GROUP/BULK)

MISSING_IDENTIFIER

No position identifier provided

FORCE_REQUIRES_EXPLICIT_MODE

force:true requires explicit matchMode

UNSUPPORTED_SCHEMA_VERSION

Only schemaVersion 1 supported

INVALID_TIMESTAMP_TYPE_FOR_HMAC

HMAC requires numeric timestamp

Not Found Errors (404)

Code
Description

TRADEKEY_NOT_FOUND

TradeKey not found in mapping

POSITION_NOT_FOUND

No positions match criteria

ACCOUNT_NOT_FOUND

Account ID not found

Conflict Errors (409)

Code
Description

AMBIGUOUS_MATCH

Too many matches - add force:true with explicit matchMode

Service Errors (503)

Code
Description

ACCOUNT_NOT_CONNECTED

Trading account is disconnected


IP Allowlist (Optional)

Restrict webhook access to specific IPs:

circle-exclamation

Troubleshooting

Alert not working?

  1. Check your webhook URL is correct

  2. Verify your JSON is valid (use a JSON validator)

  3. Confirm your secret matches exactly

  4. Make sure your account is connected

Position not found?

  1. Check the tradeKey spelling exactly

  2. The position may already be closed

  3. Use the exact same tradeKey you used when opening

AMBIGUOUS_MATCH error?

  • Add force: true with explicit matchMode

  • Or add more specific filters (symbol, direction)

HMAC signature fails?

  • Ensure timestamp is numeric (Unix seconds)

  • Ensure canonical payload excludes timestamp/signature

  • Ensure keys are sorted alphabetically


Examples by Use Case

This section provides complete examples for common trading scenarios.

Close All Positions on Account

Close every open position on the account. Useful for emergency exit or end-of-day cleanup.

Step 1: Enable closeAll in Feature Settings

Step 2: Send closeAll Request

circle-exclamation

Close by Strategy Group (Magic Number)

Close all positions belonging to a specific strategy. Useful when running multiple strategies on the same account.

Open with Magic Number

Close All Positions with Same Magic Number

circle-info

This closes ALL positions with magicNumber: "RSI_Strategy_15M", regardless of symbol or direction.

Close Only Long Positions in Group


Close by Order ID (Pine Script Strategies)

Close positions by strategy entry name. Useful for Pine Script strategies using strategy.entry().

Pine Script Strategy Example

Alert Message (Open)

Alert Message (Close All "Long Entry" Positions)

circle-info

orderId is NOT unique - all positions with the same entry name are closed.


Close by Symbol (Bulk Matching)

Close positions for a specific symbol. Requires additional filters by default.

Close All EURUSD Long Positions

Close All EURUSD Short Positions

Close ALL EURUSD Positions (Both Directions)

circle-info

Without direction, this matches all EURUSD positions. If more than maxMatchCount positions exist, force: true is required.


Close First or Last Position (FIFO/LIFO)

Close only the oldest or newest position matching your criteria.

Close Oldest Position (FIFO)

Close Newest Position (LIFO)

Close Oldest Position in Strategy Group


Partial Close (Reduce Position Size)

Reduce position size without fully closing it.

circle-info

Example: Position is 0.1 lots β†’ reduceVolumeBy: 0.05 β†’ Position becomes 0.05 lots

Partial Close by Magic Number

circle-info

This reduces ALL positions in the group by 0.01 lots each.


Using the Force Flag

The force flag allows closing more positions than maxMatchCount (default: 3).

When Force is Required

Scenario
Force Required?

2 positions match, maxMatchCount=3

No

5 positions match, maxMatchCount=3

Yes

closeAll action

Always

Symbol-only close without direction

Yes

Force with Explicit matchMode

circle-info

Important: force: true requires an explicit matchMode. Auto-detected matchMode with force will be rejected with FORCE_REQUIRES_EXPLICIT_MODE.


Real-World Strategy Examples

Grid Trading Strategy

Open multiple positions with the same magic number, close oldest first:

Open (multiple grid levels)

Close Oldest Grid Position (Take Profit)

Close All Grid Positions (Emergency Exit)


Multi-Symbol Strategy

Trade multiple symbols with the same strategy:

Open Position

Close Specific Symbol

Close All Strategy Positions (All Symbols)


Scalping Strategy with Take Profit Levels

Open with tradeKey for precise control:

Open Position

circle-info

TradingView placeholders don't support math operations. Use fixed prices or calculate SL/TP in your Pine Script using strategy.order.alert_message.

Partial Close at First Target (1/3)

Move Stop Loss to Break Even

circle-info

Tip: For dynamic SL/TP based on entry price, use strategy.order.alert_message in your Pine Script to pass calculated values.

Close Remaining Position


Symbol-Only Close (Advanced)

Close all positions for a symbol without direction filter. Requires special permission.

Step 1: Enable in Feature Settings

Step 2: Close All Symbol Positions

circle-info

Note: Without allowSymbolOnlyClose: true, you must include direction or another filter.


Using Dynamic Values (Advanced Pine Script)

TradingView placeholders don't support math operations. To use calculated values (like dynamic SL/TP), use the alert_message parameter in your Pine Script.

Pine Script Example:

Alert Message (uses the dynamic values):

When the alert triggers, TradingView replaces {{strategy.order.alert_message}} with the complete JSON containing the calculated SL/TP values.

Last updated