# Sgnl AI (/ai-assistant)
Sgnl AI is the assistant built into your TradeSgnl portal. Ask it about your trading results, your connected accounts, or how to set something up, and it answers from your own data and the TradeSgnl docs. It's there on every page, so you can ask without leaving what you're doing.
Your trades, your balance, your best and worst symbols. Ask a question and get the answer, no spreadsheets.
Tell it a signal didn't trade and it checks what happened, step by step, and tells you what to change.
Describe the trade you want and it writes the alert message for TradingView, ready to paste.
## Open Sgnl AI [#open-sgnl-ai]
Click **Sgnl AI** at the top of any page in the portal. The chat opens on the right and stays open as you move between pages. On your phone, tap **Sgnl AI** in the bottom bar.
Type your question and press **Enter**. Use **Shift + Enter** for a new line.
## What you can ask [#what-you-can-ask]
### Your performance [#your-performance]
Sgnl AI reads the same trade history you see in [Analytics](/analytics), so you can ask about it in your own words.
```
What's my most profitable symbol?
How do my longs compare to my shorts?
Show me my daily P&L this week.
Am I overtrading?
How does my live trading compare to my backtest?
```
### Your accounts and signals [#your-accounts-and-signals]
It can see your connected accounts, the signals you've sent, and what happened to each one.
```
Are all my accounts connected?
Did any signals fail today?
Why didn't my last EURUSD alert open a trade?
What's my balance right now?
```
When a signal didn't trade, Sgnl AI works through it in order: whether the signal arrived, which accounts it reached, and why an account turned it down. It ends with what to change.
### Setup and how things work [#setup-and-how-things-work]
Sgnl AI can search the TradeSgnl docs, so it answers setup questions with the steps that apply to you.
```
How do I connect my trading account?
How do I set up a TradingView webhook?
What does error 6001 mean?
How does symbol mapping work?
```
### Writing alert messages [#writing-alert-messages]
Describe the trade in plain English and Sgnl AI writes the alert message for you, using the same rules as the [Syntax Generator](/syntax-generator). It can also start from one of your saved Signal Presets.
```
Write an alert that buys 0.1 lots of gold with a 50 pip stop and two take profits.
```
Copy the message into your TradingView alert. For setting up alerts directly on your chart, the [TradingView AI](/tradingview-ai) extension does it for you.
## Add screenshots and files [#add-screenshots-and-files]
Click the attachment button to add images, PDFs, CSV files or text files to your question. A screenshot of a TradingView alert or an error message is often the quickest way to get help.
## Fast, Pro and Max [#fast-pro-and-max]
Pick how much effort Sgnl AI puts into an answer from the menu next to the send button:
| Level | Best for |
| -------- | ------------------------------------------------ |
| **Fast** | Quick, simple questions |
| **Pro** | Everyday questions. This is the default |
| **Max** | Complex questions, such as a full account review |
**Thinking** in the same menu sets how long it reasons before answering (Low, Medium or High). Deeper thinking gives more careful answers but takes longer.
Max is available on paid plans above Starter. On the Starter plan, it's shown with an **Upgrade** link.
Sgnl AI uses AI credits, the same balance as the other TradeSgnl AI features. Each plan includes a monthly amount. If you run out, you can buy more at any time on the [Billing page](https://portal.tradesgnl.com/profile?tab=billing).
## Your conversations [#your-conversations]
Every conversation is saved. Click the **history** button at the top of the chat to go back to an earlier one, click a conversation's title to rename it, or click **+** to start a new one.
## Strategy mode [#strategy-mode]
Switch the chat to **Strategy** to write TradingView Pine Script strategies instead of asking questions. This is the same AI as [Strategy Lab](/strategy-lab), which is the best place to build and edit a strategy in full. Strategy mode is available on plans above Starter.
## Sgnl AI or TradingView AI? [#sgnl-ai-or-tradingview-ai]
* **Sgnl AI** lives in the portal and knows your account: your results, your accounts, your signals and your settings.
* **[TradingView AI](/tradingview-ai)** lives on your TradingView chart: it reads the chart, draws on it, and creates alerts there.
Want the same answers in Claude, ChatGPT or another AI app you already use? Connect it with the [MCP server](/mcp-server).
# AI Trading Agents (/ai-trading-agent)
## Introduction [#introduction]
AI Trading Agents let you create your own trading agents in plain English. Describe how you trade, and an agent sets itself up to watch your markets on your own connected account. It looks for setups that fit your rules, thinks each one through, and either brings you the trade to approve or places it for you, always inside the limits you set.
You are not handing over control. The markets, the size of each trade, the daily loss limit and the sessions it may trade are all yours, and they are checked every time. Every decision, including each time an agent decides to wait, comes with the reasoning behind it, and you can ask the agent about any of them.
Approve every trade yourself in the portal or on Telegram, or let an agent place trades itself once you are comfortable with how it trades.
Risk per trade, the daily loss limit, open trades and your safeguards are enforced in code, not left to the AI. A trade that does not fit is cut down or skipped.
Open any decision to see who looked at the setup, the case for and against, and why the agent traded or stood aside. Or ask the agent itself.
{/* TODO(screenshot): the Trading Agents page Overview tab with a trade waiting for approval, the Today strip and the activity timeline. Suggested name: ai-agent-overview.png. */}
### Part of TradeSgnl Cloud [#part-of-tradesgnl-cloud]
AI Trading Agents are part of [TradeSgnl Cloud](/cloudconnect#part-of-tradesgnl-cloud), the services we run for you on our servers around the clock. They are included on the **Advanced** plan (1 agent) and the **Professional** plan (3 agents).
AI Trading Agents are rolling out in waves to people on the early-access list. Advanced and Professional members are let in first. To join, open the Trading Agents page in your portal and click **Join the waitlist**. We email you and send a notification when it is your turn.
### What you need [#what-you-need]
* A plan that includes it (Advanced or Professional) and a place from the early-access list.
* An MT5 account running on a [Cloud Terminal](/cloudconnect). An agent reads its prices and your account figures from the terminal of the account it trades on, and its orders go to that account through the TradeSgnl EA. Cloud Connections for other platforms, a Cloud VPS and your own PC are not used by agents today.
* AI credits. See [Credits](#credits).
## Create an Agent [#create-an-agent]
**Open the Trading Agents page.** In your portal, go to **Trading Agents** under **AI** in the menu. The first time, you read and agree to the AI Trading Agents terms before you can continue.
**Describe how you trade.** In the setup chat, say what you trade, how long you hold a trade, and roughly how much of your account you risk on one. For example: "I scalp gold around the London open" or "I trade EURUSD and GBPUSD during London, risking 1% a trade". You can also ask for a new agent in the Sgnl AI sidebar. See [Trading Agents in Sgnl AI](#trading-agents-in-sgnl-ai).
**Let it set itself up.** The agent finds your broker's exact symbol names (including any suffix such as `.pro`), picks the charts and sessions that suit how long you hold a trade, and asks once how much you risk if you did not say (it starts with a careful level if you still do not). If you have more than one Cloud Terminal account, it asks which one to trade on.
**Review and start.** The new agent shows as **Not started** and asks you before every trade. Check the settings, then click **Start agent**.
We suggest running a new agent on a demo account for a couple of weeks, so you can see how it trades with nothing at risk. The portal shows this tip whenever an agent is set to a live account.
## How an Agent Works [#how-an-agent-works]
An agent checks your markets each time a candle closes on its fastest chart. An agent whose fastest chart is the 15-minute looks every 15 minutes. Because brokers start 4-hour and daily candles at different times, an agent on slower charts looks every hour. Looking is free.
When a candle closes, the agent checks each of your markets for a setup: a structure break, a pullback, a momentum shift, a volatility expansion or a session open. When it finds one, the setup goes through these steps, in order:
1. **Your limits.** Are you inside your sessions? Is there room under your open trades limit and your daily loss limit? These are plain rules, checked first, and no AI can talk its way past them.
2. **A first look.** A quick check of whether the setup is worth a full discussion. Most are not, and the agent passes on them.
3. **The analysts.** They read the charts and the session and say which way they lean, and what would make them wrong.
4. **The case for and against.** One side argues for the trade and the other against it.
5. **The trader.** Makes the call: a trade with an entry zone, a stop and a target, or no trade.
6. **The risk check.** Checks the trade against your risk limits. It can make a trade smaller or stop it, never bigger.
The trader and the risk check also see your history: how this agent's own trades went over the last 90 days, by market and by kind of setup, and how your whole account has done over the last 30 days. They use it only to be more careful. A setup that keeps losing for you needs stronger confirmation, and after a run of losses the agent asks for a cleaner setup. History never makes a trade bigger, never widens a stop and never overrides your limits, and a handful of trades is not enough for it to lean on. When history changed a decision, the reason says so, and the full discussion shows what it weighed.
The result is either a trade for you, or a recorded reason for standing aside. Both appear on the Overview, and clicking **Why** on any of them opens the full discussion.
{/* TODO(screenshot): the decision transcript drawer showing the steps (Your limits, First look, Analysts, Debate, Trader, Risk check). Suggested name: ai-agent-transcript.png. */}
## Trading Modes [#trading-modes]
Each agent works in one of two modes, set under **Trading mode** in Settings. Every new agent starts on **Ask me first**.
The agent brings you each trade with its reasoning and the money at risk. Nothing is placed until you approve it, in the portal or with the buttons in a Telegram message.
The agent places trades on your account by itself, always inside your limits, and tells you after. It sends a market order with the stop and the nearest target attached.
### Approving trades [#approving-trades]
A trade that needs your answer shows on the Overview with its entry zone, stop, target and the money at risk, plus **Approve** and **Skip**. The same buttons arrive in a Telegram message if you have [connected Telegram](/telegram). The number on the **Overview** tab counts the trades waiting for you.
You have until the **Approval window** ends to answer. The agent also stops waiting if price reaches the stop before you do, because the idea is no longer valid. Your limits are checked again at the moment the order is sent.
If price has already moved past the entry zone when you approve, your approval stands. The agent sends the trade if price comes back into the zone before it expires, and not at a worse price.
### Switching to trading on its own [#switching-to-trading-on-its-own]
Switching to **Trade on its own** asks you to confirm first, because from then on the agent places real orders without checking with you. Your limits stay the same in both modes.
Trades that were already waiting for you when you switched are not placed automatically. They wait for your answer, or expire. Only trades the agent raises after the switch are placed on their own. You can switch back to **Ask me first** at any time.
## Settings [#settings]
Settings has a card for each part of how the agent trades. Change what you need, then save from the bar that appears at the bottom, which lists exactly what will change. Every save is kept in the agent's history, and **Undo** on the Settings page reverts the latest change.
{/* TODO(screenshot): the Settings tab showing the Account, Trading mode, Markets, Charts, Risk and Safeguards cards. Suggested name: ai-agent-settings.png. */}
### Account [#account]
The MT5 account an agent trades on shows under its name, with a **Demo** or **Live** badge and whether its Cloud Terminal is running. To move the agent to another account, click **Change** and pick one; only accounts with a running Cloud Terminal are listed. Before anything moves you see what happens:
* Trades waiting for your approval are cancelled.
* Trades already open on the old account stay open with their own stop and target. The agent no longer manages or counts them.
* Its risk limits count on the new account from then on, and its history and performance stay with the agent.
Moving an agent onto a live account asks you to confirm that it will trade real money. You can also ask for the move in Sgnl AI, and it shows the same confirmation first.
### Trading mode [#trading-mode]
Choose **Ask me first** or **Trade on its own**. With **Ask me first** you also set the **Approval window**: how many minutes the agent waits for your answer before letting the trade go. It starts from a sensible value for how long you hold trades, and you can set anything from 1 minute to 24 hours.
### Markets [#markets]
* **Symbols**: the markets it watches, written exactly as your broker names them. To add one, ask the agent in Sgnl AI, which knows your broker's spellings. The agent will not open a trade on a symbol your account already holds a position in.
* **Sessions**: Asia, London, New York, or **Any time**. With named sessions the agent only looks for trades while one of them is open. **Any time** puts no limit on it: the agent may trade whenever the market of its symbol is open, so a crypto market trades every day including weekends, and a forex market trades while it is open. Any time stands on its own and is not combined with the named sessions. In Sgnl AI you can say "trade any time" or "no session limit". Session hours are fixed in UTC and do not move with daylight saving.
| Session | Hours (UTC) |
| -------- | -------------- |
| Asia | 23:00 to 08:00 |
| London | 07:00 to 16:00 |
| New York | 12:00 to 21:00 |
Crypto markets do not close for the weekend, so a named session on a crypto market applies every day of the week, weekends included.
### Charts [#charts]
* **Timeframes**: pick one to five charts, from 5 minutes to weekly. The fastest chart sets how often the agent looks, and the slower ones give it the bigger picture.
* **Holding time**: Minutes, Hours, Days or Weeks. It tells the agent how far away to place stops and targets, and sets the starting charts and approval window.
### Risk [#risk]
Risk covers how big each trade is and the limits it never goes past.
**Position size** is how a trade is sized:
| Method | What it does |
| ----------------------------- | ----------------------------------------------------------------------------------------------- |
| **Percent of account risked** | Every trade risks the same share of your account, whatever the stop distance. |
| **Fixed amount risked** | Every trade risks the same amount of money, in your account currency. |
| **Fixed lots** | Every trade uses the same lot size, so the money at risk changes with the stop distance. |
| **Lots by balance** | The lot size grows and shrinks with your account balance, for example 0.01 lots for each 1,000. |
| **Lots by equity** | The same, based on your equity, open profit and loss included. |
The limits sit next to it:
* **Risk per trade** (or **Max risk per trade** when you size by money or lots): the most one trade can lose if its stop is hit, up to 10% of your account. If a trade would risk more, it is cut down to fit, and if even the smallest lot is too big, the trade is skipped.
* **Max open trades**: the most trades the agent keeps open together.
* **Daily loss limit**: once today's losses reach this share of your account, the agent stops looking for trades until the next day. Open losses count, not only closed trades, and the day starts at midnight UTC.
* **Max total risk**: all its open trades together can never risk more than this share of your account.
**Use a preset** fills in all four limits at once:
| Preset | Risk per trade | Max open trades | Daily loss limit | Max total risk |
| ------------ | -------------- | --------------- | ---------------- | -------------- |
| Conservative | 0.5% | 2 | 2% | 4% |
| Balanced | 1% | 3 | 4% | 8% |
| Aggressive | 2% | 5 | 6% | 15% |
### Safeguards [#safeguards]
Extra rules, each off until you switch it on. They are checked before the agent thinks a setup through and again before an order is sent. If a safeguard you switched on cannot get the figure it needs, the agent stands aside instead of skipping the rule.
| Safeguard | What it does |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Max trades per day** | Stops opening trades for the day once it has placed this many. |
| **Max losses in a row** | Stops for the day once this many trades in a row have closed at a loss on your account. |
| **Min reward to risk** | Skips a trade whose target pays less than this for each unit risked. |
| **Max spread** | Waits while the spread is wider than this share of the distance to the stop. |
| **Session close buffer** | No new trades in the last minutes of a session it trades. |
| **Friday cutoff** | On Fridays, no new trades in the last hours before the market closes at 21:00 UTC. It does not apply to crypto markets, which have no weekend gap. |
Agents do not watch the economic calendar yet, so they will not stand aside around news releases. Set your limits with this in mind.
## Overview [#overview]
The Overview is the agent's home.
* **Trades waiting for you** sit at the top with **Approve** and **Skip**.
* **Today** counts the setups it thought through, the trades it raised, the trades your account opened, and the approvals still pending.
* **The timeline** lists every decision. Each is marked as **Proposed a trade**, **Stood aside**, **Passed on it**, **Held back** by a limit, or **Could not finish**. Click one to open the full reasoning.
* **Status** shows whether the agent is watching, the last thing it decided on each market, and the next time it will check. When it is running but outside your sessions it says which session it is waiting for and when that opens in your own time, for example "Waiting for the London session, opens at 10:00 AM". If it cannot work, for example because your terminal is stopped, it says so here in plain words.
* **Settings** summarises the rules it trades by, with a shortcut to change them.
Use **Pause** at the end of the tab row to stop an agent and **Resume** to start it again. A paused agent stops watching, and any trade waiting for your answer is dropped. Trades already open on your account stay open.
## Performance [#performance]
The Performance tab shows how the agent is doing over the last 7 days, 30 days or all time, counting trades that have closed.
* **Results**: net result after fees and swap, return on the account, number of trades, win rate, profit factor, average win, average loss and maximum drawdown.
* **Equity curve**: what the agent has made or lost, one step for each closed trade.
* **By symbol**: the same figures split by market.
* **Skipped trades**: the trades you skipped, the ones that expired, and the ones the agent held back, each checked against the prices that followed. It shows whether the idea would have reached its target or its stop.
The skipped-trade results are a what-if, not money made or lost. They use your broker's prices with the entry taken as the middle of the entry zone, so real fills would have differed a little. Use them to judge whether your skips and limits are helping, not as a forecast.
{/* TODO(screenshot): the Performance tab with Results, Equity curve, By symbol and Skipped trades. Suggested name: ai-agent-performance.png. */}
## Alerts [#alerts]
The Alerts tab chooses how each agent reaches you. Every kind of alert can go to any of four places: **In the portal**, **Phone and browser**, **Telegram** and **Email**.
The agent found a trade and is waiting for you to approve or skip it.
A trade reached your account, or could not be placed, and why.
You ran out of AI credits, your Cloud Terminal stopped, or the daily loss limit was reached.
The Telegram switches stay off until you connect Telegram, which you can do from the same tab. For turning on push notifications and connecting Telegram, see [Alerts](/alerts) and [Telegram](/telegram).
## Trading Agents in Sgnl AI [#trading-agents-in-sgnl-ai]
Open [Sgnl AI](/ai-assistant) and switch the mode to **Trading Agents** to talk to your agents from any page in the portal. Who you are talking to depends on where you are.
**On an agent's page, you talk to that agent.** The chat is the agent itself. Ask why it took or skipped a trade and it explains its own decisions in the first person, from its own reasoning and history. Ask it to trade differently and it changes its own settings.
```
Why did you skip the last setup on GBPUSD?
Only trade London from now on.
How have you done this week?
Pause for now.
```
**Anywhere else, you talk to an agent that sees all your agents.** It can compare them, change any of them and create new ones.
```
How are my agents doing?
Make the gold agent only trade London.
Pause my EURUSD agent.
Create an agent that day trades NAS100 in the New York session.
```
Either way, it can change settings, start, pause and resume, and look up trades, decisions and results.
Changes that make an agent safer or narrower save straight away. Bigger changes never save on the chat's word alone. They appear as a card showing exactly what would change, and only your click on **Confirm** applies it. That covers:
* trading on its own,
* more risk (risk per trade, daily loss limit, total risk or open trades),
* bigger trades or a different way of sizing them,
* moving an agent to another account,
* switching off or loosening a safeguard.
An agent never approves, skips or cancels a trade for you in the chat. When a trade is waiting, it puts the trade on screen with **Approve** and **Skip** for you to press. It also cannot delete an agent. Delete an agent from its own page.
## Credits [#credits]
Agents use the same **AI credits** as the rest of TradeSgnl's AI features. Watching the charts and checking your limits cost nothing. Credits are spent when an agent thinks a setup through, and the quick first look comes before the full discussion so that most setups cost very little. Messages you send in the setup chat and in **Trading Agents** mode also use credits.
If you run out of credits, your agents stop looking for new trades until credits are available again, and you get a **Stops and pauses** alert. They start again by themselves once you add credits. Trades already waiting for your approval can still be approved, and trades already open on your account are not affected.
Each plan includes a monthly pool of credits, and you can add more any time on the Billing page of your portal.
### The credit estimate [#the-credit-estimate]
The **AI credits** card on an agent's page shows about how many credits the agent uses a day, and how long your credits last at that pace, for example "At this pace your credits last until Oct 30". When your credits would run out before your plan refills them, the line turns amber and the card offers **Buy credits**.
The estimate comes from what your agents really used over the last 14 days, counting only the days an agent was running. Once an agent has run for about five days it uses its own average. Until then the estimate is based on other agents with similar settings, so a faster chart, more markets and more session hours cost more, and a crypto market costs more than a forex market because it trades seven days a week instead of five. If there is not enough to go on yet, the card says it will estimate after a few days. Your other AI use, such as chat messages, is counted in the pace as well. An agent that is switched on but has not been running for a couple of days, for example because its terminal is stopped, is left out.
### Starting an agent [#starting-an-agent]
To start or resume an agent, your credits need to last about 3 days with that agent running, unless your plan refills them before then. When they would not, the agent is not started and the **Start** button reads **Top up to start**. Add credits and start it again. Asking the agent to start in Sgnl AI follows the same rule. An agent that is already running is never stopped by it, and an agent with no estimate yet can always be started.
### Reminders [#reminders]
You get two reminders about your credits, each once for as long as the situation lasts:
* **AI credits running low**: at the current pace your credits run out before your plan refills them. It says around which date, and how many days before the refill.
* **AI credits almost used up**: your credits run out within about 3 days and no refill comes first.
If you top up or your plan refills, and your credits fall short again later, you are told again. When your credits are already at zero you get the **Stops and pauses** alert instead.
## Important [#important]
Your agents act on your own trading account. In **Ask me first**, a trade is placed only after you approve it. In **Trade on its own**, the agent places real orders without asking you, within your limits. You are responsible for every setting you choose and every trade placed. Limits and safeguards reduce risk but cannot remove it, and orders can be delayed, rejected or filled at a different price. Trading leveraged products carries a high risk of loss.
You agree to the AI Trading Agents terms before your first use. AI Trading Agents are a software tool and not financial advice, and nothing they produce is a recommendation to buy or sell. See the full disclaimer.
## FAQ [#faq]
Yes, agents run on our servers against your Cloud Terminal, so nothing depends on your computer being on. What happens next depends on the mode. In **Ask me first**, the agent sends you the trade and waits for your answer until the Approval window ends, then lets it go. In **Trade on its own**, it places trades by itself while you are away.
Yes. An agent can trade any MT5 account on a Cloud Terminal, demo or live. We suggest a demo account for the first couple of weeks, and starting on **Ask me first** on a live account until you trust how it trades.
The agent cannot see prices, so it cannot look for trades or place them. Its status changes to **Terminal offline**, you get a **Stops and pauses** alert, and it starts watching again by itself once the terminal is back. Trades already open stay open on your account. A trade you approved while the terminal had no fresh price waits for one, and is sent only if that happens before it expires.
Yes. Save a change in Settings or ask the agent in Sgnl AI, and it uses the new rules from then on. Your limits are checked again when an order is about to be sent, so a trade that was waiting is held to your latest rules. Every change is kept in the history, and you can undo the latest one.
Open the decision from the Overview and click **Why**, or ask the agent in Sgnl AI. Common reasons are: it was outside your sessions, you were at your open trades limit or daily loss limit, one of your safeguards applied (such as the spread or a Friday cutoff), the first look judged the setup not worth discussing, or the trader or the risk check decided against it. Each reason is written out in plain words. The Performance tab shows how skipped trades would have turned out.
No. It sends market orders, with a stop and the nearest target attached. If price is not in the entry zone yet, it waits and sends the trade when price is back in the zone, before the trade expires.
Yes. Your other signals work as they always do. The agent's limits look at everything open on the account, so trades from your other sources count toward **Max open trades** and the **Daily loss limit**, and it will not open a symbol the account already holds.
Advanced includes 1 agent and Professional includes 3. If you are at your limit when you ask for a new one, you are told so.
## Next Steps [#next-steps]
Join the early-access list, or create your first agent.
Connect the MT5 account your agent will trade on.
The assistant, and its Trading Agents mode for talking to your agents.
An on-demand read of any symbol, with a trade scenario or a reason to stand aside.
# Alerts (/alerts)
## Introduction [#introduction]
TradeSgnl tells you the moment something needs your attention: an account disconnects, a signal fails, a drawdown limit pauses trading, or high-impact news is coming. Each alert can reach you in four places, and you choose which ones for each alert type.
Open Alerts
## Notification Channels [#notification-channels]
The bell at the top of the portal. Works on every plan and needs no setup.
Notifications on your phone or computer, even when the portal is closed. Turn it on once per device.
Sent to your account's email address with the full details of the alert.
Sent by **@TradeSgnl\_Alerts\_bot** once you connect Telegram.
In-app and Push are on for every alert type to start with. Email and Telegram start off, so turn them on for the alerts you want there.
In-app is included on every plan. Push, Email and Telegram need a plan that includes Alerts.
## Alert Types [#alert-types]
Each alert type has its own card on the Alerts page, so you can send connection problems to your phone and keep news alerts in the bell only.
An account lost its connection to TradeSgnl.
* EA disconnected from the server
* Network or server timeouts
* Account sign-in no longer accepted by the platform (one alert until you reconnect)
Short drops that reconnect within 30 seconds don't send an alert.
A signal couldn't be placed on an account.
* Not enough margin
* Invalid symbol or market closed
* Order rejected by the broker or exchange
The alert includes the [error code](/error-codes) and the reason.
A drawdown or profit limit paused trading.
* Daily drawdown limit reached
* Maximum drawdown limit reached
* Profit target reached
The EA's news filter is about to act or is acting.
* High-impact news coming up
* Trading paused for news
* Signals held until the news window ends
## Choosing Channels [#choosing-channels]
Every alert type card lists the four channels with a switch next to each. Flip a switch and it saves straight away. A message at the bottom of the screen confirms the change.
Turning Telegram on before it's connected opens the connection screen. Once connected, the switch turns on. [Telegram setup](/telegram).
## Push Notifications [#push-notifications]
Push sends alerts to your phone or computer's notification tray, even when the portal is closed. The Push switch on each card decides which alerts are pushed. You also need to turn push on for each device you want them on.
### Computer [#computer]
Works in Chrome, Edge, Firefox and Safari.
**Open the Alerts page.** Scroll to **Notification channels**.
**Turn on Push.** Click **Turn on** in the Push column.
**Allow notifications.** Your browser asks for permission. Click **Allow**. The Push column now reads **Active on this device**.
### Android [#android]
**Open the portal in Chrome** and sign in. Push works straight from Chrome, but if you [install the app](/install-app) first, your alerts show as TradeSgnl and open full screen.
**Open the bell** at the top of the page and tap **Turn on** next to **Get these on your phone**. You can also use **Turn on** in **Notification channels** on the Alerts page.
**Tap Allow** when your phone asks.
### iPhone and iPad [#iphone-and-ipad]
Apple only allows web notifications from sites added to the Home Screen, so you [install the app](/install-app) first. You need iOS 16.4 or later.
**Open the portal in Safari**, tap the **Share** button, then **Add to Home Screen**.
**Open TradeSgnl from the new Home Screen icon** and sign in if asked.
**Open the bell** and tap **Turn on** next to **Get these on your phone**, then tap **Allow**.
Push is set per device. Turning it on for your phone doesn't turn it on for your computer, and the other way round. To stop push on a device, open the Alerts page on it and click **Turn off** in the Push column.
Tapping a push notification opens the page it's about and marks it read in the bell.
## The Notification Bell [#the-notification-bell]
The bell at the top of every portal page collects your alerts and account updates. A number on it shows how many you haven't read.
* **All and Unread.** Switch between everything and just the ones you haven't seen.
* **Open a notification.** Click it to go to the page it's about. A failed signal opens the **Signals** page with that signal selected.
* **Read when seen.** New notifications keep their blue dot while the bell is open, so you can spot what's new. When you close it, the ones you saw are marked read.
* **Dismiss.** Hover a notification and click the **x** to remove it. On a phone the **x** is always shown.
* **Mark all as read.** The double tick at the top marks everything read, including ones you haven't scrolled to.
* **Clear all.** Click **Clear all**, then **Confirm**, to empty the bell.
* **Alert settings.** The link at the bottom opens the Alerts page.
On a phone, the bell opens as a sheet from the bottom of the screen. Notifications stay in the bell for 14 days.
While the portal is open, a new notification also pops up in the corner of the screen (across the top on a phone). Click it to open what it's about. If several arrive at once, it shows how many, and clicking it opens the bell.
## Account Notifications [#account-notifications]
Besides the four alert types, TradeSgnl lets you know about your account. These go to the bell, push and email, and aren't controlled by the switches on the Alerts page.
* **Billing.** A payment failed (also sent to Telegram when connected), or your plan ended.
* **Trials.** Your trial or Cloud Terminal trial is about to end.
* **Cloud VPS.** Your VPS is being set up, is ready, or its sign-in details changed. Sign-in details are only ever sent by email.
* **Support.** Support replied to your ticket.
* **Hosted strategies.** Your strategy went live or its status changed.
## Activity [#activity]
The **Activity** tab on the Alerts page lists every alert from the last 14 days with its time, type, channel, message and whether it was sent. Use it to check an alert went out, spot repeating problems, or share details with support.
## Troubleshooting [#troubleshooting]
You chose Block when the browser asked. Open the site settings for portal.tradesgnl.com (the icon left of the address bar), set **Notifications** to **Allow**, reload the page and click **Turn on** again.
You're on an iPhone or iPad in a Safari tab. Add TradeSgnl to your Home Screen, open it from the icon, and turn push on there. See [iPhone and iPad](#iphone-and-ipad).
* Check the **Push** switch is on for that alert type
* Check your phone or computer isn't in Do Not Disturb or Focus mode
* Check notifications are allowed for your browser (or the TradeSgnl Home Screen app) in your device's settings
* Turn push off and on again in **Notification channels**
* Check your spam or junk folder
* Check the **Email** switch is on for that alert type
* Alerts go to your account's email address, shown in **Notification channels**
* Check Telegram shows **Connected** in **Notification channels**
* Check the **Telegram** switch is on for that alert type
* See [Telegram troubleshooting](/telegram)
These need a plan that includes Alerts. In-app works on every plan.
### Frequently Asked Questions [#frequently-asked-questions]
Yes. Turn on as many channels as you like for each alert type. Many traders keep every alert in the bell and push only Connection Lost and Signal Errors to their phone.
Yes. Push is turned on per browser or phone. The switches on the alert cards apply to all your devices.
Yes. Turn off **In-app** on an alert type's card and that alert stops appearing in the bell.
The bell keeps notifications for 14 days. The Activity tab keeps alerts for 14 days.
# Market Analyst (/analyst)
## Introduction [#introduction]
The Market Analyst is an AI that reads the market for you. Open it from your portal, pick a symbol and a trading style, and it pulls live price data, computes the indicators a discretionary trader would check, and returns a structured read: where the trend sits, the key levels, what momentum and volatility are doing, and whether there is a clean setup worth taking.
The part that makes it different is restraint. The analyst only calls a trade when the structure earns it. When the chart is mid-range or the signals conflict, it says so and explains what would need to happen to form a setup. "Stand aside" is a valid answer, not a failure.
A directional bias with a conviction rating, key support and resistance, a momentum and volatility read, and a trade scenario with an entry, an invalidation level, and targets.
Once a report is open, ask follow-up questions. The assistant has the report pinned as context and can pull a fresh quote or extra timeframes on demand.
The Market Analyst lives in your portal navigation. It is available on **Advanced** and **Professional** plans.
## Generate a Report [#generate-a-report]
A report is built from two choices: which symbol, and how you trade it.
**Open the Analyst.** From your portal, go to **Analyst**. On first use you will see a short note confirming the analyst is for analysis and education only.
**Pick a trading style.** In the composer at the bottom, choose **Scalping**, **Day trading**, or **Swing**. The style sets which timeframes the analyst reads, so the same symbol gets a different read depending on how long you intend to hold.
**Pick a symbol.** Search by name or ticker. The analyst covers forex, stocks, crypto, indices, and commodities.
**Click Analyze.** The analyst fetches live data, computes the indicators, and returns the report in a few seconds. Each generated report is timestamped and saved.
## Trading Styles [#trading-styles]
Every style reads three timeframes at once, in a hierarchy a discretionary trader would recognise: a **trend** frame for the big-picture direction, a **structure** frame to define the setup, and a **trigger** frame for entry timing.
| Style | Trend | Structure | Trigger |
| --------------- | ----- | --------- | ------- |
| **Scalping** | 1H | 15M | 5M |
| **Day trading** | 4H | 1H | 15M |
| **Swing** | 1W | 1D | 4H |
Because the timeframes differ, a symbol can read bullish for a swing trader and neutral for a scalper at the same moment. That is expected, and it is why the style is part of the report rather than a global setting.
## Reading the Report [#reading-the-report]
Each report follows the same layout, so you learn where to look once.
### Bias and conviction [#bias-and-conviction]
The header shows the direction (**bullish**, **bearish**, or **neutral**) and a **conviction** rating of one to three. Conviction reflects how cleanly the structure lines up. A neutral bias with low conviction is the analyst being honest about a messy chart, not a weak attempt at a call.
### The read [#the-read]
The left column is the structural read, in plain English backed by the numbers:
Where price sits relative to its moving averages (EMA 20, 50, and 200) on the trend frame.
RSI and MACD across the frames, shown as a gauge so you can see overbought or oversold at a glance.
Average True Range per frame, which sizes how far price is swinging and informs stop distance.
### Key levels and the chart [#key-levels-and-the-chart]
Support and resistance are expressed as zones, not single prices, and drawn directly onto the candlestick chart along with the moving averages. When there is a trade scenario, its entry, stop, and targets appear as lines on the same chart, so the plan and the price action are read together.
Levels and entries are shown as small ranges (for example 1.0890 to 1.0900). Live feed prices and your broker's prices differ slightly, so a zone is more honest than a to-the-decimal number you cannot fill at.
### Trade scenario, or stand aside [#trade-scenario-or-stand-aside]
If the structure supports a trade, the right column lays out a scenario: a **direction**, an **entry zone**, an **invalidation** level where the idea is wrong, **targets**, and the rationale, with an approximate risk-to-reward to the first target.
If it does not, the analyst says **Stand aside — no clean setup** and explains what would need to happen for one to form. This is the feature working as intended. A tool that finds a trade on every chart is a tool that loses you money on the charts that had no trade.
### Risks [#risks]
Most reports close with a short list of risks specific to that read: a nearby news event, a level that has not been tested, a session about to close. They are the caveats a careful analyst would mention out loud.
## Open vs Generate [#open-vs-generate]
The analyst draws a clear line between reading a saved report and paying for a fresh one.
* **Open** retrieves a report that already exists. It is free, and it shows you exactly how old it is. If it is more than twenty minutes old it is marked **Delayed**, so you are never looking at stale analysis without knowing.
* **Generate** (the **Analyze** and **Regenerate** buttons) runs a new analysis on live data. This is the action that uses your AI credits.
To keep billing honest, clicking **Regenerate** always runs a genuine fresh analysis rather than charging you for a cached result. (A report generated in the last sixty seconds is reused to prevent an accidental double-charge from a quick second click.)
## Watchlist and Feed [#watchlist-and-feed]
The left rail is your home base.
The symbols you follow. Each row shows the latest bias per style and how long ago it was run. Click an analysed style to open its report for free, or run a style that has not been analysed yet.
A live feed of the newest analyses across the platform. Add any symbol to your watchlist with one click to start following it.
Adding and removing symbols only curates your own view. Reports themselves are never deleted, so the shared archive stays intact.
## Discuss With the Analyst [#discuss-with-the-analyst]
Open report in front of you, and the **Discuss with AI** button hands it to the assistant as context. From there you can ask anything:
```
What would flip this from neutral to bullish?
Is the 4H structure as clean as the 1H?
Where would you move the stop if price retests 1.0900?
What's the current price right now?
```
The assistant answers from the pinned report and can fetch a live quote or an extra timeframe that was not in the original snapshot. It will not contradict the report it was handed, and it frames any call the same way the report does: as a scenario with an invalidation level, never a promise.
## Credits [#credits]
Generating a report and chatting with the analyst both draw on **AI credits**, the same balance used across TradeSgnl's AI features. Each plan includes a monthly pool of credits, and you can top up at any time on the Billing page.
Only genuinely new analysis is charged. Opening a saved report is free, and so is the brief reuse window that stops an accidental double-click from charging you twice. You spend credits when the analyst actually runs.
Each fresh analysis pulls live market data from an external feed. During a spike in demand the feed can throttle, and the analyst will ask you to try again in a moment rather than return a degraded report. When that happens you are not charged.
## Important [#important]
The Market Analyst provides analysis for educational purposes. It is not financial advice and not a recommendation to buy or sell any instrument. Every scenario it describes is conditional and can be invalidated by the market. You are responsible for your own trading decisions and risk management.
## FAQ [#faq]
Forex, stocks, crypto, indices, and commodities. Search by name or ticker in the symbol picker. If a symbol has no usable data the analyst will tell you rather than guess.
Each style reads a different set of timeframes. A swing read looks at the weekly and daily; a scalp read looks at the 15-minute and 5-minute. They can legitimately disagree at the same moment. Pick the style that matches how long you intend to hold.
No. The analyst reads the market and lays out a scenario. It never sends orders. Execution stays with you and your EA. For automated execution from TradingView or Telegram, see CloudConnect and the signal tools.
By design. When the structure is mid-range or the signals conflict, the analyst returns "Stand aside" and explains what would form a setup. A real edge comes partly from skipping the charts that offer nothing.
The analyst uses an independent market data feed, which can differ from any single broker by a small amount. That is why levels and entries are shown as zones rather than exact prices.
Generating a fresh report uses AI credits from your monthly pool, as does each message when you discuss a report. Opening and re-reading saved reports is always free. If you run low, you can buy more AI credits on the Billing page.
## Next Steps [#next-steps]
Pick a symbol and a style, and generate your first report.
The browser extension that reads and controls your live TradingView chart.
Review how your own executed trades have actually performed.
# Analytics (/analytics)
## Introduction [#introduction]
Analytics reads the closed trade history from your trading account and turns it into the numbers that tell you whether a system is working: profit factor, win rate, expectancy, drawdown, and the same figures broken down per symbol, per strategy and per direction.
The data comes from the account itself, not from your signals. Manual trades, trades from other tools and TradeSgnl trades all appear side by side.
### What your plan includes [#what-your-plan-includes]
Analytics comes in two levels.
**Basic Analytics** starts at the Starter plan. It covers the four headline metric cards, the Balance & Equity chart, and the four key indicators below it.
**Detailed Analytics** starts at the Advanced plan. It adds everything else on the page: the Summary, History and Calendar tabs, the Direction, Symbol and Strategy breakdowns, and the filter bar with Export.
The number of accounts you can monitor at once also follows your plan: Starter covers 1 account, Advanced 3, and Professional 10.
## Getting Started [#getting-started]
**Connect your account.** If the account runs the TradeSgnl EA, use the latest version, available from the Download page in your dashboard.
**Check Analytics is enabled.** Open the EA settings panel and scroll to the **Miscellaneous** group at the bottom. **Enable TradeSgnl Analytics** is on by default, so in most cases there is nothing to change.
**Open the Analytics page.** Your first upload starts as soon as the account connects. On an account with a long history it can take a few minutes for everything to process.
**Pick an account.** The switcher in the top right lists every account that has uploaded analytics, with the broker, the last four digits of the account number, and whether it is Demo or Live.
Accounts that are no longer connected stay in the list and keep their history, marked **Offline**. Connected accounts are sorted to the top. Your choice is remembered between visits, and it is carried in the page URL, so a link to a specific account reopens on that account.
## Keeping the data fresh [#keeping-the-data-fresh]
Next to the account switcher you will see when the account last uploaded, for example **Updated 1 minute ago**. Past the first day this becomes a date instead.
The refresh button beside it asks the EA to send a new report and updates the page when it arrives. It only works while that account is online, since the request goes to the running terminal. For an offline account you are looking at the last report it sent before it disconnected.
Analytics does not poll in the background. The page loads what is stored when you open it, and refreshes when you ask it to.
## The headline metrics [#the-headline-metrics]
Four cards sit above the chart and four below it.
| Metric | What it tells you |
| --------------------- | -------------------------------------------------------------------------------------------------- |
| **Net Profit** | Total profit or loss after all fees and costs, with the percentage change and your current balance |
| **Profit Factor** | Gross profit divided by gross loss. Above 1 means the account is profitable overall |
| **Win Rate** | Share of trades that closed in profit, with the raw count behind it |
| **Current Drawdown** | The gap between balance and equity right now, which is your open unrealised loss |
| **Win/Loss Ratio** | Winning trades divided by losing trades. Above 1 means more winners than losers |
| **Risk/Reward Ratio** | Average win divided by average loss |
| **Maximum Drawdown** | The largest peak-to-trough decline the account has been through |
| **Expectancy** | Average profit or loss per trade. The single number that says whether the system pays |
Win rate and reward-to-risk are worth reading together rather than separately. A 47% win rate looks unremarkable on its own, but paired with a 2.24 risk/reward it produces a healthy expectancy. [Understanding profitability](#understanding-profitability-across-trading-systems) below works through why.
### Balance & Equity [#balance--equity]
The chart plots balance against equity over time. The **Hourly**, **Daily** and **Monthly** buttons change how the points are grouped: hourly for reading a single session closely, monthly for seeing the shape of a year.
Where the two lines separate, you are holding open positions. Equity above balance means those positions are in profit.
## Trading Statistics [#trading-statistics]
The Trading Statistics card holds three tabs.
### Summary [#summary]
The full breakdown of wins and losses, including the long and short split with a win rate for each, your largest single win and loss, and gross figures before fees.
### History [#history]
Every closed trade, newest first. Columns cover close time, symbol, ticket, type, comment, volume, commission, swap, fee, profit and the running account balance after that trade.
Click **Close Time** to reverse the order, and set **Rows per page** to 5, 10, 25 or 50.
### Calendar [#calendar]
A month view with the net profit or loss for each trading day and the win/loss count underneath. Days you did not trade stay empty. Use the arrows to step through months, or the double arrows to jump a year.
This is the quickest way to spot a pattern the totals bury, like one bad session paying for itself across the rest of the month.
## Performance Breakdown [#performance-breakdown]
The same statistics, cut three ways. Every column header sorts, so you can rank by profit factor, win rate or total P/L rather than reading down the list.
### Direction [#direction]
Long against short. Traders are often much better at one than the other without realising it, and this is the table that shows it.
### Symbol [#symbol]
Every instrument you have traded on the account. Useful for finding the pair that quietly funds the account, and the one quietly draining it.
### Strategy [#strategy]
Trades grouped by the `comment=` value in the signal that placed them. That parameter is already how TradeSgnl separates one strategy from another, so every strategy you run on the account gets its own row here and can be compared against the rest.
Trades that arrived without a comment, including most manual trades, are grouped as **No Strategy**.
Setting `comment=` on your signals is what makes this table worth reading. See [Multiple Strategies](/strategies) for how the parameter works and what else it controls.
## Filtering and Export [#filtering-and-export]
The bar above the metrics narrows every part of the page at once. The cards, the chart, the statistics tabs and the breakdowns all recalculate against the slice you select.
* **Date range.** Presets for the last 7, 30 or 90 days, the last 12 months, last month, this month, this year and all time, plus a calendar for a custom range.
* **Symbols.** Any combination of instruments. Each option shows how many trades it holds.
* **Strategies.** The same, by trade comment.
* **Direction.** Long, short or both.
A **Clear** button appears once a filter is applied, and applied filters are highlighted so you can tell at a glance what is narrowing the page.
**Export** takes whatever is currently on screen:
* **Excel (.xlsx)** gives you six sheets: Summary, Trades, Symbols, Strategies, Direction and Daily.
* **CSV** gives you the trades only.
Filtering and Export are part of Detailed Analytics, from the Advanced plan up.
## FAQ [#faq]
Analytics is opt-in. Set **Enable TradeSgnl Analytics** to false in the EA settings and nothing is uploaded.
Every account connected to TradeSgnl shows in Analytics. An account that runs the TradeSgnl EA needs its latest version, with **Enable TradeSgnl Analytics** on.
No. Analytics reads the account's closed trade history, so manual trades and trades from other tools are included. Use the Strategy breakdown to separate them: TradeSgnl trades carry a strategy name, most manual trades fall under **No Strategy**.
No. Reporting runs independently of trade execution and does not sit in the path of an order.
The EA uploads its trade report when it starts and whenever a refresh is requested (the refresh button next to the account switcher in the portal, or `POST /api/v1/analytics/refresh`), and it reports equity every hour. Use the refresh button for a fresh report. The account has to be online for that request to reach it.
Nothing is lost. The account stays in the switcher marked **Offline** and keeps its full history. You just cannot request a fresh report until it reconnects.
Those sections are Detailed Analytics, which starts at the Advanced plan. Basic Analytics on the Starter plan covers the headline metrics and the equity curve.
Starter covers 1 account, Advanced 3 and Professional 10.
## Understanding Profitability Across Trading Systems [#understanding-profitability-across-trading-systems]
A common misconception is that profitable trading requires both high win rates and high reward-to-risk ratios. In reality, understanding the relationship between these factors is key to building sustainable trading systems.
*Relationship between reward-to-risk ratio and breakeven win rate*
| Reward-to-Risk | Breakeven Win Rate |
| -------------- | ------------------ |
| 0.5 | 67% |
| 1 | 50% |
| 2 | 33% |
| 3 | 25% |
| 5 | 17% |
| 10 | 9% |
For example, a system with a 2:1 reward-to-risk ratio only needs a 33% win rate to break even. At a 40% win rate, the same system becomes solidly profitable over time.
To evaluate your trading system's true potential, calculate its **expectancy**, the average profit or loss you can expect per trade. This is the figure the dashboard shows in the Expectancy card.
### Expectancy Formula [#expectancy-formula]
```
Expectancy = (Win Rate × Average Win) − (Loss Rate × Average Loss)
```
Where:
* **Win Rate**: The percentage of trades you win.
* **Loss Rate**: The percentage of trades you lose, or (1 - Win Rate).
* **Average Win**: The average profit from winning trades.
* **Average Loss**: The average loss from losing trades.
### Example Calculation [#example-calculation]
If your win rate is 40% (0.4), your loss rate is 60% (0.6), your average win is $100, and your average loss is $50:
```
Expectancy = (0.4 × 100) − (0.6 × 50)
Expectancy = 40 − 30 = $10
```
With a positive expectancy of $10 per trade, this system is profitable in the long run despite having more losing trades than winning ones.
Analytics tracks these metrics across all your accounts, so you can tune entry timing, exits and position sizing against real results rather than guesswork.
# Backtesting (/backtesting)
## Introduction [#introduction]
Backtesting is a critical process for evaluating trading strategies using historical data before risking real capital. The TradeSgnl EA offers powerful backtesting capabilities that allow you to:
Test TradingView strategies with advanced trade management features including trailing stops, pyramiding, and recovery systems
Validate any CSV-based trading strategy from any source that can export to CSV format
Gain insights through comprehensive statistics and interactive charts
Fine-tune stop loss, take profit, and position sizing settings for optimal performance
Unlike simple backtesting systems that only simulate basic entries and exits, the TradeSgnl backtesting system incorporates sophisticated trade management features that can significantly improve your strategy's performance.
Backtesting requires a TradeSgnl license with backtesting privileges. Ensure your license is active before beginning.
## Preparing Your CSV File [#preparing-your-csv-file]
The TradeSgnl EA uses a CSV (Comma-Separated Values) file as input for backtesting. This file contains your trade signals, including entry and exit points. Here's how to create and format your file correctly.
**Required columns:**
* **Type** — Values should be: `ENTRY LONG`, `ENTRY SHORT`, `EXIT LONG`, or `EXIT SHORT` (case-insensitive).
* **Date/Time** — Preferred format: `DD/MM/YYYY HH:MM:SS` (e.g., `15/06/2023 10:00:00`).
The EA recognizes various column header variations like "Action" for "Type" and "DateTime" for "Date/Time".
**Optional column:**
* **Comment** — Use comments to categorize trades or differentiate between strategies.
The Comment field is extremely useful for:
* Testing multiple variations of a strategy in a single backtest.
* Separating data for different symbols or timeframes.
* Filtering results in the analytics dashboard.
**Sample CSV file format**
Create a spreadsheet with the following columns and format:
| Type | Date/Time | Comment |
| ----------- | ------------------- | --------------- |
| ENTRY LONG | 15/06/2023 10:30:00 | MACD\_Cross |
| EXIT LONG | 15/06/2023 14:45:00 | MACD\_Cross |
| ENTRY SHORT | 16/06/2023 09:15:00 | MACD\_Cross |
| EXIT SHORT | 16/06/2023 15:30:00 | MACD\_Cross |
| ENTRY LONG | 17/06/2023 11:00:00 | RSI\_Overbought |
| EXIT LONG | 17/06/2023 16:15:00 | RSI\_Overbought |
This example shows how the data would appear in spreadsheet software like Microsoft Excel or Google Sheets. We recommend using these tools to create and edit your files for simplicity, then saving them as CSV format when finished.
* The EA uses its built-in settings for volume, stop loss, and take profit values. These are not defined in the CSV file.
* The EA supports multiple date formats, but `DD/MM/YYYY HH:MM:SS` is recommended for consistency.
* Save as CSV format with comma separators.
While the EA is flexible with formats, following these recommendations ensures best results:
* Use `Type` and `Date/Time` as column headers, though variations are supported.
* For trade actions, `ENTRY LONG`, `ENTRY SHORT`, `EXIT LONG`, or `EXIT SHORT` are accepted in any case and with variations like `ENTRY_LONG` or `ENTRYLONG`.
* The EA can handle various date separators (`/`, `-`, `.`) but `DD/MM/YYYY HH:MM:SS` format is preferred.
* The `csv_exits` parameter controls whether exit signals from the CSV are used. Set to false to ignore them.
## Exporting from TradingView [#exporting-from-tradingview]
One of the most powerful features of the TradeSgnl backtesting system is the ability to take strategies developed in TradingView and enhance them with our advanced risk management features. Follow these steps to export your TradingView strategy results.
**Create a strategy in TradingView.** You have several options for creating your trading strategy:
* **Pine Script** — Develop a custom strategy using TradingView's Pine Script language.
* **Built-in TradingView Strategies** — Use TradingView's pre-built strategies and customize parameters.
* **TradeSgnl Strategy Builder** — Use our intuitive strategy builder to create strategies without coding. [Documentation](/strategy-builder).
**Run your strategy and export trade data.** After creating your strategy, test it and export the results:
* Add your strategy to the chart and adjust settings if needed.
* Click on the **Strategy Tester** tab at the bottom of your chart.
* In the Strategy Tester panel, click on the **List of Trades** tab.
* Click on the strategy name dropdown on the top left of the panel.
* Select **Export data**.
* The file will be saved to your browser's default download location (typically the Downloads folder).
You can change your default download location in your browser's settings if needed.
**Format the exported file.** The TradeSgnl EA is already optimized to work with TradingView's export format (as of May 25, 2024), so only minimal modifications are needed:
* Open the downloaded file in Excel, Google Sheets, or another spreadsheet program.
* Delete all sheets except for the **List of Trades** sheet.
* In the **List of Trades** sheet, you can delete all columns except `Type` and `Date/Time`.
* Optionally add a `Comment` column to categorize your trades. This is useful for identifying different strategies or testing variations.
* Save the file as CSV format in your MetaTrader `MQL5/Files` folder (or specify a different location in the EA settings).
**Testing multiple strategies together**
To test how multiple strategies work together:
* Export each strategy separately from TradingView.
* Format each file as described above.
* Add a `Comment` column to each file with a unique identifier for each strategy.
* Combine all strategies into a single CSV file by copying and pasting the rows.
* Make sure to maintain the column headers in the combined file.
- Use Ctrl+F to open the Find & Replace dialog for quick modifications of multiple entries at once.
- We will continually update our EA to stay compatible with TradingView's export format.
## Importing Your CSV File [#importing-your-csv-file]
The CSV file needs to be placed in a specific folder for the EA to find it. Follow these steps.
**Open Data Folder from MT5.** In MetaTrader 5, click on the **File** menu and select **Open Data Folder**.
**Navigate to Terminal Folder.** When the MQL5 folder opens, go up one directory level to the **Terminal** folder.
**Open Common/Files Folder and Place Your CSV.** Inside the Terminal folder, open the **Common** folder, then open the **Files** folder. Copy your CSV files into this folder.
You can **create a shortcut** to this folder for easy access in the future. This is especially helpful if you'll be running multiple backtests with different CSV files.
## Setting Up MT5 Strategy Tester [#setting-up-mt5-strategy-tester]
After preparing your CSV file with trading signals and placing it in the correct folder, you're ready to set up and run your backtest with the TradeSgnl EA. Follow these steps to get actionable results.
**Install and locate the TradeSgnl EA.** If you haven't already installed the TradeSgnl EA, download it from your dashboard and install it in your MetaTrader 5 terminal. For detailed installation instructions, refer to our [Setup Guide](/setup).
**Open the Strategy Tester.** In the Navigator panel on the left side of MT5, find the TradeSgnl EA under **Expert Advisors**. Right-click on it and select **Test** to open the Strategy Tester with the EA already selected.
**Configure the Strategy Tester settings.** In the Strategy Tester panel, configure the following settings:
* Choose the symbol (currency pair) you want to test.
* Set **Model** to **Every tick** for the most accurate results.
* Select a date range that covers all trades in your CSV file.
**Go to the Inputs tab and enter your License ID.** In the Strategy Tester panel, click on the **Inputs** tab. At the top, find the `license_code` parameter and enter your valid TradeSgnl license ID. This is required for backtesting to work.
A valid license with an active subscription is required for backtesting. The EA will check your license when the backtest starts and will terminate if no valid license is found.
**Configure backtesting parameters.** Scroll down to the **Backtesting Settings** section and configure the following parameters:
* **CSV File Name** — Enter the name of your CSV file without the extension (e.g., `Trades` for `Trades.csv`).
* **Exits from CSV** — Set to true if you want to use exit signals from your CSV file, or false to use EA-managed exits.
* **Timezone Offset** — Adjust the timezone offset if your CSV timestamps differ from your broker's server time.
You can also configure other EA parameters like trailing stops, take profit, stop loss, and position sizing to test how they would improve your strategy's performance. This is a great way to optimize your trading approach before going live.
**Run the backtest.** Click **Start** to begin the backtest. The EA will validate your license, load your CSV file, and execute trades according to your signals. You'll see the equity curve forming in the Strategy Tester window.
When complete, the EA will automatically upload your results to the TradeSgnl portal for detailed analysis. You'll see a confirmation message in the MT5 journal.
If the upload fails due to connectivity issues, simply run the backtest again when your connection is restored. Access your results in the [Backtests](https://portal.tradesgnl.com/backtests) section of your dashboard.
## Analyzing Results [#analyzing-results]
Once your backtest is complete, TradeSgnl provides a comprehensive analytics dashboard where you can evaluate your strategy's performance. Access your results by logging into your TradeSgnl account and navigating to the [Backtests](https://portal.tradesgnl.com/backtests) section.
The dashboard provides powerful visualization tools to help you evaluate your strategy.
**Key performance metrics:**
* Profitability metrics (net profit, profit factor).
* Risk metrics (drawdown, Sharpe ratio).
* Trade statistics (win rate, average trade).
**Visual analysis tools:**
* Interactive equity and drawdown charts.
* Trade distribution and performance by period.
* Detailed trade-by-trade breakdown.
View Backtest Analytics
For the most effective strategy optimization, focus on risk-adjusted metrics like Sharpe ratio and drawdown alongside raw profitability. A truly robust strategy balances profitability with acceptable risk levels and shows consistent performance across different market conditions.
## Best Practices and Tips [#best-practices-and-tips]
To get the most out of the TradeSgnl backtesting system, follow these best practices and tips.
**Data quality:**
* **Use high-quality historical data.** Ensure your broker provides accurate tick data for best results.
* **Check CSV file format carefully.** A single formatting error can affect the entire backtest.
* **Verify time zones.** Ensure your CSV file time stamps match your MT5 data time zone.
**Testing strategy:**
* **Test across multiple time periods.** Include bull, bear, and sideways markets.
* **Test multiple instruments.** Verify your strategy works on different currency pairs or assets.
* **Use realistic settings.** Avoid curve-fitting by using practical risk and money management settings.
**Advanced optimization tips:**
* **Risk Management Optimization.** Test different combinations of stop loss and take profit levels to find the optimal risk-reward ratio for your strategy. The EA's advanced risk management features can dramatically improve a strategy's performance.
* **Trade Size Optimization.** Experiment with different position sizing methods: fixed lot sizes vs. percentage-based risk. The latter often provides more consistent equity growth and better risk management.
* **Advanced Feature Combinations.** Try different combinations of trailing stops, pyramiding, and recovery systems. Sometimes, the interaction between these features creates synergies that significantly enhance performance.
While it's tempting to optimize every parameter until you have perfect historical results, this often leads to poor future performance. Focus on robust settings that work well across different market conditions rather than perfect settings for a specific period.
By combining TradingView's strategy building capabilities with the advanced trade management features of the TradeSgnl EA, you can create robust trading systems that would be impossible to implement in TradingView alone.
## FAQ [#faq]
Yes, you can use the "Comment" column in your CSV file to differentiate between strategies. Each trade entry can have a unique comment identifier, allowing you to filter and compare different strategies in the dashboard.
The backtesting system strives to be as realistic as possible, but there are inherent limitations. It uses historical data and assumes perfect execution of trades, which may differ from live market conditions. For the most accurate results, use "Every tick" mode in MT5's strategy tester and ensure your historical data is high quality.
There is no hard limit on the number of trades, but extremely large datasets (tens of thousands of trades) may take longer to process and upload. For optimal performance, consider breaking very large backtests into smaller, manageable chunks.
# Cloud VPS (/cloud-vps)
## Introduction [#introduction]
A Virtual Private Server (VPS) ensures your trading algorithms run 24/7 without interruption, even if your personal computer is turned off or loses internet connection. The TradeSgnl Cloud VPS comes pre-configured with MetaTrader 5 and the TradeSgnl EA, providing a turnkey solution for automated trading.
With a 99.9% uptime guarantee and optimized network connectivity, your Cloud VPS delivers the reliability and low latency required for professional algorithmic trading.
**Why use a Cloud VPS?**
Your VPS comes with MT5 and TradeSgnl EA pre-installed and configured for optimal performance.
99.9% uptime guarantee ensures you never miss a trading signal, day or night.
## VPS vs. CloudConnect [#vps-vs-cloudconnect]
If your plan **includes** a Cloud VPS, you run either that VPS or [CloudConnect](/cloudconnect), not both. You may switch between them once every 30 days.
A Cloud VPS you **buy as an add-on** has no such restriction. It runs alongside your CloudConnect terminals.
* Full MT5 desktop in your browser
* One-click deploy, ready in 30 seconds
* Access from any device through portal
* 24/7 uptime with automatic EA recovery
* Full Windows desktop via RDP
* Install any additional software you need
* Dedicated server resources
* Best for power users who need full OS control
You can switch between Cloud VPS and CloudConnect once every **30 days**. When you switch, your current product is terminated and the new one is provisioned. Make sure to back up any important data before switching.
## Cloud VPS Pricing [#cloud-vps-pricing]
No plan includes a Cloud VPS. It is a **paid add-on**, and **Starter**, **Advanced** and **Professional** get a subscriber discount on it. Current prices and the discount that applies to your plan are shown at [tradesgnl.com/forex-vps#pricing](https://www.tradesgnl.com/forex-vps#pricing) and at checkout.
**Subscribed before August 1, 2026?**
**Advanced** and **Professional** subscriptions that started before the cutoff keep a Cloud VPS **free for as long as that subscription stays active**. The free rate is locked in for the life of the subscription and does not expire on August 1.
* On both plans, the free VPS is the **Core** tier. A larger tier can be bought as an add-on.
* **Starter** has never included a free Cloud VPS, before or after the cutoff. It is a discounted add-on there.
* If your subscription lapses or is cancelled, re-subscribing means the Cloud VPS is charged at the standard add-on price shown at [tradesgnl.com/forex-vps#pricing](https://www.tradesgnl.com/forex-vps#pricing).
* Prices are not duplicated here, so [tradesgnl.com/forex-vps#pricing](https://www.tradesgnl.com/forex-vps#pricing) stays the single source of truth.
## Claim Your Cloud VPS [#claim-your-cloud-vps]
Head to the [Cloud VPS page](https://portal.tradesgnl.com/cloud-vps) in your Portal. That page is where you buy one as an add-on. If you kept a free Cloud VPS from a subscription started before August 1, 2026, you claim it there yourself.
| Cloud VPS tier | vCPU | RAM | SSD |
| -------------- | -------- | ------- | -------- |
| Core | `2 vCPU` | `4 GB` | `40 GB` |
| Performance | `4 vCPU` | `8 GB` | `80 GB` |
| High-End | `8 vCPU` | `16 GB` | `160 GB` |
The table above shows the **hardware** of each Cloud VPS tier. No plan includes one. Only subscriptions started before August 1, 2026 keep a free Core VPS, see the pricing section above. Any tier can be bought as an add-on on any plan.
After claiming your VPS from the portal, you'll receive an email with your IP address, username, and password within 24 hours.
## Connecting to Your VPS [#connecting-to-your-vps]
Your VPS is a full Windows desktop, reached over Remote Desktop Protocol (RDP). Everything you need to connect is on the Cloud VPS page: **Connection details** carries your IP address, username, hostname and port, each with a copy button, and **How to connect** walks through it alongside.
**Download RDP** gives you a pre-configured shortcut file. Open it, enter your password, and you're in. That's the one-click route, and it saves typing the IP by hand.
Your password is emailed to you when the VPS is provisioned. If you've changed it since, or never received it, use **Reset password** on the server's controls. **Console** opens a browser-based session that works even when RDP doesn't, which makes it the one to reach for if the machine stops answering.
If you'd rather set the connection up by hand:
**From Windows**
1. Press **Win+S** and search for 'Remote Desktop Connection'.
2. Input the **IP address** from Connection details.
3. When prompted, enter the **username** (usually 'Administrator') and your password.
**From macOS**
Download the **Microsoft Remote Desktop** app from the Mac App Store, then:
* Click the **+** button and select **Add PC**.
* Enter the **IP address** in the PC name field.
* Add a user account with your provided credentials, or ask every time.
## Managing Your VPS [#managing-your-vps]
You have **complete control** over your Cloud VPS directly from the Client Portal. Monitor real-time metrics and manage your server without ever needing to connect via RDP.
**Server controls**
Control your VPS state using the action buttons in your dashboard:
| Action | Effect |
| ---------------- | -------------------------------------------------- |
| `Start` | Power on a stopped VPS. |
| `Reboot` | Restart gracefully. Available while it's running. |
| `Shut down` | Power off gracefully. Start brings it back. |
| `Reset password` | Set a new Administrator password. |
| `Delete` | Permanently destroy the server (the red bin icon). |
**Real-time monitoring**
Monitor your server health at a glance with live metrics:
| Metric | Description |
| -------- | --------------------------------------------------------- |
| `Uptime` | How long the server has been running since its last boot. |
| `CPU` | Processor usage, against the core count of your tier. |
| `Memory` | RAM in use, against your tier's total. |
| `Disk` | Storage used, against your tier's total. |
The header above them names the server's tier, whether it's **Included** or an **Add-on**, its IP, its hardware, and the date you got it.
Use **Reboot** for a graceful restart if MetaTrader 5 becomes unresponsive. If the desktop itself stops answering, open the **Console** rather than shutting the server down, since it reaches the machine directly.
## FAQ [#faq]
Yes, on a Cloud VPS. It's a full Windows desktop, so you can install other EAs, indicators and programs alongside MetaTrader 5. CloudConnect terminals are set up for the TradeSgnl EA, and other EAs aren't supported on them.
A Cloud VPS that comes with your plan is deleted, with everything on it, when the plan ends or moves below the tier that includes it. Subscribing again doesn't restore it. Back up anything you want to keep before your plan ends. A Cloud VPS you bought as an add-on follows its own subscription.
# MT5 Cloud (/cloudconnect)
## Introduction [#introduction]
MT5 Cloud lets you connect your MT5 broker accounts directly from your TradeSgnl dashboard. Enter your broker credentials, and we provision a dedicated cloud terminal for each account, with MetaTrader 5 and the TradeSgnl EA pre-installed and signed in to your broker automatically.
### Why use MT5 Cloud? [#why-use-mt5-cloud]
Enter your broker credentials in the portal and your terminal is provisioned automatically. No downloads, no VNC sessions, no manual MT5 setup. Just connect and trade.
See your balance, equity, and profit for each broker account directly in your dashboard. Monitor all your accounts at a glance without opening any terminals.
Each trading account gets its own dedicated terminal. Connect multiple accounts up to your plan's connection limit, each managed independently from your dashboard.
Your terminals keep running even when you close the browser. Trades execute around the clock. Never miss a signal because your PC went to sleep.
Access your full MT5 desktop from any browser, laptop, tablet, or phone. Open your terminal to adjust positions, check charts, or troubleshoot connections.
Direct connection to broker servers with optimized network routing. Execute trades with minimal delay, the same low-latency performance as a dedicated VPS.
## Plans and Connections [#plans-and-connections]
TradeSgnl uses a license-based system. Each plan includes licenses equal to the maximum number of MT5 terminals you can have connected at the same time. A license routes signals: every account connected under a license receives the signals sent to it, and several accounts can share one. Each connected account uses one of the plan's connections, and connections are shared across all licenses. Put an account on its own license when it should receive its own signals.
| Plan | Licenses | Max Connections |
| ------------ | -------- | --------------- |
| Bridge | 1 | 1 |
| Starter | 1 | 1 |
| Advanced | 3 | 3 |
| Professional | 10 | 10 |
MT5 Cloud is included on every paid plan, Bridge upwards. If you need more accounts than your plan covers, you can buy extra connections as an add-on from Starter upwards, and each one raises your limit by one account.
### Part of TradeSgnl Cloud [#part-of-tradesgnl-cloud]
MT5 Cloud is one part of TradeSgnl Cloud: the services we run for you on our servers around the clock.
* **MT5 Cloud**: a managed terminal for each MT5 account, on every paid plan.
* **Cloud Connections**: your [cTrader](/ctrader), [TradeLocker](/tradelocker) and [crypto exchange](/crypto-exchanges) accounts, each using one Cloud Connection.
* **[Cloud VPS](/cloud-vps)**: a private server with MT5 and the TradeSgnl EA pre-installed.
* **[MCP server](/mcp-server) and [REST API](/rest-api)**: access for your AI agents and your own code, on the Advanced and Professional plans.
* **[AI Trading Agents](/ai-trading-agent)**: your own AI agents that watch your trading account and trade your rules, with 1 agent on Advanced and 3 on Professional. Rolling out through early access.
### One EA per account [#one-ea-per-account]
You only need one connection per trading account. A single EA instance handles all symbols on that account, no matter what chart it's attached to. With 3 connections you can trade 3 accounts at once, each handling unlimited symbols.
A broker account can run the EA in one place at a time. While an account runs on a cloud terminal, do not attach the EA to the same account in your own MT5. The second connection is refused.
A connection is counted when the EA connects and released the moment you disconnect a terminal or remove the EA, freeing it for use elsewhere.
## Connect Your Account [#connect-your-account]
Connecting an account takes a few steps. Click **Connect Account** on your Connections page, choose a license, enter your broker credentials, and your terminal is provisioned for you.
**Open the connect dialog.** On your Connections page, click **Connect Account**. The chip under **Licenses** shows how many of your connections are in use.
**Select a license.** Pick the license this account will run on. Licenses already running an account are marked, so you can see at a glance which ones are free. Click **Next step**.
**Choose MetaTrader 5.** Select **MetaTrader 5** and click **Next step**.
**Enter your broker account.** Fill in your **Trading Account Number**, **Trading Account Password**, and **Broker Server Name**, using the same details you sign in with in MetaTrader 5. The server field searches as you type, so start typing your broker's name and pick your server from the list.
Choose **Can't find it? Add your broker** at the bottom of the server list, type your broker or server name, and click **Search & add broker**. We look it up with MetaQuotes and add its servers to the list so you can pick yours.
**Go live.** Click **Connect** and watch it happen: we prepare your cloud terminal, sign in to your broker, attach the TradeSgnl EA, and confirm the connection. This usually finishes in under two minutes, so keep the window open until it does.
When it's done you'll see **Your account is live** with your broker, account number, and account type, plus your terminal password. Use **Open Terminal** to look inside straight away, or **Done** to go back to your Connections page.
The terminal password is not stored and cannot be retrieved later. Copy it now. If you lose it, you can set a new one with **Reset Password** on the connection card.
You can connect several accounts up to your plan's connection limit. Each one gets its own dedicated terminal. Click **Connect Account** again to add another.
### If it doesn't connect [#if-it-doesnt-connect]
The dialog tells you which stage it stopped at and why. The most common cause is a wrong account number, password, or server name, so use **Edit details** to correct them and **Try again**.
Your cloud terminal is already running at that point, so you can also open it and sign in to your broker by hand. A terminal that never gets a broker connection is removed after 1 hour.
## How Your Credentials Are Handled [#how-your-credentials-are-handled]
Since MetaTrader doesn't support a login method like "Sign in with Google," connecting an account means entering your broker login. We treat those details as something to pass through, never to keep.
Your login is encrypted in transit and used only to connect your account. We keep no copy in our database, files, or logs.
* **Encrypted in transit.** Everything you enter travels over an encrypted (HTTPS) connection. Your credentials are never sent in plain text.
* **Never stored on our servers.** We don't save your broker login to any database, file, or log. It's used to sign your terminal into your broker, and nothing more.
* **Only your terminal uses it.** Each account runs in its own isolated terminal. No staff member can view your credentials, and they're never shared with any third party. The only system that ever receives them is your own broker.
* **You stay in control.** Disconnecting or deleting a terminal removes the connection entirely, anytime from your dashboard.
## Your Connections Page [#your-connections-page]
Your Connections page lists your licenses, with the account running on each one nested underneath. The card header shows your broker name, account number, account type, live balance, equity, and profit, an **MT5 Cloud** chip, and the EA version it's running. Click the card to expand it.
### Live account info [#live-account-info]
The card header displays live trading data right next to your broker name:
* **Balance.** Your current account balance.
* **Equity.** Your balance adjusted for open positions (shown when you have active trades).
* **Profit.** Your unrealized P\&L from open positions, green for profit and red for loss.
### EA settings panel [#ea-settings-panel]
The left panel summarises the settings you use most: volume source, TP/SL source, risk mode, default values, and drawdown limits. **Edit Settings** opens the full editor, covered in [EA settings](#ea-settings) below.
### Recent signals [#recent-signals]
The right panel shows your most recent signals: time, symbol, direction, volume, and delivery status. Click **View Signals** to open the full signal history for that account.
### Status and controls [#status-and-controls]
The bottom bar of the expanded card carries two status chips and the controls for that connection:
* **Analytics.** Whether the EA is reporting trade analytics, which is what fills your [Analytics](/analytics) page.
* **Auto Update.** Whether the EA downloads new versions into the terminal by itself. See [EA version and updates](#ea-version-and-updates) for what that does and doesn't do.
* **Updated.** When the EA last reported in. On a disconnected account this reads **Last seen** instead.
| Action | Description |
| ---------------- | --------------------------------------------------------- |
| `Open Terminal` | Launch the full MT5 desktop in your browser |
| `Reset Password` | Set a new terminal access password |
| `Disconnect` | Terminate the cloud terminal and stop signals reaching it |
## EA Settings [#ea-settings]
MT5 Cloud accounts give you full control over your EA configuration directly from the portal. No need to open the terminal.
### Full settings editor [#full-settings-editor]
Click **Edit Settings** on any connection card to open the EA settings dialog. From here you can configure every EA parameter: volume type, risk management, SL/TP modes, trailing stops, breakeven, drawdown limits, and more. Use the search box at the top to jump to a setting by name.
### Pinning settings to the card [#pinning-settings-to-the-card]
Click the star next to any setting to pin it to the connection card, up to nine at a time. That's how you decide what the card's EA Settings panel shows, so the numbers you check daily are there without opening anything.
### Applying changes [#applying-changes]
When you save, we push the new settings to the running EA and it reinitializes with them. MetaTrader is not restarted and your open trades are not affected. The EA drops off the signal server for a few seconds while it reloads, then reconnects on its own, which is the whole wait.
## EA Version and Updates [#ea-version-and-updates]
The **EA version chip** in the card header shows which version your EA is running. When a newer version exists, the chip turns yellow and shows the jump (for example, **EA v0.69 → v0.70**). Click it to update. The new version is installed and re-attached with your current settings while MetaTrader keeps running, so open trades are not affected. Signals waiting out a news window are dropped, because the queue lives in the running EA, and their delivery reads `rejected` with error `6023`. The EA disconnects for a few seconds while it reloads, then your broker connection resumes automatically.
With **Auto Update: On**, the EA pulls new versions into the terminal as they're released, but it keeps running the version it started with. Restarting the terminal doesn't change that either. Use the version chip whenever it turns yellow: that's what actually moves your account onto the new version.
## Managing Your Terminals [#managing-your-terminals]
The connection card covers the day-to-day. For the terminal itself, open the MT5 Cloud page. Your terminals are listed on the left, and the one you select fills the panel on the right: its broker, account number, server and leverage, whether it's running, and a live read of your balance, equity, open P\&L, margin and free margin.
### Terminal controls [#terminal-controls]
| Action | Description |
| ---------------- | -------------------------------------------------- |
| `Open Terminal` | Launch MT5 desktop in your browser |
| `EA Settings` | Open the EA settings editor for this terminal |
| `Start` | Power on a stopped terminal |
| `Stop` | Shut down the terminal |
| `Restart` | Reboot the terminal |
| `Reset Password` | Set a new terminal access password |
| `Delete` | Permanently remove the terminal (the red bin icon) |
Most of these need the terminal to be running. On a stopped terminal only **Start** and **Delete** are available.
### Terminal logs [#terminal-logs]
Below the controls, the panel streams your terminal's own MT5 logs, so you can see what your EA and MetaTrader are doing without opening the terminal at all. There are two tabs.
**Experts** is your EA's own output: what it parsed from each signal, what it executed, and why it rejected anything. This is the first place to look when a signal didn't do what you expected.
**Journal** is MetaTrader's own log: broker sign-ins, terminal synchronisation, and the exchange behind every order, including fill prices, deal and order numbers, and how many milliseconds your broker took to accept each one.
Both tabs behave the same way:
* **Live.** New lines arrive every few seconds. The view follows the newest line unless you scroll up, which holds your place.
* **Filter.** Type in the filter box to show only lines containing that text, such as a symbol or an order number.
* **Refresh and copy.** The refresh icon re-reads the logs and the account figures. The copy icon puts every line on screen on your clipboard, which is what to send us if you open a support ticket.
* The last **300 lines** are shown, from today and yesterday, in your local time.
Logs are read from the terminal's own files, so the terminal only needs to be running. It doesn't need to be signed in to your broker, which is what makes this useful when a broker connection is the thing that's failing.
### Opening your terminal [#opening-your-terminal]
Click **Open Terminal** and your terminal opens in a new browser window. Enter your terminal password to get in.
Behind it is a full MetaTrader 5 desktop, the real thing, running in your browser. Charts, Market Watch, the Navigator, the Toolbox and your open positions all work as they do on your own machine, and the TradeSgnl EA is already attached to a chart with its dashboard showing status, license, and live performance stats.
Now that settings and logs are in the portal, opening the terminal is mainly for:
* Viewing charts and placing manual trades
* Troubleshooting a broker connection from inside MetaTrader
* Adjusting MT5 settings that aren't available through the portal
### Password management [#password-management]
Each terminal has its own access password for when you open it in the browser:
* **Initial password.** Generated when the terminal is first created. Shown only once, at the end of the connect flow. Save it immediately.
* **Reset password.** Click **Reset Password** to set a new one. Type your own (at least 6 characters) or click **Generate** for a random one, then confirm it.
* **Instant effect.** Password changes take effect immediately. No restart required.
This password only controls access to the terminal itself. It is not your broker password, and changing it does not touch your trading account.
### Disconnecting and deleting [#disconnecting-and-deleting]
Both end the cloud terminal, from different places:
* **Disconnect**, on the account's card, terminates its cloud terminal and stops signals reaching it. Open trades stay open on your broker account but are no longer managed.
* **Delete**, on the MT5 Cloud page, destroys a terminal and frees its connection so you can connect a different account.
Deleting a terminal permanently destroys the container and all its data, including your MetaTrader 5 configuration. You can connect the same account again afterward, and a new terminal will be created.
A terminal with no active broker connection is terminated automatically to free up resources after 1 hour. Reconnect with **Connect Account** to get a new one.
# EA Settings (/configuration)
Start with the basic settings and gradually explore advanced features as you become comfortable with the EA's operation. Always test new configurations on a demo account before using them in live trading.
Trading involves significant risk. Advanced features like Pyramid Trading, Recovery, and Hedging can amplify both profits and losses. It is your responsibility to understand how these features work before implementing them. Past performance is not indicative of future results.
## Understanding Management Modes [#understanding-management-modes]
Several EA features offer three control modes that determine how and when they activate. Understanding these modes helps you choose the right approach for your trading strategy.
| Mode | Description | Best For |
| -------- | ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Disabled | Feature is completely turned off and will not activate under any circumstances | When you don't want to use the feature at all |
| Enabled | Feature is always active and uses the parameters you've configured in the EA inputs | When you want consistent behavior across all trades using your EA settings |
| Signal | Feature activation and parameters are controlled by your webhook signals on a per-trade or per-strategy basis | When you want dynamic control through your webhook signals rather than fixed EA settings |
The "Signal" mode allows you to enable or disable features dynamically through your webhook signals. Choose "Enabled" for consistent behavior across all trades, or "Signal" when you want to control features on a per-trade or per-strategy basis through your own signals.
## General Settings [#general-settings]
Basic parameters for EA operation and signal handling.
| Parameter | Description | Importance |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `License ID` | Your License ID, shown on the Connections page of your portal | Required |
| `Receive Trade Signals` | Enable/disable receiving trade signals | Required |
| `Volume Source` | Source of lot size parameter (Signal Parameters or EA Inputs) | Optional |
| `TP/SL Source` | Source of take profit and stop loss parameters (Signal Parameters or EA Inputs) | Optional |
| `Pending Order Entry` | How pending order levels are calculated (Pips from Current, Absolute Price, or Percent of Price) | Conditional |
| `Distance Unit` | Unit type for SL/TP values. Choose Pips for Forex or Currency Points for Indices/CFDs where values represent direct price distance | Optional |
**Detailed Explanation**
* **License ID**: Your License ID from the Connections page of your portal. It links the EA to your account so it can receive your signals.
* **Receive Trade Signals**: Master switch to enable or disable receiving trade signals from the webhook server. When disabled, the EA will not execute any new trades but will continue to manage existing positions.
* **Volume Source**: Determines whether the EA uses lot size from incoming signals or from the EA inputs.
* **Signal Parameters**: Lot size (`risk=` parameter) comes from the signal.
* **EA Inputs**: Uses the default volume configured in EA settings.
* **TP/SL Source**: Determines whether the EA uses take profit and stop loss values from incoming signals or from the EA inputs.
* **Signal Parameters**: TP/SL values (`tp=`, `sl=` parameters) come from the signal.
* **EA Inputs**: Uses the default TP/SL configured in EA settings.
* **Pending Order Entry**: Determines how pending order entry levels are calculated.
* **Pips from Current Price**: Level calculated as offset from current price (e.g., `pending=20` means 20 pips above/below current price).
* **Absolute Price Level**: Specify exact price level for entry (e.g., `pending=1.1050` means enter at exactly 1.1050).
* **Percent of Current Price**: Distance calculated as a percentage of the current price (e.g., `pending=1` means 1% away from current price).
* **Distance Unit**: Choose the unit type for all SL/TP distance values in signals and EA inputs.
* **Pips**: Standard pip calculation for Forex pairs (accounts for 5-digit vs 4-digit brokers).
* **Currency Points (for Indices/CFDs)**: Values directly represent price distance in the instrument's currency. Perfect for US30, NAS100, DAX40, Gold, Silver, and crypto where 1 point = 1 unit of currency.
## Volume Settings [#volume-settings]
Parameters for controlling position sizing and risk-based lot calculation.
| Parameter | Description | Importance |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `Volume Type` | Method for calculating position size (see details below) | Required |
| `Partial Close Type` | How to interpret `pct=` signal parameter (Percentage or Lots) | Required |
| `SL/TP Mode` | How to interpret SL/TP values. Distance Unit Setting uses the Distance Unit (pips/points) from General Settings. Percentage interprets values as percentage of entry price. Absolute Price Level treats values as exact price levels. | Optional |
| `Volume (Risk)` | Lot size or risk value based on Volume Type | Required |
| `Take Profit` | Default take profit distance (0 = disabled) | Optional |
| `Stop Loss` | Default stop loss distance (0 = disabled) | Recommended |
| `Max Trades` | Maximum open trades across all symbols (0 = no limit) | Recommended |
| `Max Long Trades` | Maximum open long (buy) trades (0 = no limit) | Optional |
| `Max Short Trades` | Maximum open short (sell) trades (0 = no limit) | Optional |
| `Max Trades Per Symbol` | Maximum open trades per symbol (0 = no limit) | Recommended |
| `Max Total Lot Size` | Maximum total lot size (0 = no limit) | Recommended |
**Understanding Volume Types**
Standard Volume Types calculate lot size based on fixed values or account size:
* **Lots**: Uses the exact lot size you specify. Example: `risk=0.01` opens 0.01 lots for every trade.
* **Percentage of Balance (Lots)**: Calculates lot size based on a percentage of your account balance. Example: `risk=1` on a $10,000 balance opens 0.1 lots.
* **Percentage of Equity (Lots)**: Same as above but based on current equity instead of balance.
SL-Based Risk Volume Types calculate lot size based on how much you're willing to lose if your stop loss is hit. A stop loss value is required for these methods:
* **Dollar Amount (Risk)**: The `risk=` value specifies the dollar amount you're willing to lose if the SL is hit. Example: `risk=10` calculates lot size so the SL hit loses approximately $10.
* **Percentage of Balance (Loss)**: The `risk=` value specifies the percentage of your balance you're willing to lose if the SL is hit. Example: `risk=1` on a $10,000 balance calculates lot size so the SL hit loses approximately $100.
* **Percentage of Equity (Loss)**: Same as above but based on current equity instead of balance.
Dollar Amount (Risk), Percentage of Balance (Loss), and Percentage of Equity (Loss) require a stop loss value. If no SL is provided in the signal or EA settings, the trade will be rejected with error code 6013.
**Other Volume Settings**
* **Partial Close Type**: Determines how the EA interprets the `pct=` parameter in partial close signals.
* **Percentage**: The `pct` value is treated as a percentage to close (`pct=0.5` closes 50% of position volume).
* **Lots**: The `pct` value is treated as the exact number of lots to close (`pct=0.5` closes exactly 0.5 lots).
* The same setting reads the `pct1=`, `pct2=` values of take profit levels. A signal can override it: `pct_percent=` and `pct_lots=` on a close, and `pct1_percent=` and `pct1_lots=` on take profit levels (EA 0.77 or later), where the later plain `pct2=`, `pct3=` follow pct1's type. See [Signals](/signals).
* **SL/TP Mode**: Controls how stop loss and take profit values are interpreted.
* **Distance Unit Setting**: SL/TP values use the Distance Unit from General Settings (pips or currency points). Example: `sl=50` means 50 pips from entry.
* **Percentage**: SL/TP values represent a percentage of the entry price. Example: `sl=1` means stop loss at 1% below entry for buys, 1% above for sells.
* **Absolute Price Level**: SL/TP values are exact price levels. Example: `sl=1.0800` sets the stop loss at exactly 1.0800 regardless of entry price.
* **Max Trade Limits**: Control the number of positions the EA can open. Max Trades limits the total number of open positions across all symbols. Max Long Trades and Max Short Trades allow independent limits on buy and sell positions. Max Trades Per Symbol prevents overexposure on single instruments.
* **Max Total Lot Size**: This safety feature limits your total exposure across all open positions. When enabled (non-zero value), the EA rejects new trades if opening them would exceed the maximum total lot size.
For consistent risk management, consider using "Percentage of Balance (Loss)" or "Percentage of Equity (Loss)" with values like 1-2%. This ensures you risk the same percentage of your account on every trade regardless of stop loss distance.
## Risk Management [#risk-management]
Parameters for controlling account risk and protecting capital.
| Parameter | Description | Importance |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `Risk Management Mode` | How drawdown and profit limits are interpreted (Percentage of balance or fixed Currency amount) | Optional |
| `Daily Drawdown Type` | Method for calculating drawdown (Balance Based or Equity Based) | Optional |
| `Metrics Start Date` | Custom start date for performance metrics calculation in dd.mm.yyyy format (01.01.1970 = use all-time history) | Optional |
| `Daily Drawdown Limit` | Maximum daily drawdown before closing positions and pausing EA. Interpreted as % or currency based on Risk Management Mode (0 = disabled) | Recommended |
| `Max Drawdown Limit` | Maximum total drawdown before stopping the EA. Interpreted as % or currency based on Risk Management Mode (0 = disabled) | Recommended |
| `Daily Profit Target` | Daily profit target. EA pauses when reached. Interpreted as % or currency based on Risk Management Mode (0 = disabled) | Optional |
| `Monthly Profit Target` | Monthly profit target. EA stops when reached. Interpreted as % or currency based on Risk Management Mode (0 = disabled) | Optional |
| `Max Spread in pips` | Maximum spread allowed for trade execution (0 = disabled) | Recommended |
| `Trade Duration Limit` | Maximum duration for trades in minutes (0 = disabled) | Optional |
**What is Risk Management?**
Risk Management protects your account by automatically enforcing drawdown limits, profit targets, and trading constraints. Essential for prop firm challenges and capital preservation.
**Example: Prop Firm Challenge Settings**
$100,000 account | 5% daily limit | 10% max drawdown | Mode: Percentage
* Daily Drawdown Limit: **5** → Trading pauses if daily loss reaches $5,000
* Max Drawdown Limit: **10** → EA stops completely if total loss reaches $10,000
* All positions auto-close when limits are hit to prevent further losses
**Risk Management Mode**
* **Percentage**: Limits are % of balance. "5" = 5% of account.
* **Currency**: Limits are fixed amounts. "500" = $500 regardless of account size.
**Daily Drawdown Type**
* **Balance Based**: Measures loss from opening balance each day (more forgiving).
* **Equity Based**: Measures loss from highest equity point (stricter, matches most prop firm rules).
**All Settings Explained**
* **Metrics Start Date**: Custom baseline for calculations. Leave default for all-time history. Set to challenge start date for prop firms.
* **Daily Drawdown Limit**: Max daily loss before closing positions and pausing for the day. 0 = disabled.
* **Max Drawdown Limit**: Max total loss before closing all and stopping EA permanently. 0 = disabled.
* **Daily Profit Target**: Lock in gains by pausing when daily profit is reached. 0 = disabled.
* **Monthly Profit Target**: Stop trading for the month when target is reached. 0 = disabled.
* **Max Spread (pips)**: Reject signals when spread exceeds this. Protects against poor fills during news.
* **Trade Duration Limit**: Auto-close trades open longer than X minutes. Useful for scalping strategies.
Daily limits reset each new trading day and trading resumes automatically. Max drawdown does NOT reset. Once hit, EA stops permanently until you restart it.
For prop firm challenges, set daily drawdown slightly below the firm's limit (e.g., 4.5% if limit is 5%) to give yourself a safety buffer.
## Trailing Stop Management [#trailing-stop-management]
Parameters for automatic trailing stop functionality.
| Parameter | Description | Importance |
| -------------------------- | ------------------------------------------------------------------- | ----------- |
| `Trailing Stop Management` | Source of trailing stop parameters (Signal Parameters or EA Inputs) | Optional |
| `Trigger Distance (Pips)` | Price movement required to activate trailing stop | Conditional |
| `Trailing Distance (Pips)` | Distance to maintain between price and stop-loss | Conditional |
| `Step Size (Pips)` | Minimum price movement required to adjust trailing stop | Conditional |
**How Trailing Stop Works**
Trailing stops work on individual trades, automatically moving your stop-loss to lock in profits as the market moves in your favor.
**Parameter Source Options**
* **Signal Parameters**: Trailing stop values (`trtrig=`, `trdist=`, `trstep=`) come from your webhook signals. Use this for per-signal trailing stop customization.
* **EA Inputs**: Uses the Trigger Distance, Trailing Distance, and Step Size configured in this EA section for all trades. Use this for consistent trailing stop behavior.
**The Three Key Settings**
* **Trigger Distance**: How far price must move in profit before trailing begins. Your stop-loss remains static until this threshold is reached.
* **Trailing Distance**: How far behind the current price your stop-loss trails. A smaller distance = tighter protection but more prone to being stopped out by noise.
* **Step Size**: Minimum price movement required before the stop-loss is adjusted. Prevents excessive modifications from tick-by-tick movement.
**Example: BUY trade at 1.1000**
Settings: Trigger = 20 pips, Trailing Distance = 15 pips, Step Size = 5 pips
1. Price at 1.1000 → Stop-loss stays at original level (trigger not reached).
2. Price hits 1.1020 (+20 pips) → **Trailing activates!** Stop moves to 1.1005 (15 pips behind).
3. Price rises to 1.1025 (+5 pips) → Stop moves to 1.1010 (still 15 pips behind).
4. Price rises to 1.1040 → Stop moves to 1.1025.
5. Price drops to 1.1030 → **Stop stays at 1.1025** (never moves backward).
**Result**: If price reverses and hits your stop at 1.1025, you lock in +25 pips profit instead of potentially losing your entire position.
For trending markets, use a larger Trailing Distance (15-20 pips) and smaller Step Size (3-5 pips). For scalping, tighten both values. Always test on demo first.
## Pyramid Management [#pyramid-management]
Parameters for managing multiple positions in the same strategy, meaning positions that share a symbol and a `comment=` value. See [Multiple Strategies](/strategies) for how that grouping works.
| Parameter | Description | Importance |
| ---------------------------- | -------------------------------------------------------------------------------------- | ----------- |
| `Pyramid Management` | Pyramid management mode (Disabled, Enabled, or Signal) | Optional |
| `Volume Calculation` | Method for calculating profit target (Initial Volume, Total Volume, or Average Volume) | Conditional |
| `Direction Lock` | Restrict pyramid trades to the same direction | Conditional |
| `Separate Buy/Sell Pyramids` | Manage buy and sell positions separately within the same strategy | Conditional |
| `DCA Filter` | Only allow entries at better prices than the previous entry | Conditional |
| `Enable Pyramid Trailing` | Enable trailing stop for pyramid target exit | Conditional |
| `Pyramid Target (Pips)` | Profit target for the pyramid strategy | Conditional |
| `Trailing Distance (Pips)` | Distance for pyramid trailing stop | Conditional |
| `Trailing Step (Pips)` | Step size for pyramid trailing stop | Conditional |
| `Overlap Threshold` | Minimum number of trades before profit overlap feature activates | Conditional |
| `Overlap Profit %` | Percentage of profit to use for overlapping trades | Conditional |
**What is Pyramid Management?**
Pyramid Management groups multiple trades sharing a symbol and strategy name (comment) and manages them as a **single coordinated position** with a combined profit target. Instead of closing each trade individually, all trades in the group close together when the target is reached.
In **Enabled** mode every strategy pyramids and the `py` signal parameter is ignored. In **Signal** mode a strategy pyramids only if `py` was present on the signal that **opened** it. That decision is stamped on the strategy group and survives every later signal, so removing `py` from your alert does not turn pyramid management off for a strategy that is already running. Close the group, or use a different comment. Full explanation in [Multiple Strategies](/strategies).
**Example: 3 trades with 50 pip combined target**
Strategy: "EURUSD\_Long" | Pyramid Target: 50 pips | Volume Calculation: Total Volume
1. **BUY 0.1 lot** at 1.1000 (Trade #1)
2. Price drops → **BUY 0.1 lot** at 1.0950 (Trade #2) — Better entry!
3. Price drops more → **BUY 0.1 lot** at 1.0900 (Trade #3)
4. **Breakeven** = (1.1000 + 1.0950 + 1.0900) ÷ 3 = 1.0950
5. Price hits 1.1000 → **All 3 trades close together** with combined +50 pips profit!
**Result**: Trade #1 = +0 pips, Trade #2 = +50 pips, Trade #3 = +100 pips. Net: +$150 profit on 0.3 total lots.
**Key Settings Explained**
* **Direction Lock**: When enabled, new entries are restricted to the same direction as existing trades in the strategy. Prevents mixed buy/sell positions within the same pyramid. Like DCA Filter, it only acts on pyramid-managed strategies: with Pyramid Management Disabled, or on a Signal-mode strategy that was opened without `py`, the filter is skipped entirely.
* **Separate Buy/Sell Pyramids**: Manages long and short positions independently with separate profit targets and breakeven calculations.
* **DCA Filter**: Only allows new trades at BETTER prices than the previous entry in the same strategy. For buys, price must be lower. For sells, price must be higher. Like Direction Lock, it only acts on pyramid-managed strategies and is skipped entirely on strategies that do not pyramid.
* **Pyramid Trailing**: When the strategy reaches its profit target, instead of closing immediately, the target trails the market, locking in gains while allowing the profit to grow on strong trends.
* **Overlap Feature**: After reaching the Overlap Threshold (number of trades), the EA uses a percentage of unrealized profits to offset the risk of new entries. Example: with 3 trades in profit, new entry risk can be partially covered by existing floating profit.
**Volume Calculation (determines profit target sizing)**
* **Initial Volume**: Target = Pyramid Target × first trade's lot size. Fastest exit, smallest profit.
* **Total Volume**: Target = Pyramid Target × sum of all trades' lot sizes. Largest profit but requires more price movement.
* **Average Volume**: Target = Pyramid Target × average lot size across trades. Balanced approach.
Combine Pyramid Management with Pyramid Levels to automatically control entry spacing and lot sizing per level. Use DCA Filter for true averaging down, or disable it for grid-style strategies.
## Pyramid Levels [#pyramid-levels]
Parameters for controlling pyramid level structure and trade entry conditions.
| Parameter | Description | Importance |
| --------------------------- | -------------------------------------------------------- | ----------- |
| `Multiply All Level Trades` | Apply lot multiplier to all trades in a level | Conditional |
| `Lot Size Multiplier` | Multiplier for lot size in subsequent pyramid levels | Conditional |
| `Trade Limit Per Level` | Maximum trades allowed per pyramid level (0 = unlimited) | Conditional |
| `Level Size (Pips)` | Price distance between pyramid levels | Conditional |
| `Level Size Multiplier` | Multiplier for increasing level size at each level | Conditional |
| `Trade Limit Increase` | Amount to increase trade limit after specified levels | Conditional |
| `Limit Increase After` | Number of levels before increasing trade limit | Conditional |
**What are Pyramid Levels?**
Pyramid Levels divides your pyramid entries into price-based zones. Each "level" is a price range where trades can be placed. This controls **entry spacing**, **position sizing**, and **trade limits** as price moves away from your initial entry.
**Example: BUY pyramid with Level Size = 20 pips**
Initial entry at 1.1000, Level Size Multiplier = 1.5, Lot Multiplier = 2.0
* **Level 0**: 1.1000+ (initial entry zone) → 0.1 lots
* **Level 1**: 1.0980 (20 pips below) → 0.2 lots (2× multiplier)
* **Level 2**: 1.0950 (30 pips below L1, 20×1.5) → 0.4 lots
* **Level 3**: 1.0905 (45 pips below L2, 30×1.5) → 0.8 lots
**All Settings Explained**
* **Level Size (pips)**: Distance from initial entry to Level 1. Set to 0 to switch from price-based levels to **per-trade multiplication**: the Lot Size Multiplier then compounds on every new pyramid entry regardless of price (e.g. 0.05 → 0.10 → 0.20 → 0.40 at a multiplier of 2.0), instead of only when price crosses a level. In this mode each new entry is sized from the **largest trade still open** in the strategy, so when higher entries close at their take profit the next entry refills that step (e.g. back to 0.20) rather than climbing ever higher, and any entry blocked by a filter such as the DCA Filter never inflates the size of the next accepted entry. Trade Limit Per Level does not apply in this mode, since each entry is its own level.
* **Level Size Multiplier**: Each subsequent level is this × further apart. 1.0 = equal spacing, 1.5 = 50% wider each level.
* **Lot Size Multiplier**: Trade size increases by this factor per level. 2.0 = double the lots at each new level.
* **Multiply All Level Trades**: When ON, ALL trades at a level use the multiplied lot size. When OFF, only the first trade at each level is multiplied.
* **Trade Limit Per Level**: Maximum trades allowed in each level zone. 0 = unlimited.
* **Trade Limit Increase**: Add this many more allowed trades after X levels.
* **Limit Increase After**: How many levels before the trade limit increases. Example: Limit=2, Increase=1, After=3 → Levels 0-2 allow 2 trades, Levels 3-5 allow 3 trades.
Use Level Size Multiplier > 1 to give more breathing room as drawdown increases. Use Lot Multiplier > 1 to average down more aggressively at deeper levels (higher risk).
## Recovery Management [#recovery-management]
Parameters for automatic recovery trading during drawdowns.
| Parameter | Description | Importance |
| ------------------------- | ----------------------------------------------------------------------------------------------- | ----------- |
| `Recovery Management` | Recovery system mode (Disabled, Enabled, or Signal) | Optional |
| `Recovery Direction` | Apply recovery to All Trades, Long Only (buys), or Short Only (sells) | Conditional |
| `Volume Calculation` | Method for calculating recovery profit target (Initial Volume, Total Volume, or Average Volume) | Conditional |
| `Max Recovery Trades` | Maximum number of recovery trades allowed (0 = disabled) | Conditional |
| `Initial Distance (Pips)` | Price distance for first recovery trade | Conditional |
| `Distance Multiplier` | Multiplier for distance in subsequent recovery trades | Conditional |
| `Lot Multiplier` | Multiplier for lot size in subsequent recovery trades | Conditional |
| `Recovery Target (Pips)` | Profit target for recovery trades | Conditional |
**What is Recovery Management?**
Recovery Management automatically adds trades when a position moves against you, attempting to recover losses through averaging. When the combined position reaches the Recovery Target, all trades close together for a net profit.
Recovery trading is similar to Martingale. It can recover losses but also amplify them significantly. Always use Max Recovery Trades limit and test thoroughly on demo.
**Example: BUY at 1.1000 goes wrong**
Initial Distance: 20 pips | Distance Multiplier: 1.5 | Lot Multiplier: 2.0 | Recovery Target: 10 pips | Volume Calculation: Total Volume
1. **Original BUY**: 0.1 lots at 1.1000
2. Price drops 20 pips → **Recovery #1**: 0.2 lots at 1.0980
3. Price drops 30 more pips (20×1.5) → **Recovery #2**: 0.4 lots at 1.0950
4. Breakeven now at \~1.0964 (weighted average)
5. Price rises to 1.0974 (+10 pips from breakeven) → **All 3 trades close!**
**Result**: Original trade still in loss, but recovery trades generated enough profit to offset it plus hit the 10 pip target.
**All Settings Explained**
* **Recovery Direction**: Filter which trades can trigger recovery. "All Trades" applies to any position, "Long Only" only to buys, "Short Only" only to sells. Useful for directional bias strategies.
* **Initial Distance (pips)**: How far price must move against you before first recovery trade triggers.
* **Distance Multiplier**: Each subsequent recovery triggers this × further. 1.5 = 50% wider spacing each level.
* **Lot Multiplier**: Each recovery trade is this × larger. 2.0 = double lots each time (Martingale style).
* **Recovery Target (pips)**: The combined profit all trades must reach before they close together: this many pips on the lot size chosen in Volume Calculation. It is measured in your account's currency, so it works the same on cent accounts.
* **Max Recovery Trades**: Safety cap. If reached, no more recovery trades open.
* **Volume Calculation**: Which lot size the Recovery Target is measured on. "Initial Volume" uses the original trade's lots, so the trades close soonest. "Total Volume" uses all trades' lots combined, so the trades close when price is the target in pips past breakeven. "Average Volume" uses the average lot size across all trades.
When the first recovery trade opens, the original trade's take profit, partial take profits, trailing stop and breakeven are removed, so all trades close together at the Recovery Target. Its stop loss stays in place: if it is hit, all trades close together.
Recovery trades respect all max trade limits (max trades, max long/short, per symbol, total volume). If limits are reached, recovery trades are silently skipped.
Use conservative settings: Max 3-4 recovery trades, small lot multiplier (1.2-1.5), and always set a stop loss at your maximum acceptable drawdown level on the original trade.
## Hedge Management [#hedge-management]
Parameters for automatic hedging during drawdowns.
| Parameter | Description | Importance |
| -------------------------- | -------------------------------------------------------------------------------------------------- | ----------- |
| `Hedge Management` | Hedge management mode (Disabled or Enabled) | Optional |
| `Hedge Direction` | Apply hedging to All Trades, Long Only (net long strategies), or Short Only (net short strategies) | Conditional |
| `Hedge Trigger (Pips)` | Loss required to trigger hedge position | Conditional |
| `Hedge Volume` | Percentage of net position volume to use for hedge | Conditional |
| `Hedge Take Profit (Pips)` | Take profit for hedge positions | Conditional |
| `Hedge Stop Loss (Pips)` | Stop loss for hedge positions | Conditional |
**What is Hedge Management?**
Hedge Management protects your pyramid strategies by automatically opening an **opposite-direction trade** when losses exceed a threshold. If your longs keep falling, the hedge (a short) profits and reduces overall drawdown.
**Example: Hedging a losing BUY strategy**
Strategy: "EURUSD\_Long" with 0.5 total lots | Hedge Trigger: 50 pips | Volume: 50%
1. Your BUY trades are at 1.1000 and falling.
2. Worst trade hits -50 pips loss → **Hedge activates!**
3. EA opens **SELL 0.25 lots** at 1.0950 (50% of 0.5 lots).
4. If price drops to 1.0900: BUY trades lose more, but SELL hedge gains +50 pips.
5. Hedge has its own TP/SL — can close independently for profit.
**Result**: The hedge offsets further losses. If market bounces back, close the hedge at SL and let original trades recover.
**All Settings Explained**
* **Hedge Direction**: Filter which strategies can trigger hedging. "All Trades" hedges any net exposure, "Long Only" only hedges when net long (more buys than sells), "Short Only" only hedges when net short.
* **Hedge Trigger (pips)**: The loss threshold on the worst trade before a hedge opens.
* **Hedge Volume (%)**: Hedge lot size as % of your total strategy exposure. 50% = half the size of your combined longs.
* **Hedge Take Profit (pips)**: TP for the hedge trade. Closes hedge at profit while original trades may still be open.
* **Hedge Stop Loss (pips)**: SL for the hedge. Limits hedge loss if market reverses quickly in your favor.
Each strategy can only have one active hedge at a time. The hedge is a separate trade with its own TP/SL and does not affect the pyramid's profit target.
Hedge trades respect all max trade limits (max trades, max long/short, per symbol, total volume). If limits are reached, hedge trades are silently skipped.
Use hedging as insurance, not a profit strategy. Set the hedge TP smaller than the original strategy target so it locks in partial protection before the main trades fully recover.
## News Filter [#news-filter]
Parameters for avoiding trading during high-impact economic news.
| Parameter | Description | Importance |
| --------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------- |
| `Enable News Filter` | Enable/disable news filter functionality | Optional |
| `Impact Level` | Minimum news impact level to filter (1-Low, 2-Medium, 3-High) | Conditional |
| `Minutes Before News` | Minutes before news event to stop trading | Conditional |
| `Minutes After News` | Minutes after news event to resume trading | Conditional |
| `Queue Signals During News` | Queue incoming signals during news events instead of rejecting them. Signals execute after news period ends | Conditional |
**What is News Filter?**
News Filter automatically pauses trading around high-impact economic events (NFP, FOMC, CPI) to protect you from sudden, unpredictable volatility spikes.
**Example: NFP Release at 8:30 AM**
Settings: Impact Level = 3 (High) | Before = 30 min | After = 15 min
* 8:00 AM → **Trading pauses** (30 min before)
* 8:30 AM → NFP released, market spikes 50+ pips
* 8:45 AM → **Trading resumes** (15 min after)
* Any signals received during pause are rejected OR queued (if enabled)
**All Settings Explained**
* **Impact Level**: Minimum news severity to filter. 1 = filter all news, 2 = medium+high, 3 = high only (NFP, FOMC, etc.).
* **Minutes Before News**: How early to pause trading. 30 minutes is common to avoid pre-news positioning volatility.
* **Minutes After News**: How long to wait after release before resuming. 15-30 min lets the initial spike settle.
* **Queue Signals During News**: When ON, an entry that arrives during the filter window waits and is placed when the window ends. When OFF (the default), it is rejected with error `6023`.
News Filter holds back only entries: market and pending entries, and the opening half of a reversal. Closes, cancels and modifies are never blocked or queued. They run immediately, including inside the news window, and so does the closing half of a reversal. Existing positions continue to be managed (trailing stops, pyramid targets, etc.) during the filter window.
**How the queue works**
* While an entry waits, its delivery reads `received`.
* A full close (`closebuy`, `closesell`, `closeall`), a cancel or a reversal that arrives for the same symbol and side while an entry is queued drops that entry. If the close carries a `comment`, only entries with that comment are dropped. The dropped entry's delivery reads `rejected` with error `6023`, so a queued buy never opens after the close that came later. A partial close, or a close that names a `ticket=`, does not drop queued entries.
* When the window ends, a queued entry is dropped instead of placed if it is older than Minutes Before + Minutes After + 5 minutes, if the EA is paused or stopped by a drawdown or profit limit, or if its stop loss or take profit price is already on the wrong side of the market.
* The queue holds up to 100 entries. It lives in the EA's memory, so restarting MT5, removing or re-attaching the EA, or updating it from the portal during the window clears it. Each entry cleared this way is reported as dropped: its delivery reads `rejected` with error `6023`. If MT5 is force-closed or crashes, the EA cannot report them and they stay at `received`.
* Closes running during news and dropping queued entries need EA 0.78 or later. Reporting entries dropped by a restart, removal or update needs EA 0.82 or later.
For prop firm challenges, set Impact Level to 2 (Medium+High) with 30/15 minute windows. This avoids most volatility spikes while not pausing too frequently.
## Session Filter [#session-filter]
Parameters for restricting trading to specific time periods.
| Parameter | Description | Importance |
| ------------------------------------------- | ------------------------------------------------------------------------ | ----------- |
| `Enable Session Filter` | Enable/disable session filter functionality | Optional |
| `Monday Session` | Trading hours for Monday (format: HH:MM-HH:MM) | Conditional |
| `Tuesday Session` | Trading hours for Tuesday (format: HH:MM-HH:MM) | Conditional |
| `Wednesday Session` | Trading hours for Wednesday (format: HH:MM-HH:MM) | Conditional |
| `Thursday Session` | Trading hours for Thursday (format: HH:MM-HH:MM) | Conditional |
| `Friday Session` | Trading hours for Friday (format: HH:MM-HH:MM) | Conditional |
| `Saturday Session` | Trading hours for Saturday (format: HH:MM-HH:MM, 00:00-00:00 = disabled) | Conditional |
| `Sunday Session` | Trading hours for Sunday (format: HH:MM-HH:MM, 00:00-00:00 = disabled) | Conditional |
| `Close All Trades at Friday Session End` | Automatically close positions at Friday session end | Conditional |
| `Friday Closing Hour` | Hour to close positions on Friday (0-23, broker time) | Conditional |
| `Minimum Daily Profit % for Friday Closure` | Minimum daily profit percentage required for Friday closure | Conditional |
**What is Session Filter?**
Session Filter restricts trading to specific hours each day. Trade only during London/NY overlap for volatility, or avoid Asian session if your strategy struggles in ranging markets.
**Example: London + NY Sessions Only**
All times in broker server time (usually GMT+2 or GMT+3)
* Monday-Thursday: **08:00-20:00** (London open to NY close)
* Friday: **08:00-17:00** (stop early before weekend)
* Saturday-Sunday: **00:00-00:00** (disabled, markets closed)
**All Settings Explained**
* **Day Sessions**: Format is HH:MM-HH:MM (24-hour). "00:00-00:00" disables trading that day completely.
* **Close All Trades at Friday Session End**: Auto-close all positions at the specified Friday hour to avoid weekend gap risk.
* **Friday Closing Hour**: When to close (0-23 in broker time). Example: 17 = 5 PM broker time.
* **Minimum Daily Profit % for Friday Closure**: Only auto-close if your daily profit is at least this %. Prevents closing losing positions at end of week.
All session times use your broker's server timezone, NOT your local time. Check your MT5 Market Watch to see current broker time.
For best fills and tightest spreads, focus on London/NY overlap (12:00-16:00 GMT). Avoid low-liquidity hours like 20:00-00:00 GMT.
## Push Notifications [#push-notifications]
Parameters for controlling MT5 mobile push notifications.
| Parameter | Description | Importance |
| ------------------------------ | ----------------------------------------------------------------------- | ----------- |
| `Enable Push Notifications` | Enable/disable all MT5 push notifications to mobile device | Optional |
| `EA Update Notifications` | Receive notifications when EA updates are available | Conditional |
| `Trade Error Notifications` | Receive notifications when trade execution errors occur | Conditional |
| `Drawdown Limit Notifications` | Receive notifications when daily or maximum drawdown limits are reached | Conditional |
| `News Filter Notifications` | Receive notifications when news filter pauses trading | Conditional |
**How Push Notifications Work**
* **MT5 Mobile Integration**: Push notifications use MetaTrader 5's built-in mobile notification system to send alerts directly to your mobile device.
* **Setup Requirement**: To receive push notifications, you must first configure your MetaTrader 5 mobile app and link it to your trading terminal.
* **Master Control**: The "Enable Push Notifications" setting acts as a master switch.
* **Notification Types**: Each notification type can be independently enabled or disabled:
* **EA Updates**: Alerts you when a new version of the EA is available.
* **Trade Errors**: Notifies you of failed trade executions or errors.
* **Drawdown Limits**: Warns you when risk management limits are reached.
* **News Filter**: Informs you when trading is paused due to upcoming news events.
* **Different from Telegram**: MT5 push notifications are separate from Telegram notifications.
* **Real-Time Alerts**: Push notifications are sent immediately when events occur.
**Setting Up MT5 Push Notifications**
Before you can receive push notifications from the EA, you need to configure MT5 to enable push notifications.
### Open MT5 Options [#open-mt5-options]
In your MetaTrader 5 terminal, navigate to **Tools** → **Options**.
### Navigate to Notifications Tab [#navigate-to-notifications-tab]
Click on the **Notifications** tab at the top of the window.
### Enable Push Notifications [#enable-push-notifications]
Check the box labeled **"Enable Push notifications"** to activate the push notification system.
### Enter Your MetaQuotes ID [#enter-your-metaquotes-id]
In the **MetaQuotes ID** field, enter your unique MetaQuotes ID. This ID can be found in your MetaTrader 5 mobile app under **Settings → Messages**.
Open your MT5 mobile app, go to Settings, tap on Messages, and you'll see your MetaQuotes ID displayed.
Click the **Test** button to verify your setup. Once verified, click **OK** to save your settings.
Once you've completed these steps, your MT5 terminal is ready to send push notifications to your mobile device.
## Dashboard Settings [#dashboard-settings]
Parameters for controlling the on-chart dashboard panel display.
| Parameter | Description | Importance |
| --------------------------- | ------------------------------------------------------------------------------------------- | ---------- |
| `Show Dashboard Panel` | Enable/disable the on-chart dashboard panel | Optional |
| `Font Size` | Dashboard text font size in points | Optional |
| `Panel Width Multiplier` | Scales the width of the dashboard panel. 30 is the standard width | Optional |
| `Show Performance Stats` | Display performance statistics (win rate, avg win/loss, R:R ratio, expectancy) in dashboard | Optional |
| `Show Upcoming News Events` | Display upcoming high-impact news events in the dashboard panel | Optional |
| `Global Breakeven` | Display global breakeven line on chart | Optional |
| `Strategy Target Lines` | Display strategy target lines on chart | Optional |
**What is the Dashboard?**
The on-chart dashboard displays real-time account metrics, performance statistics, and strategy status directly on your MT5 chart.
**All Settings Explained**
* **Show Dashboard Panel**: Master toggle to show/hide the entire dashboard.
* **Font Size**: Text size in points (default: 10). Increase for high-resolution monitors.
* **Panel Width Multiplier**: Scales the panel's width (default: 30). A higher number makes it wider, up to double width at 60. A lower number makes it narrower, down to 24.
* **Show Performance Stats**: Display win rate, average win/loss, expectancy, and other trading metrics.
* **Show Upcoming News Events**: Display next high-impact news events with countdown timer.
* **Global Breakeven**: Draw a horizontal line showing breakeven price for all open positions combined.
* **Strategy Target Lines**: Draw horizontal lines showing pyramid profit targets for each active strategy.
The dashboard updates in real-time. Disable it during backtesting for faster performance.
## Backtesting Settings [#backtesting-settings]
Parameters for strategy testing and CSV-based signal processing.
| Parameter | Description | Importance |
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `CSV File Name` | Base name for CSV file when using CSV signals during backtesting | Conditional |
| `Exits From CSV` | Process exit signals from CSV file | Conditional |
| `Timezone offset hrs (UTC=0)` | Timezone of CSV timestamps relative to UTC. Set to 0 if CSV uses UTC time (recommended). EA automatically converts to broker server time. | Conditional |
**What are Backtesting Settings?**
These settings enable the EA to process trading signals from CSV files in the Strategy Tester. Useful for backtesting TradingView strategies or replaying historical signals.
**All Settings Explained**
* **CSV File Name**: Base name for your signal file (without .csv). File must be in MT5 Common Files folder.
* **Exits From CSV**: When ON, process exit signals from CSV. When OFF, use only EA's own exit logic (TP/SL/trailing).
* **Timezone Offset**: Your CSV timestamp timezone relative to UTC. Set to 0 if CSV uses UTC (recommended).
Place your CSV file in: File → Open Data Folder → MQL5 → Files (or Common Files folder for shared access).
For complete backtesting instructions and CSV format details, see the [Backtesting Guide](/backtesting).
## Miscellaneous [#miscellaneous]
Additional configuration options.
| Parameter | Description | Importance |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------- | ---------- |
| `Magic Number (Unique ID)` | Unique identifier for trades placed by this EA | Optional |
| `Magic Number Restriction` | Only manage trades with matching magic number | Optional |
| `Debug Logs` | Enable detailed debug messages in logs | Optional |
| `Enable TradeSgnl Analytics` | Enable collection and upload of trade statistics to TradeSgnl server | Optional |
| `Auto-Download Updates` | Automatically download new EA versions to the Experts folder | Optional |
| `Trade Retry Count` | Number of times the EA retries an entry that the broker answered with a temporary error (0 = each entry is sent once) | Optional |
| `Symbol Prefix` | Broker-specific symbol prefix (e.g., "." for some brokers). Applied to trade symbols for proper matching. | Optional |
| `Symbol Suffix` | Broker-specific symbol suffix (e.g., "m", ".pro", "\_raw"). Applied to trade symbols for proper matching. | Optional |
**Additional Settings**
General EA settings for trade identification, logging, and updates.
**All Settings Explained**
* **Magic Number**: Unique ID assigned to all trades by this EA (default: 12345). Use different numbers if running multiple EAs on the same account.
* **Magic Number Restriction**: When ON (default), EA only manages trades with matching magic number. Prevents interference with other EAs or manual trades.
* **Debug Logs**: Enable verbose logging to MT5 Experts tab. Useful for troubleshooting but generates large log files.
* **Enable TradeSgnl Analytics**: Send anonymous trade statistics to TradeSgnl servers for performance tracking in the portal.
* **Auto-Download Updates**: Automatically download new EA versions to your MQL5/Experts folder when available.
* **Trade Retry Count**: How many times the EA retries an entry when the broker answers with a temporary error (default: 3). It counts retries, so 3 means one first try and up to three more, and 0 means each entry is sent once. Only temporary errors are retried: requote, request rejected, price changed, no quotes, request locked, timeout and no connection. Anything else, such as market closed, not enough money or invalid stops, fails straight away. After a timeout or a lost connection the EA first checks your account for the order for up to 5 seconds and only retries if it is not there, so a slow confirmation does not open a second trade (EA 0.82 or later).
* **Symbol Prefix**: Broker-specific prefix added to symbols (e.g., "." for some brokers). Leave empty if your broker uses standard symbol names.
* **Symbol Suffix**: Broker-specific suffix added to symbols (e.g., "m", ".pro", "\_raw"). Required for brokers that append codes to symbol names. Symbols containing non-English characters, such as the `(£)` some brokers use, are supported from EA 0.70 onward.
Running multiple strategies? Use different Magic Numbers (e.g., 11111, 22222) so each EA only manages its own trades.
# Crypto Exchanges (/crypto-exchanges)
It's spot trading: TradeSgnl buys coins with your balance and sells them back. There's no separate crypto syntax, so the alerts you already send work here too.
An alert sent to your license trades every account on it, exchanges included.
Your API key is stored encrypted and never shown again after you save it.
Each has a testnet with fake funds for practice (OKX calls it Demo trading).
## Connect an Exchange [#connect-an-exchange]
**Select a license.** On your dashboard, click **Connect Account**, pick the license this exchange will trade from, and click **Next step**.
Every account on a license gets the same signals. To keep an exchange apart, give it its own license.
**Choose your exchange.** Select **Crypto Exchange**, pick your exchange, and click **Next step**.
**Create an API key on the exchange.** Allow spot trading only, never withdrawals, and restrict the key to TradeSgnl's IP address, **209.71.64.114**.
* **Bybit:** the key must belong to a Unified Trading account.
* **OKX:** the key only trades the coins on its **Crypto** list, so add every coin you trade. Keep its passphrase for the next step.
A key that can withdraw, or can't trade, is refused. A key that can also trade futures or margin is accepted, but TradeSgnl only ever trades spot with it.
**Enter the key.** Paste the key and secret (and the passphrase on OKX), switch on **Testnet** if it's a testnet key, and click **Connect**. The key is checked with the exchange before it's saved.
**Send a signal.** Start your TradingView alert with your license code and use the regular [signal syntax](/signals). This buys 100 USDT of BTC with a 2% stop loss and two take profits:
```
LicenseID,BTCUSDT,buy,vol_dollar=100,sl_percent=2,tp1_percent=2,tp2_percent=4
```
Channels you copy with the [Telegram Copier](/telegram-copier) trade here too.
Connect a testnet key first, send a few signals, and check the results on the **Signals** page before you connect a funded account.
## Signals on a Crypto Exchange [#signals-on-a-crypto-exchange]
A spot account can buy a coin and sell it back. It can't short or use leverage, so:
| Signal | On the exchange |
| ------------------------------------------- | ------------------------------------------------------------------------- |
| `buy`, `long` | Buys at market |
| `buylimit` | Places a limit buy at `entry_price=`, or `entry_percent=` below the price |
| `sell`, `closebuy`, `closeall` | Sells the coins TradeSgnl bought for that symbol. No short is opened |
| `cancellong`, `cancelall` | Cancels TradeSgnl's limit buys still waiting on that symbol |
| `short`, `selllimit`, `buystop`, `sellstop` | Refused, with the reason on the **Signals** page |
A few things to know:
* **Only TradeSgnl's coins are sold.** Coins you already held, and orders you placed yourself, are never touched. To keep two [strategies](/strategies) apart, give each its own `comment=`.
* **A `sell` closes your buy.** So a Telegram channel's short signals close the buys copied from that channel.
* **Close part of a position** with `pct=0.5` (half), or a coin amount with `pct_lots=0.01`. Without one, a close sells everything.
### Trade Size [#trade-size]
| Field | Means |
| ---------------------- | ------------------------------------------------------ |
| `vol_lots=` or `risk=` | An amount of the coin, for example `0.01` BTC |
| `vol_dollar=` | An amount of the quote currency, for example `25` USDT |
| `vol_pctbal=` | A share of your free quote balance. `10` is 10% |
Sizes are rounded to the exchange's precision. An order below the exchange's minimum, or bigger than your balance can pay for, is refused.
### Stop Loss and Take Profit [#stop-loss-and-take-profit]
* **The stop loss rests on the exchange** as a stop order as soon as the buy fills, so it protects you even if TradeSgnl can't be reached. If the exchange refuses it, TradeSgnl watches the price and sells at market instead.
* **Take profits are watched by TradeSgnl.** When one is reached, its share is sold at market and the stop loss is placed again for the rest. An exchange can't rest a stop and a take profit on the same coins.
Use percent or price levels: `sl_percent=`, `tp_percent=`, `sl_price=`, `tp_price=`, and `tp1_percent=`, `tp2_percent=` with `pct1=`, `pct2=` for several take profits. Plain `sl=` and `tp=` are pips, which mean nothing on an exchange.
### Symbols [#symbols]
TradingView names are matched to the exchange's spot pairs: `BTCUSDT` trades BTC/USDT. If a USD, USDT or USDC pair isn't listed, the same coin trades against another of them, so `BTCUSD` trades BTC/USDT on Binance and the **Signals** page says so. Futures and perpetual markets are never used.
To send a symbol to a specific pair, add a [symbol mapping](/symbol-mapping) on your license. It always wins.
## Cloud Connections [#cloud-connections]
Crypto exchanges are included in Starter and every higher plan. The Bridge plan connects MT5 accounts. Each connected exchange uses one of your plan's Cloud Connections while it's switched on. A paused exchange doesn't use one.
## Managing Your Exchanges [#managing-your-exchanges]
Each exchange has its own card under its license, with its balance, open profit and a **Testnet** chip on testnet keys. Expand a card to see its open positions with their stop loss and take profits, its recent signals, and its controls.
| Action | What it does |
| ---------- | ------------------------------------------------------------------------------------------------------------------------ |
| `Close` | Sells one position at market and cancels its stop loss. |
| `Pause` | Stops new signals and frees the Cloud Connection. Stop losses stay on the exchange, but take profits stop being watched. |
| `Resume` | Turns trading back on, if a Cloud Connection is free. |
| `Settings` | Rename the exchange or move it to another license. |
| `Remove` | Disconnects the exchange and deletes its key and analytics history. Nothing is cancelled on the exchange. |
## Seeing Your Results [#seeing-your-results]
An exchange's latest signals show on its card. **View Signals** opens the full **Signals** page, with the amount filled and whether it worked. If an order couldn't be placed, you'll see an [error code](/error-codes#crypto-exchange-error-codes) and the reason. You're also notified in the app, by push, email or Telegram, depending on your [Alerts](/alerts) settings.
In **Analytics**, each exchange appears as its own account with its trade history.
## FAQ [#faq]
The key was deleted, expired, or lost a permission it needs. Nothing trades until you remove the exchange and connect it again with a new key. Stop orders already on the exchange stay in place.
An exchange account can only be connected to TradeSgnl once. Remove it where it's connected first.
It stays on the exchange. If it fills while the exchange is paused, it has no stop loss or take profits until you resume.
TradeSgnl tries three times, then alerts you and keeps the stop loss in place. A take profit smaller than the exchange's minimum order is skipped and noted on the position.
Your exchanges are paused. Stop losses resting on the exchange stay, but TradeSgnl stops watching take profits. Once you subscribe again, resume each exchange from its card.
# cTrader (/ctrader)
Once your accounts are connected, they trade without anything running on your computer.
Connect as many demo and live accounts as you like. One alert trades them all.
You sign in on cTrader's own page, so TradeSgnl never sees your password.
Stop loss, several take profits, trailing stop and breakeven, set and moved for you.
## Connect an Account [#connect-an-account]
**Select a license.** On your dashboard, click **Connect Account**, pick the license these accounts will trade from, and click **Next step**.
**Sign in with cTrader.** Choose **cTrader** and click **Sign in with cTrader**.
A cTrader window opens. Sign in with your cTrader ID, tick the accounts TradeSgnl may trade, and click **Allow access**. Accounts from every broker under that cTrader ID are listed together.
**Pick your accounts.** Back in the portal, tick the accounts you want to trade and click **Connect**. Each one appears on your dashboard as its own card within a few seconds.
**Send a signal.** Point your TradingView alert at TradeSgnl and start the message with your license code, as on any other account. See [Signals](/signals) for the full syntax.
```
LicenseID,EURUSD,buy,vol_lots=0.1,sl=30,tp=60
```
Channels you copy with the [Telegram Copier](/telegram-copier) trade here too.
Connect a demo account first, send a few alerts, and check the results on the **Signals** page before you trade a funded account.
## Signals on cTrader [#signals-on-ctrader]
Your alerts work as they are. Market and pending orders, closes, partial closes, stop loss and take profit changes, several take profits, trailing stop and breakeven all use the same [signal syntax](/signals).
A few things to know:
* **Only TradeSgnl's trades are touched.** Closes and changes never affect trades you opened yourself in cTrader. To keep two [strategies](/strategies) apart on one account, give each its own `comment=`.
* **Your stop loss and final take profit are saved in cTrader.** They protect the trade even if TradeSgnl can't be reached. Earlier take profits, the trailing stop and breakeven are run by TradeSgnl and carry on once it's back.
* **Sizes round down** to the nearest size your broker allows. If that's below the broker's minimum, the order isn't placed.
* **Pending orders need a price.** Use `entry_price=`.
### Not Available on cTrader [#not-available-on-ctrader]
A signal that uses one of these isn't placed, and the **Signals** page says why.
* Pending orders set as a distance (`entry_pips=`, `entry_points=`, `entry_percent=`, `pending=`)
* [Pyramiding](/pyramid-trading) and the [recovery system](/recovery-system)
* Sizing from equity or from a loss amount (`vol_pcteq=`, `vol_pctbal_loss=`, `vol_pcteq_loss=`)
* Session and news filters, trade limits, drawdown limits and [hedge protection](/hedge-protection)
## Cloud Connections [#cloud-connections]
cTrader is included in Starter and every higher plan. The Bridge plan connects MT5 accounts. Each connected account uses one of your plan's Cloud Connections while it's switched on. A paused account doesn't use one.
When all your Cloud Connections are in use, the portal offers to add another. Each cTrader account also counts toward your plan's total number of connections, together with your MT5 accounts.
## Managing Your Accounts [#managing-your-accounts]
Each cTrader account has its own card under its license, showing its balance, equity and open profit, with a **Demo** chip on demo accounts. Expand a card to see its recent signals and its controls.
| Action | What it does |
| ----------- | -------------------------------------------------------------------------------------------------- |
| `Pause` | Stops new signals and frees the Cloud Connection. Stop loss and final take profit stay in cTrader. |
| `Resume` | Turns trading back on, if a Cloud Connection is free. |
| `Settings` | Rename the account, move it to another license, or set its **Symbol mapping**. |
| `Remove` | Disconnects the account and deletes its analytics history. Open trades stay open in cTrader. |
| `Reconnect` | Shown when cTrader stops accepting the account's sign-in. Sign in again to resume trading. |
### Symbol Mapping [#symbol-mapping]
You don't need your broker's exact symbol names. `EURUSD`, `eurusd` and `EUR/USD` all work, and a plain `XAUUSD` finds your broker's `XAUUSD.pro`. Leave out any exchange prefix: `EURUSD`, not `OANDA:EURUSD`.
If a name still doesn't match, open **Settings** on the account's card and switch on **Symbol mapping**. Map the alert's name to your broker's, or add a prefix or suffix for every symbol. When nothing matches, the **Signals** page suggests the closest names your broker offers.
Symbol mapping is included on the Advanced and Professional plans. If your plan drops below Advanced, it switches off and your mappings are kept for when you upgrade.
## Seeing Your Results [#seeing-your-results]
An account's latest signals show on its card. **View Signals** opens the full **Signals** page, with the account each signal traded, the size filled and whether it worked. If an order couldn't be placed, you'll see an [error code](/error-codes#ctrader-error-codes) and the reason. You're also notified in the app, by push, email or Telegram, depending on your [Alerts](/alerts) settings.
In **Analytics**, each cTrader account appears on its own with its balance, equity and trade history.
## FAQ [#faq]
cTrader has stopped letting TradeSgnl trade the account, usually because access was removed in your cTrader ID settings. Nothing trades until you click **Reconnect** and sign in again. The account keeps its card and history.
The account list says so, and you can tick it to move it to this license. A cTrader account can only be connected to one TradeSgnl login.
Your broker turned the level down, usually because it was too close to the price. The trade still opens, you get an alert, and the **Signals** page says which level is missing so you can add it in cTrader.
On most forex pairs a pip is `0.0001`, or `0.01` on yen pairs. On gold and other symbols quoted with two decimals it's `0.01`, so `sl=100` on gold is 1.00. On symbols with no decimals, use `sl_price=` or `sl_percent=` instead.
Your cTrader accounts are paused. Open trades keep their stop loss and final take profit in cTrader, but TradeSgnl stops managing the rest. Once you subscribe again, resume each account from its card.
If a payment fails, your accounts keep trading for 24 hours while it's retried. Connecting, resuming or reconnecting an account waits until the payment goes through.
# Error Codes (/error-codes)
## Introduction [#introduction]
When the Expert Advisor processes a signal, errors can occur due to market conditions, account restrictions, or signal-format issues. Each error returns a numeric code so you can identify the cause quickly.
* **MT5 Error Codes** (10000+) come directly from the MetaTrader 5 platform.
* **EA Error Codes** (6000+) are raised by the TradeSgnl EA itself.
* **Signal Error Codes** (7000+) are raised during signal validation, before the request reaches your terminal.
* **Crypto Exchange Error Codes** (7500+) are raised when a signal is executed on a connected [crypto exchange](/crypto-exchanges).
* **cTrader Error Codes** (7600+) are raised when a signal is executed on a connected [cTrader account](/ctrader).
* **TradeLocker Error Codes** (7700+) are raised when a signal is executed on a connected [TradeLocker account](/tradelocker).
Error codes appear in **Signal History** in your dashboard, next to any signal that didn't execute. The code tells you why.
## MT5 Error Codes [#mt5-error-codes]
Returned directly by MetaTrader 5 when a trade request can't be completed. These are consistent across brokers, though the conditions that trigger them depend on your broker's rules.
| Code | Error | Description |
| ------- | --------------------------- | ------------------------------------------------------------------------------------ |
| `10004` | Requote | Price changed during order execution. Try again at the new price. |
| `10006` | Request Rejected | Trade request was rejected by the server. |
| `10007` | Request Canceled | Trade request was canceled by the trader. |
| `10008` | Order Placed | Order has been successfully placed. |
| `10009` | Request Completed | Trade request has been completed successfully. |
| `10010` | Partial Completion | Only part of the requested volume was executed. |
| `10011` | Processing Error | Error occurred while processing the trade request. |
| `10012` | Timeout | Trade request was canceled due to timeout. |
| `10013` | Invalid Request | Trade request contains invalid parameters or is improperly formatted. |
| `10014` | Invalid Volume | The volume specified in the trade request is invalid or outside allowed limits. |
| `10015` | Invalid Price | The price specified in the trade request is invalid. |
| `10016` | Invalid Stops | Stop levels (take profit or stop loss) in the request are invalid. |
| `10017` | Trading Disabled | Trading is disabled for this account or symbol. |
| `10018` | Market Closed | The market is currently closed for the requested symbol. |
| `10019` | Insufficient Funds | Not enough money in the account to complete the trade request. |
| `10020` | Price Changed | The price changed during order execution. Retry with the new price. |
| `10021` | No Quotes | There are no quotes available to process the request. |
| `10022` | Invalid Expiration | The order expiration date in the request is invalid. |
| `10023` | Order State Changed | The state of the order has changed since the request was made. |
| `10024` | Too Many Requests | Too many trade requests have been sent in a short period. Please wait and try again. |
| `10025` | No Changes | The request contained no changes to the existing order. |
| `10026` | Server Disabled AutoTrading | Automated trading has been disabled by the server. |
| `10027` | Client Disabled AutoTrading | Automated trading has been disabled by the client terminal. |
| `10028` | Request Locked | The request is currently locked for processing. |
| `10029` | Order/Position Frozen | The order or position is currently frozen and cannot be modified. |
| `10030` | Invalid Fill Type | The order filling type specified is invalid. |
| `10031` | No Connection | No connection to the trade server. Check your internet connection. |
| `10032` | Only Real Accounts | This operation is only allowed for live trading accounts. |
| `10033` | Pending Orders Limit | The number of pending orders has reached the maximum allowed limit. |
| `10034` | Volume Limit | The volume of orders and positions for this symbol has reached the limit. |
| `10035` | Invalid Order Type | The order type specified is incorrect or prohibited. |
| `10036` | Position Already Closed | The position with the specified identifier has already been closed. |
| `10038` | Invalid Close Volume | The close volume exceeds the current position volume. |
| `10039` | Close Order Exists | A close order already exists for this position. Check existing orders. |
| `10040` | Position Limit Reached | The account has reached the maximum number of open positions allowed. |
| `10041` | Activation Rejected | The pending order activation request was rejected and the order was canceled. |
| `10042` | Long Only | Only long positions are allowed for this symbol. |
| `10043` | Short Only | Only short positions are allowed for this symbol. |
| `10044` | Close Only | Only position closing is allowed for this symbol. |
| `10045` | FIFO Close Violation | Position closing is only allowed according to FIFO (First In, First Out) rule. |
| `10046` | Hedge Prohibited | Opposite positions on the same symbol are disabled for this account. |
## EA Error Codes [#ea-error-codes]
Raised by the TradeSgnl Expert Advisor when a signal violates its configuration (risk limits, spread filters, symbol availability, etc.).
| Code | Error | Description |
| ------ | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `6001` | Outside Trading Session | The trade was rejected because it was placed outside of allowed trading hours. |
| `6002` | Spread Too High | The trade was rejected because the current spread exceeds maximum allowed value. |
| `6003` | Pyramid Limit Reached | The strategy group already holds the maximum number of trades allowed at its current pyramid level (Trade Limit Per Level). Only applies when both Level Size and Trade Limit Per Level are set. Scoped to the group, meaning trades sharing this signal's symbol and [comment](/strategies). |
| `6004` | Maximum Volume Exceeded | The trade was rejected because it would exceed the maximum allowed volume. |
| `6005` | Pending Order Level Missing | The pending order could not be placed because the order level was not specified. |
| `6006` | Direction Lock Violation | The trade was rejected because Direction Lock is enabled and prevents opening positions in the opposite direction. The strategy is currently locked to one side of the market. Only fires on pyramid-managed strategies, and is scoped to trades sharing this signal's symbol and [comment](/strategies). |
| `6007` | Invalid Symbol | The symbol does not exist or cannot be traded on this broker. If a close match exists, the rejection suggests it, with a shortcut to add it as a [symbol mapping](/symbol-mapping#symbol-suggestions-and-auto-match) or enable auto-match. |
| `6008` | DCA Filter Violation | The trade was rejected by DCA Filter. Buys must be below the last entry price, and sells must be above the last entry price to allow averaging down. Only fires on pyramid-managed strategies, and compares against the last entry sharing this signal's symbol and [comment](/strategies). |
| `6009` | EA Stopped by Max Drawdown | The trade was rejected because the EA has been stopped after reaching the maximum drawdown limit. Manual resume required. |
| `6010` | EA Paused by Daily Drawdown | The trade was rejected because the EA is paused after reaching the daily drawdown limit. Will auto-resume at start of new trading day. |
| `6011` | Maximum Trades Limit Reached | The trade was rejected because opening it would exceed the maximum total number of allowed open trades. |
| `6012` | Maximum Trades Per Symbol Limit Reached | The trade was rejected because opening it would exceed the maximum number of allowed trades for this symbol. |
| `6013` | SL Required for Volume Type | The trade was rejected because the selected volume type requires a stop loss value for lot size calculation. |
| `6014` | EA Paused by Daily Profit Target | The trade was rejected because the EA is paused after reaching the daily profit target. Will auto-resume at start of new trading day. |
| `6015` | EA Paused by Monthly Profit Target | The trade was rejected because the EA is paused after reaching the monthly profit target. Will auto-resume at start of new trading month. |
| `6016` | Maximum Long Trades Limit Reached | The trade was rejected because opening it would exceed the maximum allowed number of long (buy) trades. |
| `6017` | Maximum Short Trades Limit Reached | The trade was rejected because opening it would exceed the maximum allowed number of short (sell) trades. |
| `6018` | Broker Disconnected | The terminal was disconnected from the broker when the signal arrived, so the symbol could not be verified. This is usually transient. The next signal should succeed once the connection is restored. |
| `6019` | Nothing to Modify | The [modify command](/signals#modify-orders) found no open position or pending order to change on this symbol and side. When the signal carries a comment, only trades with that comment count. |
| `6020` | Invalid Modify Request | The [modify command](/signals#modify-orders) named nothing it can change. Send a stop loss or take profit, or an entry for pending orders. `sl=entry`, `sl=none` and `tp=none` only apply to open positions, and an entry only to pending orders. |
| `6021` | Copy Below Minimum Lot | The copy was smaller than the broker's minimum lot, so it was not opened. Raise the Trade Copier's sizing to copy trades this small. |
| `6022` | Signal Could Not Be Read | The signal is missing its symbol or action, or names an action the EA does not know, so nothing was done. Check the alert message against the [signal syntax](/signals). |
| `6023` | Blocked by the News Filter | The signal arrived during a news window set in the EA and was not traded. Turn on Queue Signals During News to trade it once the window ends, or widen the filter settings. It is also reported when a queued entry was dropped before it was placed, for example because a close for the same symbol and side arrived while it waited, or because MT5 was restarted or the EA was removed or updated before the window ended. Only new entries are held back: closes, cancels and modifies are never blocked. |
| `6024` | Partial Close Below Minimum Lot | The part of the position this signal asked to close is smaller than the broker's minimum lot, so nothing was closed. Close a larger share, or close the whole position. |
| `6025` | Signal Value Could Not Be Used | A value in the signal could not be used, so nothing was done. Usually a stop loss, take profit, entry, size or close percentage that is empty, text or out of range, or a `ticket=` that is not a number, or a symbol with no price yet. Check the alert message against the [signal syntax](/signals). |
| `6026` | Risk Below Minimum Lot | With this stop loss, the risk you set works out smaller than the broker's minimum lot, so the trade was not opened. Raise the risk, move the stop closer, or use a fixed lot size. |
| `6027` | No Lot Size | The EA takes the lot size from the signal, and this signal has none, so nothing was opened. Add a lot size or risk to the alert, or set Volume Source to EA Inputs. |
| `6028` | Stop Loss on the Wrong Side | The stop loss price is on the wrong side of the entry, so the trade was not opened. A buy needs its stop loss below the entry price and a sell needs it above. Check the stop loss price in the alert, or send it as a distance (`sl_pips`). |
| `6029` | Take Profit on the Wrong Side | A take profit price is on the wrong side of the entry, so the trade was not opened. A buy needs its take profit above the entry price and a sell needs it below. Check the take profit prices in the alert, or send them as distances (`tp_pips`). |
EA error codes usually point at safety filters or trading rules you've configured. Most can be relaxed or disabled in the EA settings if they're blocking signals you want executed.
## Signal Error Codes [#signal-error-codes]
Raised during signal validation on the TradeSgnl servers, before the signal reaches your terminal. These usually indicate a problem with the signal payload itself.
| Code | Error | Description |
| ------ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `7001` | Invalid license code | License code is invalid, expired, or not found. Check your license details. |
| `7002` | Invalid action/command | Signal command (e.g., BUY, SELL) is not recognized or improperly formatted. Verify command syntax. |
| `7003` | Missing trade volume/risk | Signal must include trade volume or risk percentage. This information was not found. |
| `7004` | Invalid symbol format | Trading symbol is improperly formatted, contains invalid characters, or is not recognized. Check symbol against broker's naming convention. |
| `7005` | Invalid numeric value for TP | Take Profit (TP) must be a valid positive number. Check formatting and ensure it is a logical price. |
| `7006` | Invalid numeric value for SL | Stop Loss (SL) must be a valid positive number. Check formatting and ensure it is a logical price. |
| `7007` | Invalid numeric value for volume/risk | Trade volume or risk percentage is not a valid positive number or is outside broker limits. Check value and formatting. |
| `7008` | Missing required symbol | Signal is missing trading symbol (e.g., EURUSD). Specify the financial instrument. |
| `7009` | Missing required action | Signal is missing action/command (e.g., BUY, SELL). Specify the trading operation. |
| `7010` | Invalid secret key authentication | Secret key or API token is incorrect, expired, or unrecognized. Verify authentication credentials. |
| `7011` | Signal parsing failed | Error interpreting signal data due to incorrect formatting, unexpected characters, or corrupted structure. Review signal syntax. |
| `7012` | Payload too large | Signal data exceeds the server's maximum allowed size. Reduce information in comments or optional parameters. |
| `7013` | Empty or malformed payload | Received signal data is empty, incorrectly formatted, or has structural errors preventing parsing. Check signal content and structure. |
| `7014` | Invalid parameter format | One or more parameters (e.g., price, SL/TP) are not in the correct data type or format. Review parameter specifications. |
| `7015` | Duplicate signal ID | A signal with this unique ID has already been processed. Ensure each new signal uses a unique identifier. |
| `7016` | No client connected | Signal was received but no MT5 terminal was connected and no cTrader or TradeLocker account was switched on for this license. Ensure your EA is running and connected, or that a cTrader or TradeLocker account on this license is switched on, before sending signals. |
| `7017` | Alert time missing | The alert came through the TradeSgnl browser extension without the time TradingView fired it, so it was not traded. Update the extension. |
| `7018` | Alert arrived too late | The alert came through the TradeSgnl browser extension more than 5 seconds after TradingView fired it (for example, the computer was asleep or offline), so it was not traded at an old price. Keep the computer awake with TradingView open, or use a webhook. |
| `7020` | Exit signal ignored | Strategy has "Ignore Exit Signals" enabled (the `,noexit` flag), so the server rejected this position-close action. Entries, reversals, and pending-order cancels from the same strategy still execute. To re-enable: remove the `noexit` flag from the alert message. |
| `7021` | EA update required | This account runs an EA version that does not understand this command, so the signal was not sent to it. [Modify commands](/signals#modify-orders) need EA 0.68 or newer, a signal that carries a [`ticket=`](/signals#target-one-trade-by-ticket) needs EA 0.71 or newer, and a pending order sent with [`cancel_at=tp1`](/signals#cancel-at-tp1) needs EA 0.80 or newer. Update the EA and send the signal again. |
| `7022` | No active subscription | The signal was not accepted because the subscription on this license is not active and no account was connected to receive it. It is not saved to your signal history. Renew your subscription to send signals again. |
**Common signal error scenarios:**
* **Authentication issues (7001, 7010)**: verify your license code and secret key are correct and active.
* **Missing parameters (7003, 7008, 7009)**: your signal must include symbol, action, and volume/risk.
* **Format errors (7004, 7011, 7013, 7014)**: check the signal's syntax and data types.
* **Data issues (7012, 7015)**: avoid sending duplicate signals or oversized payloads.
## Crypto Exchange Error Codes [#crypto-exchange-error-codes]
Raised when a signal is placed on a connected [crypto exchange](/crypto-exchanges). They appear on the **Signals** page next to the order, with a sentence saying why.
| Code | Error | Description |
| ------ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `7501` | Short selling not available on spot | Spot exchanges cannot open short positions. Use `closebuy` or `closeall` to exit a position instead. |
| `7502` | Stop-entry orders not supported | Stop-entry orders are not supported on crypto exchanges yet. Use `buy` or `buylimit` instead. |
| `7503` | Limit exits not supported | Limit exits are not supported on crypto exchanges yet. Set `tp_price` or `tp_percent` on the entry, or send `closebuy`. |
| `7504` | No short position on spot | Short positions do not exist on a spot exchange, so there was nothing to close or cancel. |
| `7505` | Action not supported on crypto | Supported crypto actions are `buy`, `long`, `buylimit`, `closebuy`, `closelong`, `closeall`, `closelongbuy`, `closelongsell`, `closeshortbuy`, `cancellong` and `cancelall`. A sell closes the long, as `closelong` does. Use `pct=`, `pct_percent=` or `pct_lots=` for partial closes and `comment=` to close one strategy. |
| `7506` | No tradable spot pair | The exchange has no spot pair for this symbol that is open for trading. Futures and perpetuals are not traded. A coin on its own (such as SOL), or a symbol quoted in USD, USDT or USDC whose own pair is missing or not open for trading (such as BTCUSD or EURUSD), is traded against USDT, USDC or USD, in that order. Check the symbol in your alert message. |
| `7507` | Stale signal rejected | The signal was older than the freshness limit, usually a delayed TradingView retry. It was not traded. |
| `7508` | Duplicate signal rejected | No longer used: every signal is now placed. Older signals may still show it, from when a repeat of the same signal within a few seconds was ignored. |
| `7509` | No open position to close | TradeSgnl holds no open position for this symbol that matches the signal (its comment, if it has one), or the position is on a pair that is not open for trading right now, which the message then names. Coins bought outside TradeSgnl are never touched. |
| `7510` | Insufficient balance on exchange | Not enough funds on the exchange for this order. Deposit funds or reduce the order size. |
| `7511` | Order below exchange minimum | The order is below the exchange's minimum size for this pair. Increase the volume or risk value. |
| `7512` | Exchange API key rejected | The exchange no longer accepts the stored API key. Remove the connection and add it again with a new key. |
| `7513` | Exchange unreachable | The exchange could not be reached or did not confirm a request, or the server was restarting. When the message says nothing was traded, later signals are tried normally. When it says a request was not confirmed, it may have gone through: check the account on the exchange before sending it again. |
| `7514` | Missing trade volume/risk | The signal carried no position size. Add `vol_dollar`, `vol_pctbal`, `vol_lots` or `risk`. |
| `7515` | Exit sale failed | A take profit or stop loss price was reached, but the sale could not be completed after several tries (the message says why). A stop loss resting on the exchange stays there, and one TradeSgnl watches keeps being tried every minute. Close the position from your dashboard or on the exchange. |
| `7516` | Buy not saved | TradeSgnl placed the buy but could not save it yet. It keeps trying, and manages the position once it is saved. The message says whether a stop loss was placed meanwhile. |
| `7517` | Close size not understood | `pct=` and `pct_percent=` are a share between 0 and 1 (0.5 closes half), and `pct_lots=` an amount of the coin above 0. Nothing was sold. |
| `7518` | Sale not recorded | The exchange sold this, but TradeSgnl could not record it. Check the position before you close it again. |
| `7519` | TradeSgnl could not finish | TradeSgnl could not complete this signal because of a fault on its side. Check the account on the exchange before sending it again. |
| `7520` | Exchange not open yet | This exchange is not open for new trades on TradeSgnl yet, so this entry was not placed. Positions already open on it are still closed, cancelled and protected as usual. |
| `7521` | Account type not supported | This exchange account type cannot be traded by TradeSgnl, so the order was not placed. The message says which account type the exchange needs. |
| `7599` | Exchange rejected the order | The exchange refused this order or did not fill it. The message says what happened. |
## cTrader Error Codes [#ctrader-error-codes]
Raised when a signal is placed on a connected [cTrader account](/ctrader). They appear on the **Signals** page next to the order, with a sentence saying why. A message that begins "Position opened" means the trade is open without the level it names: set it in cTrader.
| Code | Error | Description |
| ------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `7601` | cTrader sign-in expired | cTrader no longer accepts the account's sign-in, for example because access was removed in your cTrader ID settings. Click **Reconnect** on the account's card and sign in again. You are alerted once; later signals show this code until you reconnect. |
| `7602` | cTrader account not authorised | cTrader did not let TradeSgnl trade this account, or the account no longer exists or is disabled at the broker. If the card says cTrader no longer accepts the sign-in, reconnect it, or remove it if the account was closed. If the message says TradeSgnl signed the account back in, the next signal trades normally. A limited-risk account, which needs a guaranteed stop loss on every position, cannot be traded by TradeSgnl. |
| `7603` | Too many requests to cTrader | cTrader limited how fast requests could be sent, so this one was refused. Later signals are tried normally. |
| `7604` | cTrader unreachable | The connection to cTrader was unavailable or cTrader did not confirm a request, or the server was restarting. When the message says nothing was traded, later signals are tried normally. When it says a request was not confirmed, it may have gone through: check the account in cTrader before sending it again. |
| `7605` | Action not supported on cTrader | The signal's action cannot be carried out on a cTrader account. See [what your signals can do](/ctrader#what-your-signals-can-do). |
| `7606` | Symbol not offered by the broker | The broker behind this account has no symbol by that name. The message suggests close names when there are any. Use the broker's name, map the alert's name under **Symbol mapping** in the account card's **Settings**, or add a [license symbol mapping](/symbol-mapping). |
| `7607` | Stale signal rejected | The alert included `timenow={{timenow}}` and arrived more than two minutes after it fired, so it was dropped as outdated. No alert is sent. |
| `7608` | Duplicate signal rejected | No longer used: every signal is now placed. Older signals may still show it, from when a repeat of the same trade within a few seconds was ignored. |
| `7609` | No matching position or order | A close or modify arrived, but no position or pending order placed by TradeSgnl matched it, or cTrader could not cancel an order that had just filled or been cancelled. Trades you opened yourself in cTrader are never touched. |
| `7610` | Margin or position limit reached | The account does not have enough free margin for this trade, has reached its exposure limit for the symbol, or has reached its limit of open positions and orders. Reduce the size or add funds. |
| `7611` | Trade size rejected | The size is missing, below the symbol's minimum (or a partial close would be), or refused by the broker. `vol_dollar=` without a stop loss cannot be sized. TradeSgnl never rounds an entry up. |
| `7612` | Stop loss or take profit rejected | The broker refused the stop loss or take profit, often because it was too close to the price. If the trade opened, it is open without that level: set it in cTrader. |
| `7613` | Trading not allowed | Trading is not possible on this account or symbol right now, for example because the market is closed (a weekend or holiday), the symbol is close-only, or short selling is not allowed on it. |
| `7614` | No price from the broker | The broker had no price for this symbol when the signal arrived, so the order was not sized or placed. |
| `7615` | Missing or unusable parameter | The action was fine, but one of its parameters was missing or unusable. The message says which one when it can. |
| `7699` | cTrader rejected the order | cTrader refused the order for a reason not covered above. The message gives cTrader's reason code; contact support if it keeps happening. |
**About 7615.** `7605` means the action itself cannot run; `7615` means the action is fine and one parameter needs fixing. The common causes:
* A pending order without the price to place it at, or with its entry set as a distance from the price (`entry_pips=`, `entry_points=`, `entry_percent=`, `pending=`).
* A value that is not a number, a price the broker rejected as invalid, a stop too small for the symbol to express, or a pip distance on a symbol quoted with no decimals.
* A `pct=` above 1, such as `pct=50`: `pct=` is a share between 0 and 1.
* A flag cTrader does not run: `re` (recovery) or `py` (pyramiding) on an order that opens a position, or `ticket=` on a close or modify (a ticket targets one MT5 position, so cTrader refuses it).
* `exop` or `exent` on anything but a market entry.
* A sizing field cTrader does not support: `vol_pcteq=`, `vol_pctbal_loss=`, `vol_pcteq_loss=`, or `volume=` on its own.
* `vol_dollar=` with a stop set as a price or a percentage (`sl_price=`, `sl_percent=`).
* A stop, target, trailing or breakeven field with an unknown ending, such as `sl_pip=`.
## TradeLocker Error Codes [#tradelocker-error-codes]
Raised when a signal is placed on a connected [TradeLocker account](/tradelocker). They appear on the **Signals** page next to the order, with a sentence saying why. A message that begins "Position opened" means the trade is open without the level it names: set it in TradeLocker.
| Code | Error | Description |
| ------ | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `7701` | TradeLocker sign-in refused | TradeLocker no longer accepts the account's sign-in, usually because the password was changed, or the login no longer lists this account. Click **Reconnect** on the account's card and sign in with your current TradeLocker password. You are alerted once; later signals show this code until you reconnect. |
| `7702` | Account refused the trade | The broker or prop firm refused the trade under its own rules, and the message quotes its reason. Also shown when the account does not allow closing part of a trade, or when TradeLocker cancelled an order before it filled. |
| `7703` | Too many requests to TradeLocker | TradeLocker asked TradeSgnl to slow down, so this one was not carried out. The next signal is sent normally. |
| `7704` | TradeLocker unreachable | TradeLocker could not be reached, was too busy, or did not answer, or the server was restarting. When the message says nothing was traded, later signals are tried normally. When it says the outcome is unknown, it may have gone through: check the account in TradeLocker before sending it again. |
| `7705` | Action not supported on TradeLocker | The signal's action cannot be carried out on a TradeLocker account. See [what your signals can do](/tradelocker#what-your-signals-can-do). |
| `7706` | Symbol not offered by the broker | The broker behind this account has no symbol by that name. The message suggests close names when there are any. Use the broker's name, map the alert's name under **Symbol mapping** in the account card's **Settings**, or add a [license symbol mapping](/symbol-mapping). |
| `7707` | Stale signal rejected | The alert included `timenow={{timenow}}` and arrived more than two minutes after it fired, so it was dropped as outdated. No alert is sent. |
| `7709` | No matching position or order | A close or modify arrived, but no position or pending order placed by TradeSgnl matched it, or TradeLocker no longer had it. Trades you opened yourself in TradeLocker are never touched. |
| `7710` | Not enough funds | The account does not have enough funds or free margin for this trade. Reduce the size or add funds. |
| `7711` | Trade size rejected | The size is missing, below the symbol's minimum (or a partial close would be), not a whole number of the symbol's lot steps, or refused by the broker. `vol_dollar=` without a stop loss in pips cannot be sized. TradeSgnl never rounds an entry up. |
| `7712` | Stop loss or take profit rejected | The stop loss or take profit was refused, often because it was too close to the price or on the wrong side of it. If the trade opened, it is open without that level: set it in TradeLocker. |
| `7713` | Trading not allowed | Trading is not possible on this symbol right now, for example because the market is closed (a weekend or holiday) or the symbol is disabled. When the market is closed, TradeLocker's reason reads like "SL orders are forbidden by trade session status". |
| `7714` | No price from the broker | TradeLocker had no price for this symbol when the signal arrived, so a stop or target measured from the price, or a `vol_dollar=` size, could not be worked out. No order was sent. |
| `7715` | Parameter not supported | The action was fine, but one of its parameters was missing or unusable. The message says which one when it can. The common causes are the same as for `7615` above. |
| `7716` | Not confirmed yet | TradeLocker took the order or close but did not confirm it in time, so it shows as pending. TradeSgnl checks it again within five minutes and updates it. Don't send it again in the meantime. |
| `7799` | TradeLocker rejected the order | TradeLocker gave an answer TradeSgnl could not read, or a trade opened but TradeSgnl could not start managing it (the message says which take profit levels, trailing stop or breakeven are not active, so manage it in TradeLocker). Contact support if it keeps happening. |
## Troubleshooting Common Errors [#troubleshooting-common-errors]
The most frequent errors and how to resolve them.
| Error | Problem | Solution |
| -------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `10019` Insufficient Funds | Account does not have enough free margin to open the position. | Check account balance and margin requirements. Reduce risk per trade if needed. |
| `10017` Trading Disabled | Automated trading is blocked at the terminal or broker level. | Enable automated trading in MT5. Confirm your broker allows EA execution. |
| `10031` No Connection | EA cannot reach the broker server. | Check internet connection, confirm terminal is logged in, restart MT5 if needed. |
| `10018` Market Closed | The symbol is outside its trading hours. | Check your broker's trading hours for that instrument. |
| `6002` Spread Too High | Current spread exceeds the EA's configured max-spread. | Wait for tighter market conditions, or adjust the spread filter in EA settings. |
| `6007` Invalid Symbol | The signal's symbol does not match any tradeable symbol on your broker. | Open the rejection in Signal Logs: the EA suggests the closest symbol your broker lists (e.g. `EURUSD.m`, `EURUSD.micro`) with a one-click shortcut to add it as a [symbol mapping](/symbol-mapping#symbol-suggestions-and-auto-match), or enable auto-match to let the EA pick the one clear match itself. On a copied trade, set the symbol mapping on the [Trade Copier](/trade-copier#symbol-mapping) instead. |
**General troubleshooting steps:**
* **Check EA logs.** The Experts tab in MT5 has the detailed error context.
* **Verify signal format.** All required fields present, correct types.
* **Check account status.** Active, funded, not in margin call.
* **Restart the EA.** Solves transient connection issues.
* **Contact support.** For persistent errors that don't match any of the above.
# FAQ (/faq)
## Billing [#billing]
You can pay by card, Apple Pay or Google Pay. Apple Pay and Google Pay show at checkout when your device and browser support them. Crypto payments are not accepted.
An upgrade starts straight away, and you're charged the difference for the rest of your current billing period. The same goes for switching from monthly to yearly billing.
A downgrade takes effect at the end of your current billing period. You keep your current plan until then.
## Servers and speed [#servers-and-speed]
TradeSgnl runs on servers around the world. Cloud terminals are hosted in Europe.
The time on a TradingView alert is the moment its condition was met, usually when the bar closed. TradingView then builds the alert and sends the webhook, and that takes time on TradingView's side. A few seconds is normal.
The wait is usually longest right on the minute. Many TradingView users have alerts that fire at the same second, so webhooks queue up before TradingView sends them, and two alerts that fire together can arrive several seconds apart.
TradeSgnl can't make TradingView send sooner. Once your signal reaches TradeSgnl, it is sent on to your accounts straight away. The **Signals** page shows when each signal arrived.
## Signals [#signals]
No. Signals can't be deleted. They're kept for 30 days and then removed automatically.
# Hedge Protection (/hedge-protection)
## Introduction [#introduction]
Hedge Protection is an advanced risk management feature that automatically opens counter-positions when trading strategies experience significant losses. By monitoring the worst-performing trade in each strategy and triggering hedges based on pip loss thresholds, this system helps protect capital while maintaining your original market positions.
Hedge Protection increases your position size and market exposure. While it can limit losses during adverse moves, it also adds complexity to position management. This feature is recommended for experienced traders who understand risk management and hedging strategies.
Before using hedge protection, ensure you're comfortable with basic EA operations, understand position management, and have tested the feature thoroughly on a demo account.
## Core Concepts [#core-concepts]
When your trades start losing money, hedge protection automatically opens a counter-position to limit further losses while keeping your original trades open.
The EA groups your trades by symbol and [comment](/strategies) and monitors each group separately. When the worst trade in a group hits your loss limit, protection activates for that group only.
You control how much protection to apply, from partial hedging that maintains some market exposure to complete neutralization of directional risk.
**Key Benefits:**
Caps your maximum loss at the trigger level regardless of further market movement.
Keeps your original trades open in case the market reverses in your favor.
Works automatically without requiring you to monitor markets constantly.
Hedge positions can be configured with their own profit and loss exit points.
## Activation & Setup [#activation--setup]
Hedge Protection is an EA-only feature controlled exclusively through the EA interface. Unlike other advanced features, it cannot be activated through signal parameters and operates globally for all strategies when enabled.
Hedge positions are opened with your strategy comment plus `_Hedge`, for example `MyStrategy_Hedge`. When deciding whether to hedge, the EA skips any strategy whose comment contains `_Hedge` (so it never hedges a hedge) or `Recovery` (so it never hedges a recovery batch). A strategy you named `Recovery_Grid` or `EU_Hedge` will therefore never receive hedge protection. Keep both strings out of your own comments. See [Multiple Strategies](/strategies).
| Mode | Description | Behavior |
| -------- | ------------------------------------- | ------------------------------------------- |
| Disabled | Feature completely disabled (default) | No hedge monitoring or protection |
| Enabled | Always active using EA input settings | All strategies monitored for hedge triggers |
**Important:** When enabled, hedge protection applies to ALL trading strategies managed by the EA. There is no per-strategy control. The feature operates globally based on the settings configured in the EA interface.
Test hedge protection thoroughly on demo accounts before enabling it on live trading. Start with conservative settings and gradually adjust based on your risk tolerance and market conditions.
## Hedge Management [#hedge-management]
The Hedge Management section contains five simple settings that control when and how hedge protection activates. Understanding these settings helps you customize the protection to match your trading style and risk tolerance.
| Setting | What It Does | Recommended Values |
| ----------------- | --------------------------------------------------------------- | ----------------------------------------------------- |
| Hedge Management | Turns the feature on or off completely | Disabled (safe default) / Enabled (active protection) |
| Hedge Trigger | How many pips you're willing to lose before protection kicks in | 30-50 pips for major pairs, 20-30 for scalping |
| Hedge Volume % | How much protection to apply (100% = complete protection) | 75-100% for strong protection, 50% for partial |
| Hedge Take Profit | When to close hedge with profit (0 = manual control) | 15-30 pips for active management, 0 for manual |
| Hedge Stop Loss | When to close hedge with loss (0 = no automatic stop) | 20-40 pips recommended, never leave at 0 |
### How Hedge Protection Activates [#how-hedge-protection-activates]
Understanding when and how hedge protection triggers helps you set appropriate parameters for your trading strategy:
1. **Monitoring Your Trades:** The EA continuously watches all your open positions, grouping them by strategy name.
2. **Finding the Worst Performer:** In each strategy group, it identifies which trade is losing the most money.
3. **Checking the Loss:** When that worst trade reaches your trigger level (in pips), protection activates.
4. **Opening Protection:** A hedge position opens in the opposite direction to limit further losses.
5. **Managing the Hedge:** The hedge position can have its own profit and loss targets, independent of your original trades.
6. **Ongoing Protection:** Your losses are now capped. Further adverse price movement won't hurt as much.
**Simple Rule:** The EA only looks at your worst-performing trade in each strategy. Even if you have multiple losing trades, only the biggest loser determines when protection kicks in.
### Understanding Hedge Volume Percentage [#understanding-hedge-volume-percentage]
The hedge volume percentage determines how much protection you get. Here are common scenarios to help you choose the right setting:
| Your Trades | Hedge % Setting | Protection Applied | What This Means |
| ------------------------- | --------------- | ------------------- | ----------------------------------------- |
| 0.3 lots BUY positions | 100% | 0.3 lots SELL hedge | Complete protection, no more losses |
| 0.2 BUY + 0.1 SELL trades | 100% | 0.1 lots SELL hedge | Protects your net 0.1 lots exposure |
| 0.4 lots SELL positions | 75% | 0.3 lots BUY hedge | Partial protection, 0.1 lots risk remains |
| 0.2 lots BUY positions | 150% | 0.3 lots SELL hedge | Over-hedged, now net 0.1 lots SHORT |
**Choosing Your Level:** 100% gives complete protection, 75% gives partial protection while maintaining some upside, 150%+ actually reverses your market direction.
### Managing Your Hedge Positions [#managing-your-hedge-positions]
Once a hedge is placed, you can let it manage itself or control it manually. Here's how the exit settings work:
| Exit Setting | Set to 0 (Manual) | Set to Pips (Automatic) | Best For |
| ----------------- | ----------------------------------- | -------------------------------------------- | ----------------------------------------------------- |
| Hedge Take Profit | You decide when to close for profit | Closes automatically when hedge gains X pips | Active traders (manual) vs. hands-off approach (auto) |
| Hedge Stop Loss | No automatic protection (risky!) | Closes automatically if hedge loses X pips | Always set this, never leave at 0 |
**Important:** Your hedge positions are separate from your original trades. When a hedge closes (profit or loss), your original trades remain open. This gives you flexibility to manage each part of your position independently.
Always set a hedge stop loss! Without it, your hedge could lose more money than your original trade, defeating the purpose of protection.
## Practical Examples [#practical-examples]
### Example 1: Single Position Hedge [#example-1-single-position-hedge]
**Setup:** EURUSD strategy with single BUY position, 30-pip trigger, 100% hedge volume.
| Event | Price | Position Status | Net Exposure | Action |
| ------------- | ------ | ------------------------------------------- | -------------- | ------------------- |
| Initial Entry | 1.2000 | 0.10 lots BUY (TrendStrategy) | 0.10 lots LONG | Monitor for trigger |
| Price Drop | 1.1970 | 0.10 lots BUY (-30 pips) | 0.10 lots LONG | Hedge triggered! |
| Hedge Placed | 1.1970 | 0.10 BUY + 0.10 SELL (TrendStrategy\_Hedge) | 0.00 (Neutral) | Risk neutralized |
| Further Drop | 1.1930 | 0.10 BUY + 0.10 SELL | 0.00 (Neutral) | No additional loss |
**Result:** Original position locked at -30 pips loss. Further price movement doesn't increase losses.
### Example 2: Multiple Trades Protection [#example-2-multiple-trades-protection]
**Scenario:** You have multiple EURUSD trades under "MyStrategy", some winning, some losing.
| Your Trades | Size | Current Result | What Happens |
| ------------- | --------- | -------------- | ---------------------------------------------- |
| BUY Trade #1 | 0.20 lots | -10 pips | Not the worst yet |
| BUY Trade #2 | 0.15 lots | -28 pips | This is your worst trade, triggers protection! |
| SELL Trade #3 | 0.10 lots | +8 pips | Making money, doesn't affect trigger |
**What the EA does:** It sees you have 0.25 lots net BUY exposure (0.35 BUY - 0.10 SELL). With 75% hedge setting, it opens a 0.19 lots SELL hedge to provide partial protection while keeping some upside potential.
### Example 3: How Hedge Exits Work [#example-3-how-hedge-exits-work]
**Scenario:** Your GBPUSD trade triggered a hedge, and you've set automatic exit levels for the hedge.
**Your Trading Situation:**
* You bought 0.30 lots GBPUSD at 1.3000.
* Price dropped to 1.2960 (-40 pips) and triggered your hedge.
* EA opened 0.36 lots SELL as protection (120% hedge setting).
**Your Hedge Settings:**
* Hedge Take Profit: 20 pips (closes hedge when it makes 20 pips).
* Hedge Stop Loss: 15 pips (closes hedge if it loses 15 pips).
* Original BUY trade: Still open, not affected by hedge exits.
**What Could Happen Next:**
* **Market keeps falling:** Your hedge makes money and closes at 20 pips profit.
* **Market bounces back:** Your hedge loses 15 pips and closes, but your original trade recovers.
* **Either way:** You're protected from major losses while keeping upside potential.
## Common Questions & Solutions [#common-questions--solutions]
| Question/Problem | Why This Happens | How to Fix It |
| --------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| My trades are losing but no hedge is opening | Feature might be disabled or trigger level too high | Check that Hedge Management is "Enabled" in EA settings. Lower your trigger if needed (try 25-30 pips). |
| I see multiple hedge positions for one strategy | EA was restarted and lost track, or duplicate EAs running | Each strategy should have only one hedge. Manually close the extra hedges and check for duplicate EAs. |
| The hedge size doesn't look right | The EA calculates based on your net exposure, not individual trades | If you have mixed BUY/SELL trades, the hedge protects your net position. This is normal behavior. |
| My hedge won't close automatically | Take Profit or Stop Loss settings are set to 0 | Set Hedge Take Profit and Stop Loss to positive numbers (like 20 and 30 pips) for automatic management. |
| Only one losing trade triggered the hedge | The EA watches your worst trade, not all losing trades | This is how it's designed to work. The worst performer determines when protection activates. |
| I can't find my hedge positions | Hedge positions have different comment names | Look for positions with "\_Hedge" added to your strategy name (e.g., "MyStrategy\_Hedge"). |
| Hedge keeps triggering too often | Trigger threshold too small for market movement | Increase your Hedge Trigger setting. For volatile pairs, try 40-50 pips instead of 20-30. |
| 100% hedge didn't completely neutralize my position | Broker lot size restrictions cause small rounding differences | Small differences are normal due to broker minimum lot sizes. The protection is still effective. |
Always test hedge protection thoroughly on demo accounts before live trading. Start with conservative settings (higher trigger thresholds, lower hedge percentages) and gradually adjust based on your risk tolerance and market conditions.
For complete parameter references and additional configuration options, see the [Configuration Guide](/configuration).
# Automate TradingView and Telegram into live trades. (/)
Get started in 5 minutes
See what it does
Pick the source you already trade from, TradingView or Telegram, and TradeSgnl handles the rest: parsing, alert wiring, execution, hosting, and reporting. There's more than one way to wire each side up, so you can match the workflow you actually use.
## Cloud hosting, handled for you [#cloud-hosting]
Your accounts run on our servers around the clock, so nothing depends on your PC staying on. MetaTrader 5 gets a managed terminal, and every other platform connects straight from the portal with nothing to install.
### Supported platforms [#supported-platforms]
Connect any mix of these under one license. One alert trades every account on it, whatever the platform.
Any broker that offers MT5. Run it on a managed cloud terminal or a Cloud VPS, or on your own PC.
Sign in with your cTrader ID and pick your demo and live accounts. Your password stays with cTrader.
Works with the brokers and prop firms that use TradeLocker. Sign in with your email, password and server.
Binance, Bybit and OKX spot accounts, connected with an API key. Testnets are supported for practice.
### Three ways to run MetaTrader 5 [#three-ways-to-run-metatrader-5]
A managed terminal, a full Windows VPS, or your own MetaTrader. Same portal and analytics across all three.
A managed cloud-based terminal, with MT5 and the EA pre-installed and connected automatically.
A dedicated Windows desktop, with MT5 and the EA pre-installed. Full OS control through RDP.
Already running MetaTrader? Install the EA on your terminal and use the same portal, alerts, and analytics.
## Automate TradingView [#automate-tradingview]
Four surfaces for turning a TradingView chart into automated trades on your accounts, each suited to a different level of control and customization.
A Chrome side panel that reads your chart in real time. Ask in plain English to run indicators, draw levels, or create alerts, and the assistant acts on the chart for you.
A Pine Script template you add to TradingView with one click. Configure entries, exits, and risk visually inside TradingView; it emits alerts TradeSgnl executes.
A Pine Script workspace in the portal with an AI developer. Generate strategies from a description, adapt indicators into strategies, or edit existing ones.
Automate any existing TradingView strategy without touching its source. One alert with the right message format and TradeSgnl handles entries, exits, and reversals.
The TradingView AI extension puts all of it on the chart itself. It sees your symbol, indicators, and recent bars as they update, knows your signal presets and broker setup, and its guided workflows walk you through wiring up alerts without leaving TradingView.
Read the TradingView AI guide
## Automate Telegram [#automate-telegram]
Turn the signals from any Telegram channel you read into trades on your accounts, parsed and managed the way you set it up.
Monitor any channel you're subscribed to. Each new message is parsed, extracted into a trade ticket, and sent to your accounts within milliseconds.
Auto-detect signals with regex patterns or use AI parsing for complex multi-line formats. Configure templates and default volumes per channel.
Attach trailing stops and breakeven, offset or limit take profits, force market or pending orders, and filter out messages you don't want traded.
## Let AI do the watching [#ai]
Describe how you trade and let AI watch the markets for you, or ask it for a read on any chart whenever you want one.
Create your own agents that watch your trading account and trade your rules. Approve each trade yourself or let an agent place them inside your limits. In early access.
Pick a symbol and a trading style and get a structured read, with a trade scenario or a clear reason to stand aside.
Ask about your results, accounts and setup in plain English, and get alert messages written for you.
## Behind every trade [#behind-every-trade]
Trade management features configured in the EA inputs panel inside MT5. Risk sizing through advanced position management, no MQL5 required.
Lot sizing, max trades, trailing stops, breakeven, and per-symbol limits. Each parameter can come from the signal or from your EA defaults.
Group same-strategy trades into a coordinated position with a shared exit. Average down losers with controlled re-entries. Open a counter-position when a strategy crosses a loss threshold.
Test any CSV-based strategy in the MT5 Strategy Tester with TradeSgnl's trade management active. Validate trailing stops, pyramid, and recovery before going live.
Get notified about connection issues, signal errors, drawdown, and news events via portal, email, or Telegram. Review performance in the Analytics dashboard.
## Where to next [#where-to-next]
Pick a path based on where you are. New users start with Quick Start; existing traders jump straight to setup or settings.
From a fresh account to your first executed signal in about five minutes. Start here if you're new.
Install the EA on your own MetaTrader 5 terminal. Skip this if you're using CloudConnect.
Every input on the EA panel: risk, trailing stops, breakeven, pyramid, recovery, and hedge.
Common issues, error codes, and the fastest paths back to a working setup.
# Install the App (/install-app)
## Introduction [#introduction]
TradeSgnl installs straight from the browser, with no app store. Once installed it has its own icon, opens full screen like any other app, and its push notifications show as TradeSgnl.
Open the Portal
## Android [#android]
**Open the portal in Chrome** and sign in.
**Tap Install** at the top of the page, then **Install** again in the box that opens.
**Open TradeSgnl from your home screen.** You stay signed in.
No Install button at the top? Tap Chrome's **⋮** menu, then **Install app** or **Add to Home screen**. The button also hides once TradeSgnl is installed.
## iPhone and iPad [#iphone-and-ipad]
**Open the portal in Safari**, tap the **Share** button, then **Add to Home Screen**.
**Tap Add**, then **open TradeSgnl from the new Home Screen icon** and sign in.
Safari keeps the Home Screen app separate from the browser, so you may need to sign in again the first time you open it.
## Computer [#computer]
In Chrome or Edge, open your account menu at the top right of the portal and click **Install app**, then **Install**. You can also use the install icon at the right of the address bar.
TradeSgnl then opens in its own window and shows up with your other apps.
## Next Step [#next-step]
With the app installed, turn on push so alerts reach your phone even when TradeSgnl is closed.
Turn on push for this device in two taps.
# MCP server (/mcp-server)
{/* AgentLogo is used inside headings, and fumadocs hoists heading content into a
module-level `toc` export where the MDX component map does not reach, so this
import is required even though AgentLogo is registered globally. */}
## Introduction [#introduction]
TradeSgnl runs an MCP (Model Context Protocol) server. Connect it to your AI agent and it can read your signals, deliveries, connected accounts and performance metrics, query live market prices, run the Market Analyst, and, if you allow it, send trade signals directly to your broker accounts.
The MCP server is part of [TradeSgnl Cloud](/cloudconnect#part-of-tradesgnl-cloud), included on the Advanced and Professional plans.
The server address is:
```text title="MCP server address"
https://portal.tradesgnl.com/api/mcp
```
The server operates over Streamable HTTP and supports two authentication methods:
* **OAuth 2.1 (Recommended)**: Sign in through your browser and select permissions on a consent screen. No API keys to copy or manage.
* **Personal API Keys**: Standard Bearer token authentication for headless servers, scripts, and clients that support custom headers.
Chart control stays in the browser. An agent connected via MCP cannot draw on your TradingView chart, add indicators or manage TradingView alerts. For chart automation, use the [TradingView AI extension](/tradingview-ai).
## Connect with OAuth [#connect-with-oauth]
Connecting with OAuth is the simplest method: you provide the server address, your agent opens a TradeSgnl authorization tab in your browser, and you approve the connection.
### Add the server to your agent [#add-the-server-to-your-agent]
Choose your agent below and follow the configuration steps:
#### Claude (Web, Desktop, Mobile) [#-claude-web-desktop-mobile]
Click the button. Claude opens with TradeSgnl filled in. Click **Continue**.
To add it by hand instead:
1. Go to **Customize** > **Connectors**.
2. Click **Add custom connector**.
3. Set the name to **TradeSgnl** and enter the server URL:
```text
https://portal.tradesgnl.com/api/mcp
```
4. Click **Continue**.
#### Claude Code (CLI) [#-claude-code-cli]
Run the following command in your terminal:
```bash
claude mcp add --transport http tradesgnl https://portal.tradesgnl.com/api/mcp
```
#### ChatGPT [#-chatgpt]
1. Go to **Settings** > **Plugins** > **Developer mode** and enable **Developer mode**.
2. From **Plugins**, go to **Browse Plugins** > **New plugin**.
3. In the modal:
* **Name**: Enter `TradeSgnl`.
* **Connection**: Leave on **Server URL** and enter the server URL:
```text
https://portal.tradesgnl.com/api/mcp
```
* **Authentication**: Select **OAuth** (ChatGPT automatically discovers the authorization endpoints; leave Client ID and Client Secret blank).
* Check **I understand and want to continue**.
* Click **Create**.
#### Codex [#-codex]
Add the TradeSgnl MCP server to your Codex CLI or configuration:
```bash
codex mcp add tradesgnl --url https://portal.tradesgnl.com/api/mcp
```
#### Cursor [#-cursor]
Click the button. Cursor opens and asks to install tradesgnl. Click **Install**. If Cursor then shows **Needs login** next to tradesgnl, click it.
To add it by hand instead, open your project's `.cursor/mcp.json` (or your global Cursor MCP settings) and add:
```json title=".cursor/mcp.json"
{
"mcpServers": {
"tradesgnl": {
"url": "https://portal.tradesgnl.com/api/mcp"
}
}
}
```
#### Google Antigravity [#-google-antigravity]
Add the server entry to your configuration file (`~/.gemini/antigravity/mcp_config.json` or `~/.gemini/config/mcp_config.json`):
```json title="mcp_config.json"
{
"mcpServers": {
"tradesgnl": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://portal.tradesgnl.com/api/mcp"
]
}
}
}
```
#### VS Code [#-vs-code]
Click the button. VS Code opens the tradesgnl server. Click **Install**, then **Allow** when VS Code asks to sign in to tradesgnl.
To add it by hand instead, run **MCP: Add Server** from the Command Palette, choose **HTTP** and enter the server URL.
#### Windsurf [#-windsurf]
Add a new MCP server in your editor settings with transport type `stdio` using `npx -y mcp-remote https://portal.tradesgnl.com/api/mcp`, or select remote HTTP and enter the portal endpoint.
### Sign in and authorize [#sign-in-and-authorize]
When your agent first connects, a browser tab opens to the TradeSgnl consent page. If you are not signed in, log in to your account.
The consent screen shows:
* The name of the client app connecting.
* The permissions requested (all connections include read access to your portal data).
* An **Execute trades** toggle (disabled by default), which allows the agent to place real orders on your accounts.
If you enable **Execute trades**, you can also configure safety guardrails:
* **Max lots**: Caps the maximum position size the agent can dispatch in a single trade.
* **Allowed symbols**: Restricts the agent to specific symbols (for example, `EURUSD, BTCUSDm`).
### Complete connection [#complete-connection]
Click **Authorize**. The browser tab closes automatically, the token exchange completes on your local machine, and your agent immediately gains access to your TradeSgnl tools.
## Connect with an API Key [#connect-with-an-api-key]
If you are running in a headless environment (such as a remote Linux server, Docker container, or CI/CD script) where a browser cannot open, or if your client natively supports HTTP headers, you can use a personal API key instead of OAuth.
### 1. Create a key [#1-create-a-key]
1. In the portal, open **API & MCP Server** > **API Keys**.
2. Click **New API key**.
3. Give your key a name, select whether it may trade, and configure any lot or symbol restrictions.
4. Copy the secret key (it begins with `tsk_`). It is displayed only once.
### 2. Configure your client [#2-configure-your-client]
#### Cursor (Direct HTTP with Headers) [#-cursor-direct-http-with-headers]
Cursor supports sending headers directly over Streamable HTTP:
```json title=".cursor/mcp.json"
{
"mcpServers": {
"tradesgnl": {
"url": "https://portal.tradesgnl.com/api/mcp",
"headers": {
"Authorization": "Bearer tsk_YOUR_KEY"
}
}
}
}
```
#### Antigravity & Stdio Clients [#-antigravity--stdio-clients]
Pass the `--header` flag to `mcp-remote`:
```json
{
"mcpServers": {
"tradesgnl": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://portal.tradesgnl.com/api/mcp",
"--header",
"Authorization: Bearer tsk_YOUR_KEY"
]
}
}
}
```
#### Claude Code (CLI) [#-claude-code-cli-1]
```bash
claude mcp add --transport http tradesgnl https://portal.tradesgnl.com/api/mcp --header "Authorization: Bearer tsk_YOUR_KEY"
```
#### Custom Scripts & REST API [#custom-scripts--rest-api]
The same `tsk_` key authenticates requests to both the MCP server and the [REST API](/rest-api) (`https://portal.tradesgnl.com/api/v1/`):
```bash
curl https://portal.tradesgnl.com/api/v1/signals \
-H "Authorization: Bearer tsk_YOUR_KEY"
```
## Manage Connected Apps and Keys [#manage-connected-apps-and-keys]
Go to **API & MCP Server** in the portal to manage all active integrations: connected apps under **MCP Server**, personal keys under **API Keys**.
Open API & MCP Server
* **View Status**: See every connected application and personal key, its permissions, and when it was last used.
* **Edit Limits**: Update trade permissions, lot size limits, or allowed symbols at any time. Changes apply immediately to the agent's next call.
* **Revoke**: Disconnect an app or revoke a key with one click. Access is terminated instantly.
* **Reconnecting**: Re-authorizing an application with OAuth replaces any existing grant for that client, updating its permissions.
## Available Tools [#available-tools]
Your agent receives access to the following tools upon connection:
|
Group
|
Tool
|
What it does
|
|
Signals
|
get_signals
|
Signal history: what arrived, its parameters, and whether it executed
|
get_signal_deliveries
|
What each account did with a signal: executed, rejected or failed, with the reason and the broker ticket
|
list_signal_presets
|
Your saved signal presets
|
|
Accounts
|
get_clients
|
Your accounts: broker, connection status, and Cloud Terminal status
|
get_ea_settings
|
The EA input values of one account: risk, lot size, drawdown limits, sessions
|
get_analytics
|
Balance, equity and account summary per account, as of the EA's last report
|
get_live_account
|
Live balance, equity, margin, open positions, pending orders and trading permissions, read from the account's Cloud Terminal right now
|
get_live_history
|
Closed trades with why each closed, realized P&L, and orders that were canceled or expired
|
calc_order
|
The margin an order needs and what it makes or loses at a price, computed by your broker's terminal
|
get_terminal_logs
|
The MT5 journal and EA log, for when an account drops or a signal did not execute
|
get_subscription
|
Plan tier, connection limit, connections in use, and licences issued
|
list_licenses
|
Your licences, each with the accounts that run under it: MT5 terminals and cTrader, TradeLocker and crypto connections, as last known
|
|
Analytics
|
get_trade_details
|
Open positions and closed trades with their P&L
|
get_performance_metrics
|
Win rate, profit factor, drawdown, and return metrics
|
get_performance_breakdowns
|
Performance by symbol, direction, strategy, or day
|
get_backtests
|
Saved backtest results
|
refresh_analytics
|
Make a connected account upload a fresh report and wait for it, so the figures above are current
|
|
Trade Copier
|
get_trade_copiers
|
Your Trade Copiers, their sizing and symbols, and whether each is copying right now or what stops it
|
get_copier_activity
|
What a copier did with each master trade: copied, closed, missed or skipped, and why
|
|
Alerts
|
get_alert_history
|
Alerts you were sent: connection drops, signal errors, drawdown warnings
|
get_alert_preferences
|
Which channels each alert type goes to (in-app, push, email, Telegram)
|
|
Market data
|
get_symbols
|
The symbols your broker offers, named as your broker names them
|
get_symbol_spec
|
Contract size, tick value, lot step, swaps and margin for a symbol
|
get_candles
|
Candles from 1 minute to monthly, paging back through history
|
get_quote
|
Live bid, ask, spread and tick time for a symbol
|
get_quotes
|
Live quotes for up to 50 symbols in one call
|
get_ticks
|
Tick-by-tick bid and ask history for a symbol
|
|
Market Analyst
|
analyze_symbol
|
Run the Market Analyst on a symbol and get the full report (spends AI credits)
|
|
Trading
|
send_signal
|
Send a trade signal to every account under a licence (needs trade permission). With
dry_run
it asks the signal server who would receive it, including the accounts it would skip and why, and sends nothing. The receipt lists the accounts it went to
|
|
Help
|
search_docs
|
Search the TradeSgnl documentation
|
## Trading Safety [#trading-safety]
Trading is off until you switch it on. A newly connected app can read your data but cannot send signals; you enable trading per app under **API & MCP Server** > **MCP Server**, and can cap the lot size and limit the symbols it may trade at the same time.
### Preview before sending [#preview-before-sending]
Ask your agent to preview a trade first. It shows you the exact signal and the accounts it would reach, and nothing is placed until you say so. For an order sized in lots, the preview also prices it on each Cloud Terminal account: the entry, stop loss and take profit prices, the margin it needs against your free margin, and how much you would lose at the stop or make at the target. You can make this a standing rule:
> Before sending any trade, preview it first and ask for my confirmation.
### No accidental double orders [#no-accidental-double-orders]
If the connection drops while a trade is being sent and the agent tries again, the same order is never placed twice. The first attempt counts and the repeat is ignored.
### Every trade is tracked [#every-trade-is-tracked]
After sending, your agent can tell you which accounts executed the signal, the broker ticket of the position it opened, and the reason if an account rejected it. Signals sent by an agent carry an "AI agent" badge on your Signals page, so you always know which trades came from your assistant.
## Limits and Entitlements [#limits-and-entitlements]
* **Rate Limits**: 60 calls per minute across all tools. Within that, sending signals is limited to 10 per minute and 200 per day.
* **Plan Requirement**: The MCP server is part of TradeSgnl Cloud, included on the Advanced and Professional plans.
## Troubleshooting [#troubleshooting]
Common issues and quick solutions when connecting and using the MCP server.
In desktop or IDE environments (Antigravity, Cursor, or terminal tools), ensure Node.js and `npx` are installed and available in your system PATH. If you are operating inside a remote SSH session, headless container, or server without a graphical browser, connect using a **Personal API Key** and custom HTTP headers instead of OAuth.
By default, newly connected apps and API keys are read-only for safety. To enable trading, open the portal, go to **API & MCP Server** > **MCP Server**, find your connected app, click **Edit**, enable **Execute trades**, set your desired lot and symbol limits, and click Save. The changes apply immediately.
Live prices and the Market Analyst come from a Cloud Terminal, so the account has to run on one. Add a Cloud Terminal under **MT5 Cloud** in the portal, or ask the agent to use an account that already has one.
Ask your agent to check the delivery status of the signal: each account reports whether it executed the order and, if not, why. Common reasons include:
* The TradeSgnl EA is not attached to an active chart or the chart is closed.
* **Algo Trading** (or AutoTrading) is disabled in your MT5 terminal toolbar.
* Symbol mismatch between the signal and your broker (for example, your broker requires `EURUSD.pro` or `EURUSDm` instead of `EURUSD`). Configure [Symbol Mapping](/symbol-mapping) in the portal to resolve broker suffix variations automatically.
OAuth access tokens expire after 1 hour and are automatically refreshed by your client. If your connection remained idle past the 90-day refresh window or was manually revoked in the portal, reconnect your agent to start a new authorization session.
## Frequently Asked Questions [#frequently-asked-questions]
No. All standard tools (reading signal history, checking balances, querying deliveries, and sending trade signals) are included in your subscription without consuming credits. The only thing that spends AI credits is running the Market Analyst.
An agent with trade permissions enabled can execute trades autonomously if you prompt it to do so. If you prefer to supervise every order, tell your agent: *Always preview a trade first and wait for my confirmation before sending it.*
You can enforce strict boundaries on what the agent can trade directly from the portal. Under **API & MCP Server** > **MCP Server**, edit the connected app to set **Max lots** and restrict **Allowed symbols**. These guardrails are evaluated and enforced on TradeSgnl servers before any trade reaches your accounts.
Yes. You can connect Claude, ChatGPT, Cursor, and Antigravity concurrently. Each client establishes its own authorization grant and appears as a separate entry under **API & MCP Server** > **MCP Server**.
In the portal, open **API & MCP Server** > **MCP Server**, locate the client under Connections, and click **Disconnect**. The agent's token is immediately invalidated and all subsequent tool calls will be blocked.
# No-Code Setup (/no-code-setup)
## Introduction [#introduction]
This guide shows you how to automate TradingView strategies without accessing their source code. Make sure your script is a strategy (not an indicator). If it's an indicator, use our [TradeSgnl Strategy Builder](/strategy-builder) instead.
A single alert with this format handles entries, exits, and reversals for any strategy. The transition pair (e.g. `flat>long`, `long>flat`, `long>short`, `short>flat`) tells TradeSgnl which action to take, so you don't need separate alerts or extra parameters for each signal type.
## Setup Instructions [#setup-instructions]
Follow these steps to wire your TradingView strategy up to your trading account.
**Create an Alert on Your Strategy.** Apply your strategy to the desired chart and create an alert (Alt+A on Windows / Option+A on Mac). Select your strategy under **Condition**.
If you see an **"Order fills only"** dropdown option, select it. The other option, order fills and alert() function calls, also sends the strategy's own alert text, which TradeSgnl cannot read. If you don't see this dropdown below the strategy name, skip this step and proceed to the alert message.
**Configure the Alert Message.** The fastest way to build this message is the **Syntax Generator** — configure your risk, SL, TP, and any advanced features in the form, then click **Custom Strategy Message** to copy the single-alert version below. It uses the same transition pair (`{{strategy.prev_market_position}}>{{strategy.market_position}}`) that one alert needs to handle entries, exits, and reversals.
Open the Syntax Generator
Paste what you copied into the alert's **Message** field. The format looks like this:
```
LicenseID,{{ticker}},{{strategy.prev_market_position}}>{{strategy.market_position}},risk=0.01
```
* Replace `LicenseID` with your actual TradeSgnl license ID.
* Use a fixed risk value (`risk=0.01`). TradingView placeholders cannot be used for risk.
* `{{ticker}}` returns the symbol (EURUSD, BTCUSD, etc.).
* The transition pair (e.g. `flat>long`, `long>flat`, `long>short`) lets one alert handle entries, exits, and reversals — the server translates it into the right action verb.
**Add the Webhook URL.** In the **Notifications** tab, check **Webhook URL** and paste the following URL:
```
https://webhook.tradesgnl.com
```
**Save the Alert.** Click **Create** to save your alert. Your strategy will now send signals to your trading account.
* On a paid TradingView plan, alerts reach TradeSgnl by webhook. On a free plan, install the [TradeSgnl Chrome extension](/tradingview-ai), turn on **Forward alerts to TradeSgnl** in its menu, and keep TradingView open: the extension sends your alerts to TradeSgnl the moment they fire.
* Set up separate alerts for each symbol and timeframe you want to automate.
## Best Practices [#best-practices]
* **Start with Demo Trading.** Test all strategies on demo accounts first to verify alerts, position sizing, and stop loss/take profit functionality before risking real capital.
* **Configure Alerts Properly.** Use 'Once Per Bar Close' trigger, set appropriate expirations, and name alerts clearly with symbol and timeframe information.
* **Manage Risk Carefully.** Always use stop losses, start with small position sizes (0.01 to 0.1 lots), and set daily/weekly loss limits in your EA configuration.
* **Select Strategies Wisely.** Choose strategies with proven backtest results, favorable profit factors (above 1.5), reasonable drawdowns, and consistent performance across different market conditions.
Automated trading involves risks. Never risk more than you can afford to lose and monitor your automated systems regularly.
## Additional Resources [#additional-resources]
Complete documentation on all available signal parameters and options.
Learn how to build custom strategies from indicators without coding.
How to properly evaluate and test trading strategies before automation.
# Pyramid Trading (/pyramid-trading)
## Introduction [#introduction]
Pyramid Trading is an advanced trade management feature that groups multiple trades sharing the same strategy name (comment) into a single coordinated position. Instead of managing each trade individually with its own take profit, the EA calculates a combined breakeven price and monitors a shared profit target. When the target is reached, all trades in the group close together.
The EA does NOT automatically open pyramid trades. Your signals or strategy sends the trades. The EA groups them by comment and manages exits as a unit. The EA's built-in controls (levels, DCA filter, direction lock, overlap) help structure how incoming trades are organized within the group.
Everything on this page operates on a **strategy group**, identified by the symbol plus the `comment=` value in your signal. Trades with different comments pyramid independently, and so does the same comment running on a different symbol. Read [Multiple Strategies](/strategies) before configuring pyramid trading.
Every trade added to a group increases your total position size. Because the group closes only at its shared target, a strategy that keeps adding trades while price moves against it builds a larger losing position. Set level limits and lot sizing with that in mind.
Before using pyramid trading, ensure you're comfortable with basic EA operations, understand the configuration parameters, and have tested the feature thoroughly on a demo account.
## Core Concepts [#core-concepts]
Trades on the same symbol with identical comments are treated as a single strategy. Matching is exact and case sensitive, so a stray space or a capitalisation difference creates a second group.
Incoming trades are organized into price-based "levels". Each level controls trade limits and lot sizing. Levels do not open trades, they filter and structure them.
The entire strategy exits together when the combined weighted-average breakeven price plus target distance is reached, ensuring coordinated profit-taking.
**Key features:**
When a second trade is added to a strategy, individual take-profits are removed and replaced with strategy-level targets.
Target calculations use volume-weighted average prices, ensuring fair profit distribution.
Each level can have different spacing, trade limits, and position sizes.
Strategy target lines are displayed on charts for real-time monitoring.
The TradeSgnl pyramid feature consists of two complementary sections. **Pyramid Management** controls overall strategy behavior (targets, exits, trailing), while **Pyramid Levels** controls entry structure (when and how new trades are added). Both sections work together to create sophisticated position scaling strategies.
## Activation and Setup [#activation-and-setup]
Pyramid trading can be controlled through three modes:
| Mode | Description | Activation Method |
| -------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Disabled | Feature completely disabled (default) | No pyramid functionality available. The `py` parameter is ignored. |
| Enabled | Always active using EA input settings | Every strategy group pyramids automatically. The `py` parameter is ignored, because it is not needed. |
| Signal | Controlled per-strategy via webhook signals | A strategy pyramids only if `py` was present on the **first** signal that opened it |
### Enabled versus Signal [#enabled-versus-signal]
Both modes use exactly the same pyramid settings from the EA inputs. The only difference is **which strategies get them**.
* **Enabled** applies pyramid management to every strategy group on the terminal, with no signal changes required. Use it when the terminal runs one strategy, or when every strategy should pyramid.
* **Signal** lets you choose. The `py` flag in the alert decides, per strategy, whether that group is pyramid managed. Use it when you run several strategies on one account and only some of them should pyramid.
**Signal mode example.** To enable pyramiding for a specific strategy when using Signal mode:
```
LicenseID,EURUSD,buy,risk=0.01,sl=50,tp=100,comment=TrendStrategy,py
```
The `py` parameter activates pyramid management for the `TrendStrategy` comment group. All subsequent trades with the same comment are managed as a unified pyramid strategy, whether or not they carry `py`.
### `py` is stamped on the strategy, not on the signal [#py-is-stamped-on-the-strategy-not-on-the-signal]
The EA reads `py` **only when it creates a new strategy group**. Once a group with that comment exists, the flag is not read again.
| Situation | Result |
| ------------------------------------------------------ | ------------------------------------------------ |
| First signal for a new comment carries `py` | The group is pyramid managed for its entire life |
| A later signal for the same comment carries `py` | No effect. It was already decided. |
| A later signal for the same comment **drops** `py` | No effect. Pyramid management stays on. |
| A later signal adds `py` to a group created without it | No effect. Pyramid management stays off. |
If a strategy is already running as a pyramid, taking `py` out of your alert changes nothing. The setting lives on the strategy group, and the group survives until **every** trade under that comment is closed. To stop pyramiding a live strategy, either close all of its positions and let the next signal recreate the group without `py`, or send the new trades under a different `comment=` value.
When starting with pyramid trading, use Signal mode to selectively enable it for specific strategies while you learn how it behaves with different market conditions and trade setups.
How comments define strategy groups
## Pyramid Management [#pyramid-management]
The Pyramid Management section controls the overall strategy behavior: how trades are grouped, when they exit, and how profits are calculated. These settings determine the "big picture" behavior of your pyramid strategies.
### Core Management Parameters [#core-management-parameters]
| Parameter | Function | Impact |
| ----------------------- | -------------------------------------- | ------------------------------------------------------------ |
| Pyramid Management | Main control (Disabled/Enabled/Signal) | Determines if and how pyramid features activate |
| Volume Calculation | How targets scale with position size | Initial = easier targets, Total = harder targets with growth |
| Pyramid Target | Profit target in pips for the strategy | Sets the exit distance from weighted breakeven |
| Enable Pyramid Trailing | Activates dynamic target adjustment | Allows targets to move favorably with price movement |
### Volume Calculation Methods [#volume-calculation-methods]
This is one of the most important settings as it determines how your Pyramid Target scales with position size:
| Method | How It Works | Best For |
| -------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| Initial Volume | Target based only on first trade size. Adding trades makes target easier to reach. | Conservative scaling. Maintains original risk/reward. |
| Total Volume | Target scales with combined volume. Larger pyramids need more price movement. | Proportional scaling. Maintains consistent risk across all trades. |
| Average Volume | Target based on average volume of all trades in the strategy. | Moderate scaling. Middle ground between other methods. |
The Volume Calculation method determines how the EA calculates the profit target for your pyramid strategy. This is crucial because it affects how difficult it becomes to reach your target as you add more trades. The EA uses the selected method to calculate a weighted target price that all trades in the strategy will exit at simultaneously.
Start with Initial Volume for conservative pyramid strategies. Use Total Volume when you want consistent risk/reward scaling as your pyramid grows.
### Trailing Management [#trailing-management]
These parameters control dynamic exit targets that move favorably with price:
| Parameter | Purpose | Typical Values |
| ----------------------- | ------------------------------------------------ | ------------------------------------------------ |
| Enable Pyramid Trailing | Activates dynamic target adjustment | false (static targets) / true (trailing targets) |
| Trailing Distance | How far behind favorable price the target trails | 15-25 pips (adjust for instrument volatility) |
| Trailing Step | Minimum price movement before target adjusts | 5-10 pips (smaller = more frequent adjustments) |
Trailing Management allows your pyramid's exit target to move dynamically with favorable price movement, protecting profits while still allowing for additional gains. When enabled, instead of a fixed target price, the EA maintains a target that "trails" behind the most favorable price by a specified distance. This means if price moves strongly in your favor, your exit target moves up with it, but if price retraces, the target stays at the best level achieved.
**How it works.** The EA monitors the most favorable price reached and maintains the target at \[Best Price - Trailing Distance]. The target only moves favorably, it never moves against you. The Trailing Step prevents excessive updates by only moving the target when price has moved at least that distance.
### Entry Control Features [#entry-control-features]
Additional controls that affect how and when new pyramid entries are allowed:
| Parameter | Function | Behavior |
| -------------------------- | -------------------------------------------------- | ---------------------------------------------------------------- |
| Direction Lock | Restricts all trades to same direction | Prevents mixing buy and sell trades within same strategy |
| Separate Buy/Sell Pyramids | Manages buy and sell positions independently | Creates separate targets for each direction within strategy |
| DCA Filter | Only allows entries at better prices than previous | BUY: new entries must be LOWER. SELL: new entries must be HIGHER |
Entry Control Features provide sophisticated filters and rules that govern when and how new trades can be added to your pyramid strategy. These features help maintain strategy coherence and implement specific trading methodologies.
**Direction Lock** ensures all trades in a strategy move in the same direction. Once you have a BUY trade, only additional BUY trades are allowed. **Separate Buy/Sell Pyramids** treats BUY and SELL trades as independent strategies even with the same comment, each with their own targets. **DCA Filter** implements dollar-cost averaging by only allowing new entries at better prices than previous trades, ensuring each addition improves your average entry price.
Direction Lock and DCA Filter act on **pyramid-managed strategy groups only**. If Pyramid Management is Disabled, or the group is running under Signal mode without `py`, both filters are skipped and the trade goes through on its own merits. They are also comment scoped, so within a pyramid strategy they compare a new entry only against trades sharing its symbol and comment. Enable them per terminal in the EA inputs, then decide per strategy by whether that strategy pyramids at all.
### Profit Overlap System [#profit-overlap-system]
Advanced risk management using profits from closed trades to fund new entries:
| Parameter | Function | Example |
| ----------------- | --------------------------------------- | -------------------------------------------------- |
| Overlap Threshold | Minimum trades before overlap activates | 3 = feature activates after 3rd trade in strategy |
| Overlap Profit % | Percentage of closed profits to use | 50% = use half of previous profits for risk offset |
The Profit Overlap System is an advanced risk management feature that uses profits from winning trades within a strategy to offset losses from losing trades. This creates a dynamic "profit buffer" that can help sustain longer-term strategies even when some individual trades go against you.
**How it works.** Once your strategy reaches the Overlap Threshold number of trades, the EA monitors for profitable trades. When a profitable trade is closed, a percentage of its profit (set by Overlap Profit %) is allocated to offset losses from other trades in the same strategy. This effectively allows you to "reinvest" profits to support the overall strategy's success.
Overlap is most effective in trending markets where early entries generate profits that can fund later entries at less favorable prices.
## Pyramid Levels [#pyramid-levels]
The Pyramid Levels section controls the entry structure: when new trades are added, at what price levels, with what position sizes, and how many trades per level. These settings determine the "entry mechanics" of your pyramid strategies.
### Level Structure Parameters [#level-structure-parameters]
These settings control the basic framework of how levels are spaced and how many trades can be placed at each level:
| Parameter | Function | Impact on Strategy |
| --------------------- | ----------------------------------------- | ------------------------------------------------------------- |
| Level Size | Base distance in pips between levels | Determines how often new entry opportunities arise |
| Level Size Multiplier | Increases level distance at higher levels | Creates wider spacing as price moves further from entry |
| Trade Limit Per Level | Maximum trades allowed at each level | Controls how many positions can be opened at each price level |
| Lot Size Multiplier | Increases position size at higher levels | Makes trades larger as they move further from initial entry |
Level Structure Parameters define the fundamental architecture of your pyramid: how far apart price levels are, how many trades can be placed at each level, and how these parameters evolve as you move further from your initial entry. The EA uses these settings to determine when new entry opportunities arise and how aggressive your scaling becomes.
**Level Size** sets the base pip distance between levels. **Level Size Multiplier** progressively increases this distance at higher levels (e.g., 1.5x means level distances grow: 20, 30, 45, 67.5 pips). **Trade Limit Per Level** caps how many positions can be opened at each price level, while **Lot Size Multiplier** scales position sizes larger as levels increase.
### Level Calculation Logic [#level-calculation-logic]
The EA continuously monitors price movement and calculates which "level" the current price represents relative to your strategy's initial entry. Levels do NOT open trades. They control trade limits and lot sizing for incoming signal trades at each price zone.
**Understanding the progression.** Level 0 is your initial entry area. When price moves AGAINST your position by the Level Size distance, the level increases (Level 1, 2, 3, etc., deeper drawdown). When price moves back IN FAVOR, levels decrease back toward 0. Each time a new level is reached, the EA resets its reference price.
* **Level 0:** Around entry price (initial trade area).
* **Unfavorable movement:** When price moves AGAINST your position, level increases (Level 1, 2, 3...), deeper drawdown zones.
* **Favorable movement:** When price moves WITH your position, level decreases back toward 0.
* **Trade filtering:** If a level's trade limit is reached, new signal trades at that price zone are rejected (error 6003).
### Position Sizing Control [#position-sizing-control]
These parameters determine how position sizes scale as you move to higher levels in your pyramid:
| Parameter | Effect | Example (1.5x multiplier) |
| ------------------------- | -------------------------------------------------- | ------------------------------------------------- |
| Multiply All Level Trades | Applies lot multiplier to all trades at same level | false = only first trade at level gets multiplier |
| Lot Size Multiplier | Factor to increase lot sizes at each level | Level 0: 0.1, Level 1: 0.15, Level 2: 0.225 lots |
Position Sizing Control manages how your trade volumes scale across different pyramid levels. This is crucial for risk management and determines whether your pyramid becomes more aggressive or maintains consistent exposure as you add trades.
**Lot Size Multiplier** increases position sizes at each level (e.g., 1.5x means: Level 0 = 0.1 lots, Level 1 = 0.15 lots, Level 2 = 0.225 lots). **Multiply All Level Trades** determines whether this multiplier applies to all trades at a level or just the first trade. When enabled, if you have 3 trades at Level 1, all three get the 1.5x multiplier.
### Progressive Limit Management [#progressive-limit-management]
Advanced feature that allows more aggressive pyramiding by automatically increasing the number of allowed trades at specified level intervals:
| Parameter | Purpose | Configuration Example |
| -------------------- | ------------------------------------- | ----------------------------------- |
| Trade Limit Increase | Amount to add to trade limit | 1 = add one more trade to the limit |
| Limit Increase After | Level interval for applying increases | 3 = increase limit every 3 levels |
Progressive Limit Management automatically increases the number of trades allowed at each level as your pyramid grows larger. This creates a system where higher levels (further from initial entry) can accommodate more trades, allowing for increasingly aggressive scaling when markets move against your position.
**How to configure.** Set **Trade Limit Increase** to how many additional trades you want to allow, and **Limit Increase After** to the level interval. For example, with Trade Limit = 2, Increase = 1, After = 3 levels, you get: Levels 0-2 allow 2 trades each, Levels 3-5 allow 3 trades each, Levels 6-8 allow 4 trades each, and so on. This creates a progressive scaling strategy that becomes more aggressive at extreme levels.
**Example configuration:**
* Trade Limit Per Level: 2
* Trade Limit Increase: 1
* Limit Increase After: 3 levels
**Result:** Levels 0-2 (2 trades), Levels 3-5 (3 trades), Levels 6-8 (4 trades), etc.
Start with simple level settings: Level Size = 15-20 pips, Trade Limit = 2-3 per level, Lot Multiplier = 1.0 (no scaling). Test thoroughly before adding complexity like level multipliers or progressive limits.
**Configuration flow:** First configure Pyramid Management (overall strategy behavior), then configure Pyramid Levels (entry mechanics). The Management section defines "what happens when targets are reached" while the Levels section defines "when and how new trades are added."
**Example:** Pyramid Management sets a 40-pip target with Total Volume calculation and trailing enabled. Pyramid Levels sets 15-pip spacing with 2 trades per level and 1.5x lot multiplier. Result: a sophisticated scaling system that builds positions every 15 pips with increasing sizes, exits all trades together at a 40-pip weighted target, and trails the target if price moves favorably.
## Practical Examples [#practical-examples]
### Example 1: DCA (Dollar Cost Averaging) Pyramid [#example-1-dca-dollar-cost-averaging-pyramid]
**Setup:** EURUSD, your strategy sends 3 BUY signals at different prices. Pyramid Target: 50 pips, DCA Filter: On, Volume Calc: Average Volume.
| Event | Price | Trades in Group | Breakeven | Target |
| ------------------- | ------ | --------------- | --------- | -------------- |
| Signal: BUY 0.1 lot | 1.1000 | 1 trade | N/A | N/A (needs 2+) |
| Signal: BUY 0.1 lot | 1.0970 | 2 trades | 1.0985 | 1.1035 |
| Signal: BUY 0.1 lot | 1.0940 | 3 trades | 1.0970 | 1.1020 |
**Result:** All 3 trades close together when price reaches the combined target (breakeven + 50 pips). The DCA filter ensured each entry was at a lower (better) price.
### Example 2: Counter-Trend Recovery Pyramid [#example-2-counter-trend-recovery-pyramid]
**Setup:** GBPUSD short position moving against, Level Size: 25 pips, Initial Volume calculation.
| Entry | Price | Level | Individual P\&L | Strategy Target |
| ------------- | ------ | ----- | --------------- | --------------- |
| Initial Short | 1.3000 | 0 | -25 pips | 1.2970 |
| Add Short | 1.3025 | 1 | +5 pips | 1.2970 |
| Add Short | 1.3050 | 2 | +30 pips | 1.2970 |
**Result:** Despite first trade being -25 pips, overall strategy profits when price reaches 1.2970 due to volume-weighted targeting.
## Troubleshooting [#troubleshooting]
| Issue | Possible Cause | Solution |
| ----------------------------------------------------------- | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Trades not grouping into pyramid | Comment strings don't match exactly | Ensure all trades have identical comments. Check for spaces, capitalization, special characters. See [Multiple Strategies](/strategies). |
| Pyramid keeps running after `py` was removed from the alert | `py` is read only when the strategy group is created, then stamped on the group | Close every position under that comment, or move the strategy to a new comment. Removing `py` alone has no effect. |
| Adding `py` does not enable pyramid on a live strategy | Same stamping rule, in the other direction | Close the group first so the next signal recreates it with `py`. |
| Individual TPs disappear after 2nd trade | Normal pyramid behavior | This is expected. Pyramid manages exits at strategy level. Check chart for strategy target lines. |
| Target seems unreachable | Total Volume calculation with large pyramid | Switch to Initial Volume or Average Volume calculation method. |
| New trades rejected at level | Trade limit per level reached | Increase Trade Limit Per Level or enable progressive limit increases. |
| Levels not progressing correctly | Level Size too large for market movement | Reduce Level Size to match typical price movements for the instrument. |
| Trailing exits too early | Trailing Distance too small | Increase Trailing Distance to give trades more breathing room. |
| No new entries when DCA Filter enabled | Price hasn't moved to better entry level | DCA Filter only allows entries at better prices than previous entries. This is normal behavior. |
| Pyramid not activating with signals | Missing `py` parameter or wrong control mode | Ensure Pyramid Management is set to Signal mode and include `py` in the signal that **opens** the strategy. |
Always test pyramid configurations thoroughly on demo accounts. Start with small position sizes and conservative level settings. Monitor how different market conditions affect your pyramid strategies before increasing risk.
For complete parameter references and additional configuration options, see the [Configuration Guide](/configuration).
# Quick Start (/quick-start)
## Introduction [#introduction]
TradeSgnl turns TradingView alerts into live trades on your broker account. This guide walks you from a fresh account to your first executed signal.
**Time required** about **5 minutes** end to end.
**Before you start, you'll need two things:**
* **A paid TradeSgnl plan.** Concurrent connections scale with tier (Starter: 1, Advanced: 3, Professional: 10). [Open the portal](https://portal.tradesgnl.com/login) to pick a plan.
* **A TradingView account.** On a paid TradingView plan, alerts reach TradeSgnl by webhook (free-trial users on a paid tier can send webhook alerts during the trial). On a free plan, install the [TradeSgnl Chrome extension](/tradingview-ai), turn on **Forward alerts to TradeSgnl** in its menu, and keep TradingView open: the extension sends your alerts to TradeSgnl the moment they fire. [Check TradingView plans](https://www.tradingview.com/gopro/).
Click **Sgnl AI** at the top of the portal and ask. It can see your accounts and signals, so it can tell you exactly what's missing. See [Sgnl AI](/ai-assistant).
You can also run the EA in your own MetaTrader 5 install. Full manual setup (Windows requirements, file placement, DLL imports) lives on the [EA Setup](/setup) page.
## Account Connection [#account-connection]
On your portal Connections page, click **Connect Account**, pick the license this account will run on, and click **Next step**. Then choose your platform below.
A dedicated cloud terminal is provisioned for each account with the EA pre-installed and authenticated. No download, no DLL toggle, no chart configuration.
**Choose MetaTrader 5.** Select **MetaTrader 5** and click **Next step**.
**Enter your broker account.** Fill in your **Trading Account Number**, **Trading Account Password**, and **Broker Server Name** (for example, `ICMarkets-Demo03`). The server field searches as you type.
**Go live.** Click **Connect**. We prepare your cloud terminal, sign in to your broker, attach the EA, and confirm the connection. This usually finishes in under two minutes, so keep the window open until it does.
The terminal password is not stored and cannot be retrieved later. If you lose it, you can reset it from the terminal card.
**Connected successfully.** A healthy connection shows an **MT5 Cloud** chip in the card header, live **balance** and **equity**.
[View the full MT5 Cloud guide](/cloudconnect)
Sign in with your cTrader ID. Nothing to install, and your password stays with cTrader.
**Sign in with cTrader.** Choose **cTrader** and click **Sign in with cTrader**.
**Allow access.** A cTrader window opens. Sign in with your cTrader ID, tick the accounts TradeSgnl may trade, and click **Allow access**. Accounts from every broker under that cTrader ID are listed together.
**Pick your accounts.** Back in the portal, tick the accounts you want to trade and click **Connect**. Each one appears on your dashboard as its own card within a few seconds.
[View the full cTrader guide](/ctrader)
Works with brokers and prop firms that use TradeLocker. Nothing to install.
**Choose TradeLocker.** Select **TradeLocker** and click **Next step**.
**Sign in to TradeLocker.** Choose **Demo** or **Live**, enter the email and password you use for TradeLocker and your server, then click **Sign in**. Use your email, not your account number.
**Pick your accounts.** Tick the accounts you want to trade and click **Connect**. Each one appears on your dashboard as its own card.
[View the full TradeLocker guide](/tradelocker)
Binance, Bybit and OKX spot accounts, connected with an API key. Start on a testnet key if you want to practise first.
**Choose your exchange.** Select **Crypto Exchange**, pick your exchange, and click **Next step**.
**Create an API key on the exchange.** Allow spot trading only, never withdrawals, and restrict the key to TradeSgnl's IP address, **209.71.64.114**. The full guide has the details for each exchange.
**Enter the key.** Paste the key and secret (and the passphrase on OKX), switch on **Testnet** if it's a testnet key, and click **Connect**.
[View the full crypto exchanges guide](/crypto-exchanges)
MetaTrader 5 is included on every paid plan. cTrader, TradeLocker and crypto exchanges are included from Starter upwards.
## Test Signal [#test-signal]
Before touching TradingView, confirm your account can receive signals. The **Syntax Generator** in the portal has a one-click **Send** button that bypasses TradingView entirely, so you can isolate any issues immediately.
**Open the Syntax Generator.** In the portal, open **Tools → Syntax Generator**.
Open Syntax Generator
**Fill the minimum fields.** Pick your **License**, type a **Symbol** (`BTCUSD` is a safe default, since it trades 24/7), choose **Buy** as the action, and set **Risk** to `0.01`.
**Click Send.** On the **ENTRY** row of the preview box (blue border), click **Send**. The portal sends the signal straight to your account.
Your license and account are working. Close the trade manually when you're done. Anything that fails after this point is on the TradingView side, not the TradeSgnl side.
Full Syntax Generator guide
## TradingView Alert [#tradingview-alert]
Once Send works, let the TradeSgnl extension set up TradingView for you. It works on any chart: it picks your signal preset, writes the alert message, creates the alert with the webhook already filled in, and checks your broker settings.
**Install the extension.** Add TradeSgnl to Chrome (or Edge, Brave or Arc) from the Chrome Web Store and pin it to your toolbar.
Install Extension
**Open it on your chart.** Open the chart you want to automate on tradingview\.com, click the TradeSgnl icon, and sign in with your TradeSgnl account.
**Run the automation workflow.** Type `/` in the side panel and choose the chart automation workflow. It walks you through each choice and finishes with a card showing the alert it created. Click it to check the alert in TradingView.
Use a tiny size (`risk=0.01`) for your first live alert. Once you've confirmed it trades, scale up.
Full TradingView AI guide
### Manual Setup [#manual-setup]
Prefer not to use the extension? Build the message in the Syntax Generator and paste it into a TradingView alert yourself.
**Generate your alert message.** Back in the Syntax Generator, configure your real strategy (symbol, action, risk, optional SL/TP). Then click the **Copy** button on the Entry preview, or click **Custom Strategy Message** if you're attaching this to a Pine Script strategy that was not built for TradeSgnl. Not sure which? See [Which Alert Message to Use](/syntax-generator#which-alert-message-to-use).
**Create the alert in TradingView.** Open any chart and create a new alert. Use your strategy's trigger conditions.
**Paste the message.** In the **Message** field, paste what you copied from the Syntax Generator.
**Set the webhook URL.** In the **Notifications** tab, enable **Webhook URL** and paste:
```
https://webhook.tradesgnl.com
```
Use a tiny risk value (`risk=0.01`) for your first live alert. Once you've confirmed it executes, scale up.
## Telegram Signals [#telegram-signals]
If your signals come from a Telegram channel instead, the [Telegram Copier](/telegram-copier) reads each new message, turns it into a trade, and sends it to the account you just connected. No TradingView alert needed.
**Connect Telegram.** In the portal, open **Telegram Copier**, click **Connect Telegram**, and scan the QR code from **Settings → Devices → Add Device** in your Telegram app.
**Pick a channel.** Click **Monitor a channel** and choose any channel or group you're subscribed to. Use **Preview** to look at its recent messages first.
**Check the parsing and save.** Choose the license that should receive the signals, confirm the preview reads symbol, direction, stop loss and take profits correctly, and save. New messages in that channel now trade automatically.
Set a small default volume on the channel at first, and watch a few signals land on the **Signals** page before you scale up.
Full Telegram Copier guide
## Next Steps [#next-steps]
Now that the basics are wired up, explore what else TradeSgnl can do:
Every signal option: multiple take profits, trailing stops, sizing and more.
Analyze charts, manage alerts and automate strategies from the side panel.
Get notified in the app, on your phone, by email or on Telegram when a trade fails or an account disconnects.
# Recovery System (/recovery-system)
## Introduction [#introduction]
The Recovery System is an advanced feature that automatically adds positions to losing trades when price moves against you. By opening additional trades in the same direction at better prices, the system reduces your average entry price and helps you achieve profitability even when your initial trade doesn't perform as expected.
Recovery trading significantly increases your position size and market exposure. Each recovery trade is larger than the previous one, which can lead to substantial losses if the market continues moving against you. This feature is only recommended for experienced traders who understand position sizing and risk management.
Before using recovery, ensure you understand how averaging down works, have tested the feature on demo accounts, and never risk more than you can afford to lose. Always start with minimum position sizes when first testing recovery.
## Core Concepts [#core-concepts]
When your trade moves against you, recovery automatically opens additional positions at better prices to lower your overall entry point.
Each recovery trade uses a larger position size than the previous one, helping you reach profitability faster when the market eventually turns.
All recovery trades are managed together with a single profit target calculated from your improved average entry price.
**Key Benefits:**
Recovery trades at better levels reduce your average cost basis.
Larger position sizes help you reach profit with smaller market retracements.
The EA handles timing, sizing, and exit management without manual intervention.
You control maximum number of recovery trades and spacing between levels.
## Activation and Setup [#activation-and-setup]
Recovery can be activated in two ways: globally through the EA settings or selectively through signal parameters. This flexibility allows you to apply recovery to all trades or only to specific opportunities that you identify.
| Mode | Description | How to Use |
| -------- | ------------------------------------- | ------------------------------------------------------ |
| Disabled | Feature completely disabled (default) | No recovery trades will be placed |
| Enabled | Always active using EA settings | All trades will use recovery when conditions are met |
| Signal | Activated only by signal parameter | Add `re` parameter to signals that should use recovery |
**Signal Control Example:** To enable recovery for a specific trade, add the `re` parameter to your signal. The fastest way is the **Syntax Generator**: switch on **Recovery** under the entry fields, and the `re` flag is added to every generated signal automatically.
Open the Syntax Generator
If you do build the signal by hand, the format is:
```
LicenseID,EURUSD,buy,risk=0.01,sl=50,tp=100,comment=MyStrategy,re
```
When recovery is enabled globally (Enabled mode), it applies to ALL trades. When using Signal mode, only trades with the `re` parameter will use recovery, giving you precise control over which trades get this feature.
Recovery is decided **for each trade individually**, every time a signal arrives. Add `re` and that trade gets recovery, leave it off and that trade does not, even for trades in the same strategy. This is the opposite of the pyramid flag `py`, which is read once when the strategy group is created and then applies to the whole group until it closes. See [Multiple Strategies](/strategies) for the full list of sticky versus per signal parameters.
**Recovery trade naming.** Recovery positions are opened with your strategy comment plus ` Recovery`, for example `MyStrategy Recovery`. Because of that suffix, avoid putting the word `Recovery` in your own strategy comments: the EA treats any group whose comment contains it as a recovery batch and will never open hedge protection for it.
## Recovery Management [#recovery-management]
The Recovery Management section contains seven settings that control how the recovery system operates. Understanding these settings helps you customize the system to match your risk tolerance and trading strategy.
| Setting | What It Does | Recommended Values |
| ------------------- | ---------------------------------------------- | ----------------------------------------------------------- |
| Recovery Management | Controls when recovery is active | Disabled (safe) / Enabled (all trades) / Signal (selective) |
| Volume Calculation | How profit target is calculated | Initial Volume (simpler) / Average Volume (balanced) |
| Maximum Trades | Limits total recovery trades per position | 1-3 for beginners, 2-5 for experienced traders |
| Initial Distance | Pips to wait before first recovery trade | 20-30 pips for scalping, 40-60 pips for swing trading |
| Distance Multiplier | How much farther each recovery trade is placed | 1.0 (equal spacing) to 2.0 (increasing spacing) |
| Lot Multiplier | How much larger each recovery trade becomes | 1.5-2.0 for moderate risk, 2.0-3.0 for aggressive |
| Recovery Target | Profit target in pips for all trades combined | 5-15 pips for quick exits, 20-50 pips for larger gains |
### How Recovery Activation Works [#how-recovery-activation-works]
Understanding when recovery trades are placed helps you set appropriate parameters:
1. **Initial Trade Placed.** Your original trade is opened based on your signal or strategy.
2. **Price Moves Against You.** Market price moves in the opposite direction to your trade.
3. **Distance Threshold Reached.** When price moves beyond your Initial Distance setting, recovery activates.
4. **First Recovery Trade.** EA opens a larger position in the same direction at the current (better) price.
5. **Additional Recoveries.** If price continues against you, more recovery trades are placed at increasing distances.
6. **Unified Exit.** All trades close together when the combined position reaches your profit target.
**Key Point:** Recovery trades are always placed in the same direction as your original trade. If you bought EURUSD and it drops, recovery will buy more at lower prices to improve your average.
### Understanding Position Size Growth [#understanding-position-size-growth]
The lot multiplier determines how much larger each recovery trade becomes. Here are common scenarios:
| Original Trade | Lot Multiplier | Recovery Sizes | Total Exposure |
| -------------- | -------------- | --------------------- | ----------------------- |
| 0.10 lots | 1.5x | 0.15, 0.23, 0.34 lots | 0.82 lots (8.2x bigger) |
| 0.10 lots | 2.0x | 0.20, 0.40, 0.80 lots | 1.50 lots (15x bigger) |
| 0.10 lots | 2.5x | 0.25, 0.63, 1.56 lots | 2.54 lots (25x bigger) |
Position sizes grow exponentially with each recovery trade. With a 2.0 lot multiplier and 3 recovery trades, your final position will be 15 times larger than your initial trade. Always calculate your maximum possible exposure before enabling recovery.
### Profit Target Calculation Methods [#profit-target-calculation-methods]
The Volume Calculation setting affects how your profit target is calculated:
| Method | How It Works | Best For |
| -------------- | ------------------------------------------ | ------------------------------------------- |
| Initial Volume | Target based only on your first trade size | Beginners. Easier to reach, faster exits |
| Average Volume | Target based on average of all trade sizes | Experienced traders. More balanced approach |
**Example:** With a 10-pip target and Initial Volume method, you need only $10 profit per lot of your original trade. With Average Volume method, you need $10 profit per lot of the average position size across all trades.
## Practical Examples [#practical-examples]
### Example 1: Conservative Recovery Strategy [#example-1-conservative-recovery-strategy]
**Scenario:** You buy EURUSD but price starts dropping. Conservative recovery settings help limit risk.
| Trade | Price Level | Position Size | What Happened |
| ----------- | ----------- | ------------- | ---------------------------------------------- |
| Initial BUY | 1.2000 | 0.10 lots | Original signal execution |
| Recovery 1 | 1.1970 | 0.15 lots | Price dropped 30 pips, first recovery |
| Recovery 2 | 1.1940 | 0.23 lots | Price dropped another 30 pips, second recovery |
**Settings Used:** Max Trades: 2, Initial Distance: 30 pips, Distance Multiplier: 1.0, Lot Multiplier: 1.5, Recovery Target: 15 pips.
**Result:** Average entry price is now \~1.1977. If price recovers to just 1.1992 (15 pips from average), all trades close with profit despite being 8 pips below the original entry.
### Example 2: How Recovery Saves a Bad Trade [#example-2-how-recovery-saves-a-bad-trade]
**Your Trading Situation:** You sold GBPUSD expecting it to fall, but it keeps rising against you.
**Without Recovery:**
* Sold 0.20 lots at 1.3000
* Price rises to 1.3100 (100 pips against you)
* You're facing a significant loss
* Need price to drop all the way back to 1.3000 to break even
**With Recovery System:**
* Original: SELL 0.20 lots at 1.3000
* Recovery 1: SELL 0.30 lots at 1.3040 (40 pips up)
* Recovery 2: SELL 0.45 lots at 1.3080 (another 40 pips)
* Your average entry is now \~1.3052
* Need price to drop only to 1.3037 for 15-pip profit target
**The Recovery Advantage:** Instead of needing a 100-pip reversal to break even, you now need only a 63-pip drop (from 1.3100 to 1.3037) to achieve profit. The recovery system turned a potential disaster into a manageable situation.
### Example 3: When Recovery Reaches Maximum Trades [#example-3-when-recovery-reaches-maximum-trades]
**Scenario:** A strong trend against you reaches your maximum recovery limit. What happens next?
| Stage | Price Movement | EA Action | Your Options |
| ------------------ | ------------------------------- | ------------------------------------------- | ------------------------------------------------- |
| Max Trades Reached | Price continues against you | No more recovery trades placed | Wait for reversal or manually manage position |
| Price Stabilizes | Market stops moving against you | All trades remain open, monitoring for exit | Patient wait for target or reduce target manually |
| Market Reverses | Price moves back in your favor | Automatic exit when profit target reached | Let system handle exit or take manual profit |
**Important:** Once you reach your maximum number of recovery trades, the EA stops adding positions. Your existing trades will remain open and close together when the profit target is reached, but no additional recovery will occur.
## Troubleshooting [#troubleshooting]
Common questions and solutions when using the recovery system.
| Question/Problem | Why This Happens | How to Fix It |
| ----------------------------------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| My trade is losing but no recovery opened | Distance threshold not reached or feature disabled | Check Recovery Management is "Enabled" and reduce Initial Distance if needed (try 20-30 pips). |
| Recovery trades seem too small | Lot Multiplier set too low | Increase Lot Multiplier to 1.5-2.0 for more recovery power. Remember this increases risk. |
| Profit target never reached | Target too high or market trend too strong | Reduce Recovery Target to 5-15 pips or switch to Initial Volume calculation method. |
| Too many recovery trades placed | Maximum Trades set too high | Reduce Maximum Trades to 1-3. Start conservative and increase gradually with experience. |
| Position size grew too large | Lot Multiplier creating exponential growth | Use smaller Lot Multiplier (1.2-1.5) or reduce Maximum Trades. Always calculate total exposure first. |
| Recovery only works on some trades | Using Signal mode but not all signals have `re` parameter | Either switch to "Enabled" mode for all trades or ensure `re` is added to signals needing recovery. |
| Stop loss hit before recovery could help | Initial Distance larger than Stop Loss distance | Set Initial Distance smaller than your Stop Loss distance, or remove SL to let recovery work. |
| All trades closed unexpectedly | Profit target reached, this is normal operation | This is correct behavior. If target seems too low, increase Recovery Target setting. |
* Always test recovery thoroughly on demo accounts before live trading.
* Start with minimum position sizes. Recovery can multiply your exposure by 10-20x.
* Calculate your maximum possible loss before enabling recovery.
* Consider removing stop losses when using recovery to give the system time to work.
* Never use recovery on money you cannot afford to lose completely.
For complete parameter references and additional configuration options, see the [Configuration Guide](/configuration).
# REST API (/rest-api)
## Introduction [#introduction]
Every tool the [MCP server](/mcp-server) offers is also a plain JSON endpoint under `https://portal.tradesgnl.com/api/v1/`. Use it from a spreadsheet, a WordPress table plugin, a cron job or your own code.
The REST API is part of [TradeSgnl Cloud](/cloudconnect#part-of-tradesgnl-cloud), included on the Advanced and Professional plans.
The full list of endpoints, parameters and response shapes is published as an OpenAPI document at `https://portal.tradesgnl.com/openapi/v1.json`. Postman, Insomnia or any OpenAPI client can be pointed at that URL directly. This page is the shorter path: what the data looks like, how to send a signal, and a few ready-made recipes.
## Authentication [#authentication]
Create a key in the portal under **API & MCP Server** > **API Keys** (it begins with `tsk_` and is shown once), then send it as a Bearer token on every request:
```bash
curl "https://portal.tradesgnl.com/api/v1/signals?limit=20" \
-H "Authorization: Bearer tsk_YOUR_KEY"
```
A key is read-only unless you enabled trading when you created it. You can also cap the lot size and restrict the symbols a key may trade; those limits are enforced before anything reaches your accounts, and you can change or revoke them at any time.
## Endpoints [#endpoints]
| Method and path | What it does |
| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /api/v1/signals` | Signal log, most recent first (`symbol`, `command`, `limit`, `offset`, `date_from`, `date_to`, `include_deliveries`) |
| `GET /api/v1/deliveries` | Per-account delivery status (`signal_id`, `status`, `limit`, `offset`, `date_from`, `date_to`) |
| `GET /api/v1/clients` | Your accounts, connected first (`status`) |
| `GET /api/v1/clients/settings` | EA input values of one account (`client_id`) |
| `GET /api/v1/analytics` | Balance and equity per account, as of the EA's last report (`client_id`) |
| `POST /api/v1/analytics/refresh` | Make the EA upload a fresh report and wait for it (`client_id`) |
| `GET /api/v1/live/account` | Live balance, equity, margin, open positions, pending orders and trading permissions from a Cloud Terminal (`client_id`) |
| `GET /api/v1/live/history` | Closed trades, realized P\&L and unfilled orders over the last hours, from a Cloud Terminal (`client_id`, `hours`, `limit`) |
| `GET /api/v1/live/calc` | Margin and profit of a hypothetical order, computed by the broker's terminal (`client_id`, `symbol`, `side`, `volume`, `price_open`, `price_close`) |
| `GET /api/v1/live/logs` | MT5 journal or Experts log lines from a Cloud Terminal (`client_id`, `source`, `lines`, `contains`) |
| `GET /api/v1/trades` | Positions for one account, from its last uploaded report (`client_id`, `limit`, `offset`, `date_from`, `date_to`) |
| `GET /api/v1/performance` | Performance metrics (`client_id`) |
| `GET /api/v1/performance/breakdowns` | Breakdowns by symbol, direction, strategy, day (`client_id`, `breakdown_type`, `date_from`, `date_to`) |
| `GET /api/v1/backtests` | Backtest results (`symbol`, `limit`) |
| `GET /api/v1/alerts` | Alert history (`alert_type`, `limit`, `offset`, `date_from`, `date_to`) |
| `GET /api/v1/alerts/preferences` | Alert preferences |
| `GET /api/v1/subscription` | Your plan and connection counts |
| `GET /api/v1/copiers` | Your Trade Copiers and whether each is copying |
| `GET /api/v1/copiers/activity` | Copied trades of one Trade Copier (`copier_id`, `status`, `limit`, `offset`, `date_from`, `date_to`) |
| `GET /api/v1/licenses` | Your licences, each with the accounts that run under it |
| `GET /api/v1/presets` | Saved signal presets |
| `GET /api/v1/docs/search` | Search this documentation (`query`) |
| `GET /api/v1/market/symbols` | Broker symbol catalog (`client_id`, `query`) |
| `GET /api/v1/market/symbol` | Contract specification of one symbol: contract size, tick value, lot step, swaps (`client_id`, `symbol`) |
| `GET /api/v1/market/candles` | Live candles from 1 minute to monthly, with paging (`client_id`, `symbol`, `interval`, `count`, `before`) |
| `GET /api/v1/market/quote` | Live bid, ask, last and tick time (`client_id`, `symbol`) |
| `GET /api/v1/market/quotes` | Live quotes for up to 50 symbols in one call (`client_id`, `symbols`) |
| `GET /api/v1/market/ticks` | Tick history for one symbol, with paging (`client_id`, `symbol`, `from`, `count`) |
| `GET /api/v1/analyst/report` | Run the Market Analyst (`client_id`, `symbol`, `style`). Spends AI credits |
| `POST /api/v1/signals` | Send a trade signal. Needs a key with the trade permission |
Query parameters map one to one onto the tool inputs; numbers and booleans are read from the query string. The `live/*` and `market/*` endpoints and `analyst/report` read from the account's Cloud Terminal, so `client_id` must be an account that has one running; it can be left out when exactly one of your accounts qualifies.
## Reading the data [#reading-the-data]
Account figures come from the EA's periodic report, not a live read: `analytics`, `trades` and `performance` carry a `reported_at` (and `trades` a `report_age_minutes`). For numbers right now there are two paths. The `live/*` endpoints read straight from the account's Cloud Terminal (see [Live account data](#live-account-data)). `POST /api/v1/analytics/refresh` makes the EA upload a fresh report, waits up to 20 seconds for it to land, and returns the new `reported_at`; one refresh per account per minute.
List endpoints take `limit` (up to 50) and `offset` for paging and `date_from` / `date_to` as `YYYY-MM-DD`, both inclusive, and return the newest rows first. Signals and deliveries are kept for 30 days. Trade history in `trades` is not pruned. Every response is a JSON object; lists sit under a named key (`signals`, `clients`, `trades`, ...) alongside counts such as `returned` and `offset`.
Numbers on a signal (`volume`, `sl`, `tp`) come with a `units` object that says how to read them, because the same field can hold lots or a percent of balance, pips or a price, depending on how the signal was written. `params` holds every parameter exactly as it was sent. Error codes on signals, deliveries and alerts come with an `error_message` that spells out what the code means.
A signal with its per-account deliveries, from `GET /api/v1/signals?limit=1&include_deliveries=true`:
```json
{
"signals": [
{
"id": "BEIJ9",
"license_code": "1234567890",
"symbol": "EURUSD",
"command": "buy",
"volume": 0.1,
"sl": 30,
"tp": 60,
"comment": "Strategy1",
"error": null,
"error_message": null,
"timestamp": "2026-09-09T00:40:59.8+00:00",
"source": "mcp",
"params": { "vol_lots": 0.1, "sl_pips": 30, "tp_pips": 60, "comment": "Strategy1" },
"units": { "volume": "lots", "sl": "pips", "tp": "pips" },
"deliveries": [
{
"client_id": "ICM12345678",
"status": "executed",
"error": null,
"error_message": null,
"created_at": "2026-09-09T00:41:00.2+00:00",
"ticket": 987654321
}
]
}
],
"returned": 1,
"offset": 0
}
```
A signal produces one delivery per account. The `status` says what that account did:
* `executed`: the account carried the signal out. An entry's row carries its `ticket`: the position ticket, or the order ticket for a pending order. A close, cancel or modify carries a `note` such as "Closed 2 positions" or "Nothing to close", and no ticket.
* `failed`: nothing was placed, or a close or modify only partly succeeded. In the partial case the `note` gives how many were done out of how many, and `error` is the broker's code.
* `rejected`: the account refused the signal, and `error_message` says why. A modify that matches nothing is `rejected` with code `6019`. An entry held by the EA's news filter and then dropped is `rejected` with code `6023`.
* `received`: the account got the signal but reported no outcome. An EA older than 0.74 reports nothing more for closes, cancels and modifies, so treat it as delivered, not as proof a trade opened. An entry queued by the EA's news filter also reads `received` while it waits. A `received` delivery that carries a `ticket` did open that order.
* `unknown`: the account reported a status the server did not recognise. Treat it as unconfirmed.
`ticket` is the broker's ticket for the position an entry opened; it is what links a signal to a row in `GET /api/v1/trades` and to the closing deals in `GET /api/v1/live/history`, and it is the number to pass as `ticket` when you close or modify that one trade (see [Actions](#actions)). It is recorded by EA 0.66 or newer on signals from 2026-09-09 onward, and only when the signal opened a position or placed a pending order, so it is `null` on older deliveries and on closes. Check `ea_version` in `GET /api/v1/clients`.
A delivery is the account's own report of what it did. For conclusive proof of a close, read `GET /api/v1/live/account` (the position is gone) and `GET /api/v1/live/history` (the closing deal is there).
Your accounts, from `GET /api/v1/clients` (trimmed):
```json
{
"clients": [
{
"client_id": "ICM12345678",
"license_code": "1234567890",
"broker_name": "IC Markets",
"account_number": "12345678",
"account_type": "demo",
"status": "connected",
"connected_at": "2026-09-01T08:12:44+00:00",
"disconnected_at": null,
"last_seen": "2026-09-09T06:58:03+00:00",
"cloud_terminal": { "status": "active", "is_trial": false, "trial_expires_at": null }
}
],
"total": 3,
"connected": 1,
"disconnected": 2
}
```
Every account that ever connected is listed; pass `status=connected` for the live ones only. `client_id` is the id every other endpoint takes. `license_code` is the licence whose signals the account takes. Accounts connected from the portal (cTrader, TradeLocker, crypto exchanges) are listed separately under `exchange_connections`, with their own `license_code`. `cloud_terminal` is `null` for an account running the EA on your own machine or VPS.
### Licences and their accounts [#licences-and-their-accounts]
`GET /api/v1/licenses` returns your licences, oldest first, each with every account that has run under it (trimmed):
```json
{
"licenses": [
{
"code": "1234567890",
"created_at": "2026-05-02T09:14:00+00:00",
"is_preassigned": false,
"accounts": [
{
"client_id": "ICM12345678",
"platform": "mt5",
"broker_name": "IC Markets",
"account_number": "12345678",
"account_type": "demo",
"ea_version": "0.81",
"online": true,
"last_seen": "2026-09-09T06:58:03+00:00"
},
{
"connection_id": "0d6f2c1e-4b0a-4f57-9a7e-2f1c9b8d7e11",
"platform": "ctrader",
"display_name": "Spotware 5896112",
"account_type": "real",
"status": "active",
"enabled": true
}
]
}
],
"total": 1,
"note": "The list shows every account that ever ran under each licence, as last heard. ..."
}
```
An MT5 terminal carries `client_id`. A cTrader, TradeLocker or crypto connection carries `connection_id`, the same id `clients` lists under `exchange_connections`, plus its `status` and whether it is switched on (`enabled`). `online` is the last state TradeSgnl heard: it stays true until the terminal reports a disconnect. The list also holds accounts that ran under the licence in the past, so use it to see which licence an account belongs to. To see who gets the next signal right now, send a [dry run](#sending-a-signal).
### Trade history [#trade-history]
`GET /api/v1/trades?client_id=ICM12345678` returns the account's last uploaded report, not a live read, with one row per position. Rows are newest first. `client_id` is required. `limit` defaults to 20 and goes up to 50, `offset` pages, and `date_from` / `date_to` (`YYYY-MM-DD`) are compared with the close time. An open position has no close time: `date_from` keeps it and `date_to` leaves it out. To get a current report first, call `POST /api/v1/analytics/refresh`.
The response carries `reported_at` (when the account built the report, in UTC), `report_age_minutes`, `collection_time`, the `trades` list and a `summary`:
```json
{
"reported_at": "2026-09-09T06:55:00+00:00",
"report_age_minutes": 4,
"collection_time": "2026-09-09T06:55:00+00:00",
"trades": [
{
"ticket": 987654321,
"symbol": "EURUSD",
"type": "Buy",
"volume": 0.1,
"price_open": 1.1002,
"price_close": 1.1062,
"sl": 1.0972,
"tp": 1.1062,
"profit": 60,
"swap": 0,
"commission": -0.7,
"fee": 0,
"comment": "Strategy1",
"open_time": "2026.09.09 00:41:00",
"close_time": "2026.09.09 04:12:37",
"is_open": false
}
],
"summary": {
"total_trades": 214,
"returned": 1,
"offset": 0,
"trades_order": "newest first",
"closed_trades": 213,
"balance_operations_excluded": 2,
"total_profit": 1840.5,
"win_rate": "61.5%",
"currency": "USD",
"balance": 11840.5,
"initial_balance": 10000
}
}
```
* `ticket` is the MT5 position id, the same number a delivery's `ticket` carries.
* `type` is `Buy` or `Sell`. `volume` is a closed position's opening size and an open position's current size.
* `price_close` is set on closed rows and `null` on open rows. `current_price` is set on open rows only, as of `reported_at`.
* `sl` and `tp` are `0` when none is set.
* `commission` is summed over the position's deals on closed rows. `fee` is always `0` on MT5.
* `open_time` and `close_time` are in the broker's server time, formatted `YYYY.MM.DD HH:MM:SS`. `close_time` is `null` while the position is open.
* History covers the whole account history as of the report.
* The rows do not list individual closing deals. Use `GET /api/v1/live/history` for those, including each partial close.
* `win_rate` is a string such as `"61.5%"`, or `"N/A"` when no trade has closed.
## Live account data [#live-account-data]
These endpoints read the MT5 terminal on the account's Cloud Terminal at the moment of the call.
### Account, positions and pending orders [#account-positions-and-pending-orders]
`GET /api/v1/live/account` returns `as_of` (when it was read), balance, equity, margin and open P\&L, the open positions with their current price, commission and fee, and the pending orders. Each open position carries `ticket`, `volume`, `stop_loss`, `take_profit`, `profit`, `swap`, `commission`, `magic`, `comment` and `opened_at`; `stop_loss` and `take_profit` are `null` when none is set. The `ticket` is what you pass to close or modify that one trade. Two groups say what stands between an order and the broker:
* `trading`: `trade_allowed` is false on an investor (read-only) login, `algo_trading_enabled` is the terminal's Algo Trading button, `broker_connected` is whether the terminal is connected to the broker, `margin_mode` is `hedging` or `netting`, and `ping_ms` is the latency to the broker. On a hedging account each entry opens its own position. On a netting account MT5 keeps one position per symbol, with one stop loss and one take profit, so two strategies cannot be managed separately on the same symbol (see [Multiple Strategies](/strategies#hedging-and-netting-accounts)).
* `stop_out`: `margin_call_level` and `stop_out_level`, as a margin level percent, or as account money when `mode` is `money`.
On every position and order, `opened_by_ea` (or `placed_by_ea`) is true when it carries the EA's magic number and false when it does not, so manual trades stand out. It is `null` until the EA has reported its settings. `opened_via` says where it was placed: `expert`, `desktop`, `mobile` or `web`.
### Closed trades [#closed-trades]
`GET /api/v1/live/history?hours=24` is read from the terminal at the moment of the call. `hours` runs from 1 to 168 (default 24) and `limit` from 1 to 100 (default 20). It returns:
* `as_of` and `time_basis`. Times are UTC when `time_basis` is `utc`. `server` means the broker's clock offset has not been measured yet, and the times are on the broker's clock.
* `summary` of realized profit, swap, commission, fee and net over the whole window, not only the rows listed.
* `closed`: one row per closing deal, newest first, with `deal_ticket`, `position_id`, `symbol`, `direction`, `volume`, `price_open`, `price_close`, `profit`, `swap`, `commission`, `fee`, `reason` (`sl`, `tp`, `stop_out`, `expert`, ...), `reversal`, `magic`, `comment` and `closed_at`. A partial close is its own row.
* `closed_truncated`: true when more closes exist than `limit`.
* `ended_orders`: pending orders that were canceled, rejected or expired.
`position_id` equals the delivery's `ticket` and the `ticket` in `GET /api/v1/trades`, so it joins a signal to its fills. For history older than 168 hours use `GET /api/v1/trades`.
### Margin and profit calculator [#margin-and-profit-calculator]
`GET /api/v1/live/calc?symbol=XAUUSD&side=buy&volume=0.5&price_close=2390` asks the account's terminal what the order needs and makes, using the broker's own rules for leverage, margin currency and hedged margin:
```json
{
"symbol": "XAUUSD",
"side": "buy",
"volume": 0.5,
"currency": "USD",
"price_open": 2401.37,
"price_close": 2390,
"margin": 1200.69,
"profit": -568.5,
"margin_free": 9850
}
```
`price_open` defaults to the price the order would fill at now. Pass your stop loss as `price_close` to get the money at risk. Nothing is sent.
### Terminal logs [#terminal-logs]
`GET /api/v1/live/logs` returns the newest lines of the MT5 journal (`source=journal`: broker connection, authorization, trade requests and their results, the EA loading) or of the Experts log (`source=experts`: what the EA printed). `contains` filters lines and `lines` goes up to 500. Logs read even while the terminal is disconnected from the broker, which is when they help most.
## Market data [#market-data]
The `market/*` endpoints read from the MT5 terminal the account runs on, so prices, times and contract specifications are your broker's own. The symbol, candle and quote endpoints were first published under `analyst/`, and those paths still answer.
### Quotes [#quotes]
From `GET /api/v1/market/quote?symbol=XAUUSD`:
```json
{
"client_id": "ICM12345678",
"broker_label": "IC Markets 12345678",
"symbol": "XAUUSD",
"bid": 2401.12,
"ask": 2401.37,
"last": null,
"spread_points": 25,
"price": 2401.12,
"price_basis": "bid",
"change_percent": 0.42,
"day_open": 2391.08,
"tick_time": "2026-09-14T08:15:02.418Z",
"tick_age_seconds": 0.6,
"time_basis": "utc",
"trade_mode": "full"
}
```
`tick_time` is when the broker's latest tick arrived and `tick_age_seconds` how long ago that was, so a closed market shows up as a large age. `price` is the price the symbol's candles are built from (see `price_basis` below) and `change_percent` runs from today's daily open. `last` is the last trade price, set only for exchange-traded instruments. `trade_mode` is `full` when the symbol can be traded; `long_only`, `short_only`, `close_only` and `disabled` mean the broker restricts new trades.
### Candles [#candles]
`interval` is one of `1min`, `5min`, `15min`, `30min`, `1h`, `2h`, `4h`, `1day`, `1week` or `1month`, and `count` goes up to 5,000 bars, newest last. For older history, pass the `time` of the oldest bar you hold as `before` and repeat; every page holds only bars strictly older than it.
```json
{ "time": "2026-09-14T08:14:00Z", "open": 2400.95, "high": 2401.40, "low": 2400.81, "close": 2401.12, "volume": 212, "real_volume": 0, "spread": 25 }
```
* `time` is the bar's open time.
* Prices follow the response's `price_basis`: `bid` for forex, metals and CFDs, which is how MT5 builds their charts, and `last` for exchange-traded instruments.
* `volume` is tick volume, the number of price updates in the bar. `real_volume` is traded volume where the broker reports one and 0 otherwise. `spread` is the bar's spread in points.
Times on quotes and candles are UTC when `time_basis` is `utc`, which is the normal case. It reads `server` only when the terminal could not measure the broker's clock offset yet (a terminal started over a weekend), and the times are then the broker's clock written as UTC.
### Contract specification [#contract-specification]
`GET /api/v1/market/symbol?symbol=XAUUSD` returns what position sizing needs: `contract_size`, `tick_size` and `tick_value`, `volume_min`, `volume_max` and `volume_step`, `stops_level_points`, the `filling_modes` and `order_types` the broker accepts, `swap_long`, `swap_short` and `triple_swap_day`, and margin figures. `tick_value` is the money one `tick_size` move is worth on one lot, in `tick_value_currency` (the account currency), so a price move is worth `move / tick_size * tick_value * lots`. The specification is read live, so `tick_value` follows the exchange rate for symbols quoted in another currency.
### Several quotes at once [#several-quotes-at-once]
`GET /api/v1/market/quotes?symbols=EURUSD,XAUUSD,US30` returns up to 50 quotes in one call, each with the fields above. A symbol the account does not offer, or that has no price, appears under `errors` (`unknown_symbol`, `no_data`) instead of failing the whole call.
### Ticks [#ticks]
`GET /api/v1/market/ticks?symbol=XAUUSD` returns the newest ticks of the last hour (`count`, up to 10,000). Each tick has `time` to the millisecond, `bid`, `ask`, `last` (exchange-traded instruments), `volume`, and `flags` naming what changed. For a range, pass `from` as an ISO UTC time: ticks come oldest first, and when `next_from` is set, pass it as `from` to get the next page with nothing skipped or repeated.
## Sending a signal [#sending-a-signal]
```bash
curl -X POST https://portal.tradesgnl.com/api/v1/signals \
-H "Authorization: Bearer tsk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"license_code": "1234567890",
"symbol": "EURUSD",
"action": "buy",
"volume": { "lots": 0.1 },
"stop_loss": { "pips": 30 },
"take_profit": { "pips": 60 },
"comment": "Strategy1",
"idempotency_key": "order-2026-09-09-001"
}'
```
The response is a receipt: the exact [signal syntax](/signals) that was sent, the accounts it went to (`recipients`), the accounts under the licence it did not go to (`skipped`), and the `signal_id` to check afterwards. Both lists come from the signal server's answer to this very send, not from a lookup afterwards.
```json
{
"sent": true,
"syntax": "1234567890,EURUSD,buy,vol_lots=0.1,sl_pips=30,tp_pips=60,comment=Strategy1",
"license_code": "1234567890",
"signal_id": "BEIJ9",
"idempotency_key": "order-2026-09-09-001",
"recipients": [
{
"platform": "mt5",
"client_id": "ICM12345678",
"broker_name": "IC Markets",
"account_number": "12345678",
"account_type": "demo",
"ea_version": "0.81"
},
{
"platform": "ctrader",
"connection_id": "0d6f2c1e-4b0a-4f57-9a7e-2f1c9b8d7e11",
"display_name": "Spotware 5896112",
"account_type": "real"
}
],
"skipped": [],
"connected_accounts": 2,
"server_response": { "signalId": "BEIJ9" },
"next": "The server accepted the signal; the accounts in recipients execute it next. ..."
}
```
`recipients` are the accounts the signal was handed to: each MT5 terminal whose connection was open, and each cTrader, TradeLocker or crypto connection that is switched on, signed in and on a plan that is active. It is a hand-off, not a result: the deliveries say what each account did. `accounts` carries the same list as `recipients`, and `connected_accounts` is its length; both are kept for integrations written before `recipients` existed.
`skipped` lists accounts the signal server knows under the licence that did not get this signal, each with a `code` and a `reason` in words:
| `code` | Why the account was skipped |
| ------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `7021` | Its EA is too old for this action (modify actions need 0.68, a `ticket` needs 0.71, `cancel_at` on a pending order needs 0.80). Update the EA. |
| `7601` | A cTrader account whose sign-in expired. Reconnect it from its card in the portal. |
| `7701` | A TradeLocker account whose sign-in was refused. Reconnect it from its card in the portal. |
| `7020` | The signal is an exit and carries `noexit`, so the exit is dropped and positions close only by stop loss or take profit. |
| `7016` | The account's connection to the signal server was closing, so nothing was sent to it. |
An account that is offline, switched off or on a lapsed plan is not in either list: the signal server only names accounts it holds right now.
Then read `GET /api/v1/deliveries?signal_id=BEIJ9` to see whether each account executed it, or `GET /api/v1/signals?include_deliveries=true` to get signals and their per-account status in one call. Give the EA a moment before checking.
A `200` means the signal was accepted and passed to the accounts in `recipients`, the ones connected under that licence at that moment. It is not proof of execution: the deliveries say what each account did. A signal is not held for an account that is offline when it is sent. A signal goes to every account connected under the licence. To send to one account only, put that account on its own licence.
Two optional fields make sending safer:
* `"dry_run": true` validates the order and asks the signal server who would receive it, without sending anything. The server reads the signal exactly as it would a real one (so a syntax or secret error comes back the same way) and picks the accounts with the very same rules, so `recipients` and `skipped` are the exact live answer for this signal, including the accounts it would leave out and why. Nothing is stored, no alert is raised, and an `idempotency_key` is not used up. The receipt has `sent: false`, and a dry run does not count toward the signal limits. A dry run is limited to 60 a minute per licence (reason `rate_limited`).
```json
{
"dry_run": true,
"sent": false,
"syntax": "1234567890,EURUSD,modifylong,sl_price=1.0950",
"license_code": "1234567890",
"recipients": [
{
"platform": "mt5",
"client_id": "ICM12345678",
"broker_name": "IC Markets",
"account_number": "12345678",
"account_type": "demo",
"ea_version": "0.81"
},
{
"platform": "ctrader",
"connection_id": "0d6f2c1e-4b0a-4f57-9a7e-2f1c9b8d7e11",
"display_name": "Spotware 5896112",
"account_type": "real"
}
],
"skipped": [
{
"platform": "mt5",
"client_id": "EXN87654321",
"broker_name": "Exness",
"account_number": "87654321",
"account_type": "real",
"ea_version": "0.67",
"code": 7021,
"reason": "EA update required for this command: this command needs EA 0.68 or newer, and this account runs 0.67. Update the EA."
}
],
"connected_accounts": 2,
"next": "Nothing was sent. recipients is exactly where the signal server would send it right now, and skipped lists the accounts it would not, with why. ..."
}
```
If nothing is connected under the licence and its plan is not active, a real send would be dropped. The dry run says so with `blocked` (`code` 7022) and empty lists.
For an entry sized in lots the dry run also carries `risk`, priced on each recipient with live access (an MT5 account on a Cloud Terminal, or a cTrader account) from that account's own prices and rules, the way the order will be placed (symbol mapping, prefix and suffix, pip size included). A skipped account is not priced. TradeLocker and crypto accounts get no risk figures:
```json
"risk": [
{
"client_id": "ICM12345678",
"symbol": "EURUSD",
"side": "buy",
"volume": 0.1,
"entry_price": 1.1002,
"entry_is_estimate": true,
"stop_loss_price": 1.0972,
"take_profit_price": 1.1062,
"currency": "USD",
"margin_required": 220.04,
"margin_free": 9850,
"loss_at_stop_loss": -30,
"profit_at_take_profit": 60
}
]
```
A market order fills at whatever the price is when it arrives, so `entry_is_estimate` is true. An account the preview cannot price, such as one whose broker does not offer the symbol, gets a `note` instead of figures. Volumes given as a percent of balance or equity are not priced: the EA, or TradeSgnl on an account without one, turns them into lots when the signal arrives.
* `"idempotency_key"` (any unique tag, 8 to 128 characters of letters, digits, `_` and `-`) makes a retry safe. If your request times out after the order was already placed and you send it again with the same key, the server returns the original receipt with `duplicate: true` instead of placing a second order. Keys are kept for 24 hours; use a fresh key for each new order.
The same `idempotency_key` for the same licence within 24 hours returns the original receipt with `duplicate: true` and sends nothing. A key is remembered only when the signal reached an account. A send that reached nothing (no account connected) or was rejected is not remembered, so the same key can be retried. A stored signal carries its key in `params.idempotency_key` on `GET /api/v1/signals`, so you can find a signal by its key.
### Actions [#actions]
| Action | What it does | Fields |
| ---------------------------------------------------------------------- | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `buy`, `sell` | Open at market | `volume`; optional `stop_loss`, `take_profit` |
| `buystop`, `buylimit`, `sellstop`, `selllimit` | Place a pending order | `volume`, `entry`; optional `stop_loss`, `take_profit` |
| `closebuy`, `closesell` | Close positions on one side of the symbol | optional `partial`, optional `ticket` |
| `closeall` | Close every position on the symbol | |
| `cancellong`, `cancelshort` | Cancel pending orders on one side | |
| `modifylong`, `modifyshort` | Change the stop loss and take profit of open positions on one side | at least one of `stop_loss`, `take_profit`; `stop_loss` also takes `{ "entry": true }` to move it to each position's open price; optional `ticket` |
| `modifybuystop`, `modifybuylimit`, `modifysellstop`, `modifyselllimit` | Change the entry, stop loss and take profit of unfilled orders of that type | at least one of `entry`, `stop_loss`, `take_profit`; optional `ticket` |
| `closelongsell`, `closeshortbuy`, `closelongbuy`, `closeshortsell` | Close one side, then open the other | `volume`; optional `stop_loss`, `take_profit` |
Each field is an object with exactly one key: `volume` is `{ "lots": n }`, `{ "percent_balance": n }` or `{ "percent_equity": n }`; `entry` is `{ "pips": n }` from the current price or `{ "price": n }`; `stop_loss` and `take_profit` are `{ "pips": n }`, `{ "points": n }` (a price distance) or `{ "price": n }`; `partial` is `{ "lots": n }` or `{ "percent": n }` from 1 to 100, and only goes with `closebuy` and `closesell`. The size to close is rounded up to the broker's lot step, and if what would remain is below the broker's minimum lot, the whole position closes. `comment` (1 to 31 characters: letters, digits, space, `_` and `-`) is optional on every action and groups trades: a close or modify with a comment only touches positions that carry exactly that comment (exact and case-sensitive), and one without a comment touches every position the EA opened on that symbol and side.
`ticket` acts on one trade only. Give it as a string of digits or an integer. It is allowed with `closebuy`, `closesell` (with or without `partial`) and the six modify actions; any other action with a ticket is refused with `400` and reason `invalid_input`. For a pending-order modify it is the order's ticket. The ticket narrows the signal, it never widens it: symbol and side (and `comment`, if sent) must still match the position. A ticket that is no longer open changes nothing. The delivery of the signal that opened the trade carries the ticket, and `GET /api/v1/live/account` lists it on each open position. It needs EA 0.71 or later and an MT5 account. The [MCP](/mcp-server) `send_signal` tool takes the same field.
```bash
curl -X POST https://portal.tradesgnl.com/api/v1/signals \
-H "Authorization: Bearer tsk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"license_code":"1234567890123","symbol":"EURUSD","action":"closebuy","ticket":"10753414922"}'
```
Taking a level off a position is not available in JSON: send `sl=none` or `tp=none` in the [comma-separated signal format](/signals#modify-orders).
## Recipes [#recipes]
### Google Sheets [#google-sheets]
`IMPORTDATA` cannot send a header, so use a short Apps Script instead. In your sheet open **Extensions** > **Apps Script**, paste this, run it once to grant access, then add a time-driven trigger to refresh it on a schedule.
```js
function refreshSignals() {
const res = UrlFetchApp.fetch(
'https://portal.tradesgnl.com/api/v1/signals?limit=50&include_deliveries=true',
{ headers: { Authorization: 'Bearer tsk_YOUR_KEY' } },
);
const { signals } = JSON.parse(res.getContentText());
const sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
sheet.appendRow(['Time', 'Symbol', 'Action', 'Volume', 'Executed on', 'Error']);
signals.forEach((s) => sheet.appendRow([
s.timestamp, s.symbol, s.command, s.volume,
s.deliveries.filter((d) => d.status === 'executed' || d.status === 'received').length,
s.error_message || '',
]));
}
```
### WordPress [#wordpress]
Any table plugin that can read a JSON URL with a custom request header works. Point it at the endpoint you want (for example `https://portal.tradesgnl.com/api/v1/signals?limit=50`), add `Authorization: Bearer tsk_YOUR_KEY` as a header, and set the JSON root to the list key (`signals`, `clients`, `trades`). Use a read-only key for anything that lives on a public site.
### A daily P\&L line from cron [#a-daily-pl-line-from-cron]
`GET /api/v1/trades` returns a `summary` alongside the positions. Filtering by `date_from` limits the closed trades to that day, so this prints today's closed P\&L every weekday evening:
```bash
0 22 * * 1-5 curl -s "https://portal.tradesgnl.com/api/v1/trades?client_id=ICM12345678&date_from=$(date +\%F)&limit=50" \
-H "Authorization: Bearer tsk_YOUR_KEY" | jq '.summary | {total_profit, closed_trades, win_rate, currency}'
```
## Errors and limits [#errors-and-limits]
Errors are JSON with an `error` message that says what to do next and a stable `reason` code, and use the usual statuses:
| Status | When |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 400 | Invalid input; `error` names the field |
| 401 | Missing, revoked or expired key |
| 402 | AI credits exhausted (Market Analyst) |
| 403 | The plan does not include the API, the key lacks the trade permission, or a per-key limit blocked the call. `no_cloud_connection` means no account has live access at all |
| 404 | Unknown account (`account_not_found`) or symbol |
| 409 | The account cannot be read: `no_cloud_terminal` (it has no Cloud Terminal), `terminal_offline` (its Cloud Terminal is stopped), `not_connected` or `account_paused` |
| 422 | The terminal could not price the request: no tick for the symbol (`no_data`), or MT5 could not run the calculation (`calc_failed`) |
| 429 | Rate limit reached (`rate_limited`) |
| 502 | The terminal could not be read (`terminal_unavailable`), or the signal server rejected the signal (`webhook_rejected`) or could not be reached (`webhook_unreachable`); for a signal, nothing was sent |
| 503 | The account could not be read (`account_unavailable`) |
| 504 | A refresh did not land in time (`refresh_timeout`) |
Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (a Unix timestamp in seconds). Limits: 60 calls per minute across all endpoints and tools. Within that, `POST /api/v1/signals` is limited to 10 per minute and 200 per day. The REST API is part of TradeSgnl Cloud, included on the Advanced and Professional plans.
# EA Setup (/setup)
There are three ways to install the TradeSgnl EA on MetaTrader 5. Pick the one that matches your machine.
Most people should use the **EA Manager**. It installs the EA to every MT5 terminal in one click and keeps it up to date automatically. The whole process takes about **5 minutes**.
## Choose your installation method [#choose-your-installation-method]
## Before you begin [#before-you-begin]
A few things apply no matter which method you choose.
**Verify system compatibility.** Make sure your machine runs a supported version of Windows.
**Compatible operating systems:**
* Windows 10 and 11
* Windows Server 2016, 2019, and 2022
**Open your Downloads page.** Every download (EA Manager, standalone installer, and manual EA files) lives in one place in your TradeSgnl dashboard.
Access Downloads Page
An active subscription is required to access downloads. You will also need your **License ID** later, which you can find under the **Connections** section of your dashboard.
## EA Manager (Recommended) [#ea-manager-recommended]
The EA Manager is a small desktop app that scans your computer for every MetaTrader 5 terminal, then installs, updates, or removes the TradeSgnl EA across all of them with a single click. It is the recommended method because it always pulls the latest EA version and removes any risk of copying the wrong files.
**Get the EA Manager.** Install it whichever way suits your machine. Both options give you the same app.
* **Windows 10 / 11** — install from the Microsoft Store.
* **Windows Server, or any machine without the Microsoft Store** — download the standalone installer from your Downloads page (under the EA Manager download, click **Download Standalone Installer**) and run the `.exe`.
Get from Microsoft Store
Download Standalone Installer
The Microsoft Store package (.Msix) needs Windows 10 or 11 with the Store / App Installer available. The standalone installer is a regular `.exe` that works anywhere, including Windows Server. Windows may show a SmartScreen warning for it; choose **More info → Run anyway** to continue.
**Scan and install.** Open the EA Manager. It automatically scans for MetaTrader 5 installations and lists every terminal it finds.
1. Tick the terminals you want to set up (or use **Select All**).
2. Click **Install** on a terminal, or **Install All** to do them at once.
3. Each terminal shows its status: **Not Installed**, an update arrow (for example `v0.50 → v0.52`), or **Up to Date**.
Make sure MetaTrader 5 is installed and has been launched at least once, then click **Refresh** in the EA Manager.
**Stay up to date.** The EA Manager checks the server for the latest EA version on launch. When a newer version is available, the affected terminals show an update arrow. Click **Update** (or **Install All**) to apply it.
After installing or updating, right-click **Expert Advisors** in the MT5 Navigator panel and choose **Refresh** so the new version loads.
A new version starts with the default settings. To bring yours across, follow [Updating the EA](#updating-the-ea).
Once the EA is installed, continue to [Enable trading permissions](#enable-trading-permissions) and [Connect and verify](#connect-and-verify).
## Manual Installation [#manual-installation]
Prefer to do it by hand, or troubleshooting an automated install? You can download the EA files and copy them into your MT5 data folder yourself.
**Download the EA files.** On your Downloads page, click **Download MT5 EA Files**.
Access Downloads Page
The package includes these essential files:
* `TradeSgnl-MT5-EA_v0.79.ex5`: the Expert Advisor file
* `TradeSgnl-MT5-DLL_v0.13.dll`: required for connection with the signal server
The number at the end of each name is its version, so yours may be higher than the ones shown here. The EA and the DLL are numbered separately.
Make sure you have BOTH files. The EA will not function without the DLL, even though only the EA file is visible in your Navigator panel.
**Access the MT5 data folder.** In the main menu, click **File** → **Open Data Folder**.
In your data folder, navigate to **MQL5** → **Experts**.
**Copy the EA and DLL into the Experts folder.** Copy both files into `MQL5/Experts`:
* `TradeSgnl-MT5-EA_v0.79.ex5`
* `TradeSgnl-MT5-DLL_v0.13.dll`
**Refresh Expert Advisors.** In MetaTrader 5, right-click **Expert Advisors** in the Navigator panel and select **Refresh** to make the TradeSgnl EA visible.
## Enable trading permissions [#enable-trading-permissions]
Regardless of how you installed the EA, MetaTrader 5 must be allowed to run it and to use the DLL. Go to **Tools** → **Options** → **Expert Advisors**.
Enable both of these options:
* Check **Allow algorithmic trading**
* Check **Allow DLL imports**
Without DLL imports enabled, the EA cannot communicate with the signal server and will not function.
## Connect and verify [#connect-and-verify]
Attach the EA to a chart, plug in your license, and confirm the connection is live. This is the same final step for every installation method.
**Attach the EA to a chart.**
1. Open a price chart for any symbol in MetaTrader 5.
2. In the Navigator panel, under **Expert Advisors**, drag the TradeSgnl EA onto the chart. Its name ends in the version number, for example **TradeSgnl-MT5-EA\_v0.79**. If several versions are listed, pick the highest.
**Enter your License ID.**
1. When the EA properties window appears, go to the **Inputs** tab.
2. Enter your **License ID** (found in your TradeSgnl dashboard).
3. Click **OK** to save and start the EA.
You can find your License ID in your TradeSgnl dashboard under the **Connections** section.
**Verify connection status.** You should see **Connected** in the EA Dashboard panel on your chart.
You only need to attach the EA to one chart. It will process signals for all symbols.
**Troubleshooting connection issues**
If you don't see "Connected" status:
* **Check file installation** — ensure the EA file and DLL file are both in the `MQL5/Experts` folder.
* **Verify DLL imports** — make sure DLL imports are enabled in MT5 settings (Tools → Options → Expert Advisors).
* **Confirm license ID** — verify your license ID is entered correctly in the EA inputs.
* **Restart MetaTrader** — sometimes a simple restart resolves connection issues.
* **Check internet connection** — ensure your computer has stable internet access.
## Updating the EA [#updating-the-ea]
Each EA version is a separate file, so MetaTrader 5 treats a new version as a new EA and opens it with the default settings. To keep your settings, save them as a preset on the version you are running, then load that preset on the new one. It takes about a minute.
On a Cloud terminal you can skip this. Updating from the portal keeps every setting for you. See [EA version and updates](/cloudconnect#ea-version-and-updates).
**Get the new version into MetaTrader.** Click **Update** in the EA Manager, or copy the new files into `MQL5/Experts` as in [Manual Installation](#manual-installation). If **Auto-Download Updates** is on, the EA has already downloaded it. Then right-click **Expert Advisors** in the Navigator and choose **Refresh** so the new version shows in the list.
The version you are running stays on your chart and keeps working while you do this.
**Save your current settings as a preset.**
1. Click the chart the EA is running on and press **F7**. You can also right-click the chart, choose **Expert List**, select the EA and click **Properties**.
2. Open the **Inputs** tab and click **Save**.
3. Give the file a name you will recognise, for example `TradeSgnl-settings`, and click **Save**.
4. Click **Cancel** to close the window. Nothing on the chart changes.
Do this while the old version is still on the chart. Once it is replaced, its settings can no longer be saved.
**Attach the new version to the same chart.** In the Navigator, under **Expert Advisors**, drag the new version onto the chart. The version number is at the end of its name, for example `TradeSgnl-MT5-EA_v0.79`. It takes the place of the old version when you click OK in the next step.
**Load your preset.** In the window that opens, go to the **Inputs** tab, click **Load**, pick the file you saved and click **Open**. Your License ID and every other setting fill in. Click **OK**.
**Check the result.** The EA panel on your chart shows the new version number and **Connected**.
A few things to know:
* **Open trades are not affected.** The EA is offline for a few seconds while you switch, and the new version carries on managing the trades the old one opened.
* **New settings keep their default.** A setting that was added in the new version is not in your preset. The release notes on your [Downloads page](https://portal.tradesgnl.com/downloads) list what each version adds.
* **Keep the preset file.** You can load the same file at the next update. Save it again after you change a setting, so the file stays current.
# Signal Authentication (/signal-authentication)
## Introduction [#introduction]
When Signal Authentication is enabled, each trading signal must include a `secret` parameter with your configured secret key. The EA verifies this key before processing any signal and rejects signals that don't include the correct value.
**How it protects you:**
Only signals containing your secret key are accepted, preventing unauthorized trading.
Just add `secret=YourSecretKey` to your TradingView alerts or other signal sources.
Changes to your secret key are immediately applied across all connected devices.
**Key benefits:**
Prevents unauthorized signals from being processed, protecting your account from potential abuse.
If your webhook URL is ever exposed, signals without your secret key are rejected, keeping the integrity of your trading system intact.
## Setting Up Signal Authentication [#setting-up-signal-authentication]
**Access Signal Authentication.** Navigate to your TradeSgnl dashboard and go to the **Signals** tab. Click on the **Signal Modifier** tab at the top to access the Signal Authentication settings.
Open Signal Modifier Page
**Enable and configure.** Toggle the **Enable** switch and enter your secret key (minimum 8 characters). Click **Generate Random Key** for a secure key, or create your own.
**Save your settings.** Click **Save** to apply your configuration. You'll see a success notification when it's saved.
**Update your alerts.** Every alert message now needs your secret key. The **Syntax Generator** adds it for you: once Signal Authentication is enabled and saved, `secret=YourSecretKey` is added to everything it builds (the Entry and Exit lines, Custom Strategy Message, Strategy Builder Preset and Modify Orders). There is nothing to fill in on the form. The preview shows the key masked, but every copy includes the real key. Copy your messages again and paste them into your alerts, or add `secret=YourSecretKey` to any message you wrote yourself.
Open the Syntax Generator
Keep your secret key confidential and secure. Anyone with access to your license ID and secret key could potentially send signals to your accounts.
## Using in Signals [#using-in-signals]
To use Signal Authentication, add the `secret` parameter to your trading signals. This works in TradingView alerts or any other signal source.
**Adding the secret parameter:**
```
LicenseID,EURUSD,buy,risk=0.01,secret=YourSecretKey
```
The `secret` parameter can be placed anywhere in your signal after the license ID, symbol, and action. The order of parameters doesn't matter.
Create alert templates with your secret key already included so you never forget to add it to new alerts.
## Troubleshooting [#troubleshooting]
If you're experiencing issues with Signal Authentication, here are common problems and solutions.
Check that you have the correct secret key in your signal and that Signal Authentication is enabled and saved.
Make sure you click **Save** after making changes and wait for the success notification. The Save button is only enabled when you have unsaved changes.
## Frequently Asked Questions [#frequently-asked-questions]
Yes, Signal Authentication adds an important layer of security to your trading system. However, it's important to keep both your License ID and secret key confidential for maximum security.
If Signal Authentication is enabled and you don't include the secret parameter (or use an incorrect key), your signal will be rejected and won't be processed.
Yes, you can change your secret key at any time. Simply navigate to the Signal Authentication section in your dashboard, enter a new key, and click 'Save'. The Save button will only be enabled when you have changes to save. Remember to update all your created alerts with the new key after saving.
For optimal security, we recommend changing your secret key periodically (e.g., every 3-6 months) or immediately if you suspect it may have been compromised.
Yes, after changing and saving your secret key, any signals using the old key will be rejected. Be sure to update all your signal sources with the new key immediately after clicking 'Save' and receiving the success confirmation.
# Signal Reference (/signals)
The raw signal syntax that TradeSgnl accepts: every parameter, every action type, every output. Use this when you're writing Pine Script by hand, integrating from a non-TradingView source, or looking up one parameter in depth.
## Syntax Generator Tool [#syntax-generator-tool]
The **Syntax Generator** builds every signal format on this page through a visual form, and includes a **Send** button to verify your setup without touching TradingView. For everyday use it is faster than writing signals by hand.
Go to the Syntax Generator guide
## Signal Format & EA Settings [#signal-format--ea-settings]
The TradeSgnl EA has settings that determine which parameters it uses for trades.
The EA has two settings, **Volume Source** and **TP/SL Source**, that decide whether it uses the values in the signal (Signal Parameters) or its own (EA Inputs). The first covers the lot size, the second the stop loss and take profit.
Open EA Settings
TradeSgnl uses a comma-separated format with required and optional parameters:
```
LicenseID,SYMBOL,ACTION,risk=VOLUME,[OPTIONAL_PARAMS]
```
### Signal Structure [#signal-structure]
Each signal consists of required components followed by optional parameters:
1. **LicenseID**. Your unique license identifier (e.g., `LicenseID`)
2. **Symbol**. The trading instrument (e.g., `EURUSD`, `BTCUSD`)
3. **Action**. The trading action (`buy`, `sell`, `buystop`, etc.)
4. **Volume**. Trading size with `risk=` prefix (e.g., `risk=0.01`)
5. **Optional Parameters**. Additional settings (`sl=`, `tp=`, `comment=`, etc.)
`comment=` names the strategy a trade belongs to. The EA groups trades by symbol and comment, and scopes close signals, pyramid targets, hedge protection, Direction Lock, and the DCA Filter to that group. Omit it and every strategy on the account shares one unnamed group, where one strategy's exit signal closes another's positions. See [Multiple Strategies](/strategies).
### Format Rules [#format-rules]
* Parameters are separated by commas with **no** spaces.
* All parameters are case-insensitive (`buy` = `BUY`).
* Optional parameters can be in any order.
* Values are assigned with the equals sign (`sl=30`).
* Risk can be in lots (`risk=0.01`) or percentage (`risk=1`) depending on EA settings.
* Partial close values can be in lots (`pct=2`) or percentage (`pct=0.5`) depending on EA settings.
## Optional Parameters [#optional-parameters]
Enhance your signals with these optional parameters.
| Parameter | Description | Example |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------- |
| `sl=` | Stop Loss in pips (or currency if enabled) from entry price | `sl=50` |
| `tp=` | Take Profit in pips (or currency if enabled) from entry price | `tp=100` |
| `tp1=, tp2=, tp3=, ...` | Unlimited take profit levels (tp1, tp2, tp3, tp4, tp5, ...) | `tp1=50,tp2=100,tp3=150,tp4=200` |
| `pct1=, pct2=, pct3=, ...` | Share of what is still open to close at each TP level (0.0–1.0) | `pct1=0.5,pct2=0.5` |
| `pct1_lots=, pct1_percent=` | Explicit partial close at a TP level, in lots or as a share. Later plain `pctN=` follow pct1's type (EA 0.77+) | `pct1_lots=0.5,pct2=0.3` |
| `pending=` | Pending order level (interpretation depends on EA setting) | `pending=20` |
| `cancel_at=tp1` | Pending orders only. Cancels the order if price reaches TP1 before it fills (EA 0.80+). See [Cancel at TP1](#cancel-at-tp1) | `cancel_at=tp1` |
| `pct=` | Partial close amount (percentage or lots based on EA setting) | `pct=0.5` |
| `trtrig=` | Pips needed to activate trailing stop | `trtrig=20` |
| `trdist=` | Trailing stop distance in pips | `trdist=10` |
| `trstep=` | Pips needed to move trailing stop | `trstep=5` |
| `betrig=` | Pips needed to activate breakeven | `betrig=15` |
| `bedist=` | Breakeven distance in pips. Optional: 0 or omitted moves the stop to your entry price | `bedist=2` |
| `comment=` | Strategy name. Groups trades and scopes close, pyramid, hedge, and filter behaviour. See [Multiple Strategies](/strategies) | `comment=Strategy1` |
| `ticket=` | Act on one trade only, by its MT5 ticket. Used with `closebuy` / `closesell` and the modify actions. See [Target One Trade by Ticket](#target-one-trade-by-ticket) | `ticket=10753414922` |
| `py` | Enable pyramid trading mode for the strategy. Read only on the signal that opens the group | `py` |
| `re` | Enable recovery mode for this trade | `re` |
| `exop` | Exit opposite positions only (no new trade if opposite positions exist) | `exop` |
| `exent` | Exit opposite positions and enter new trade | `exent` |
| `noexit` | Drop this strategy's position-close signals (closebuy, closesell, closeall) at the server; entries, reversals, and pending-order cancels still execute | `noexit` |
### How Comments Match [#how-comments-match]
* Matching is exact and case-sensitive on the whole comment. `Trend` and `trend` are different strategies.
* Spaces at the start and end of the comment are ignored. Spaces inside count, so `My Strategy` and `MyStrategy` are different.
* A comment cannot contain a comma.
* A close or modify without a comment acts on every position the EA opened on that symbol and side. With a comment it acts only on positions carrying exactly that comment. If several open trades share a comment, all of them are affected, and the delivery note gives the count.
* Keep comments to 31 characters or fewer (MT5's limit). The REST API accepts 1 to 31 characters: letters, digits, space, `_` and `-`.
* To manage one trade on its own, give each trade its own comment, or use `ticket=`.
See [Multiple Strategies](/strategies) for how the EA keeps a strategy together across restarts.
## Explicit Parameter Types [#explicit-parameter-types]
Explicit parameter types give you **complete control directly in your signal**, without relying on EA input settings. Specify exactly how volume, SL/TP, and other values should be interpreted (in pips, currency, percentages, lots, or dollar amounts).
* **Signal-Level Control:** Override EA settings per-signal. No need to change EA inputs for different strategies.
* **Multi-Strategy Support:** Run multiple strategies with different risk profiles on the same EA instance.
* **Consistent Behavior:** Ensure signals behave identically regardless of how the EA is configured.
* **Cross-Instrument Clarity:** Eliminate pip vs point confusion when trading forex, indices, and commodities together.
### Explicit Volume Parameters [#explicit-volume-parameters]
New volume parameters with explicit type specification. Use these instead of the generic `risk=` parameter for precise control.
| Parameter | Description | Example |
| ------------------ | ---------------------------------------- | -------------------------------------- |
| `vol_lots=` | Direct lot size | `vol_lots=0.5` (0.5 lots) |
| `vol_pctbal=` | Lot size as % of balance | `vol_pctbal=1` (1% of balance in lots) |
| `vol_pcteq=` | Lot size as % of equity | `vol_pcteq=1` (1% of equity in lots) |
| `vol_dollar=` | Dollar risk amount (requires SL) | `vol_dollar=100` (risk $100) |
| `vol_pctbal_loss=` | % of balance to lose at SL (requires SL) | `vol_pctbal_loss=1` (lose 1% at SL) |
| `vol_pcteq_loss=` | % of equity to lose at SL (requires SL) | `vol_pcteq_loss=1` (lose 1% at SL) |
**Examples:**
```
LicenseID,EURUSD,buy,vol_lots=0.5,sl=30,tp=60
```
Opens a buy order with exactly 0.5 lots.
```
LicenseID,XAUUSD,sell,vol_dollar=100,sl_points=15,tp_points=45
```
Opens a sell order risking exactly $100. Requires SL for position sizing calculation.
```
LicenseID,EURUSD,buy,vol_pctbal_loss=1,sl_pips=50,tp_pips=100
```
Opens a buy order sized so that a 50 pip SL loss equals 1% of account balance.
If you use a volume type that requires SL (`vol_dollar`, `vol_pctbal_loss`, `vol_pcteq_loss`) without providing an SL parameter, you'll receive error code `6013`.
### Explicit SL/TP Parameters [#explicit-sltp-parameters]
Specify exactly how your Stop Loss and Take Profit values should be interpreted.
**Stop Loss Types**
| Parameter | Description | Example |
| ------------- | -------------------------------------- | ------------------------------------------------------------ |
| `sl_pips=` | SL distance in pips | `sl_pips=25` (25 pips from entry) |
| `sl_points=` | SL as direct price distance (currency) | `sl_points=10` (10.00 price distance, e.g., Gold: 2000→1990) |
| `sl_percent=` | SL as % of current price | `sl_percent=1` (1% from entry price) |
| `sl_price=` | SL as absolute price level | `sl_price=1.0800` (SL at exactly 1.0800) |
**Take Profit Types (Single Level)**
| Parameter | Description | Example |
| ------------- | -------------------------------------- | ---------------------------------------- |
| `tp_pips=` | TP distance in pips | `tp_pips=50` (50 pips from entry) |
| `tp_points=` | TP as direct price distance (currency) | `tp_points=15` (15.00 price distance) |
| `tp_percent=` | TP as % of current price | `tp_percent=2` (2% from entry price) |
| `tp_price=` | TP as absolute price level | `tp_price=1.1200` (TP at exactly 1.1200) |
**Multi-Level Take Profit with Per-TP Types**
Each TP level can have its own type, or inherit from the first TP level (`tp1`):
```
tp1_pips=50,tp2_percent=1,tp3_price=1.1500
```
TP1: 50 pips, TP2: 1% of price, TP3: exact price at 1.1500. Each with explicit type.
```
tp1_pips=50,tp2=100,tp3=150
```
TP1: 50 pips (explicit). TP2 and TP3 inherit "pips" type automatically.
When a TP level doesn't specify a type (e.g., `tp2=100`), it automatically inherits the type from `tp1`. This makes mixed signals cleaner and faster to write.
### Explicit Pending Parameters [#explicit-pending-parameters]
Specify exactly how your pending order entry level should be interpreted, directly in your signal.
| Parameter | Description | Example |
| ---------------- | ----------------------------------------- | ---------------------------------------------- |
| `entry_pips=` | Pending entry as pips from current price | `entry_pips=20` (20 pips from current price) |
| `entry_price=` | Pending entry as absolute price level | `entry_price=1.1050` (entry at exactly 1.1050) |
| `entry_percent=` | Pending entry as percent of current price | `entry_percent=1` (entry 1% away from current) |
**Examples:**
```
LicenseID,EURUSD,buystop,risk=0.01,entry_pips=20,sl=30,tp=50
```
Buy stop 20 pips above current price, regardless of EA setting.
```
LicenseID,EURUSD,buylimit,risk=0.01,entry_price=1.0950,sl_pips=30,tp_pips=60
```
Buy limit at exactly 1.0950, regardless of EA setting.
```
LicenseID,BTCUSD,buystop,risk=0.01,entry_percent=2,sl_percent=1,tp_percent=3
```
Buy stop entry that is exactly 2% above the current price.
Explicit pending parameters (`entry_pips`, `entry_price`, `entry_percent`) always override the EA's "Pending Order Entry" setting, giving you per-signal control. The legacy `pending=` parameter still respects the EA setting.
### Explicit Trailing & Breakeven [#explicit-trailing--breakeven]
Trailing stop and breakeven parameters support explicit type suffixes (`_pips`, `_points`, `_price` or `_percent`) for consistent behavior across all instruments.
**Trailing Stop Parameters**
| Parameter | Description | Example |
| --------------------------------- | ------------------------------------------------------------------- | -------------------------------------- |
| `trtrig_pips=` / `trtrig_points=` | Profit distance to activate trailing stop (use points for currency) | `trtrig_pips=30` or `trtrig_points=30` |
| `trtrig_price=` | Exact price level that activates the trailing stop | `trtrig_price=2050` |
| `trdist_pips=` / `trdist_points=` | Distance to maintain between price and SL (use points for currency) | `trdist_pips=15` or `trdist_points=15` |
| `trstep_pips=` / `trstep_points=` | Minimum movement before adjusting SL (use points for currency) | `trstep_pips=5` or `trstep_points=5` |
| `trtrig_percent=` | Profit as a percent of price before trailing activates | `trtrig_percent=1` (1% of price) |
```
trtrig_points=30,trdist=20,trstep=5
```
Trigger uses points for currency. `trdist` and `trstep` inherit the points type automatically.
**Breakeven Parameters**
| Parameter | Description | Example |
| --------------------------------- | ------------------------------------------------------------------------- | -------------------------------------- |
| `betrig_pips=` / `betrig_points=` | Profit distance to activate breakeven (use points for currency) | `betrig_pips=20` or `betrig_points=20` |
| `betrig_price=` | Exact price level that activates breakeven | `betrig_price=1.0950` |
| `betrig_percent=` | Profit as a percent of price that activates breakeven | `betrig_percent=1` (1% of price) |
| `bedist_pips=` / `bedist_points=` | Distance to lock in above entry price (use points for currency). Optional | `bedist_pips=2` or `bedist_points=2` |
```
betrig_pips=20,bedist=2
```
Trigger uses explicit pips type. `bedist` inherits "pips" type automatically.
```
betrig_pips=20
```
Only the trigger is required. With no `bedist` (or `bedist=0`) the stop moves to your entry price plus the spread, so the trade cannot close at a loss.
Because `betrig_price=` takes an exact level, you can pass one of the signal's own targets to move the stop once that target is reached. Sending `tp1_price=4320,tp2_price=4330,tp3_price=4340,betrig_price=4330,bedist=0` scales out at TP1 and TP2, then parks the stop at entry while the rest runs to TP3. Match the suffix to how the targets are quoted: pip targets pair with `betrig_pips=`, percent targets with `betrig_percent=`.
In the [Telegram Copier](/telegram-copier/trade-management#breakeven-at-a-take-profit-level), the **TP Level** unit does this for you per signal, so the trigger tracks each signal's targets instead of a fixed number.
Just like multi-level TPs, trailing and breakeven parameters inherit their type from the trigger parameter. Set `trtrig_pips` or `trtrig_points` and `trdist`/`trstep` will use the same type. Set `betrig_pips` or `betrig_points` and `bedist` will inherit that type.
With `trtrig_price` or `betrig_price`, the trigger is an exact price and `trdist`, `trstep` and `bedist` are read as price distances, the same as `_points`.
**Examples:**
```
LicenseID,EURUSD,buy,vol_lots=0.5,sl_pips=30,tp_pips=90,trtrig_pips=30,trdist=15,trstep=5
```
Forex trade with pips-based trailing: activates at 30 pips profit, trails at 15 pips distance.
```
LicenseID,US30,buy,vol_lots=0.5,sl_points=50,betrig_points=15,bedist=2
```
Index trade using points (currency) for breakeven. Distance inherits the points type.
```
LicenseID,XAUUSD,buy,vol_lots=0.1,sl_price=2010,trtrig_price=2050,trdist=5,trstep=1
```
Gold trade that starts trailing once price reaches 2050, keeping the stop 5.00 behind and moving it in 1.00 steps.
All `_points` parameters use the value **directly** as price distance. This provides accurate handling for indices and CFDs regardless of broker decimal precision.
### Explicit Partial Close [#explicit-partial-close]
New explicit partial close parameters remove ambiguity about whether you're closing a percentage or exact lots.
| Parameter | Description | Example |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
| `pct_lots=` | Explicit lot amount to close | `pct_lots=0.5` (close exactly 0.5 lots) |
| `pct_percent=` | Explicit percentage to close. A value from 0 to 1 is a share (`0.5` is half). A value above 1, up to 100, is a whole-number percent (`50` is half) | `pct_percent=0.5` or `pct_percent=50` (close 50% of position) |
A `pct_percent=` above 100 is rejected with error `6025`. Plain `pct=` follows the EA's Partial Close Type setting.
The size to close is rounded up to the broker's lot step. If what would remain is below the broker's minimum lot, the whole position closes.
**Examples:**
```
LicenseID,EURUSD,closebuy,pct_percent=0.5,comment=Strategy1
```
Closes 50% of buy positions with comment "Strategy1".
```
LicenseID,XAUUSD,closesell,pct_lots=0.25
```
Closes exactly 0.25 lots from sell positions.
The original `pct=` parameter still works and follows the EA's "Partial Close Type" setting. Use the explicit `pct_lots` or `pct_percent` parameters when you need guaranteed behavior regardless of EA settings.
## Order Types [#order-types]
TradeSgnl supports various order types for different trading scenarios.
### Market Orders [#market-orders]
Market order commands allow you to immediately enter or exit positions at current market prices.
**buy (or long)**. Places a buy order at the current market price.
```
LicenseID,EURUSD,buy,risk=0.01
```
**sell (or short)**. Places a sell order at the current market price.
```
LicenseID,EURUSD,sell,risk=0.01
```
**closebuy (or closelong)**. Closes all buy positions for the specified symbol.
```
LicenseID,EURUSD,closebuy
```
**closesell (or closeshort)**. Closes all sell positions for the specified symbol.
```
LicenseID,EURUSD,closesell
```
**closeall**. Closes all open positions for the specified symbol. Can optionally filter by comment to close only specific strategy positions.
```
LicenseID,EURUSD,closeall
```
With comment filter:
```
LicenseID,EURUSD,closeall,comment=Strategy1
```
When using `closeall`, only positions for the specified symbol will be closed. Without a comment filter that means **every** strategy's positions on that symbol. When combined with a comment filter, only positions matching BOTH the symbol AND comment will be closed. See [Multiple Strategies](/strategies).
**Partial Close**. Close a percentage of positions instead of the entire position. Use the `pct=` parameter with any close action.
```
LicenseID,EURUSD,closebuy,pct=0.5,comment=Strategy1
```
* **Interpretation Control:** The EA's "Partial Close Type" setting (in Volume Settings) determines how the `pct=` value is interpreted (as percentage of position or as exact lots to close).
* **Percentage Mode:** Use values between 0.0 and 1.0 (`pct=0.5` closes 50% of position volume).
* **Lots Mode:** Use exact lot values (`pct=0.5` closes exactly 0.5 lots regardless of position size).
* **Volume Rounding:** The size to close is rounded up to the broker's lot step. If what would remain is below the broker's minimum lot, the whole position closes.
* **Comment Preservation:** Remaining positions stay in their strategy for later partial closes, closes and changes, even on brokers that clear a position's comment after a partial close.
* **Multiple Partial Closes:** You can send multiple partial close signals with the same comment.
### Replace Orders [#replace-orders]
Replace orders allow you to close existing positions and immediately open new positions in a single signal. This includes both same-direction updates and trend reversal strategies.
These commands first close all positions of a symbol with the specified direction (optionally filtered by comment), then immediately open a new position with the provided parameters.
If no existing positions are found to close, the command will still open the new position with the specified parameters. You can safely use these commands even when you're not sure if there are existing positions to close.
**Reverse Direction Commands**
**closelongsell**. Closes all long (buy) positions for the specified symbol (optionally filtered by comment), then opens a new sell (short) position using the provided parameters.
```
LicenseID,GBPUSD,closelongsell,risk=0.02,sl=40,tp=80,comment=Strategy2
```
**closeshortbuy**. Closes all short (sell) positions for the specified symbol (optionally filtered by comment), then opens a new buy position using the provided parameters.
```
LicenseID,EURUSD,closeshortbuy,risk=0.01,sl=30,tp=50,comment=Strategy1
```
**Same Direction Commands**
**closelongbuy**. Closes all long (buy) positions for the specified symbol (optionally filtered by comment), then opens a new buy position using the provided parameters.
```
LicenseID,EURUSD,closelongbuy,risk=0.01,sl=30,tp=50,comment=Strategy1
```
**closeshortsell**. Closes all short (sell) positions for the specified symbol (optionally filtered by comment), then opens a new sell (short) position using the provided parameters.
```
LicenseID,GBPUSD,closeshortsell,risk=0.02,sl=40,tp=80,comment=Strategy2
```
When using the comment parameter, only positions with the matching comment will be closed. If no comment is provided, all positions of that symbol with the specified direction will be closed, **including positions opened by your other strategies**. Include `comment=` on every exit signal when the account runs more than one strategy. See [Multiple Strategies](/strategies).
**Common Trading Scenarios**
* **Trend Reversal Strategy:** Use `closelongsell` or `closeshortbuy` when your strategy signals a trend reversal.
* **Position Management:** Use `closelongbuy` or `closeshortsell` to update existing positions with new parameters without manually closing first.
* **Risk Management:** These commands are particularly useful for automated strategies that need to quickly adapt to changing market conditions.
### Pending Orders [#pending-orders]
Pending order commands allow you to set orders that will be executed when price reaches a specific level.
**buystop**. Places a buy stop order above the current market price. The `pending=` parameter is required.
```
LicenseID,EURUSD,buystop,risk=0.01,pending=20,sl=30,tp=50
```
**buylimit**. Places a buy limit order below the current market price. The `pending=` parameter is required.
```
LicenseID,EURUSD,buylimit,risk=0.01,pending=20,sl=30,tp=50
```
**sellstop**. Places a sell stop order below the current market price. The `pending=` parameter is required.
```
LicenseID,EURUSD,sellstop,risk=0.01,pending=20,sl=30,tp=50
```
**selllimit**. Places a sell limit order above the current market price. The `pending=` parameter is required.
```
LicenseID,EURUSD,selllimit,risk=0.01,pending=20,sl=30,tp=50
```
**pending=**. Required parameter for all pending orders. Specifies the price level for the pending order.
```
LicenseID,EURUSD,buystop,risk=0.01,pending=20
```
The interpretation of the pending parameter depends on the "Pending Order Entry" setting in the EA:
* **Pips From Current:** The value is treated as the number of pips away from current price.
* **Absolute Price:** The value is treated as the exact price level for the order.
* **Percent of Price:** The value is treated as a percentage offset from the current price.
**Auto-Correction:** When using absolute price for pending orders, the EA will automatically correct mismatched order types (e.g., converting a `buystop` to a `buylimit` if the specified price is below the current market price).
**cancellong**. Cancels all pending buy orders (buystop and buylimit) for the specified symbol.
```
LicenseID,EURUSD,cancellong
```
**cancelshort**. Cancels all pending sell orders (sellstop and selllimit) for the specified symbol.
```
LicenseID,EURUSD,cancelshort
```
#### Cancel at TP1 [#cancel-at-tp1]
Add `cancel_at=tp1` to a pending order and the EA cancels it if price reaches the order's first take profit before the order fills. By then the move the signal called has already happened, and a fill that came later would enter a setup that is over.
```
LicenseID,XAUUSD,selllimit,risk=0.01,entry_price=4180,sl_price=4185,tp1_price=4175,tp2_price=4170,cancel_at=tp1
```
Here the Sell Limit at 4180 is cancelled if price falls to 4175 while the order is still waiting. If the order fills first, it trades as usual with its stop loss and targets.
| Detail | How it works |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Level watched | TP1, or the single take profit when the order has one `tp=` |
| Price used | The bid for a buy order and the ask for a sell order, the same prices that close an open position at its take profit |
| When the watch starts | At once, when price is between TP1 and the entry as the order is placed. An order placed while price is already at or past TP1 is kept: price has to cross TP1 on its way to the entry, so the watch starts once price is halfway from TP1 to the entry, and the order is cancelled if price then returns to TP1 |
| No take profit | There is nothing to watch yet, so the order is placed as usual and the signal log says so. The watch starts if a pending modify gives the order a take profit |
| Moving TP1 | A pending modify such as `modifyselllimit` moves the level, and the watch follows it |
| After a restart | The watch picks up again when the EA starts. Price is checked while the EA is running |
| Market orders | `cancel_at` is ignored, since no order is waiting |
When an order is cancelled this way, the signal log shows it with the take profit and entry prices. Only `tp1` is supported as the level.
The EA does the watching, so the option needs a MetaTrader account on EA 0.80 or newer. An account on an older EA, or a cTrader or TradeLocker account, does not place a pending order sent with `cancel_at=tp1`, so an order is never left waiting without the watch. The signal log shows the reason for that account. Crypto exchange connections place the order without the watch.
### Modify Orders [#modify-orders]
Modify commands change the stop loss, take profit or entry of trades that already exist, without closing them. Only the levels you send change. They need EA 0.68 or newer; an older EA returns error `7021`.
**modifylong / modifyshort**. Change the stop loss and take profit of open buy (long) or sell (short) positions for the specified symbol.
```
LicenseID,XAUUSD,modifyshort,sl_price=4300,tp_price=4286
```
**Move the stop loss to entry**. `sl=entry` sets each position's stop loss to its own open price.
```
LicenseID,XAUUSD,modifylong,sl=entry
```
**Remove a stop loss or take profit**. `sl=none` and `tp=none` take the level off each position, rather than moving it.
```
LicenseID,XAUUSD,modifylong,sl=none
```
**Replace take profit levels**. Send `tp1`, `tp2` and so on to replace a position's targets. Targets already hit stay closed.
```
LicenseID,XAUUSD,modifyshort,tp1_price=4286,tp2_price=4280,tp3_price=4272
```
**modifybuystop / modifybuylimit / modifysellstop / modifyselllimit**. Change the entry, stop loss or take profit of unfilled pending orders of that type. The entry takes the same parameters as placing the order (`entry_price`, `entry_pips`, `entry_percent` or `pending`).
```
LicenseID,EURUSD,modifybuylimit,entry_price=1.0950,sl_price=1.0920
```
* `_price` values are exact levels. Pips, points and percent are measured from each position's open price, or from the pending order's price (its new price when the entry changes too).
* The EA's default SL/TP and its TP/SL source setting do not apply. A modify only uses what the signal sends.
* Moving only the entry of a pending order keeps its stop loss and take profit where they are.
* A new stop loss cancels a breakeven that has not triggered yet on that trade, so breakeven cannot move the stop you just set.
* Modifies are not held back by trading sessions, the spread filter or the news filter, since moving a stop protects the trade.
Without `comment=`, a modify changes **every** matching position or order on the symbol, including those opened by your other strategies. Add `comment=` when the account runs more than one strategy. See [Multiple Strategies](/strategies).
When nothing matches, the signal is rejected with error `6019`. A modify that names nothing to change is rejected with `6020`.
`sl=entry`, `sl=none` and `tp=none` only mean something on an open position. On a pending order they are rejected before they reach your EA: `7006` for a stop loss, `7005` for a take profit.
### Target One Trade by Ticket [#target-one-trade-by-ticket]
A close, partial close or modify signal can name one trade by its MT5 ticket and act on that trade alone. Add `ticket=` to:
* `closebuy` / `closesell` (aliases `closelong` / `closeshort`), with or without a partial close (`pct_percent=`, `pct_lots=`)
* `modifylong` / `modifyshort`
* `modifybuystop`, `modifybuylimit`, `modifysellstop` and `modifyselllimit`. For a pending-order modify, the ticket is the order's ticket.
```
LicenseID,EURUSD,closebuy,ticket=10753414922
```
```
LicenseID,EURUSD,closebuy,pct_percent=50,ticket=10753414922
```
```
LicenseID,XAUUSD,modifylong,sl=entry,ticket=10753414922
```
**Rules**
* The ticket narrows the signal, it never widens it. Symbol and side (and `comment`, if sent) must still match the position.
* A ticket that is no longer open changes nothing. A close reports "Nothing to close", and a modify is rejected with error `6019`.
* A ticket that is not a number is rejected with error `6025`.
* `closeall`, `cancellong`, `cancelshort`, entries and reversals do not take a ticket.
* It needs EA 0.71 or later. An account on an older EA does not get the signal, and its delivery shows `rejected` with error `7021`.
* It is an MT5 feature. cTrader and TradeLocker accounts refuse a close or modify that carries a ticket.
**Where the ticket comes from**
* The delivery of the signal that opened the trade carries it: `GET /api/v1/deliveries` returns it as `ticket`, and the MCP tool `get_signal_deliveries` does the same.
* `GET /api/v1/live/account` lists it on each open position.
* It is the MT5 position ticket, which stays the same after a partial close.
See the [REST API](/rest-api#sending-a-signal) for the `ticket` field of `POST /api/v1/signals`.
## Advanced Features [#advanced-features]
Advanced parameters that enhance your trading signals with features like trailing stops, breakeven levels, and more.
### Feature Control Settings [#feature-control-settings]
Advanced features can be controlled by either signals or EA settings.
| Feature | EA Setting | Signal Parameter |
| --------------- | -------------------------------------- | ----------------------------------------------------- |
| Trailing Stop | Trailing Mode: Disabled/Enabled/Signal | `trtrig, trdist, trstep` (requires Signal mode in EA) |
| Pyramid Trading | Pyramid Mode: Disabled/Enabled/Signal | `py` (requires Signal mode in EA) |
| Recovery System | Recovery Mode: Disabled/Enabled/Signal | `re` (requires Signal mode in EA) |
For any feature to be controlled via signal parameters, the corresponding EA setting MUST be set to "Signal". Otherwise, the signal parameters for these features will be ignored.
### Trailing Stop [#trailing-stop]
Add trailing stop functionality to your trades using these parameters together.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,trtrig=20,trdist=10,trstep=5
```
* **`trtrig=`**. Trailing stop will be activated after the trade gains this number of pips. For example, with `trtrig=20`, the trailing stop will activate after price moves 20 pips in your favor.
* **`trdist=`**. Distance in pips to maintain between the current price and the trailing stop. For example, with `trdist=10`, the stop loss will be placed 10 pips away from the current price.
* **`trstep=`**. Minimum price movement in pips required to adjust the trailing stop. For example, with `trstep=5`, the stop loss will only move after the price moves at least 5 pips.
### Breakeven [#breakeven]
Automatically move your stop loss to breakeven level when price reaches a certain point.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,betrig=15,bedist=2
```
* **`betrig=`**. Breakeven will be activated after the trade gains this number of pips. For example, with `betrig=15`, the breakeven will activate after price moves 15 pips in your favor.
* **`bedist=`**. Distance in pips from the entry price to place the stop loss after breakeven is triggered. With `bedist=2`, the stop loss will be placed 2 pips in profit from your entry. This is optional: leave it out, or send `bedist=0`, and the stop moves to your entry price plus the spread.
### Pyramid Trading [#pyramid-trading]
Configure pyramid trading strategies with multiple entries.
```
LicenseID,BTCUSD,buy,risk=0.01,sl=500,tp=2000,comment=BTCTrend,py
```
* **`py`**. Flag to enable pyramid trading mode for a strategy. Requires the EA to have Pyramid Management set to "Signal" in settings. All pyramid configuration settings are controlled from the EA.
**`py` applies to the strategy, not to the signal.** The EA reads the flag only when it creates the strategy group, which is the first trade for a given symbol and comment. Every later signal for that group inherits the decision, so adding `py` to a running strategy does nothing, and **removing `py` does not stop pyramid management**. To change it, close every position in the group and let the next signal recreate it, or move the strategy to a different `comment=`.
Multiple strategies and sticky flags
### Recovery Mode [#recovery-mode]
Enable recovery system for managing losing positions.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,re
```
* **`re`**. Flag to enable the recovery system. Requires the EA to have the Recovery Mode set to "Signal" in settings. All recovery configuration settings are controlled from the EA.
### Exit Opposite Positions (ExOp) [#exit-opposite-positions-exop]
Smart position management that closes opposite positions or opens new trades based on market conditions.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,exop
```
* **`exop`**. Flag that modifies trade behavior: if opposite positions exist for the symbol/comment, close them and don't execute the new trade. If no opposite positions exist, execute the trade normally.
**How it works:**
* **Buy signal with exop:** If sell positions exist, close sells and no buy is executed. If no sells exist, execute buy normally.
- **Trend Reversal:** Close counter-trend positions when trend changes, only open a new position if market is clean.
- **Risk Management:** Avoid adding to drawdown by only trading when there are no opposite positions.
- **Strategy Filtering:** Works with comment filtering to manage specific strategy positions only.
### Exit and Enter (ExEnt) [#exit-and-enter-exent]
Advanced position management that closes opposite positions and immediately opens new trades in the signal direction.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,exent
```
* **`exent`**. Flag that modifies trade behavior: if opposite positions exist for the symbol/comment, close them and then execute the new trade. If no opposite positions exist, execute the trade normally.
**How it works:**
* **Buy signal with exent:** If sell positions exist, close sells, then execute buy. If no sells exist, execute buy normally.
**Key Differences from ExOp:**
* **ExOp:** Closes opposite positions, then stops (no new trade opened).
* **ExEnt:** Closes opposite positions, then continues to open the new trade.
- **Trend Reversal:** Automatically flip from long to short (or vice versa) when market conditions change.
- **Strategy Switching:** Close positions from one strategy and immediately enter with a new strategy.
- **Risk Management:** Ensure you're always positioned in the current trend direction.
- **Automated Trading:** Perfect for algorithmic strategies that need to switch directions quickly.
### Ignore Exit Signals (NoExit) [#ignore-exit-signals-noexit]
Per-strategy server-side filter that drops position-close signals before they reach the EA. Other strategies on the same license are unaffected.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,noexit
```
* **`noexit`**. Flag added to a strategy's alert message. The server rejects resolved position-close actions (`closebuy`, `closesell`, `closeall`) before forwarding to the EA. Entries, reversals (`closelongbuy`, `closeshortsell`, etc.), and pending-order cancels (`cancellong`, `cancelshort`) pass through unchanged. They have different fallback semantics and are out of scope for this filter. Rejections show as **rejected** status (orange) in the signal history with error code **7020** for audit. Because the rejection is user-configured rather than a system failure, no email/telegram notification is sent.
**Enabling NoExit:** Toggle **Ignore Exit Signals** in the Syntax Generator next to Exit on Opposite / Exit on Entry, then recopy the alert message into TradingView.
* **Manual Exit Management:** Take the strategy's entries but close trades via the EA's built-in TP/SL/trailing logic.
* **Stricter Risk Management:** Override the strategy's exit logic with the EA's session-end, drawdown, or news-filter rules.
* **Hybrid Strategies:** Combine entries from one strategy with exits driven by a different system.
### Multi-Level Take Profit [#multi-level-take-profit]
Scale out of positions at multiple price levels with automatic partial close execution. Set unlimited TP levels (`tp1`, `tp2`, `tp3`, `tp4`, `tp5`, ...) with optional partial close percentages for each level.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp1=50,pct1=0.5,tp2=100,pct2=0.3,tp3=150,tp4=200
```
* **`tp1=, tp2=, tp3=, tp4=, ...`**. Define unlimited take profit levels in pips (or points if enabled). Each level represents a price target where the EA will take action.
* **`pct1=, pct2=, pct3=, pct4=, ...`**. Optional partial close for each TP level, as a share between 0.0 and 1.0 of what is still open when that level is reached. For example, `pct1=0.5` closes half the position at `tp1`, and `pct2=0.5` then closes half of what is left. If omitted, smart defaults are used automatically.
**How it works:**
* **Intermediate Levels:** When price reaches `tp1`, `tp2`, `tp3`, etc., the EA executes a partial close using the specified `pct` value.
* **Final TP Level:** The last TP level is always set as the position's take profit at the broker (closes all remaining position).
* **Automatic Updates:** After each partial close, the position's TP is automatically updated to the next level.
* **Unlimited Support:** You can set as many TP levels as your strategy requires.
**Smart Defaults:**
* **2 TP Levels:** If pct values are omitted, first TP closes 50%, second closes remaining 50%.
* **3 TP Levels:** If pct values are omitted, first TP closes 33%, second closes 50% of what is left, third closes the rest (a third each).
* **4+ TP Levels:** Smart defaults divide positions equally among intermediate levels, with the final level set as the position's take profit at the broker.
- **Conservative Scaling:** `tp1=30,pct1=0.3,tp2=60,pct2=0.43,tp3=100` (take 30% of the position twice, let the final 40% ride: 0.43 of the 70% left is 30%).
- **Aggressive Scaling:** `tp1=20,pct1=0.7,tp2=50,pct2=0.67,tp3=100` (secure 70% early, then 20% more, leaving a 10% runner).
- **Simple Two-Level:** `tp1=50,tp2=100` (uses smart defaults: 50% at each level).
#### Partial Close in Lots or as a Share [#partial-close-in-lots-or-as-a-share]
Like a close signal's `pct_lots=` and `pct_percent=`, each TP level takes an explicit type that works regardless of the EA's "Partial Close Type" setting:
| Parameter | Description | Example |
| ----------------------------------- | --------------------------------------------------------------- | ----------------------------------------------- |
| `pct1_lots=, pct2_lots=, ...` | Lots to close at that TP level | `pct1_lots=0.5` (close exactly 0.5 lots at tp1) |
| `pct1_percent=, pct2_percent=, ...` | Share of what is still open to close at that TP level (0.0–1.0) | `pct1_percent=0.5` (close half at tp1) |
The type set on `pct1` carries to the plain `pct2=`, `pct3=` that follow, the same way `tp1_pips=` sets the unit for `tp2=`, `tp3=`. A typed key on a later level sets that level's own type.
```
LicenseID,XAUUSD,buy,vol_lots=2,sl=300,tp1=200,pct1_lots=0.5,tp2=400,pct2=1,tp3=800
```
Closes 0.5 lots at tp1, 1 lot at tp2, and the remaining 0.5 lots at tp3.
Explicit TP level types need EA 0.77 or later. An older EA ignores `pct1_lots=` and `pct1_percent=` and uses the smart defaults for those levels.
### Point-Based Values (For Indices & CFDs) [#point-based-values-for-indices--cfds]
Use point-based values instead of pips for instruments like indices, commodities, and crypto. Perfect for US30, NAS100, DAX40, Gold, etc.
**EA Setting Required:** In EA General Settings, enable **"Use Points Instead of Pips"** to activate this feature.
**With Feature Enabled:**
```
LicenseID,US30,buy,risk=0.25,sl=100,tp=200,comment=US30_Strategy
```
This signal will set SL at exactly 100 points (100.0 price distance) and TP at 200 points (200.0 price distance). No calculations needed.
**How it works:**
* **Traditional Mode (disabled):** Values interpreted as "pips" with broker-specific multipliers.
* **Point Mode (enabled):** Signal value directly represents price distance. Works for any broker decimal format.
* **Example:** `sl=100` with point mode equals exactly 100 points stop loss, regardless of broker.
- **Intuitive for Indices:** Think in points (100 points on US30) not pips.
- **No Calculations:** Enter values exactly as you think about them.
- **Broker Independent:** Works with any broker's decimal format (1, 2, or 3 decimals).
- **Perfect For:** US30, NAS100, DAX40, SPX500, Gold, Silver, Oil, Crypto.
This feature affects ALL TP/SL values in signals (`tp`, `tp1`, `tp2`, `tp3`, `sl`, `pending`). Once enabled, all values are interpreted as points/price distance instead of pips.
## Signal Examples [#signal-examples]
Examples of different signal formats for various trading scenarios.
### Basic Orders [#basic-orders]
**Market Buy Order**. Simple buy order for EURUSD with 0.01 lots.
```
LicenseID,EURUSD,buy,risk=0.01
```
**Market Sell Order**. Simple sell order for GBPUSD with 0.01 lots.
```
LicenseID,GBPUSD,sell,risk=0.01
```
**Buy with Stop-Loss and Take-Profit**. Buy order with 30 pips stop-loss and 50 pips take-profit.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50
```
**Buy Order with Comment**. Buy order with stop-loss, take-profit, and strategy comment.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,comment=Strategy1
```
### Closing Positions [#closing-positions]
**Close Specific Position Type**. Close all buy positions for EURUSD.
```
LicenseID,EURUSD,closebuy
```
**Close All Positions**. Close all open positions for EURUSD.
```
LicenseID,EURUSD,closeall
```
**Close All Positions with Comment**. Close all EURUSD positions that have the comment "Strategy1".
```
LicenseID,EURUSD,closeall,comment=Strategy1
```
**Partial Close 50% of Positions**. Close 50% of buy positions with comment "Strategy1" (Percentage mode) or close exactly 0.5 lots (Lots mode).
```
LicenseID,EURUSD,closebuy,pct=0.5,comment=Strategy1
```
**Partial Close 25% of All Positions**. Close 25% of all open positions for EURUSD (Percentage mode) or close exactly 0.25 lots per EURUSD position (Lots mode).
```
LicenseID,EURUSD,closeall,pct=0.25
```
### Replace Orders [#replace-orders-1]
**Close Long Then Open Buy**. Closes all long positions, then opens a new buy with provided parameters.
```
LicenseID,EURUSD,closelongbuy,risk=0.01,sl=30,tp=50,comment=Strategy1
```
**Close Short Then Open Sell**. Closes all short positions, then opens a new sell with provided parameters.
```
LicenseID,GBPUSD,closeshortsell,risk=0.02,sl=40,tp=80,comment=Strategy2
```
**Close Long Then Open Sell**. Closes all long positions, then opens a new sell with provided parameters.
```
LicenseID,EURUSD,closelongsell,risk=0.01,sl=25,tp=45,comment=Strategy3
```
**Close Short Then Open Buy**. Closes all short positions, then opens a new buy with provided parameters.
```
LicenseID,GBPUSD,closeshortbuy,risk=0.02,sl=35,tp=70,comment=Strategy4
```
### Pending Orders [#pending-orders-1]
**Buy Stop Pending Order**. Buy stop order 20 pips above current price.
```
LicenseID,EURUSD,buystop,risk=0.01,pending=20,sl=30,tp=50
```
**Buy Limit Pending Order**. Buy limit order 20 pips below current price.
```
LicenseID,EURUSD,buylimit,risk=0.01,pending=20,sl=30,tp=50
```
**Sell Stop Pending Order**. Sell stop order 25 pips below current price.
```
LicenseID,GBPUSD,sellstop,risk=0.02,pending=25,sl=40,tp=80
```
**Sell Limit Pending Order**. Sell limit order 25 pips above current price.
```
LicenseID,GBPUSD,selllimit,risk=0.02,pending=25,sl=40,tp=80
```
**Cancel Pending Buy Orders**. Cancel all pending buy orders (buystop and buylimit) for EURUSD.
```
LicenseID,EURUSD,cancellong
```
**Cancel Pending Sell Orders**. Cancel all pending sell orders (sellstop and selllimit) for EURUSD.
```
LicenseID,EURUSD,cancelshort
```
**Pending Order Cancelled at TP1**. Sell limit at 4180 that is cancelled if price reaches 4175 before it fills.
```
LicenseID,XAUUSD,selllimit,risk=0.01,entry_price=4180,sl_price=4185,tp_price=4175,cancel_at=tp1
```
### Advanced Examples [#advanced-examples]
**Multi-Level Take Profit**. Buy order with 3 TP levels: close 50% at 50 pips, 30% of the position at 100 pips (0.6 of the half left), the remaining 20% at 150 pips.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp1=50,pct1=0.5,tp2=100,pct2=0.6,tp3=150
```
**Multi-TP with Smart Defaults**. Buy order with 2 TP levels using smart defaults (50% at first TP, 50% at second).
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp1=50,tp2=100
```
**Mixed TP Types**. TP1: 10 currency, TP2: 1% of price, TP3: inherits currency type from tp1.
```
LicenseID,XAUUSD,buy,vol_lots=0.1,tp1_points=10,tp2_percent=1,tp3=20
```
**Dollar Risk with Currency**. Risks $100, SL at 15.00 price distance, TP at 45.00 price distance.
```
LicenseID,XAUUSD,sell,vol_dollar=100,sl_points=15,tp_points=45
```
**Percentage-Based Risk**. Risks 1% of balance at 50 pip SL with explicit pips type.
```
LicenseID,EURUSD,buy,vol_pctbal_loss=1,sl_pips=50,tp_pips=100
```
**With Trailing Stop**. Buy order with trailing stop that activates after 30 pips in profit.
```
LicenseID,USDJPY,buy,risk=0.05,sl=20,tp=60,trtrig=30,trdist=15,trstep=3
```
**Trailing Stop with Currency**. Index trade with explicit currency-based trailing stop activation and distance.
```
LicenseID,US30,buy,vol_lots=0.5,sl_points=50,tp_points=150,trtrig_points=30,trdist_points=20
```
**Breakeven Example**. Buy order with breakeven that activates after 20 pips in profit.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=60,betrig=20,bedist=2
```
**Pyramid Trading Strategy**. Buy order with pyramid trading enabled, allowing up to 3 entries.
```
LicenseID,BTCUSD,buy,risk=0.01,sl=500,tp=2000,py
```
**Recovery Mode**. Buy order with recovery mode enabled.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,re
```
**Exit Opposite Positions**. If sell positions exist, close them only. If no sell positions, execute the buy order normally.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,exop
```
**Exit and Enter**. Close any sell positions and then execute the buy order (reversal strategy).
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,exent
```
**Ignore Exit Signals**. Strategy entries fire normally; position-close actions from this strategy are dropped server-side before reaching the EA.
```
LicenseID,EURUSD,buy,risk=0.01,sl=30,tp=50,noexit
```
## Parameter Processing Rules [#parameter-processing-rules]
When processing signals, the TradeSgnl EA follows these rules.
### Symbol Names [#symbol-names]
Symbol names in signals must match exactly with the symbol names in your MT5 terminal. For example, if your broker uses "EURUSD.a" in Market Watch, your signal must use the same format.
```
LicenseID,EURUSD.a,buy,risk=0.01
```
Alternatively, you can use our Symbol Mapping feature to map symbol names to the correct broker-specific symbols.
Learn about Symbol Mapping
### Risk-Based Sizing [#risk-based-sizing]
When using percentage-based risk (e.g., `risk=1`), the lot size is calculated as a percentage of your account balance or equity, depending on the EA's settings. The `sl=` parameter is not required for this calculation.
With `risk=1` on a $10,000 account, a 1 lot position will be opened (0.1 lot for a $1,000 account, or 10 lots for a $100,000 account).
## Valid Action Types [#valid-action-types]
The EA supports the following action types in signals.
| Category | Action Types | Description |
| ----------------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| Market Orders | `buy, long, sell, short` | Immediate market entry orders |
| Closing Positions | `closebuy, closelong, closesell, closeshort, closeall` | Close existing positions by type or all positions (supports partial closes with `pct=`) |
| Replace Orders | `closelongbuy, closelongsell, closeshortbuy, closeshortsell` | Close one side and immediately open the specified direction with given parameters |
| Pending Orders | `buystop, buylimit, sellstop, selllimit` | Orders that execute at specified price levels |
| Cancel Orders | `cancellong, cancelshort` | Cancel pending orders by type |
| Modify Orders | `modifylong, modifyshort, modifybuystop, modifybuylimit, modifysellstop, modifyselllimit` | Change the SL/TP of open positions, or the entry, SL and TP of pending orders, without closing them |
## Signal Format Cheat Sheet [#signal-format-cheat-sheet]
A comprehensive quick reference for all signal formats. Use this as your go-to cheat sheet for creating trading signals.
| Action | Format |
| --------------------------------- | ------------------------------------------------------------------------------ |
| Market Buy | `LicenseID,SYMBOL,buy,risk=VOLUME` |
| Market Sell | `LicenseID,SYMBOL,sell,risk=VOLUME` |
| Buy with SL/TP | `LicenseID,SYMBOL,buy,risk=VOLUME,sl=PIPS,tp=PIPS` |
| Sell with SL/TP | `LicenseID,SYMBOL,sell,risk=VOLUME,sl=PIPS,tp=PIPS` |
| Buy Stop | `LicenseID,SYMBOL,buystop,risk=VOLUME,pending=PIPS` |
| Buy Limit | `LicenseID,SYMBOL,buylimit,risk=VOLUME,pending=PIPS` |
| Sell Stop | `LicenseID,SYMBOL,sellstop,risk=VOLUME,pending=PIPS` |
| Sell Limit | `LicenseID,SYMBOL,selllimit,risk=VOLUME,pending=PIPS` |
| Close Buy Positions | `LicenseID,SYMBOL,closebuy` |
| Close Sell Positions | `LicenseID,SYMBOL,closesell` |
| Close All Positions | `LicenseID,SYMBOL,closeall` |
| Close All with Comment | `LicenseID,SYMBOL,closeall,comment=STRATEGY` |
| Partial Close 50% | `LicenseID,SYMBOL,closebuy,pct=0.5,comment=STRATEGY` |
| Partial Close All 25% | `LicenseID,SYMBOL,closeall,pct=0.25` |
| Close One Trade by Ticket | `LicenseID,SYMBOL,closebuy,ticket=TICKET` |
| Partial Close One Trade by Ticket | `LicenseID,SYMBOL,closebuy,pct_percent=0.5,ticket=TICKET` |
| Close Long Then Buy | `LicenseID,SYMBOL,closelongbuy,risk=VOLUME,sl=PIPS,tp=PIPS,comment=STRATEGY` |
| Close Long Then Sell | `LicenseID,SYMBOL,closelongsell,risk=VOLUME,sl=PIPS,tp=PIPS,comment=STRATEGY` |
| Close Short Then Buy | `LicenseID,SYMBOL,closeshortbuy,risk=VOLUME,sl=PIPS,tp=PIPS,comment=STRATEGY` |
| Close Short Then Sell | `LicenseID,SYMBOL,closeshortsell,risk=VOLUME,sl=PIPS,tp=PIPS,comment=STRATEGY` |
| Buy with Trailing Stop | `LicenseID,SYMBOL,buy,risk=VOLUME,trtrig=PIPS,trdist=PIPS,trstep=PIPS` |
| Sell with Trailing Stop | `LicenseID,SYMBOL,sell,risk=VOLUME,trtrig=PIPS,trdist=PIPS,trstep=PIPS` |
| Buy with Breakeven | `LicenseID,SYMBOL,buy,risk=VOLUME,betrig=PIPS,bedist=PIPS` |
| Sell with Breakeven | `LicenseID,SYMBOL,sell,risk=VOLUME,betrig=PIPS,bedist=PIPS` |
| Cancel Pending Buy Orders | `LicenseID,SYMBOL,cancellong` |
| Cancel Pending Sell Orders | `LicenseID,SYMBOL,cancelshort` |
| Modify Open Buys | `LicenseID,SYMBOL,modifylong,sl_price=PRICE,tp_price=PRICE,comment=STRATEGY` |
| Move Stop to Entry | `LicenseID,SYMBOL,modifylong,sl=entry,comment=STRATEGY` |
| Remove Stop Loss | `LicenseID,SYMBOL,modifylong,sl=none,comment=STRATEGY` |
| Modify One Trade by Ticket | `LicenseID,SYMBOL,modifylong,sl_price=PRICE,ticket=TICKET` |
| Modify Pending Buy Limit | `LicenseID,SYMBOL,modifybuylimit,entry_price=PRICE,sl_price=PRICE` |
| Pyramid Trading | `LicenseID,SYMBOL,buy,risk=VOLUME,py` |
| Recovery Mode | `LicenseID,SYMBOL,buy,risk=VOLUME,re` |
| Exit Opposite Positions | `LicenseID,SYMBOL,buy,risk=VOLUME,exop` |
| Exit and Enter | `LicenseID,SYMBOL,buy,risk=VOLUME,exent` |
| Ignore Exit Signals | `LicenseID,SYMBOL,buy,risk=VOLUME,noexit` |
| Percentage Risk | `LicenseID,SYMBOL,buy,risk=PERCENTAGE` |
| With Comment | `LicenseID,SYMBOL,buy,risk=VOLUME,comment=STRATEGY` |
Use these formats as templates for your TradingView alerts or webhook configurations. Replace the placeholder values (LicenseID, SYMBOL, VOLUME, PIPS, etc.) with your actual values.
# Multiple Strategies (/strategies)
One trading account can run as many strategies as you like at the same time, and TradeSgnl will keep them from interfering with each other. What makes that work is the `comment=` parameter.
`comment=` is the most important optional parameter in a TradeSgnl signal. It is not a note or a label. It is the key TradeSgnl uses to group your trades into a **strategy**, and almost every advanced feature operates on that group rather than on individual trades.
Trades on the same symbol that share a comment are one strategy. Different comments, or the same comment on a different symbol, are separate strategies that never interfere with each other. Trades with no comment fall into one unnamed strategy per symbol.
## Why the comment matters [#why-the-comment-matters]
Without a comment, every trade on a symbol lands in one shared bucket. A close signal from strategy A closes strategy B's positions. Pyramid targets are calculated across unrelated trades. Direction Lock rejects a valid short because an unrelated long is open.
Give each strategy its own comment and all of that isolation happens automatically.
Trades sharing a symbol and comment are managed as one coordinated position: shared pyramid target, shared hedge decision, shared level counter.
Close, partial close, reversal, and cancel actions only touch positions whose comment matches the one in the signal.
Multiple strategies run on one account and one EA instance without stepping on each other.
## Setting the comment [#setting-the-comment]
In the **Syntax Generator**, fill the **Comment** field at the top of the form next to License and Symbol. It is written into every signal the generator produces.
Open the Syntax Generator guide
By hand, add `comment=` anywhere in the parameter list:
```
LicenseID,EURUSD,buy,risk=0.01,sl=50,tp=100,comment=TrendStrategy
```
### Naming rules [#naming-rules]
| Rule | Why |
| ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Matching is exact and case sensitive | `TrendStrategy` and `trendstrategy` are two different strategies. A stray space or a typo silently creates a second group. |
| Spaces at the start and end are ignored, spaces inside count | `My Strategy` and `MyStrategy` are two different strategies. A comment cannot contain a comma, because commas separate the parameters. |
| Keep it to 31 characters or fewer | That is MT5's limit on order comments. The REST API accepts 1 to 31 characters: letters, digits, space, `_` and `-`. A longer comment can split a strategy in two if the EA has to rebuild its groups (see [Restarts and comments](#restarts-and-comments)). |
| Avoid `_Hedge` and `Recovery` | Both are reserved. The EA appends `_Hedge` to hedge positions and ` Recovery` to recovery positions, and it skips any group whose comment contains either string when deciding whether to open a hedge. A comment like `Recovery_Grid` will never be hedge protected. |
### Restarts and comments [#restarts-and-comments]
The EA keeps its own record of every trade's comment, saved on the computer running MT5 within a second of each change. It matches closes and modifies against that record, not against the comment the broker shows. So a strategy stays together through an EA restart, a terminal restart, a partial close, and a broker that clears or rewrites the comment.
Only when that record is not available (MT5 moved to a different computer, or a fresh Windows user) does the EA rebuild its groups from open positions, reading the comment the broker stored on the opening order. A comment longer than 31 characters comes back cut short in that case, which is the one way a group can split, so keep comments within 31 characters.
After such a rebuild, each position keeps the stop loss and take profit set at the broker. A multi-level take profit ladder and per-signal trailing or breakeven settings are not restored, and the EA's own input settings apply instead.
### The symbol is part of the key [#the-symbol-is-part-of-the-key]
A strategy group is identified by **symbol plus comment**, not by the comment on its own. Running `comment=Scalper` on both EURUSD and GBPUSD gives you two independent groups: separate pyramid targets, separate level counters, separate hedge decisions, and a EURUSD close signal never touches the GBPUSD positions.
That means reusing one comment across symbols is safe. Distinct names per symbol, such as `Scalper_EU` and `Scalper_GU`, are still worth using when you want to tell the two apart at a glance in your trading platform and in the Analytics dashboard.
EA versions before 0.64 keyed strategy groups on the comment alone, so the same comment on two symbols merged into one group with targets computed from whichever symbol opened first. If you are on an older build, keep comments unique per symbol until you update.
## What the comment controls [#what-the-comment-controls]
| Feature | How the comment is used |
| ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Pyramid Trading](/pyramid-trading) | Defines the group. Combined breakeven, shared profit target, pyramid trailing, level counter, and per level trade limits are all calculated per comment. |
| Direction Lock | Prevents mixing buy and sell inside one comment group. Trades under a different comment are unaffected, and the filter only acts on pyramid-managed strategies. |
| DCA Filter | Compares a new entry against the last entry **in the same comment group**. Also pyramid-managed strategies only. |
| [Hedge Protection](/hedge-protection) | Loss thresholds are evaluated per comment group, and the hedge position is opened with `YourComment_Hedge`. |
| [Recovery System](/recovery-system) | Recovery trades are opened with `YourComment Recovery` so they stay identifiable and are excluded from hedging. |
| `closebuy`, `closesell`, `closeall` | Only positions matching both the symbol and the comment are closed. Omit the comment and **every** position on that symbol in that direction closes, regardless of which strategy opened it. |
| Partial close (`pct=`, `pct_lots=`, `pct_percent=`) | Same filtering. Remaining positions stay in their strategy, even on brokers that clear the comment after a partial close, so repeated partial closes and a later `closeall` stay on target. |
| Reversals (`closelongbuy`, `closeshortsell`, and the rest) | The close half is comment filtered, then the new entry is opened under the same comment. |
| `cancellong`, `cancelshort` | Only pending orders with the matching comment are cancelled. |
| `exop` and `exent` | Opposite positions are looked up within the symbol and comment before deciding to close or flip. |
| `noexit` | Applied per strategy at the server. Other strategies on the same license still process their exit signals normally. |
| [Analytics](/analytics) and [Backtesting](/backtesting) | Trades are grouped by comment so you can compare strategies side by side. |
`LicenseID,EURUSD,closebuy` closes every buy on EURUSD across all your strategies. Always include the comment in exit signals if the account runs more than one strategy.
A close or modify with a comment acts only on positions carrying exactly that comment. If several open trades share a comment, all of them are affected, and the delivery note gives the count. To close or modify one trade on its own, give each trade its own comment, or name it with `ticket=`. See [Target One Trade by Ticket](/signals#target-one-trade-by-ticket).
## Sticky group settings and per signal settings [#sticky-group-settings-and-per-signal-settings]
This is where most confusion starts. Some signal parameters apply only to the trade that carries them. Others are read **once**, when the strategy group is created, and then govern the whole group until it closes.
| Parameter | Scope | Read when |
| ------------------------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------ |
| `py` | **Whole group, sticky** | Only on the signal that creates the group. Ignored on every later signal for that comment. |
| `re` | Per trade | Every signal. Only trades carrying `re` get recovery. |
| `exop`, `exent`, `noexit` | Per signal | Every signal. |
| `sl=`, `tp=`, `tp1=`, `pct=`, trailing, breakeven | Per trade | Every signal. |
### Why `py` is sticky [#why-py-is-sticky]
When a signal arrives, the EA checks whether a strategy group with that comment already exists.
* **No group exists.** This signal creates it. In Signal mode, the presence of `py` decides whether the group is pyramid managed, and the pyramid target, level size, and trade limit are copied from the EA inputs into the group at that moment.
* **A group already exists.** The `py` flag is not read at all. The trade is added to the existing group and inherits whatever the group was created with.
The consequence: **removing `py` from your alert does not turn pyramid management off** for a strategy that is already running. The setting is stamped on the group, not on the signal. Adding `py` to a group that was created without it does nothing either.
Close every trade in that comment group. The group is deleted when its last position closes, and the next signal with that comment creates a fresh group that re-reads the `py` flag. If you need the change to take effect without closing positions, send the new trades under a **different comment** instead.
### Pyramid mode: Enabled versus Signal [#pyramid-mode-enabled-versus-signal]
The EA input **Pyramid Management** has three modes, and the difference between the last two is exactly this stamping behaviour.
| Mode | What happens on a new group | Does `py` matter? |
| ----------- | ------------------------------------------------------------------------- | ----------------------------------------------------------- |
| Disabled | No group is ever pyramid managed. | No. `py` is ignored entirely. |
| **Enabled** | **Every** new group is pyramid managed, automatically. | No. `py` is ignored, because every group already qualifies. |
| **Signal** | A new group is pyramid managed **only if** its first signal carried `py`. | Yes, but only on the first signal for that comment. |
Use **Enabled** when every strategy on the terminal should pyramid. Use **Signal** when you want to pick which strategies pyramid and control it from the alert message.
If the EA loses its saved state files and has to rebuild groups from open positions after a restart, it cannot know which signals carried `py`. Rebuilt groups are treated as pyramid managed whenever Pyramid Management is Enabled or Signal.
## Group lifecycle [#group-lifecycle]
**Created.** The first trade with a new comment creates the strategy group. Pyramid on or off, the pyramid target, level size, and per level trade limit are all fixed at this moment from the EA inputs.
**Grows.** Later trades with the same comment join the group. Once the group holds two or more trades and has a pyramid target, individual take profits are removed and replaced by the shared strategy target.
**Shrinks.** Closing individual trades removes them from the group. The rest of the group keeps its settings.
**Deleted.** When the last position in the group closes, the group is removed along with its chart target line. The stamped settings are gone.
**Recreated.** The next signal with that comment starts over at step 1 and re-reads `py`.
## Worked example [#worked-example]
Pyramid Management is set to **Signal**. Pyramid Target is 50 pips.
| # | Signal | What the EA does |
| - | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 1 | `...,buy,risk=0.01,tp=100,comment=Trend,py` | No `Trend` group exists, so one is created. `py` is present, so the group is pyramid managed with a 50 pip target. |
| 2 | `...,buy,risk=0.01,tp=100,comment=Trend` | `Trend` exists. `py` is not read. The trade joins the group. Both trades now share the 50 pip strategy target and their individual take profits are dropped. |
| 3 | `...,buy,risk=0.01,tp=100,comment=Trend` | Same again. Still pyramid managed. Dropping `py` changed nothing. |
| 4 | `...,buy,risk=0.01,tp=100,comment=Trend2` | A different comment, so a brand new group. No `py`, so `Trend2` is **not** pyramid managed and keeps its own 100 pip take profit per trade. |
| 5 | Strategy target hit, all `Trend` trades close | The `Trend` group is deleted. |
| 6 | `...,buy,risk=0.01,tp=100,comment=Trend` | No group exists any more, so this creates one. No `py`, so `Trend` is now **not** pyramid managed. |
Rows 3 and 6 are the whole point. The same signal produced different behaviour depending on whether a group with that comment was already open.
## Common mistakes [#common-mistakes]
| Symptom | Cause | Fix |
| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Trades that should pyramid together do not | Comments do not match exactly (case, spaces, a trailing character) | Compare the comments character by character. Use the Syntax Generator so the value is identical in every alert. |
| Pyramid keeps running after `py` was removed | The group was already stamped as pyramid managed | Close every position in that group, or switch the strategy to a new comment. |
| Adding `py` does not enable pyramid on a running strategy | The same reason, in the other direction | Close the group first, or use a new comment. |
| Two unrelated symbols share one target | The same comment was used on both, on an EA build older than 0.64 | Update the EA, or make the comment unique per symbol. |
| A close signal wiped out another strategy | The close signal had no `comment=` | Add the comment to every exit signal. |
| Direction Lock or DCA Filter rejects a trade unexpectedly | Both filters act on pyramid-managed strategies, and the group is pyramid managed | Check the Pyramid Management mode, and whether `py` was on the signal that opened the group. Turn the filter off in the EA inputs if you want the strategy to pyramid without it. |
| Hedge protection never triggers for one strategy | The comment contains `Recovery` or `_Hedge` | Rename the strategy comment. |
| Groups split in two after the EA had to rebuild from open positions | MT5 was moved to a different computer or a fresh Windows user, so the EA's own record of comments was not available, and the comment was longer than 31 characters and came back cut short | Keep comments within 31 characters. See [Restarts and comments](#restarts-and-comments). |
## Hedging and netting accounts [#hedging-and-netting-accounts]
How several strategies share a symbol depends on the account type. `GET /api/v1/live/account` returns `trading.margin_mode` (`hedging` or `netting`) for an account with a Cloud Terminal.
* **Hedging account.** Each entry opens its own position, so several strategies can hold the same symbol side by side, each with its own stop loss, take profit and comment.
* **Netting account.** MT5 keeps one position per symbol, with one stop loss and one take profit. A same-side entry adds to it. An opposite entry reduces it, closes it or flips it. The position carries the comment of the latest signal, so two strategies cannot be managed separately on the same symbol. Recovery and hedge protection are off on netting accounts.
When more than one strategy trades the same symbol, use a hedging account.
Name comments `Strategy_Symbol`, for example `Breakout_EU`, `Breakout_GU`, `Scalp_XAU`. Short, self-describing, no reserved strings, and readable in both your trading platform and the Analytics dashboard.
# Strategy Builder (/strategy-builder)
## Introduction [#introduction]
The TradeSgnl Strategy Builder is a customizable TradingView Pine Script that lets you create, test, and automate trading strategies directly in TradingView. It generates alerts that can be sent to your trading account for automated execution.
**Key Benefits:**
Use any indicator or data source available on your TradingView chart.
Create flexible entry and exit conditions with multiple data comparisons.
Set take profit and stop loss levels based on indicators or fixed values.
## Getting Started [#getting-started]
To get immediate access to the Strategy Builder, navigate to the [Strategy Builder page](https://portal.tradesgnl.com/strategy-builder) in your portal, enter your TradingView username, and click **Get Access**. This will instantly add the Strategy Builder to your TradingView account under invite-only scripts.
Need to move access to a different TradingView account? Change the username on the same Strategy Builder page and click **Update Access**.
**Open a TradingView Chart.** Log into TradingView using the account with the username you provided during your TradeSgnl subscription. Open any chart of your choice where you want to apply the strategy.
**Click Indicators in the Top Toolbar.** Locate and click on the "Indicators & Strategies" button in the top toolbar (or press the `/` key as a shortcut) to open the indicator browser.
**Navigate to Invite-only Scripts.** In the indicator browser, look for the "Invite-only Scripts" section. Here you'll find the TradeSgnl Strategy Builder that has been shared with your account. Click on it to add it to your chart.
If you don't see the Invite-only Scripts folder or cannot access the Strategy Builder, try refreshing your browser. If issues persist, please contact support with your TradingView username.
## Automate Any Indicator [#automate-any-indicator]
Any TradingView indicator that displays Buy and Sell signals can be automated using the Strategy Builder. This walkthrough demonstrates the complete process using the popular Supertrend indicator as an example. The same technique works for any indicator with signal plots.
**Add the Strategy Builder and Your Indicator.** First, add the TradeSgnl Strategy Builder to your chart from the Invite-only Scripts section. Then add the indicator you want to automate. In this example, we're using the Supertrend indicator with its default settings.
You'll see the indicator plotted on your chart. For Supertrend, this appears as a green line during uptrends and a red line during downtrends, with Buy and Sell arrows at trend reversals.
**Open the Data Window to Identify Signal Plots.** The secret to automating any indicator is the **Data Window**. Open it from TradingView's right sidebar (the icon looks like a list). This window shows you the exact plot values of every indicator on your chart.
Hover your cursor over the chart and watch the Data Window. When you hover over a candle where a Buy signal appeared, you'll see the indicator's "Buy" plot showing a numerical value while the "Sell" plot stays empty (shown as n/a or blank). When the trend flips to a Sell signal, the values swap.
Write down the exact names of the Buy and Sell plots you see in the Data Window. You'll use these when configuring your conditions in the Strategy Builder.
**Configure Your Entry Conditions.** Open the Strategy Builder settings and navigate to the entry conditions. Configure both Long and Short entries using the signal plots you identified:
**Long Entry 1**
* **Source A:** Select your indicator's Buy plot (e.g., "Supertrend: Buy")
* **Operator:** Greater Than
* **Use Custom Value:** Enable this option
* **Custom Value:** 0
**Short Entry 1**
* **Source A:** Select your indicator's Sell plot (e.g., "Supertrend: Sell")
* **Operator:** Greater Than
* **Use Custom Value:** Enable this option
* **Custom Value:** 0
This tells the Strategy Builder to trigger entries whenever the respective plot has any value greater than zero, which happens exactly when your indicator gives a signal.
Once configured, you'll notice the Strategy Builder plots its own entry and exit arrows directly on your candles. This powerful feature lets you visually verify your logic is 100% correct and matches your indicator perfectly before you ever take a live trade.
By default, TradeSgnl handles position management automatically. When a Sell signal is triggered, it will automatically close any open Buy trade before opening the new Short position, keeping you perfectly synced with the trend.
**Copy the Strategy Builder Preset from the Syntax Generator.** Open the [Syntax Generator](/syntax-generator) in the TradeSgnl Portal. Configure your entry signal: select your license, symbol, risk, and any optional parameters like SL/TP.
Click **"Strategy Builder Preset"**. This generates your complete config with both long and short signals auto-mirrored, including TP/SL exit messages.
**Paste into Strategy Builder and Create Alert.** In TradingView, open the Strategy Builder settings and paste into the **"Signal Preset"** field. A confirmation table appears on the chart showing all parsed messages.
Then create a TradingView alert: set the webhook URL and alert message placeholder. See the [Setting Up TradingView Alerts](#setting-up-tradingview-alerts) section below for details.
This method works with any indicator that plots Buy/Sell signals: RSI divergence indicators, custom scripts, candlestick pattern detectors, and more. The key is identifying the correct plot names in the Data Window.
## Entry Conditions [#entry-conditions]
The TradeSgnl Strategy Builder allows you to create sophisticated entry conditions for both long and short positions. You can define up to four different conditions for each trading direction and combine them using logical operators.
### Condition Structure [#condition-structure]
Each entry condition follows the same structure and consists of the following components:
* **Source A:** Primary data source (indicator, price data, or other value).
* **Operator:** Comparison operator (Crossing Over, Greater Than, etc.).
* **Source B or Value:** Secondary data source or a custom numerical value.
### Condition Operators [#condition-operators]
*Available condition operators in the Strategy Builder*
| Operator | Description | Example Usage |
| -------------- | -------------------------------------------------------------------- | ----------------------------------- |
| Crossing Over | True on the bar where Source A moves from below Source B to above it | MACD Line crosses above Signal Line |
| Crossing Under | True on the bar where Source A moves from above Source B to below it | Price crosses below 200 EMA |
| Greater Than | True on every bar where Source A is above Source B | RSI > 70 |
| Lower Than | True on every bar where Source A is below Source B | Stochastic \< 20 |
| Equals | True when Source A exactly equals Source B | Parabolic SAR = Price |
### Available Data Sources [#available-data-sources]
One of the most powerful features of the Strategy Builder is the ability to use virtually any data source available on your TradingView chart:
* **Price Data:** Open, High, Low, Close, HL2 (High+Low/2), OHLC4, and other price aggregations.
* **Technical Indicators:** Moving Averages, RSI, MACD, Bollinger Bands, Stochastic, custom indicators, etc.
* **Volume Data:** Volume, Volume MA, On-Balance Volume, and other volume-based indicators.
* **Custom Values:** Fixed numerical values for thresholds (e.g., RSI > 70, Price \< 100).
To use an indicator as a data source, first add it to your chart. For example, if you want to create a condition based on RSI crossing above 30, first add the RSI indicator to your chart, then select it as Source A in your condition.
### Combining Multiple Conditions [#combining-multiple-conditions]
You can define up to four separate conditions for each trading direction (long/short) and combine them using logical operators:
*Logical operators for combining conditions*
| Operator | Description | Example Usage |
| -------- | ---------------------------------------------------- | ----------------------------------------------- |
| AND | Every enabled condition must be true on the same bar | RSI \< 30 AND MACD crosses above Signal Line |
| OR | At least one enabled condition must be true | Price > 200 EMA OR Volume > 1.5x Average Volume |
Only enabled conditions participate in the logic evaluation. Disabled conditions are completely ignored, regardless of whether they would be true or false. This allows you to easily test different combinations without deleting your configuration.
### Example Entry Condition Scenarios [#example-entry-condition-scenarios]
**1. Moving Average Crossover**
Long Entry Condition: Fast MA (e.g., MA 10) crossing over Slow MA (e.g., MA 50).
Configuration:
* Source A: MA 10
* Operator: Crossing Over
* Source B: MA 50
* Logic: Single condition (others disabled)
**2. RSI With Trend Confirmation**
Long Entry Condition: RSI crosses above 30 (oversold) AND price is above 200 EMA (uptrend confirmation).
Configuration:
* Condition 1:
* Source A: RSI
* Operator: Crossing Over
* Source B: Custom Value (30)
* Condition 2:
* Source A: Close
* Operator: Greater Than
* Source B: EMA 200
* Logic: AND (both conditions must be true)
The same condition structure applies to both long and short entries, but typically with inverted operators (e.g., crossing over for longs, crossing under for shorts).
### Session Filter [#session-filter]
Under each direction's conditions, **Session** limits new entries to a time window, written as `HHMM-HHMM` (for example `0800-1700`) in the symbol's exchange time zone. Outside the window no new trade opens. A signal in the opposite direction can still close a trade that is already open.
### Don't Allow Trades Until Closed [#dont-allow-trades-until-closed]
By default, a signal in the opposite direction closes your open trade and reverses into the new one. Tick **Don't Allow Trades Until Closed** under a direction's conditions to stop that. Ticked under **Long Entry Conditions**, short signals are ignored while a long is open. No short opens until the long has closed by its stop loss, take profit or an exit condition. Ticked under **Short Entry Conditions**, it does the same for longs.
## Exit Conditions [#exit-conditions]
The Strategy Builder allows you to create flexible exit conditions separate from your take profit and stop loss levels. This gives you the ability to exit positions based on technical indicators or price action signals.
### Exit Condition Structure [#exit-condition-structure]
Exit conditions follow the same structure as entry conditions but are specifically designed to close existing positions:
You can define up to two separate exit conditions for long positions and two for short positions.
Use any indicator or price data on your chart as a trigger for exit signals.
Combine conditions using AND (both must be true) or OR (either can be true) logic.
Exit conditions work alongside your take profit and stop loss levels. Whichever triggers first will close the position.
### Only Exit on Profit Option [#only-exit-on-profit-option]
The Strategy Builder includes a powerful feature that allows you to prevent conditional exits when a position is in a loss:
**Only Exit on Profit:** When enabled, the strategy will ignore exit conditions if the position is currently in a drawdown (unrealized loss). This can help prevent premature exits during temporary price fluctuations.
Note: This setting only affects exit conditions, not stop losses. Your stop loss will still trigger regardless of this setting.
### Exit Condition Examples [#exit-condition-examples]
Here are some common exit condition setups:
**Long Exit Condition:** Price crosses below a faster-period moving average.
**Configuration:**
* Source A: Close
* Operator: Crossing Under
* Source B: EMA 20
* Logic: Single condition (second disabled)
This exit strategy allows your trade to run while it remains above the moving average, but exits when momentum shifts.
**Long Exit Condition:** RSI crosses above 80 (extreme overbought condition).
**Configuration:**
* Source A: RSI
* Operator: Crossing Over
* Source B: Custom Value (80)
* Logic: Single condition (second disabled)
* Only Exit on Profit: Enabled (to ensure we only exit winning trades)
This exit strategy takes profits when a position becomes extremely overbought, potentially capturing the peak of a move.
Properly tuned exit conditions often have more impact on overall strategy performance than entries. Consider experimenting with different indicators and timeframes for exit conditions, as well as combining them with appropriate take profit and stop loss levels for comprehensive risk management.
## Take Profit & Stop Loss [#take-profit--stop-loss]
The Strategy Builder provides flexible take profit (TP) and stop loss (SL) settings that can be configured independently for long and short positions. Unlike conditional exits, take profits and stop losses are fixed price levels calculated when a position is opened.
### TP/SL Configuration Structure [#tpsl-configuration-structure]
For each position direction (long/short), you can configure:
* **Enable/Disable:** Each TP and SL can be individually enabled or disabled.
* **Type:** Multiple calculation methods for determining the exact TP/SL levels.
* **Value:** The specific numeric value to use with the selected calculation type.
* **Indicator Source:** When using Indicator type, the specific indicator to use as the TP/SL level.
**Plot Take Profits** and **Plot Stop Losses** (both on by default) draw the levels on your chart so you can see each trade's risk. Untick them to hide the lines. The Builder checks the levels on every bar, and when one is hit it sends the matching close message to your account.
### TP/SL Types [#tpsl-types]
The Strategy Builder supports five different methods for calculating take profit and stop loss levels:
| Type | Summary | Description |
| --------- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Ticks | Distance in ticks/pips from entry price | Fixed distance in ticks/pips from entry price. Best for consistent risk management across different instruments. |
| Price | Exact price level for TP/SL | Specific price level. Ideal when you have precise price targets or support/resistance levels. |
| Currency | Price move in the symbol's own currency | A fixed move in price from the entry, measured in the symbol's price units. For example, 5 on gold puts the level 5 dollars from your entry. |
| Indicator | Dynamic levels based on indicator values | Uses a selected indicator's value as the TP/SL level. Perfect for dynamic exits based on technical indicators (e.g., Bollinger Bands). |
| ATR | ATR-based distance using a multiplier | Uses the Average True Range multiplied by your specified value. Great for volatility-adjusted TP/SL that adapts to market conditions (e.g., 1.5x ATR for SL, 3x ATR for TP). The ATR uses a 14-period setting. |
While the Strategy Builder allows you to set both conditional exits and TP/SL levels simultaneously, having too many exit methods can sometimes lead to prematurely closed trades. Consider which exit method is most appropriate for your trading style and strategy.
Using `{'{{strategy.order.alert_message}}'}` as your alert message creates a single alert that works for all signal types (entries, exits, TP/SL): the Strategy Builder fills in the correct signal for whichever condition triggered the alert. It works only with the Strategy Builder or a script adapted for TradeSgnl. For any other strategy, use the [Custom Strategy Message](/syntax-generator#custom-strategy-message).
## Alert Messages [#alert-messages]
Alert messages are the text sent to TradeSgnl when a strategy condition is triggered. Properly formatted alert messages are essential for trades to execute correctly based on your strategy signals.
### Signal Preset (Recommended) [#signal-preset-recommended]
The fastest way to configure all alert messages is using the **Signal Preset** field. This copies your entire signal config from the portal, including License ID, entry, exit, and TP/SL messages for both long and short directions, in a single paste.
* Open the [Syntax Generator](/syntax-generator)
* Configure your entry and exit signals
* Click **"Strategy Builder Preset"**
* Paste into the "Signal Preset" field in Strategy Builder settings
* Both long and short signals auto-generated from a single direction
* TP/SL messages auto-populated for TV-side take profit and stop loss
* License ID included, editable at the top of the config
* On-chart confirmation table shows all parsed messages
**Show Config Table** switches the on-chart table on or off, and the size option next to it (Small, Normal or Large) changes its text size.
### Manual Fields [#manual-fields]
If you prefer to set alert messages individually, you can paste the full signal syntax from the portal's syntax preview into each field under "Long Messages" and "Short Messages". These fields are only used when the Signal Preset field is empty.
### Alert Message Format [#alert-message-format]
The Syntax Generator builds these for you, but here's the format for reference:
**Format:**
```
LicenseID,SYMBOL,ACTION,risk=VOLUME,sl=SL,tp=TP,comment=TEXT
```
**Entry example:**
```
5643048533453,EURUSD,buy,risk=0.01,sl=30,tp=60
```
**Exit example:**
```
5643048533453,EURUSD,closebuy
```
For a comprehensive guide on all available signal parameters, command options, and advanced usage examples, visit our complete Signal Guide.
View Signal Guide
## Setting Up TradingView Alerts [#setting-up-tradingview-alerts]
Once you've formatted your alert messages, you need to create TradingView alerts to send them to your trading account. Follow these steps to set up your alerts correctly:
**Click the Alerts Button.** Find and click the 'Alerts' button located at the top of your TradingView chart interface. This will open the alert creation dialog where you can set up your strategy alerts.
The alert button appears in the top toolbar of any TradingView chart and has a bell icon.
**Configure Alert Condition.** In the **Settings** tab, from the **Condition** dropdown menu select **TradeSgnl Strategy Builder**. This ensures that alerts will trigger based on your strategy's signals. You can set other options like Interval and expiration.
**Configure Alert Message.** Click on the **Message** tab within the alert dialog. In this tab, you'll configure the alert name and message.
In the Message field enter the following:
```
{{strategy.order.alert_message}}
```
The Strategy Builder fills this in with the correctly formatted message for whichever trigger fired (entry, exit, TP/SL). It only works with the Strategy Builder or a script adapted for TradeSgnl; for any other strategy see [Which Alert Message to Use](/syntax-generator#which-alert-message-to-use).
Using `{'{{strategy.order.alert_message}}'}` as your alert message creates a single alert that works for all signal types (entries, exits, TP/SL): the Strategy Builder fills in the correct signal for whichever condition triggered the alert. It works only with the Strategy Builder or a script adapted for TradeSgnl. For any other strategy, use the [Custom Strategy Message](/syntax-generator#custom-strategy-message).
**Set Up Webhook.** Click on the **Notifications** tab within the alert dialog. Check the **Webhook URL** option.
Enter the following URL:
```
https://webhook.tradesgnl.com
```
Click **Create** to save the alert.
On a paid TradingView plan, alerts reach TradeSgnl by webhook. On a free plan, install the [TradeSgnl Chrome extension](/tradingview-ai), turn on **Forward alerts to TradeSgnl** in its menu, and keep TradingView open: the extension sends your alerts to TradeSgnl the moment they fire.
### Alert Testing Recommendations [#alert-testing-recommendations]
Before relying on your alerts for live trading, follow these best practices:
Test your alerts with a demo account first to ensure they're working correctly with your account.
Check the **Signals** page in the portal to confirm alerts are being received and processed correctly.
Start with minimal risk until you're confident in your alert configuration.
# Strategy Lab (/strategy-lab)
## Introduction [#introduction]
Strategy Lab consumes AI credits. If you run out of your monthly credits, you can purchase extra AI credits at any time on the [Billing page](https://portal.tradesgnl.com/profile?tab=billing) in your portal.
**Strategy Lab** is a Pine Script workspace in the TradeSgnl Portal. It includes a code canvas and an AI developer that edits whatever script is open in the canvas. The AI's edits appear as a diff that you accept or reject before saving.
You can use Strategy Lab to:
Convert an indicator into a strategy, or add TradeSgnl alerts to an existing strategy.
Modify a saved strategy: change entries, add risk management, swap indicators, fix bugs.
Generate a new strategy from a description in plain English.
Open Strategy Lab
## Adapt any strategy [#adapt-any-strategy]
The AI can convert an indicator into a strategy, or add TradeSgnl alerts to an existing strategy. The script can be your own, a friend's, or a public one from TradingView.
1. **Paste your script into the canvas.** The AI works on whatever strategy is currently open in the canvas, so the script needs to be there before you start chatting.
2. **In the chat, type one of these prompts:**
```
"adapt this indicator"
"adapt this strategy"
```
The AI reads the canvas and applies the right changes. An indicator is converted into a tradeable strategy, with its buy/sell signals turned into entries and exits. An existing strategy gets the four alert message inputs (Long Entry, Long Exit, Short Entry, Short Exit) connected to every entry and exit. Your original logic, calculations, and plots are preserved.
The AI can only convert indicators with clear buy/sell logic (crossovers, threshold breaks, signal flips). For indicators that only plot values, you'll need to define entry conditions before the AI can build a strategy.
## Enhance & edit [#enhance--edit]
Saved strategies stay in the sidebar across visits. Open one and ask the AI to modify it. The AI changes only the parts of the script you mention; the rest is preserved.
Examples of what to ask:
* **Add risk management.** "Add an ATR-based stop loss and a 2:1 take-profit target."
* **Tweak entry conditions.** "Only enter long when the 200 EMA is sloping up."
* **Swap indicators.** "Replace the SMA with an EMA, and use RSI(14) instead of stochastic."
* **Add session filters.** "Block entries outside the London/New York overlap."
* **Fix bugs.** "The short exit isn't closing the position. Find and fix it."
### Reviewing the AI's edits [#reviewing-the-ais-edits]
Each AI edit appears as a **diff chunk** in the canvas. Every chunk has inline **Accept** and **Reject** buttons. A floating toolbar above the canvas lets you step through chunks with arrow keys, or use **Accept All** / **Reject All** to handle them in bulk. Click **Save** in the canvas header to commit the changes.
You can also edit Pine Script directly in the canvas. Manual edits and AI edits both go through the same Save button.
## Create from scratch [#create-from-scratch]
To start a new strategy, click **+** in the sidebar to open an empty canvas. Describe the strategy you want in chat. The AI generates the script as a new saved strategy and opens it in the canvas with TradeSgnl alerts wired in. The AI will ask follow-up questions if your description is missing details.
Example prompts:
**Specific**
```
"Build me a moving average crossover strategy. Use a 20 EMA and a 50 SMA on the 1-hour chart. Long when the fast crosses above the slow, exit on the opposite cross. Wire TradeSgnl alerts."
```
**With risk rules**
```
"I want a momentum strategy that buys breakouts of the 20-day high and exits when price closes back below the 10-day moving average. Add a 1.5x ATR stop loss."
```
**Minimal**
```
"Build a mean-reversion strategy on RSI(14): buy when RSI crosses above 30, sell when it crosses below 70. Long-only."
```
New strategies are saved automatically with a version number and last-updated time. To modify them later, see the [Enhance & edit](#enhance--edit) section.
## Connect to TradingView [#connect-to-tradingview]
Your finished strategy is a Pine Script, so it runs on TradingView like any other. Copy it from the Strategy Lab canvas, open the **Pine Editor** at the bottom of any TradingView chart, paste it in, click **Save** under a name you'll recognise, then **Add to chart**.
Strategy Lab writes the TradeSgnl wiring into the script for you. Open the strategy's settings on the chart and you'll find a **TradeSgnl Alert Messages** group with four fields: **Long Entry**, **Long Exit**, **Short Entry**, and **Short Exit**. Each takes one complete signal string.
Build those four strings with the [Syntax Generator](/syntax-generator), which assembles them from your license, symbol and risk, and see [Signal Syntax](/signals) for every parameter you can add.
### Create the alert [#create-the-alert]
One alert covers all four directions. With your strategy on the chart, press **Alt+A** (Option+A on Mac), or click the **Alerts** button in TradingView's top toolbar.
**Set the condition.** In the **Settings** tab, open the **Condition** dropdown and pick the strategy you just saved.
**Set the message.** In the **Message** tab, replace everything in the field with this placeholder, and nothing else:
```
{{strategy.order.alert_message}}
```
TradingView swaps it for whichever of your four strings fired. It works because the signal lives in the script's inputs, which is what Strategy Lab wired in for you.
**Add the webhook.** In the **Notifications** tab, tick **Webhook URL** and paste:
```
https://webhook.tradesgnl.com
```
**Click Create.** The alert is live. Every entry and exit the strategy takes now reaches your account.
On a paid TradingView plan, alerts reach TradeSgnl by webhook. On a free plan, install the [TradeSgnl Chrome extension](/tradingview-ai), turn on **Forward alerts to TradeSgnl** in its menu, and keep TradingView open: the extension sends your alerts to TradeSgnl the moment they fire.
### Test before going live [#test-before-going-live]
Verify the alert end-to-end before connecting it to a live account.
Connect the alert to a demo account and confirm trades execute as expected before pointing it at a live account.
Every signal TradeSgnl receives is listed on the **Signals** page in the portal. If TradingView fires the alert but nothing shows there, the alert configuration is wrong, not the script.
When switching to a live account, lower the risk parameter for the first several trades until the strategy behaves as expected.
# Symbol Mapping (/symbol-mapping)
## Introduction [#introduction]
Different forex brokers often use different symbol naming conventions. While TradingView uses `EURUSD` for the Euro/US Dollar pair, your broker might use `EURUSD.m`, `i.EURUSD.micro`, or `EURUSD.ecn`. Symbol Mapping converts these symbols in real time, acting as a translation layer between TradingView and your broker so trades execute with the correct symbol names.
Symbol Mapping is included on the Advanced and Professional plans. If your plan drops below Advanced, it switches off and your mappings are kept for when you upgrade.
**What you get:**
Automatically converts TradingView symbols to your broker's format without manual intervention.
Configure different mappings for different symbols and brokers all in one place.
Symbol conversion happens in real-time as signals are received and processed.
**Key benefits:**
Create one set of TradingView alerts that work with any broker, regardless of their symbol naming convention.
Eliminate failed trades due to symbol name mismatches between TradingView and your broker.
## Setting Up Symbol Mapping [#setting-up-symbol-mapping]
**Open the Symbol Mapping card.** In your TradeSgnl dashboard open the **Signals** page, then the **Signal Modifier** tab. Symbol Mapping is the second card on that tab.
Open Signal Modifier Page
**Turn symbol mapping on.** Flip the switch in the card header so it reads **Enabled**. It applies immediately, there is nothing to save. While it is off the card is greyed out and signals go to your broker untouched, but every mapping you saved is kept and comes back when you switch it on again.
**Add a mapping.** Click **Add mapping**. A row opens in the table with two fields:
* **From (TradingView)**: the symbol your alert sends, for example `XAUUSD`.
* **To (your broker)**: your broker's name for the same instrument, for example `XAUUSDm`.
Click **Add**, or press Enter, and the mapping saves straight away. **Cancel** or Escape discards the row. Symbols are matched exactly, including case, so copy the broker name exactly as your broker writes it. Adding a mapping while the feature is off switches it on for you.
**Edit or delete a mapping.** The pencil icon on a row reopens it as the same two fields, with the button now reading **Update**. The delete icon removes it, after a confirmation that spells out the consequence: that symbol goes to your broker as-is again.
Every control on this card saves itself: both switches, **Add**, **Update** and delete. Each change confirms with a short message, and if a save fails the card rolls back to what it showed before.
**Test your configuration.** Send a test signal from TradingView and check your account to confirm the trade opened on the mapped symbol.
Make sure the symbols you map to actually exist at your broker. If the converted symbol doesn't exist, the trade will fail.
Use the correct symbol format from your MetaTrader Symbols List (`Ctrl+U`). For MT5, use the symbol from the Symbol column. You can also check the Market Watch window to see the exact symbol names used by your broker.
## Symbol Suggestions and Auto-Match [#symbol-suggestions-and-auto-match]
When a signal names a symbol your broker does not list, the EA rejects it with error `6007` Invalid Symbol. Since EA 0.65 the rejection also carries suggestions taken from your broker's own symbol list, so you rarely need to open Market Watch to find the right name.
**Where suggestions appear:**
* **Signal Logs**: expand the signal and the rejected delivery shows "Did you mean XAUUSDm?" with an **Add mapping** shortcut, and an **Enable auto-match** shortcut when the match is one auto-match could have taken itself.
* **Alert History**, the signal-error **email**, and the **Telegram** message carry the same hint and link.
The shortcut opens this card with the row already filled in, from the symbol your alert sends to the suggested broker symbol. Review it and click **Add**; nothing is saved until you do. If the bad symbol came from a mapping you already saved, the row opens in place of that mapping and the button reads **Update**.
**How matches are ranked:**
| Match | Example | Auto-match may trade it |
| ---------------------------------------- | ------------------------------------------- | ----------------------- |
| Same name, different case | `xauusd` → `XAUUSD` | Yes |
| Same core with a broker prefix or suffix | `XAUUSD` → `XAUUSDm`, `EURUSD` → `EURUSD.r` | Yes |
| Well-known alternate name | `GOLD` → `XAUUSD`, `NAS100` → `USTEC` | No, suggestion only |
| One or two characters off | `XAUUDSc` → `XAUUSDc` | No, suggestion only |
### Auto-match [#auto-match]
Auto-match is off by default. Turn it on with the **Auto-match broker symbols** switch on the Symbol Mapping card, confirm the dialog that explains what it will do, and the EA trades the suggested symbol itself, under two conditions:
* The match is in one of the first two tiers above (case, or a broker prefix or suffix).
* It is the only tradeable candidate in those tiers. Two plausible symbols (for example `XAUUSDm` and `XAUUSDc` on the same account) still produce a rejection with both listed.
Saved mappings are applied before auto-match and always win. Auto-matched deliveries show what was substituted in Signal Logs with a **Pin as mapping** shortcut, so you can make the choice explicit.
The switch needs an account on EA 0.65 or newer. If every connected account still runs an older EA the switch stays locked off, since nothing would honour it. Turning auto-match on also enables symbol mapping if it was off.
Auto-match places real orders on a symbol you did not name. Keep it off if your broker lists several variants of the same instrument and you want to choose between them yourself.
If the hint says the alert still contains a placeholder, TradingView did not replace it when the alert fired. Check the symbol field of your alert message rather than adding a mapping.
## Troubleshooting [#troubleshooting]
**Possible causes:**
* The mapped symbol doesn't exist at your broker.
* Symbol mapping is configured but not enabled.
* Typo in the broker symbol name.
**Solutions:**
* Open the rejected signal in Signal Logs: the suggestion names the symbol your broker actually lists, with a shortcut to update the mapping.
* Check Market Watch in MetaTrader 5 to verify symbol names.
* Ensure symbol mapping is enabled in your dashboard. While the switch is off, nothing in the table is applied.
* Double-check spelling and case of mapped symbols.
**Make sure that:**
* Symbol mapping is enabled (the switch in the card header reads **Enabled**).
* The **From** symbol exactly matches what TradingView is sending, including case.
* No extra spaces or special characters in the mapping.
* The mapping is actually in the table. Every change confirms with a short message when it saves; if you saw an error instead, the card rolled back and the change never reached your account.
**Common issues:**
* **"A mapping for this symbol already exists."** Each **From** symbol can have only one mapping. Use the pencil on the existing row to repoint it instead of adding a second one.
* **"Please enter both From and To symbols."** Neither field can be left empty.
* **Add mapping** is greyed out. Symbol mapping is switched off, or another row is already open for editing. Finish or cancel that row first.
* **Check EA logs.** Look at the MetaTrader 5 Expert tab for symbol mapping debug information.
* **Test with a simple mapping.** Start with one mapping to verify the feature is working.
* **Verify symbol availability.** Right-click in Market Watch and select **Show All** to see all available symbols.
## Frequently Asked Questions [#frequently-asked-questions]
If symbol mapping is disabled or not configured, signals are sent to your accounts using the original symbol names from TradingView. This may cause trades to fail if your broker uses different symbol names.
No, each mapping must have a unique 'From' symbol. However, multiple 'From' symbols can map to the same 'To' symbol if needed.
Yes, symbol mapping works with all signal sources including TradingView alerts, webhooks, and any other platform that sends signals to TradeSgnl.
Yes, you can use the enable/disable toggle to turn symbol mapping on or off. Your configured mappings are preserved even when disabled.
Yes. The **From** symbol must match what your alert sends exactly, and the **To** symbol must match your broker's name exactly, including case. MetaTrader symbol names are case-sensitive, so `xauusd` and `XAUUSD` can be different instruments. If a signal fails on case alone, the rejection suggests the correctly cased symbol. The card will not let you save two rows whose **From** symbols differ only by case, so repoint the existing row rather than adding a second one.
Not on MT5. Set **Symbol Suffix** (or **Symbol Prefix**) in the EA's settings and it's added to every symbol your signals send, on every plan. See [EA configuration](/configuration). Symbol mapping is for names that differ by more than a prefix or suffix, such as `US30` and `DJ30`.
Yes, from EA 0.70 onward. Enter the **To** symbol exactly as your broker writes it, including any character outside the English alphabet. On earlier versions those characters did not survive the trip to MetaTrader, so the mapping matched nothing.
## Symbol mapping on the Trade Copier [#symbol-mapping-on-the-trade-copier]
This page's mapping starts from the symbol your TradingView alert sends, and it belongs to the license. A [Trade Copier](/trade-copier) copies a trade from one account to another, so the symbol it starts from is the master's, and two target accounts on one license can sit at brokers that name things differently. Each Trade Copier therefore has its own **Symbol mapping** (prefix, suffix and rows) in its **Edit settings**. It applies to that Trade Copier's copies only, and a symbol it leaves alone still follows this license mapping.
## Symbol mapping on cTrader and TradeLocker [#symbol-mapping-on-ctrader-and-tradelocker]
A license's mappings apply to every account on it. On a [cTrader](/ctrader) or [TradeLocker](/tradelocker) account, when the mapped name is not offered by that broker, the name in the alert is tried instead, so a mapping made for an MT5 broker (for example `BTCUSD` to `BTCUSDm`) does not get in the way. These accounts also have their own **Symbol mapping** in the card's **Settings**, with its own switch, prefix, suffix and mappings. It applies to that account only, on the same plans.
# Syntax Generator (/syntax-generator)
## Introduction [#introduction]
The Syntax Generator is a visual form in the TradeSgnl Portal that builds signals for you. Pick your symbol, action, risk, and any optional parameters; the generator emits the exact text TradingView (or any other webhook source) needs to send. It also has a one-click **Send** button that fires a signal straight to your account, so you can verify your setup before touching TradingView at all.
Every parameter has a labeled field with units, types, and inline validation. No more guessing whether to write `sl=` or `sl_pips=`.
Click **Send** to fire the configured signal directly at your account. The trade appears within seconds, no TradingView account required.
Save a configured strategy once and load it in a click. Useful for managing multiple strategies on one license.
Open Syntax Generator
## Verify Your Setup with Send [#verify-your-setup-with-send]
The fastest way to confirm your license and account are working is to press **Send** on the generator's Entry signal. This skips TradingView entirely, so you can isolate "is my account receiving signals?" from "is my TradingView alert configured correctly?".
**Open the Syntax Generator.** In the Portal, open **Tools → Syntax Generator** (or visit it directly).
Open Syntax Generator
**Pick your license.** Select your license from the **License ID** dropdown. This determines which terminal the signal goes to.
**Fill the minimum fields.** You only need three things to send a test trade:
* **Symbol.** Any instrument your account can trade. `BTCUSD` is a safe default because it's tradable 24/7 and most brokers carry it.
* **Action.** Pick `Buy` from the dropdown. You can close it later.
* **Risk/Volume.** A tiny lot size like `0.01` (with the unit set to **Lots**) keeps the test cheap.
**Click Send.** On the **ENTRY** row of the preview box at the top (blue left border), click the **Send** button next to the copy icon. The generator sends the configured signal straight to your account and confirms with a notification.
**Send** is greyed out until License ID, Symbol, Action, and Risk/Volume are all set (on the Pending Orders tab, Pending Level too). Hover the button to see which field is still missing.
**Check your account.** Open your trading platform. A buy position for the symbol you picked should appear within a few seconds.
* **Trade appeared?** Your license and connection are working. Close the trade manually when you're done.
* **No trade?** Jump to [Troubleshooting](/troubleshooting). The most common causes are: EA not attached to a chart, License ID mismatch, or the symbol isn't visible in Market Watch.
You now have a verified pipeline from Portal → Server → EA. Anything that fails after this point is on the TradingView side (alert message, webhook URL, account plan).
## The Interface at a Glance [#the-interface-at-a-glance]
The page has three tabs that switch what kind of order you're building. Your License, Symbol and Comment carry over when you switch.
| Tab | Use it for |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **Market Orders** | Immediate entries at current price: buy, sell, and reversal commands (close-then-buy / close-then-sell). |
| **Pending Orders** | Orders that fire when price reaches a level you set: buy stop, buy limit, sell stop, sell limit. |
| **Modify Orders** | Changing trades that already exist: the stop loss, take profit or entry of open positions and unfilled pending orders, without closing them. |
Below the tabs, you'll see:
* **A preview box** with an **ENTRY** row (blue left border) and an **EXIT** row (orange left border). Each row shows the live generated signal text and has its own copy icon and **Send** button. The Modify Orders tab shows a single **MODIFY** row instead, since a modify has no exit half.
* **Three buttons** on the Market and Pending tabs: **Custom Strategy Message** (one alert handles entries, exits, and reversals), **Strategy Builder Preset** (text for the Strategy Builder's settings), and **TradingView Automation Wizard** (asks what you're automating and walks you through the setup). See [Output Options](#output-options) and [TradingView Automation Wizard](#tradingview-automation-wizard).
* **The configuration card** with three grouped sections: shared fields, Entry Signal, and Exit Signal. Trailing Stop and Breakeven sit inside the Entry Signal section.
* **Header actions** to the right of the tabs: a clear (X) button, **Save Preset**, and **Saved Presets**. See [Saved Presets](#saved-presets).
* **An info panel** under the form with the webhook URL and the `{{strategy.order.alert_message}}` placeholder, each with a copy button.
## Configuring a Signal [#configuring-a-signal]
Every unit picker (Risk/Volume, Stop Loss, Take Profit, Partial Close, Pending Level, Trailing, Breakeven) starts on **Default**. Default means the EA's own setting applies, so the signal carries no explicit unit. Pick Lots, Pips, Price or another unit to override the EA for that one signal.
### Shared Fields [#shared-fields]
These apply to all three tabs and to both entry and exit signals.
| Field | What it does | Tip |
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **License ID** | Which terminal receives the signal. | Required for any copy or test action. |
| **Symbol** | The instrument to trade (`EURUSD`, `BTCUSD`, `XAUUSD`). | Leave blank to insert the TradingView placeholder `{{ticker}}` automatically. **Send** needs a symbol, so fill it in to test. |
| **Comment** | Names the strategy the trade belongs to. The EA groups trades by symbol and comment, and scopes close signals, pyramid targets, hedge protection, Direction Lock, and the DCA Filter to that group. | Fill it in on every signal. Without it, one strategy's `closeall` closes another strategy's positions. See [Multiple Strategies](/strategies). |
### Market Orders [#market-orders]
The Market Orders tab handles immediate entries and reversal-style commands.
**Action options:**
* **Buy / Sell.** Open a new position at market price.
* **Close Long Then Buy / Sell.** Close any existing long positions, then open the chosen direction. Useful for "always be in a position" strategies.
* **Close Short Then Buy / Sell.** Same idea, but closes shorts first.
**Risk / Volume.** Number input plus a type selector that determines how the number is interpreted:
| Type | What the value means | Notes |
| ---------------------- | ------------------------------------------------ | --------------------------------------------------- |
| Default | Uses the EA's own volume setting. | Pick this if you don't want to override per signal. |
| Lots | Exact lot size (`0.5` = half a standard lot). | |
| % Balance / % Equity | Lot size as a percent of balance or equity. | |
| Dollar Risk | Risk a fixed dollar amount if the trade hits SL. | **Requires SL.** |
| % Bal Loss / % Eq Loss | Lose this percent of balance/equity at SL. | **Requires SL.** |
**Stop Loss & Take Profit.** Each has a number and a unit selector: Default, Pips, Currency, Price or Percent.
| Unit | What the value means |
| -------- | ------------------------------------------------------------------------------- |
| Default | Uses the EA's own unit. |
| Pips | Distance in pips. |
| Currency | A price distance (`5` = 5.00 on the price). Handy for indices, gold and crypto. |
| Price | An exact price level. |
| Percent | A percentage of the price (`1` = 1%). |
The generator emits the correct explicit parameter (`sl_pips=`, `sl_points=`, `sl_price=`, `tp_percent=`, etc.) so you don't need to remember the naming.
**Multi-level take profit with partials.** Once the Take Profit field has a value, a plus icon appears next to it. Click it to add another level, and use the minus icon to remove the last one. Each level has its own **Partial Close**, so a single signal can scale out at multiple targets. Later levels follow the unit you picked on the first one.
Partial Close has its own unit selector. **Percent** is a share of what is still open, between 0 and 1 (`0.5` closes half). **Lots** closes that many lots and needs EA 0.77 or newer. **Default** reads the value through the EA's Partial Close Type input.
### Pending Orders [#pending-orders]
The Pending Orders tab adds a **Pending Level** field. Risk, Stop Loss, trailing, breakeven, Pyramid and Recovery work the same way. It has a single **Take Profit** field with no Partial Close, and the exit toggles are not shown.
**Action options:** Buy Stop, Buy Limit, Sell Stop, Sell Limit.
**Pending Level** has its own type selector:
| Type | What the value means |
| ------- | -------------------------------------------- |
| Default | Uses the EA's "Pending Order Entry" setting. |
| Pips | Distance in pips from current price. |
| Price | Absolute price level. |
| Percent | Percentage offset from current price. |
If you set an absolute price that doesn't match the order type (e.g., a Buy Stop below current price), the EA quietly converts it to the correct order type at execution time. You don't need to worry about getting it backwards.
### Exit Signal [#exit-signal]
The Exit section (orange border) builds the **closing** half of a strategy. The generator auto-suggests an exit action based on your entry action (Buy → Close Buy, Sell → Close Sell, Close Long Then Buy → Close Buy, Buy Stop or Buy Limit → Cancel Long Orders, etc.), but you can change it. Close All is never suggested, pick it yourself if you want it.
| Exit Action | Closes |
| ------------------- | ------------------------------------------------------------------------- |
| Close Buy | All long positions for the symbol (and Comment). (Market tab) |
| Close Sell | All short positions for the symbol (and Comment). (Market tab) |
| Close All | Every open position for the symbol, regardless of direction. (Market tab) |
| Cancel Long Orders | Pending buy stop / buy limit orders. (Pending tab) |
| Cancel Short Orders | Pending sell stop / sell limit orders. (Pending tab) |
**Partial Close.** Optional, Market tab only. Use it to close only part of the position. **Percent** is a share between 0 and 1 (`0.5` = 50%), **Lots** is an exact lot size, and **Default** follows the EA's Partial Close Type input. Leave it empty to close the full position.
The Exit row's **Send** button needs only a License ID and an Exit Action.
### Modify Orders [#modify-orders]
The Modify Orders tab changes trades that already exist, without closing them. It builds one **MODIFY** signal rather than an entry and exit pair, so there is a single preview box.
**Action options:**
| Action | Changes |
| -------------------------------------- | ------------------------------------------ |
| Modify Long Positions | Open buy positions for the symbol. |
| Modify Short Positions | Open sell positions for the symbol. |
| Modify Buy Stops / Modify Buy Limits | Unfilled pending buy orders of that type. |
| Modify Sell Stops / Modify Sell Limits | Unfilled pending sell orders of that type. |
**Stop Loss, Take Profit and Partial Close** work as they do on the Market tab, each with its own unit selector and a multi-level Take Profit. The difference is that blank means "leave alone" rather than "use the EA default". Only the levels you actually fill in are sent, and a modify ignores the EA's own SL/TP settings entirely. Send and Copy both need a License ID, an Action and at least one level (Send also needs a Symbol).
New take profit levels replace the targets not reached yet. Targets already hit stay closed.
**Move SL to Entry.** This toggle emits `sl=entry`, which moves the stop of each open position to its own entry price rather than to one shared level. It replaces the Stop Loss value (the field greys out while the toggle is on). It applies to positions only, so it is not shown when the action is a pending order type.
When the action is a pending order type, a **New Entry** field appears and takes the same unit selector as Pending Level on the Pending Orders tab (Default, Pips, Price, Percent). Leave it blank to keep the order's current entry. Changing only the entry leaves that order's stop loss and take profit where they are.
The Modify tab has no trailing, breakeven, Pyramid or Recovery controls and no **Save Preset** button. The Saved Presets menu is still available.
Without a **Comment**, a modify changes every matching position or order on the symbol, including trades opened by your other strategies. Fill it in whenever the account runs more than one. See [Multiple Strategies](/strategies).
Modify commands need EA 0.68. An older EA rejects the signal with error `7021`. See [Modify Orders](/signals#modify-orders) in the signal reference for the full parameter list.
## Trailing, Breakeven and Flags [#trailing-breakeven-and-flags]
On the Market and Pending tabs these controls sit in the Entry Signal section, always visible. Pyramid, Recovery and the exit toggles are a row of switches under the entry fields. **Trailing Stop** and **Breakeven** are two cards below them: switch a card on to fill it in, and switch it off to clear its values.
### Trailing Stop [#trailing-stop]
| Field | What it does |
| --------------------- | --------------------------------------------------------------------------------------------- |
| **Trailing Trigger** | Profit needed before trailing kicks in. Its unit selector sets the unit for all three values. |
| **Trailing Distance** | How far behind price the SL trails. |
| **Trailing Step** | Minimum price movement before SL re-adjusts. |
The unit selector options:
| Unit | How the three values are read |
| -------- | ----------------------------------------------------------------------- |
| Default | In the EA's own Distance Unit. |
| Pips | All three in pips. |
| Currency | All three are price distances (`5` = 5.00). |
| Price | The trigger is an exact price level. Distance and step are price moves. |
| Percent | All three are percentages of the price (`1` = 1%). |
Trigger, distance and step must all be filled in. Until they are, trailing stays off and the card shows a reminder, so nothing is added to the signal.
### Breakeven [#breakeven]
| Field | What it does |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Breakeven Trigger** | What moves the stop to your entry. Pick a unit (Default, Pips, Currency, Price or Percent) and enter the profit needed, or pick **Price** to move the SL once an exact price level is reached. |
| **Breakeven Offset** | How far past entry to place the SL, in the trigger's unit. `0` (or blank) is true breakeven, a small positive value locks in a little profit. |
**TP Level** is an extra trigger option. Instead of a distance, you pick one of the signal's own take profits (TP1, TP2, ...) and the stop moves once that target is reached. The list offers every take profit except the last, because the trade closes there. It needs at least two take profits, so in practice it is a Market tab option. The Offset then gets a unit selector of its own, since the trigger's unit belongs to the take profit.
### Pyramid [#pyramid]
Toggle to include the `py` flag. This does not open trades by itself. It tells the EA to manage every trade sharing this signal's symbol and Comment as one coordinated group, with a combined breakeven and a shared profit target, using the rules configured in EA Settings → Pyramid Management. Your strategy still sends each individual entry.
`py` takes effect only on the signal that **opens** a strategy. Later signals with the same Comment inherit it, so untoggling Pyramid here will not stop pyramid management on a strategy whose trades are already open. Close the group first, or change the Comment.
How pyramiding works
### Recovery [#recovery]
Toggle to include the `re` flag. The EA opens additional positions in the same direction as the trade moves **against** you, using the rules configured in EA Settings → Recovery Management.
How recovery works
Recovery trades grow your position size each level. Read the Recovery System page before enabling.
### Exit Controls [#exit-controls]
Three toggles on the Market Orders tab change how the EA treats opposite-direction positions when the entry fires:
| Toggle | Behavior |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Exit on Opposite** | Close opposite positions, then **stop** (no new trade). |
| **Exit on Entry** | Close opposite positions, then **open** the new trade (reversal). |
| **Ignore Exit Signals** | Drop this strategy's close commands (Close Buy, Close Sell, Close All) server-side. Entries, reversals and pending-order cancels still go through. Useful if you want the strategy's entries but the EA's TP/SL/trailing to handle exits. |
Exit on Opposite and Exit on Entry are mutually exclusive: switching one on switches the other off.
### Cancel at TP1 [#cancel-at-tp1]
A toggle on the Pending Orders tab that adds `cancel_at=tp1`. If price reaches the order's first take profit before the order fills, the EA cancels the order, so it never fills late on a move that is already over. It needs a MetaTrader account on EA 0.80 or newer. See [Cancel at TP1](/signals#cancel-at-tp1) for the full rules.
## Output Options [#output-options]
The generator gives you several ways to take a configured signal into TradingView. Pick based on what is sending the alert.
### Which Alert Message to Use [#which-alert-message-to-use]
What goes in a TradingView alert's Message field depends on what sends the alert:
| Your alert comes from | Message to paste |
| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| The TradeSgnl **Strategy Builder** | `{{strategy.order.alert_message}}`, with the Strategy Builder Preset pasted into the Builder's Signal Preset field |
| A strategy written or adapted for TradeSgnl, for example in **Strategy Lab** | `{{strategy.order.alert_message}}` |
| Any other Pine Script **strategy**, including invite-only and protected scripts you cannot edit | The **Custom Strategy Message**, with the alert's trigger set to **Order fills only** |
| An **indicator**, an alert condition, or a price or drawing alert | The **Entry** or **Exit** signal, one alert per signal |
`{{strategy.order.alert_message}}` only works with a script that writes TradeSgnl signals into its orders. Any other strategy leaves it empty or fills it with its own text, which TradeSgnl cannot read, so nothing trades. The info panel under the form shows this placeholder with a copy button.
### Entry & Exit Signals [#entry--exit-signals]
The ENTRY and EXIT rows at the top show the **individual** entry and exit signal text. Use each row's copy icon to grab one signal at a time. Copy needs a License ID and, on the Entry row, a Risk/Volume value (plus Pending Level on the Pending tab). The Exit row needs an Exit Action.
**When to use:** indicator alerts, and price or drawing alerts, where you create one TradingView alert per signal (or you're integrating with something other than TradingView).
```
LicenseID,EURUSD,buy,risk=0.01,sl_pips=30,tp_pips=60
```
### Custom Strategy Message [#custom-strategy-message]
Click **Custom Strategy Message** to copy a single message that handles entries, exits, **and** reversals. It carries your Entry settings (risk, SL, TP and so on) and uses TradingView's `{{strategy.prev_market_position}}>{{strategy.market_position}}` placeholder, which the TradeSgnl server translates into the right action verb (`flat>long` → `buy`, `long>flat` → `closebuy`, `long>short` → `closelongsell`, etc.).
**When to use:** any TradingView strategy that was not built or adapted for TradeSgnl, including invite-only and protected scripts you cannot edit. You create **one alert** that handles every signal the strategy fires. In TradingView, set the alert's trigger to **Order fills only**.
```
LicenseID,{{ticker}},{{strategy.prev_market_position}}>{{strategy.market_position}},risk=0.01,sl_pips=30,tp_pips=60
```
Full no-code setup walkthrough
### Strategy Builder Preset [#strategy-builder-preset]
Click **Strategy Builder Preset** to copy a preset for pasting into the TradeSgnl Strategy Builder's settings. The preset is a short block of text with one line each for the long and short entry, exit, take profit and stop loss messages, built from your Entry and Exit settings. The opposite direction is mirrored for you. The Builder is a Pine Script that runs on your TradingView chart and reads the preset to generate signals; you only need to set your alert message to the `{{strategy.order.alert_message}}` placeholder shown in the info panel at the bottom of the page. That placeholder works only with the Builder or a script adapted for TradeSgnl; see [Which Alert Message to Use](#which-alert-message-to-use).
**When to use:** you're using the TradeSgnl Strategy Builder to wire any indicator or strategy into automated trading.
Strategy Builder setup
### Strategy Lab (adapted scripts) [#strategy-lab-adapted-scripts]
Strategy Lab has no button on this page. When you adapt a script in [Strategy Lab](/strategy-lab), the script gets four alert-message inputs (Long Entry, Long Exit, Short Entry, Short Exit). The Automation Wizard fills in those four signals from your form, and the alert's Message is `{{strategy.order.alert_message}}`.
## TradingView Automation Wizard [#tradingview-automation-wizard]
Click **TradingView Automation Wizard** (the filled button next to the two copy buttons) to open a side panel that asks what you're automating and ends on the exact steps and messages to use. It uses the signal you have configured on the form, so set that up first. The button stays disabled until a license is selected.
| Question | Answers and where they lead |
| ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| What are you trying to automate? | **Strategy** (has a Properties tab and a Strategy Tester) or **Indicator** (draws lines, shapes or signals). |
| Do you have access to the strategy's source code? (Strategy) | **No, it's locked** goes to Custom Strategy Setup. **Yes, I have the source code** asks the next question. |
| How do you want to set up the alert? (Strategy with source code) | **TradeSgnl Strategy Lab** (recommended) goes to Strategy Lab Adaptation. **Custom Strategy Message** goes to Custom Strategy Setup. |
| Does your indicator have built-in alerts? (Indicator) | **No, it's just lines/shapes** goes to Strategy Builder Setup. **Yes, it has built-in alerts** asks the next question. |
| How do you want to automate this? (Indicator with alerts) | **Use Strategy Builder** (recommended) goes to Strategy Builder Setup. **Setup Multiple Alerts** asks the next question. |
| Is this a continuous reversal indicator? | **Yes (Reversal System)** or **No (Standalone Signals)**, both go to Multiple Native Alerts. A reversal system gets the `exent` flag added to its buy and sell messages. |
Each result page is a short step list with copy boxes:
* **Custom Strategy Setup.** Create the alert on your strategy with **Order fills only**, paste the Custom Strategy Message, then add the webhook URL.
* **Strategy Lab Adaptation.** Open Strategy Lab and adapt your script, paste the four signals into the script's settings, set the alert Message to `{{strategy.order.alert_message}}`, then add the webhook URL.
* **Strategy Builder Setup.** Get access to the Builder, paste the Strategy Builder Preset into its Signal Preset field, create the alert on the Builder with `{{strategy.order.alert_message}}`, then add the webhook URL.
* **Multiple Native Alerts.** Create one alert per signal on the indicator's own conditions, pasting the buy syntax into the buy alert and the sell syntax into the sell alert, then add the webhook URL to each.
Click any answer in the breadcrumb at the top of the panel to go back or switch to a different answer. The panel also links to the TradeSgnl Chrome extension for people who would rather skip the wizard.
## Saved Presets [#saved-presets]
Once a configuration is dialed in, save it for later.
**Save a preset.** Click **Save Preset** in the header, to the right of the tabs. The generator suggests a name built from your symbol, size and comment (for example `XAUUSD_0.2_TradeSgnl-Gold`). Edit it and click **Save**. Presets store a strategy (an entry with its exit), so the button is not shown on the Modify Orders tab.
**Load a preset.** Click **Saved Presets** in the header to see your saved configurations grouped as Market Strategies and Pending Strategies. Click any preset to load it into the form. The tab switches to match, and the menu button shows the loaded preset's name.
**Update or delete.** When you edit a loaded preset, the Save button changes to **Save Changes**. Click it to **Update** that preset, or enter a new name and click **Save as New** to keep the original. The bin icon next to each preset in the Saved Presets menu deletes it: click it once, then click the tick it turns into to confirm.
Saved presets pair well with the Comment field. Save one preset per strategy (each with its own `comment=Strategy1`, `comment=Strategy2`, etc.) so close commands cleanly target the right positions later.
## Where to Use the Output [#where-to-use-the-output]
The Generator has several outputs because there are several ways to automate with TradeSgnl. Pick the card that matches what you're automating. Each one links to a full setup guide that covers TradingView alert configuration, webhook URLs, and any strategy-side wiring you need.
Use the **Strategy Builder Preset** output. Paste it into the Strategy Builder's Signal Preset field on your chart. The Builder runs as a Pine Script that translates any indicator or strategy into signals. Best when you want to automate an existing TradingView indicator without touching its source.
Use the **Custom Strategy Message** output. One alert handles entries, exits, and reversals via TradingView's transition pair. Best for any TradingView strategy, including protected ones, with the alert set to **Order fills only**.
Have the AI adapt a Pine Script you own, or write one from a plain-English idea. Paste the four signals the **TradingView Automation Wizard** gives you into the script's settings, and use `{{strategy.order.alert_message}}` as the alert message.
Use the copy icons on the ENTRY and EXIT rows. Each output is one signal, so create separate TradingView alerts on indicator conditions, price or drawing alerts, or any non-strategy trigger. Also works for non-TradingView sources sending to the webhook.
Every TradingView webhook alert points at `https://webhook.tradesgnl.com` in the Notifications tab. The message body is what changes per setup. On a paid TradingView plan, alerts reach TradeSgnl by webhook. On a free plan, install the [TradeSgnl Chrome extension](/tradingview-ai), turn on **Forward alerts to TradeSgnl** in its menu, and keep TradingView open: the extension sends your alerts to TradeSgnl the moment they fire.
## Frequently Asked Questions [#frequently-asked-questions]
No. The generator covers every parameter TradeSgnl accepts, including the explicit-type variants (`sl_pips=`, `vol_dollar=`, `tp_percent=`, etc.). The [Signal Reference](/signals) page exists for Pine Script authors and integrators who want the raw format, but most users never need to read it.
It sends the exact configured signal to your account via the same path TradingView would use. The trade is real (subject to your account's connection and balance), but it skips the TradingView alert layer entirely. Use a tiny risk value when testing.
On the Entry row it requires License ID, Symbol, Action, and Risk/Volume (plus Pending Level on the Pending tab). The Exit row needs only a License ID and an Exit Action. Hover the disabled button to see which field is missing. (Copy has lower requirements: License ID and Risk/Volume are enough, because Symbol and Action fall back to the TradingView placeholders.)
Yes, but the trade is real. The button respects your account's balance, leverage, and broker rules. Use a demo account or a tiny risk size (`0.01`) for verification.
No. Leave them blank and the generator inserts the TradingView placeholders `{{ticker}}` and `{{strategy.order.action}}` automatically. They'll be filled in at runtime by TradingView when the alert fires.
Presets are stored per user, not per license. If you delete the license the preset references, the preset stays but its signals will fail to dispatch until you switch it to a valid license.
Not directly. Presets are private to your account. The simplest way to share a configuration is to send someone the generated signal string and let them rebuild the preset on their side.
The copy icons on the **ENTRY** and **EXIT** rows grab one signal at a time (one alert per signal). The **Custom Strategy Message** button copies one message that handles all signal types via TradingView's transition pair. The **Strategy Builder Preset** button copies a preset for pasting into the TradeSgnl Strategy Builder's settings. The **TradingView Automation Wizard** asks what you're automating and shows which of these to use. Pick based on whether you want one alert per signal, one alert per strategy, or you're using the Builder.
# Telegram Integration (/telegram)
## Introduction [#introduction]
Connect with **@TradeSgnl\_Alerts\_bot** for instant trading notifications.
The Telegram integration enables instant delivery of trading alerts through a secure, dedicated bot. This provides faster notification delivery compared to email, with the convenience of mobile push notifications and the ability to receive alerts anywhere you have internet access.
Receive alerts within seconds of trading events, faster than email delivery.
Token-based authentication with single-use, time-limited connection tokens.
Native mobile notifications keep you informed even when away from your computer.
**Key benefits:**
Receive notifications in seconds, enabling rapid response to critical trading events.
Mobile push notifications ensure you never miss important alerts, wherever you are.
## Connection Process [#connection-process]
Connecting your Telegram account is a simple, secure process that takes just a few minutes. The system uses time-limited tokens to ensure maximum security during the connection process.
Open Alerts
**Open the Alerts page.** Scroll to **Notification channels** and click the QR code icon next to Telegram. Turning on the Telegram switch on any alert card opens the same screen.
**Choose Connection Method.** A modal will appear with your unique connection token. You can either scan the QR code with your mobile Telegram app or click **Open in Telegram** for direct access.
**Connection methods:**
* **QR Code (recommended).** Scan with your mobile camera for instant connection.
* **Direct Link.** Click **Open in Telegram** for direct access.
**Start Bot Conversation.** After scanning or clicking the link, you'll be taken to **@TradeSgnl\_Alerts\_bot**. Tap the **START** button to initiate the secure connection with your account.
**Connection Confirmed.** The bot replies with a confirmation message, and Telegram shows **Connected** in **Notification channels**. You're now ready to receive alerts.
Each connection uses a unique, secure token that expires after 10 minutes. If the token expires, simply generate a new one from the dashboard.
## Using Telegram Alerts [#using-telegram-alerts]
Once connected, turn on the **Telegram** switch on each alert card you want sent to Telegram. Alerts arrive within seconds of the event. See [Alerts](/alerts) for every channel.
**Supported alert types:**
* **Signal Errors.** Failed trade execution notifications with detailed error information.
* **Connection Errors.** EA disconnection and connection issue notifications.
* **Account Risk.** Daily and maximum drawdown limits, loss amounts.
* **News Events.** Upcoming news, trading blocks, and signal queuing.
**Message format example:**
## Connection Management [#connection-management]
Managing your Telegram connection is simple and can be done entirely through the TradeSgnl dashboard. You have full control over when to connect, disconnect, and monitor the connection status.
**Connection status monitoring:**
* **Connected.** Shows your Telegram ID and **Connected** badge when active.
* **Disconnected.** Shows **Not connected** with a connect button when inactive.
* **Connecting.** Shows loading state during token generation and connection.
**To disconnect your Telegram account:**
1. Click the disconnect icon next to Telegram in **Notification channels**.
2. Confirm disconnection in the modal dialog.
3. UI immediately updates to disconnected state.
4. You can reconnect at any time using the same process.
Disconnecting removes your Telegram ID from our system but doesn't affect your Telegram account or the bot chat. You can safely reconnect later if needed.
## Troubleshooting [#troubleshooting]
If you're experiencing issues with the Telegram integration, here are common problems and their solutions.
**Common Causes:**
* Poor lighting or camera focus
* QR code expired (10-minute limit)
* Outdated Telegram app
**Solutions:**
* Use the 'Open in Telegram' button instead
* Generate a new token if expired
* Update your Telegram app to the latest version
**Possible Issues:**
* Incorrect bot username or chat
* Bot temporarily offline
* Connection token already used or expired
**Solutions:**
* Ensure you're chatting with @TradeSgnl\_Alerts\_bot
* Generate a fresh connection token
* Wait a few minutes and try again
**Check These Items:**
* Telegram connection shows as 'Connected' in dashboard
* Telegram notifications enabled for specific alert types
* Bot chat not blocked or deleted
* Alert types are properly configured and enabled
Check the **Activity** tab on the Alerts page to see each alert and whether it was sent.
## FAQ [#faq]
Yes, the integration uses cryptographically secure tokens, single-use authentication, and stores minimal data (only your Telegram ID). The connection process is designed with security as a top priority.
No, once connected, you'll receive alerts automatically even if you close the chat. Telegram delivers messages to your account regardless of whether the specific chat is open.
Each TradeSgnl subscription can be connected to one Telegram account at a time. You can disconnect and reconnect to a different account if needed.
If you block the bot or delete the chat, alerts will fail to deliver. You'll need to unblock the bot and ensure the chat exists, or disconnect and reconnect your Telegram account.
Telegram alerts are typically delivered within seconds of the triggering event, making them faster than email for time-sensitive notifications.
Alert messages are automatically formatted to provide clear, concise information about each event. While you cannot customize the format, the messages include all relevant details for quick understanding.
# Trade Copier (/trade-copier)
Copies follow the master within seconds. Trade Copier uses the accounts and the EA you already have connected, so there's nothing new to install.
Trades you place by hand on the master copy the same way as trades from your alerts.
Fixed lots, a multiple of the master's size, or scaled to each account's equity.
See what was copied, what wasn't, and why.
Trade Copier is included on the Advanced and Professional plans. It works with MT5 accounts running EA 0.71 or newer, on both the master and the targets.
## Create a Trade Copier [#create-a-trade-copier]
**Open Trade Copier.** In your portal, open **Trade Copier** under **Trading** and click **New Trade Copier**.
**Pick the master and targets.** Choose the account to copy from on the left, and tick the accounts that copy it on the right. Click **Continue**.
Only accounts that are connected right now are listed. Each target becomes its own Trade Copier, so you can pause or change them one at a time.
**Set sizing and symbols.** Choose how each copy is sized. To copy only some symbols, list them, spelled the way the master's broker names them. Leave it empty to copy everything. If the target's broker names symbols differently from the master's, turn on [symbol mapping](#symbol-mapping) here too. Click **Create Trade Copier**.
New Trade Copiers are named **Copier 1**, **Copier 2** and so on. Click the pencil next to the name to rename one.
## Sizing [#sizing]
| Mode | What it does |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
| Fixed lots | Every copy opens at the lot size you set. |
| Multiplier | Copies scale with the master's lot size. `0.5` halves it, `2` doubles it. |
| Equity ratio | Copies scale with the target's equity compared to the master's, read at the moment of each trade. **Adjust by** scales the result further. |
A copy that works out smaller than the broker's minimum lot isn't opened. It's never rounded up, so a copy never trades more than your sizing asks for.
## Symbol Mapping [#symbol-mapping]
Brokers don't always name an instrument the same way. If the master trades `EURUSD` and the target's broker lists `EURUSD.m`, the target rejects the copy with error `6007` Invalid Symbol. Each Trade Copier has its own **Symbol mapping** for this, under **Symbols** in the New Trade Copier dialog and in **Edit settings**.
Turn the switch on and fill in whichever of these you need:
* **Auto-match broker symbols** lets the target's EA trade the one clear match itself when its broker doesn't list the master's symbol, such as `EURUSD.m` for `EURUSD`. It works on a difference in case, prefix or suffix, and rejects the copy when two symbols could fit. It's the quickest fix when the target's broker adds a suffix to everything. If the target license already has [auto-match](/symbol-mapping#auto-match) on, it applies to copies whatever this switch says.
* **Prefix and Suffix** are added to every symbol the rows below don't name. A suffix of `.m` sends `EURUSD` on the master as `EURUSD.m` on the target.
* **Mapping rows** rename one symbol exactly. The left side is the symbol as the **master** writes it, the right side is the **target's** name, for example `XAUUSD` to `GOLD`. Names are matched exactly, including case.
A row wins over the prefix and suffix for the symbol it names, and both win over auto-match. A Trade Copier with no mapping of its own, or one that leaves a symbol alone, follows the target license's [Symbol Mapping](/symbol-mapping), exactly as before.
Because the mapping belongs to the Trade Copier and not to the license, two targets on the same license can each name symbols their own way, and the Signal Modifier mapping used for your TradingView alerts is never touched. Switching a mapping off keeps your rows for when you switch it back on.
The symbol filter is checked against the master's symbol, before any renaming. List `EURUSD`, not `EURUSD.m`, if `EURUSD` is what the master trades.
Changes apply to the next copy. Open copies close on the symbol they opened with.
When a copy is rejected for its symbol anyway, the suggestion under it in Signal Logs and Alert History, and in the alert email and Telegram message, opens this Trade Copier's **Edit settings** with the suggested row or auto-match already filled in. Nothing is saved until you click **Save changes**.
## What's Copied [#whats-copied]
* **Opens.** Same symbol, same direction, at your sizing. The copy opens with the master's stop loss and take profit already on it.
* **Closes and partial closes.** Closing part of the master's trade closes the same share of the copy.
* **Stop loss and take profit changes.** Moving or removing a level on the master does the same on the copy, at the same price. Trailing stops and breakeven follow too.
Pending orders aren't copied until they fill. The fill is then copied at the target's market price.
Copies carry a `TSC` comment followed by the master's account number, so you can find them in MT5. Symbols are renamed for the target by the Trade Copier's own [symbol mapping](#symbol-mapping) and, where that leaves a symbol alone, by the target license's [Symbol Mapping](/symbol-mapping), so `EURUSD` on the master still copies to `EURUSD.pro` on the target.
A target's own EA settings still apply to copies. If it has trailing or breakeven on, it fights the stop the master sends. Set trailing on the master only.
On a netting account, a reversal closes one side and opens the other in a single step, and nothing is copied. On a netting master, close and then open as two separate trades.
## Timing [#timing]
* **Entries more than 30 seconds late are skipped**, so a copy never opens at a price that has already moved.
* **The target has to be connected when the master opens.** Nothing is queued. A trade the target misses is recorded as **Missed** and isn't opened later.
* **Closes always go through**, even on a paused Trade Copier, as soon as the target can be reached.
* **Stop loss and take profit changes wait.** A level moved while the target was offline is set when it reconnects.
## Managing a Trade Copier [#managing-a-trade-copier]
Select a Trade Copier to see its master and target, whether each is online, and every trade it has copied.
| Action | What it does |
| --------------- | ----------------------------------------------------------------------------------------------- |
| `Edit settings` | Change the sizing, the symbols or the symbol mapping. Open copies keep the size they opened at. |
| `Pause` | Stops new copies. Open copies still close when the master closes them. |
| `Resume` | Starts copying new trades again. |
| `Delete` | Stops copying. Open copies stay open on the target for you to manage. |
To copy from a different master, delete the Trade Copier and create a new one. If you create one again for the same master and target, it comes back with its name and history, and takes back its open copies. A copy whose master trade closed while it was deleted is left open for you to manage.
## Activity [#activity]
Each row is one trade on the master and what happened on the target. The **Detail** column says why when something wasn't copied.
| Status | Meaning |
| ----------------------------- | ------------------------------------------------------------------------------------------------------- |
| Open | Copied, and still open on the target. |
| Closed | Closed with the master. |
| Missed | Should have been copied and wasn't, usually because the target was offline or refused the order. |
| Skipped | Not copied on purpose, such as an entry more than 30 seconds late or a size below the broker's minimum. |
| Orphaned | The master closed while it was disconnected. The copy was closed when it reconnected. |
| Released | Left open on the target when the Trade Copier was deleted. |
| May be open, cannot be closed | The order went out but the copier lost track of it. Check the target account in MT5. |
Trades a symbol filter leaves out, and trades on a paused Trade Copier, don't appear.
The [AI assistant](/ai-assistant) can read your Trade Copiers and their activity. Ask it why a trade didn't copy.
## FAQ [#faq]
Only MT5 accounts that are connected right now appear. Trade Copier works through the EA, so cTrader, TradeLocker and crypto exchange accounts can't be used.
0.71 or newer on both accounts. The master needs 0.72 to send stop loss and take profit changes, and a target needs 0.72 to remove a level. Equity ratio needs 0.73 on the target. The Trade Copier says when an account needs updating. Get the latest EA from the **Downloads** page.
The target's broker doesn't list the symbol the master traded. Use the suggestion's **Add mapping** or **Enable auto-match** shortcut, or open the Trade Copier, choose **Edit settings** and turn on **Symbol mapping**: switch on auto-match or add a suffix if the broker adds one to every symbol, or add a row for each symbol it names differently. The Signal Modifier mapping is for TradingView alerts and is a separate setting. The copy's row in the activity table shows the symbol that was sent to the target.
Yes. Tick them all when you create it. Each target becomes its own Trade Copier with its own settings.
No. A trade placed by a Trade Copier is never copied again, so A to B and then B to C copies only the trades you place on B yourself. To copy A onto C, add C as another target of A.
No. A target follows one master. An account that already follows one is greyed out as a target.
No. The master and every target have to be connected under your own TradeSgnl login.
Either the target was offline, and the copy picks the level up when it reconnects, or one of the accounts is on an EA older than 0.72. The copy's **Detail** column says which.
# TradeLocker (/tradelocker)
It works with brokers and prop firms that use TradeLocker.
Connect as many demo and live accounts as you like. One alert trades them all.
It's used only to sign in to TradeLocker for you, so your accounts keep trading.
Stop loss, several take profits, trailing stop and breakeven, set and moved for you.
## Connect an Account [#connect-an-account]
**Select a license.** On your dashboard, click **Connect Account**, pick the license these accounts will trade from, and click **Next step**.
**Choose TradeLocker.** Select **TradeLocker** and click **Next step**.
**Sign in to TradeLocker.** Choose **Demo** or **Live**, enter the email and password you use for TradeLocker, and your server, then click **Sign in**.
Use your email, not your account number. If you sign in to TradeLocker with Google, Apple or two-factor sign-in, set a password in TradeLocker first and use that here.
**Pick your accounts.** Every account on that login is listed. Tick the ones you want to trade and click **Connect**. Each one appears on your dashboard as its own card.
**Send a signal.** Point your TradingView alert at TradeSgnl and start the message with your license code, as on any other account. See [Signals](/signals) for the full syntax.
```
LicenseID,EURUSD,buy,vol_lots=0.1,sl=30,tp=60
```
Channels you copy with the [Telegram Copier](/telegram-copier) trade here too.
Connect a demo account first, send a few alerts, and check the results on the **Signals** page before you trade a funded account.
Some prop firms limit or don't allow automated trading. Check before you connect a challenge or funded account.
## Signals on TradeLocker [#signals-on-tradelocker]
Your alerts work as they are. Market and pending orders, closes, partial closes, stop loss and take profit changes, several take profits, trailing stop and breakeven all use the same [signal syntax](/signals).
A few things to know:
* **Only TradeSgnl's trades are touched.** Closes and changes never affect trades you opened yourself in TradeLocker. To keep two [strategies](/strategies) apart on one account, give each its own `comment=`.
* **Your stop loss and final take profit are saved in TradeLocker.** They protect the trade even if TradeSgnl can't be reached. Earlier take profits, the trailing stop and breakeven are run by TradeSgnl and carry on once it's back.
* **Some accounts set the stop loss just after the trade opens.** If the account doesn't accept it on the order, TradeSgnl adds it as soon as the trade opens. On a pending order, the **Signals** page asks you to add it in TradeLocker once it fills.
* **Some accounts can't close part of a trade.** On those, a close with `pct=` leaves the trade open and the **Signals** page says so.
* **Sizes round down** to the nearest size your broker allows. If that's below the broker's minimum, the order isn't placed.
* **Pending orders need a price.** Use `entry_price=`.
### Not Available on TradeLocker [#not-available-on-tradelocker]
A signal that uses one of these isn't placed, and the **Signals** page says why.
* Pending orders set as a distance (`entry_pips=`, `entry_points=`, `entry_percent=`, `pending=`)
* [Pyramiding](/pyramid-trading) and the [recovery system](/recovery-system)
* Sizing from equity or from a loss amount (`vol_pcteq=`, `vol_pctbal_loss=`, `vol_pcteq_loss=`)
* Session and news filters, trade limits, drawdown limits and [hedge protection](/hedge-protection)
Live balance on the card, and live account and price data in the AI assistant and Market Analyst, aren't available for TradeLocker yet.
## Cloud Connections [#cloud-connections]
TradeLocker is included in Starter and every higher plan. The Bridge plan connects MT5 accounts. Each connected account uses one of your plan's Cloud Connections while it's switched on. A paused account doesn't use one.
When all your Cloud Connections are in use, the portal offers to add another. Each TradeLocker account also counts toward your plan's total number of connections, together with your MT5 accounts.
## Managing Your Accounts [#managing-your-accounts]
Each TradeLocker account has its own card under its license, named after its server and account number, with a **Demo** chip on demo accounts. Expand a card to see its recent signals and its controls.
| Action | What it does |
| ----------- | ------------------------------------------------------------------------------------------------------ |
| `Pause` | Stops new signals and frees the Cloud Connection. Stop loss and final take profit stay in TradeLocker. |
| `Resume` | Turns trading back on, if a Cloud Connection is free. |
| `Settings` | Rename the account, move it to another license, or set its **Symbol mapping**. |
| `Remove` | Disconnects the account and deletes its analytics history. Open trades stay open in TradeLocker. |
| `Reconnect` | Shown when TradeLocker stops accepting the account's sign-in. Sign in again to resume trading. |
### Symbol Mapping [#symbol-mapping]
You don't need your broker's exact symbol names. `EURUSD`, `eurusd` and `EUR/USD` all work, and a plain `EURUSD` finds your broker's `EURUSD.R`. Leave out any exchange prefix: `EURUSD`, not `OANDA:EURUSD`.
If a name still doesn't match, open **Settings** on the account's card and switch on **Symbol mapping**. Map the alert's name to your broker's, or add a prefix or suffix for every symbol. When nothing matches, the **Signals** page suggests the closest names your broker offers.
Symbol mapping is included on the Advanced and Professional plans. If your plan drops below Advanced, it switches off and your mappings are kept for when you upgrade.
## Seeing Your Results [#seeing-your-results]
An account's latest signals show on its card. **View Signals** opens the full **Signals** page, with the account each signal traded, the size filled and whether it worked. If an order couldn't be placed, you'll see an [error code](/error-codes#tradelocker-error-codes) and the reason. You're also notified in the app, by push, email or Telegram, depending on your [Alerts](/alerts) settings.
In **Analytics**, each TradeLocker account appears on its own with its balance, equity and trade history, updated every hour and after each trade.
## FAQ [#faq]
Usually you changed your TradeLocker password. Nothing trades until you click **Reconnect** and sign in with your current password. Reconnecting updates every account on that login, and each keeps its card and history.
Check that the server is typed exactly as TradeLocker's own sign-in page shows it, and that **Demo** or **Live** matches the account. If you sign in to TradeLocker with Google, Apple or two-factor sign-in, set a TradeLocker password first and use that.
The account list shows it as connected, or names the license it's on, and it can't be ticked again. To move it to another license, use **Settings** on its card. A TradeLocker account can only be connected to one TradeSgnl login.
TradeLocker took the order but didn't confirm it straight away. TradeSgnl checks again within a few minutes and updates it. Don't send the signal again in the meantime.
TradeLocker turned the level down, usually because it was too close to the price. The trade still opens, you get an alert, and the **Signals** page says which level is missing so you can add it in TradeLocker.
On most forex pairs a pip is `0.0001`, or `0.01` on yen pairs. On gold and other symbols quoted with two decimals it's `0.01`, so `sl=100` on gold is 1.00. On symbols with no decimals, use `sl_price=` or `sl_percent=` instead.
Your TradeLocker accounts are paused. Open trades keep their stop loss and final take profit in TradeLocker, but TradeSgnl stops managing the rest. Once you subscribe again, resume each account from its card.
If a payment fails, your accounts keep trading for 24 hours while it's retried. Connecting, resuming or reconnecting an account waits until the payment goes through.
# TradingView AI (/tradingview-ai)
## Introduction [#introduction]
The TradeSgnl extension turns your TradingView side panel into a working surface for analysis and automation. Open it on any chart and you get two tools sharing one space: an AI assistant that reads your chart in real time and can act on it, and guided workflows that walk through your TradeSgnl automation setup step by step.
Both tools know your account. The assistant can see your signal presets, broker configuration, and connection limits. The workflows use that same context to skip questions you have already answered elsewhere.
Ask anything about your chart, your indicators, or your trades. The assistant reads live data, answers in plain English, and can execute actions on the chart for you.
Step-by-step flows for common automation tasks. Pick a signal preset, set up TradingView alerts, and confirm broker settings without leaving the chart.
## Install [#install]
The extension is published on the Chrome Web Store. It runs on Chrome and on any Chromium-based browser that supports the side panel API, including Microsoft Edge, Brave, and Arc.
**Add to Chrome.** Open the Chrome Web Store listing and click **Add to Chrome**. Confirm the permissions prompt.
**Pin to toolbar.** Click the puzzle icon in the browser toolbar and pin TradeSgnl, so the icon is always one click away.
**Sign in.** Open the side panel on a TradingView chart and sign in with your TradeSgnl account.
Install Extension
Open Portal
## Open the Side Panel [#open-the-side-panel]
Visit any chart on tradingview\.com and click the TradeSgnl icon in your browser toolbar. The side panel docks to the right of the page and stays attached to the tab as you switch symbols and timeframes.
On first launch, the panel asks you to sign in with your TradeSgnl account. After that, it picks up where you left off, including your recent conversation history.
### What the panel sees [#what-the-panel-sees]
Once attached, the panel reads the live state of the chart in front of you:
* The symbol and timeframe currently loaded
* Indicators on the chart, including their inputs and current values
* Recent OHLCV data so the assistant can talk about the last bars
* Visible drawings and overlays
If you open the side panel before signing in to TradingView, sign in to TradingView first and then reload the tab. The chart context is read at page load.
## AI Assistant [#ai-assistant]
TradingView AI Assistant consumes AI credits. If you run out of your monthly credits, you can purchase extra AI credits at any time on the [Billing page](https://portal.tradesgnl.com/profile?tab=billing) in your portal.
The assistant is a chat surface in the side panel. Ask it anything about your chart, your indicators, or your trades. It answers in plain English and can run actions on TradingView for you. You will see each action stream as it executes, so you always know what the assistant is touching.
### Chart analysis and control [#chart-analysis-and-control]
Reads your symbol, timeframe, indicator values, and recent OHLCV. Ask what RSI is doing, whether the last bar broke a level, or where the next support sits.
Switch symbols and timeframes, flip between candles, bars, line, area, Heikin Ashi, or Renko. Zoom to a date range or overlay another ticker for side-by-side comparison.
Add a study, change its inputs, hide it, or remove it. Pull saved Pine indicators onto the current chart by name. Read live values straight from the data window.
Trendlines, rectangles, Fibonacci retracements, horizontal levels, channels. Just describe where and the assistant places the drawing.
Take a snapshot of the current chart and have the assistant analyze price action, annotate structure, or save it for later reference.
### Alerts and automation [#alerts-and-automation]
Create, list, modify, pause, restart, and delete native TradingView alerts in plain English. Includes the webhook wiring needed for TradeSgnl signal delivery.
Wires up TradeSgnl Strategy Builder studies. Sets entry and exit conditions, TP / SL, position sizing, and pastes signal preset payloads so messages and conditions line up in one shot.
List your saved Pine scripts, read or search a script's source, and edit specific blocks. Useful for adapting an existing strategy for TradeSgnl alerts without leaving the side panel.
### Performance and history [#performance-and-history]
Reads your TradeSgnl signal history and connected accounts. Ask why a signal did not fire, what your win rate is by symbol, where your drawdown came from, or how a specific account is performing.
Pulls strategy report metrics (net profit, profit factor, win rate, drawdown, Sharpe) and per-trade fills from any Pine strategy on the chart. Drill into individual trades on demand.
### Example prompts [#example-prompts]
The assistant works best with concrete, conversational prompts. Try things like:
```
Add RSI 14 and tell me if we're oversold
Draw a trendline from the swing low at March 12 to the most recent low
Create an alert when EURUSD crosses above 1.0850 on the 1H
Switch to BTCUSDT on the 4H chart and overlay ETHUSDT
Why didn't last Tuesday's BUY signal fire on my IC Markets account?
Show me my win rate by symbol over the last 30 days
What's the profit factor on this Pine strategy and where's the largest drawdown?
Wire up Strategy Builder with my "EMA Cross" preset and 1% stops
Find where my MACD strategy script handles divergence
Take a screenshot and tell me if structure looks bullish
```
Stay specific. "Add RSI 14" is more reliable than "Add an oscillator". Naming the symbol, timeframe, level, or indicator parameters helps the assistant pick the right tool the first time.
## Send alerts without a webhook [#send-alerts-without-a-webhook]
TradingView webhooks need a paid TradingView plan. With the extension you don't need one: when an alert fires in an open TradingView tab, the extension sends the alert message to TradeSgnl straight away.
Forwarding is off until you turn it on. Open the extension side panel, click your avatar, and switch on **Forward alerts to TradeSgnl**. Turn it off any time to use webhooks only.
* It works for any alert whose message starts with your license code, the same message you would use for a webhook.
* Alerts that already have the TradeSgnl webhook set are left to the webhook, so a trade never goes through twice.
* Your browser must be open with a TradingView tab loaded (any TradingView page, not only a chart) and the computer awake. If an alert fires while the computer is asleep or offline, it is not traded later: an alert that reaches TradeSgnl more than 5 seconds after it fired is refused (error [`7018`](/error-codes)), so you never enter at an old price.
* Chrome's Memory Saver can close idle tabs. Add `tradingview.com` to "Always keep these sites active" in Chrome settings.
* While forwarding is on, the extension side panel reads **Forwarding alerts from this browser** when a TradingView tab is open, and **Open TradingView to forward alerts** when none is. Click **Activity** to see the last 3 alerts, each marked **Sent**, **Rejected**, **Missed** (reached TradeSgnl too late), **Left to your webhook**, or **Failed** (could not reach TradeSgnl).
## Guided Workflows [#guided-workflows]
Workflows are step-by-step automations triggered from the slash menu inside the side panel. Type `/` in the chat input to see the available flows.
Each workflow knows your TradeSgnl account state and skips steps you have already completed. The most common one walks through your full automation setup: pick a signal preset, generate the TradingView alert syntax, create the alert on the current chart, and confirm broker settings. Decision points hand off to the AI assistant, so you never get stuck on a question with no answer.
### When to use a workflow vs. ask the assistant [#when-to-use-a-workflow-vs-ask-the-assistant]
* **Use a workflow** when you want to complete a multi-step setup reliably, with the same checks every time. Good for: connecting a strategy, publishing alerts, configuring a new signal preset.
* **Ask the assistant** when you have a one-off question or change. Good for: analyzing a setup, tweaking an indicator, drawing a level, creating a single alert.
Workflows that touch paid features (Strategy Builder wiring, signal preset management, performance analytics) require an active TradeSgnl subscription. The workflow will tell you up front if a step needs an upgrade.
## Troubleshooting [#troubleshooting]
Most extension issues come down to authentication or page state. Try the items below before opening a support ticket.
Make sure you are on a tradingview\.com tab, then click the TradeSgnl icon in your browser toolbar. If the icon is hidden, click the puzzle icon and pin TradeSgnl. Reload the TradingView tab if the panel was open before you signed in.
Confirm you are signed in to your TradeSgnl portal in the same browser. Open portal.tradesgnl.com in another tab, sign in there, then reopen the side panel. Cookies need to be enabled for portal.tradesgnl.com.
Refresh the TradingView tab. The content script attaches when the page loads, so a tab opened before the extension was installed will not be wired up until you reload it.
You must be signed in to TradingView in the same browser. The extension uses your TradingView session to create alerts on your account. Sign in to tradingview\.com, then try the request again.
Signal presets are pulled from your TradeSgnl account. If the list is empty, open your portal and confirm you have presets configured. The extension refreshes its account view every hour, or when you reopen the side panel.
# Troubleshooting (/troubleshooting)
## Introduction [#introduction]
Two places answer most questions before you need this page:
* **The Signals page in your portal.** Every signal is listed with what each account did with it. A signal that did not trade shows a code and the reason. Look the code up in [Error Codes](/error-codes).
* **Sgnl AI.** Click **Sgnl AI** at the top of the portal and ask. It can see your accounts and signals, so it can tell you why a signal did not trade or what is missing from your setup. See [Sgnl AI](/ai-assistant).
Most of this page is about the TradeSgnl EA running on your own MetaTrader 5. For a Cloud terminal see [If it doesn't connect](/cloudconnect#if-it-doesnt-connect). For other platforms see the FAQ on the [cTrader](/ctrader#faq) and [TradeLocker](/tradelocker#faq) pages.
## The EA will not connect [#the-ea-will-not-connect]
When the EA cannot sign in, MetaTrader shows an alert with the reason, and for most of these the EA removes itself from the chart so it does not keep retrying. Find the message you saw:
| Message | What it means | What to do |
| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| License code is empty | The License ID field was left blank. | Attach the EA again and enter your License ID on the **Inputs** tab. It is on the **Connections** page of your portal. |
| Invalid license code format | A License ID is exactly 13 digits. | Check for a missing digit, a letter, or a space before or after the number. |
| Invalid or expired license code | The License ID is not recognised, or your subscription is not active. | Copy the License ID again from the **Connections** page, and check your plan under [Billing](https://portal.tradesgnl.com/profile?tab=billing). |
| This account is already connected from another chart | This trading account already has a live connection. It can be another chart, another MetaTrader on a different computer or VPS, or a Cloud terminal. | Keep one and remove the others. One connection per account is all you need: it handles every symbol. |
| Maximum connections reached for subscription | Your plan's connection limit is in use. | Disconnect an account you no longer use, or add a connection. See [Plans and Connections](/cloudconnect#plans-and-connections). |
| Your subscription has expired or is inactive | The subscription ended while the EA was running. | Renew under [Billing](https://portal.tradesgnl.com/profile?tab=billing), then attach the EA again. |
| EA Removed due to manual user disconnect from dashboard | The account was disconnected from your portal. | Attach the EA again when you want it back. |
| Subscription Warning | A renewal payment failed. | Update your payment method under [Billing](https://portal.tradesgnl.com/profile?tab=billing). |
Check three things in MetaTrader 5:
* The EA file and its DLL (the file whose name starts with `TradeSgnl-MT5-DLL`) are both in the `MQL5/Experts` folder.
* **Allow DLL imports** is ticked under **Tools → Options → Expert Advisors**.
* **Algo Trading** in the toolbar is on.
The **Experts** tab at the bottom of MetaTrader says why an EA failed to load. The full install steps are in [EA Setup](/setup).
The EA cannot reach the TradeSgnl server and tries again by itself. The line under the status says why, for example **Server unreachable** or **Connection failed**.
Check your internet connection, then check that a firewall or antivirus is not blocking MetaTrader. Trades that are already open keep being managed while the EA reconnects.
This is almost always the internet connection of the computer or VPS running MetaTrader. Short drops reconnect by themselves, and a drop under 30 seconds does not send a disconnect alert.
If it happens daily, run the account on [MT5 Cloud](/cloudconnect) or a [Cloud VPS](/cloud-vps) instead of a home computer.
The version of Windows is too old or is missing a component the EA needs. The EA runs on Windows 10 and 11, and Windows Server 2016 or newer. Install pending Windows updates, or move to a supported version.
## A signal arrived but did not trade [#a-signal-arrived-but-did-not-trade]
Open the **Signals** page and find the signal. Its row shows whether each account executed it, and if not, the code and reason.
It never reached TradeSgnl, so the problem is on the sending side.
* In TradingView, open the alert log and check the alert fired.
* Check the alert's webhook URL and that the message starts with the right License ID.
* Press **Send** in the [Syntax Generator](/syntax-generator#verify-your-setup-with-send). It sends a signal straight to your account without TradingView. If that trades, your account is fine and the alert needs fixing.
No account was connected on that license when the signal arrived. Check the **Connections** page: the account must show as connected, and it must be on the same license the alert uses.
Also check **Receive Trade Signals** in the EA's General Settings. When it is off the EA manages open trades but takes no new signals.
These are the codes traders meet most. The full list is in [Error Codes](/error-codes).
| Code | Reason | What to do |
| --------------------------- | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `6007` | Your broker does not list that symbol name. | Add a [symbol mapping](/symbol-mapping), or set the Symbol Suffix in the EA. The rejection suggests the closest match. For a copied trade, use the [Trade Copier's own symbol mapping](/trade-copier#symbol-mapping). |
| `6001` | Outside the hours set in the Session Filter. | Change the hours in [Session Filter](/configuration#session-filter). |
| `6002` | The spread was above your Max Spread. | Raise the limit in [Risk Management](/configuration#risk-management), or wait for a tighter market. |
| `6009` `6010` `6014` `6015` | A drawdown limit or profit target was reached, so the EA is paused or stopped. | A daily pause lifts by itself the next trading day, a monthly one the next month. A max drawdown stop needs a manual resume. |
| `6011` `6012` `6016` `6017` | A Max Trades limit is full. | Raise the limit in [Volume Settings](/configuration#volume-settings), or wait for trades to close. |
| `6013` `6026` `6027` | The lot size could not be worked out. | See [Wrong lot size, stop loss or take profit](#wrong-lot-size-stop-loss-or-take-profit). |
| `6023` | The News Filter was blocking trades. | Change the [News Filter](/configuration#news-filter), or turn on Queue Signals During News. |
| `10018` | The market for that symbol was closed. | Check your broker's trading hours for the symbol. |
Once [Signal Authentication](/signal-authentication) is on, every signal must carry your `secret`. Add it to each alert message, including older alerts you created before switching it on.
## Wrong lot size, stop loss or take profit [#wrong-lot-size-stop-loss-or-take-profit]
Two EA settings decide the size:
* **Volume Source.** With **Signal Parameters**, the size comes from the signal. With **EA Inputs**, the EA uses its own default and ignores the size in the signal.
* **Volume Type.** This decides what the number means. The same `risk=1` is 1 lot under **Lots**, a share of your balance under the percentage types, and an amount you are willing to lose under the risk types.
Every type is explained in [Volume Settings](/configuration#volume-settings).
Check **TP/SL Source**. With **EA Inputs**, the EA applies its own stop loss and take profit to every trade and ignores the ones in the signal.
Check how the EA reads the number:
* **SL/TP Mode** sets whether a value is a distance, a percentage of the entry price, or an exact price.
* **Distance Unit** sets whether a distance is in pips or points. On most forex symbols a pip is 10 points, so the wrong unit puts the level ten times too close or too far.
| Code | Reason | What to do |
| ------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
| `6013` | The Volume Type sizes the trade from the stop loss, and there is none. | Add a stop loss to the signal, or choose a Volume Type that does not need one. |
| `6026` | With that stop loss, the risk works out below your broker's minimum lot. | Raise the risk, move the stop closer, or use a fixed lot size. |
| `6027` | The signal carries no size and Volume Source is Signal Parameters. | Add a size to the alert, or set Volume Source to EA Inputs. |
| `6028` `6029` | A stop loss or take profit price is on the wrong side of the entry. | A buy needs its stop below the entry and its take profit above. A sell is the reverse. |
## Trade management [#trade-management]
Check **Trailing Stop Management** in the EA:
* With **Signal Parameters**, the signal itself must carry the trailing values (`trtrig=` and `trdist=`). A signal without them is not trailed.
* With **EA Inputs**, the EA uses its own Trigger Distance, Trailing Distance and Step Size.
In both cases the stop only starts to move once price has gone the trigger distance into profit. See [Trailing Stop Management](/configuration#trailing-stop-management).
Breakeven is set in the signal with `betrig=`, and it acts once price has moved that far into profit. Check the alert message carries it, and that price reached the trigger. See [Breakeven](/signals#breakeven).
One of these EA settings closed them:
* **Daily Drawdown Limit**, **Max Drawdown Limit** or **Daily Profit Target** was reached. The EA closes open trades and pauses, and the panel shows **Paused** or **Stopped** with the reason.
* **Trade Duration Limit** is set and the trade stayed open that long.
* **Close All Trades at Friday Session End** is on.
Also check whether another strategy sent an exit signal without a `comment=` filter. A `closeall`, `closebuy`, or `closesell` with no comment closes every position on that symbol, whichever strategy opened it. See [Multiple Strategies](/strategies).
The `py` flag is read only when the EA creates a strategy group, which is the first trade for a given symbol and comment. After that the setting is stamped on the group and later signals cannot change it, in either direction.
To stop pyramiding, close every position under that comment so the group is deleted, then let the next signal recreate it without `py`. If you need the change to apply while trades are still open, send the new trades under a different `comment=` value instead. Full explanation in [Multiple Strategies](/strategies).
Both strategies are sharing a comment on the same symbol, so the EA treats them as one group with one pyramid target, one hedge decision, and one set of entry filters. Give each strategy its own `comment=` value. See [Multiple Strategies](/strategies).
Direction Lock (6006) and DCA Filter (6008) act only on pyramid-managed strategies, and only against trades sharing the rejected signal's symbol and comment.
If you did not expect the strategy to be pyramid managed, check the Pyramid Management mode. In Enabled mode every strategy pyramids, so both filters apply everywhere. In Signal mode, check whether the signal that opened this strategy carried `py`, since that decision is stamped on the group and stays until all its trades close. If you do want the strategy to pyramid but not to be filtered, turn Direction Lock or DCA Filter off in the EA inputs.
## The panel on the chart [#the-panel-on-the-chart]
* **Show Dashboard Panel** may be off. It is under [Dashboard Settings](/configuration#dashboard-settings) in the EA inputs.
* The panel may be folded to its title row. Click the title row to open it again.
* The EA may not be running. Its name shows in the top right corner of the chart when it is attached.
Turn on **Global Breakeven** and **Strategy Target Lines** under [Dashboard Settings](/configuration#dashboard-settings). The lines are only drawn while there are open trades for them to describe.
## Reading the logs [#reading-the-logs]
When the cause is still not clear, MetaTrader's own logs usually name it. Open the Toolbox at the bottom of MetaTrader (press `Ctrl+T` if it is hidden).
* **Experts tab.** Everything the EA does: connecting, each signal it receives, and why it refused one.
* **Journal tab.** MetaTrader's side: orders sent to your broker and the broker's answer when it refuses one.
For more detail, turn on **Debug Logs** under [Miscellaneous](/configuration#miscellaneous) in the EA inputs. Turn it off again afterwards, because the log files grow quickly.
If you contact support, include the EA version shown at the top of the panel, the time or ID of the signal, and the lines from the Experts tab around that time. That is usually enough to find the cause in one reply.
# Telegram Copier (/telegram-copier)
## Introduction [#introduction]
The Telegram Copier bridges your Telegram signal channels and your trading accounts. When a trading signal is posted in a monitored channel, the copier detects it, extracts the trade parameters (symbol, action, entry, stop loss, take profits), and sends a formatted command to your accounts for instant execution.
Signals are parsed and sent to your accounts within milliseconds. No manual intervention required.
Auto-detect with regex patterns or use AI-powered parsing for complex signal formats. See [Signal Parsing](/telegram-copier/signal-parsing).
Override execution, offset targets, limit take profits, or attach trailing stops. See [Trade Management](/telegram-copier/trade-management).
The Telegram Copier requires an active TradeSgnl license with at least one connected account.
## Getting Started [#getting-started]
Setting up the Telegram Copier takes just a few minutes. Here is the process.
**Connect Your Telegram Account.** Navigate to the **Telegram Copier** page in your TradeSgnl portal and click **Connect Telegram**. A dialog opens where you can connect using either an instant QR code or your phone number. To switch between the two, use the **Connect with phone** or **Connect with QR code** button at the bottom left of the dialog.
* **Option A: QR Code (Fastest & Recommended)**. Choose **QR Code**. Open the Telegram app on your phone, go to **Settings → Devices → Add Device**, and point your camera at the QR code on your screen. The connection completes automatically in real time.
* **Option B: Phone Number**. Choose **Phone Number**, pick your country code, enter your phone number, and click **Send Code**.
Then enter the 5-digit verification code sent directly to your Telegram app (or via SMS, phone call, or email, depending on your Telegram security preferences). If the code doesn't arrive, click **Resend code** under the code boxes. It becomes available after a 60-second countdown, and each new code replaces the previous one.
If Telegram requires an email on your account, enter your email address to receive a confirmation code. If you have Two-Factor Authentication (2FA / Cloud Password) enabled on your Telegram account, enter your 2FA password to complete connection.
Your Telegram session is encrypted and stored securely. TradeSgnl only accesses the channels you explicitly choose to monitor.
**Select a Channel to Monitor.** After connecting, click **Monitor a channel** (or pick a channel from the channel browser). A dialog lists every channel, group and bot you're subscribed to on Telegram. You can search by name or filter by type (**Channels**, **Groups**, or **Bots**):
* **Preview**: Click to view the channel's latest 50 messages stream on the right panel without monitoring.
* **Monitor**: Click to open the template builder and configure signal execution.
Anything you already monitor is marked with a **Monitoring** badge, so you won't add it twice.
If the chat is a group split into topics, you can copy from just one of them. See [Groups with Topics](#groups-with-topics).
**Configure Signal Parsing and Save.** A setup dialog opens where you configure how signals are parsed, set defaults, and choose which license receives the signals.
* To learn how regex and AI parsing extract signal data, see [Signal Parsing & Templates](/telegram-copier/signal-parsing).
* To configure order execution overrides, offsets, and stop guards, see [Trade Management](/telegram-copier/trade-management).
## Managing Channels [#managing-channels]
Your monitored channels are listed on the left of the Telegram Copier page. Select one and it fills the panel on the right: whether it's **Active** or **Paused**, whether it's a channel, group or bot, the license its signals run on, and how it reads messages.
### Recent Outcomes [#recent-outcomes]
The four figures across the top tell you whether the channel is working without opening anything:
* **Sent**: Messages that produced a trade, over the last 7 days.
* **Not a trade**: Messages checked but not traded, over the same window. A healthy number: most posts in a signal channel are commentary, not signals.
* **Failed**: Messages that should have traded but didn't, over the same window. Anything other than zero is worth opening the Activity tab for.
* **Last message**: How long ago the channel last posted anything the copier looked at. If this is older than you expect, the problem is the channel or your Telegram connection, not your template.
### Controls [#controls]
| Control | What it does |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Channel template | Re-open the channel setup dialog to adjust parsing rules, defaults, trade management, filters, or reassign the license. For a group with topics, it is also where you choose which topic to copy. |
| AI parsing | Interactive toggle switch between template-based parsing (fast, \~100ms) and AI parsing (smarter, \~1-5s) for this channel. Order rules and trade management apply to both. |
| Merge repeats | Interactive toggle switch (on by default). When the channel restates a signal it already sent, apply the new stop loss and targets to the open trade instead of opening a second trade. See [Restated Signals and Trade Updates](#restated-signals-and-trade-updates). |
| Pause / Resume | Temporarily stop or resume signal processing without losing the configuration. |
| Remove | Stop monitoring the channel and delete its setup (the red bin icon). |
A channel with no template yet says so, and needs one before you can resume it. Until then nothing from that channel is traded.
### Groups with Topics [#groups-with-topics]
Some Telegram groups are split into topics (sub-groups), often one per trader or signal type. Without a setting, the copier reads every message in the group, so you would get the signals of every trader in it. You can limit a group to one topic instead.
1. Click **Monitor** on the group (or **Channel template** if you already monitor it). The setup dialog shows a **Topic** dropdown next to **Target License**. It only appears for groups that have topics turned on.
2. Choose the topic you want. The message list on the left switches to that topic's posts, so you can pick an example signal from the right trader.
3. Save. From the next message on, the copier ignores every other topic in the group.
A few things to know:
* **General** is the topic every group with topics starts with. Pick it if the signals are posted there.
* Choose **All topics** to read the whole group again. You can change the topic at any time from **Channel template**.
* The channel's detail panel shows which topic it reads, for example `Topic: Institutional Trader`, and its **Messages** tab shows only that topic's posts.
* A group follows one topic at a time. Copying two topics of the same group with separate settings is not supported yet.
* If the topic you saved is later deleted in Telegram, it stays in the dropdown under its saved name. Pick another topic or **All topics** to fix it.
* A reply to a post inside the topic is handled like a reply anywhere else.
### Activity and Messages [#activity-and-messages]
Below the controls, two tabs show you what actually happened, updating live.
**Activity** is the copier's own record: one row per message it checked for a trade, newest first. Each row shows the time, what it decided, and the trade it parsed.
| Column | What it shows |
| ------- | ------------------------------------------------------------------------------------------------------------------------ |
| Time | When the message was processed in your local time |
| Status | `Sent`, `Partial`, `Failed`, or `Not a trade` |
| Action | The command sent, such as `BUY`, `SELLLIMIT` or `CLOSEBUY`. A message carrying several trades stacks one line per trade. |
| Symbol | The trading instrument detected |
| Entry | The quoted entry price parsed from the message |
| Filled | The actual execution price reported back from your broker/account |
| SL, TP | The stop loss and take profit levels dispatched to your accounts |
| Message | The start of the original post, or the reason it wasn't traded |
Click any row to expand it. You get the full message text, and for anything that failed or was skipped, the reason above it. This is the fastest way to answer "why didn't that one trade?", because you can compare what the channel wrote against what the copier read from it.
**Messages** is the raw feed: the channel's latest posts as Telegram delivered them, whether or not the copier acted. Use it to confirm a post arrived at all when nothing shows in Activity.
Activity holds the newest 100 messages the copier checked, Messages the latest 50 from Telegram, both in your local time.
### Restated Signals and Trade Updates [#restated-signals-and-trade-updates]
Many channels post a quick call ("SELL GOLD NOW, SL 4300") and then, a minute later, the full setup for the same trade with its targets. With **Merge** on, the copier recognizes the second post as the same trade: same symbol and direction, the same stop loss or entry, within a few minutes. It sends a [modify command](/signals#modify-orders) that adds the new stop loss and targets to the trade already open, instead of opening a second one. A repeat that adds nothing new is skipped.
If the quick call carries no stop loss, the trade stays unprotected until the full setup arrives, and the quick call may have already hit its target by then. To trade only the full setup, turn on a [Message Filter](/telegram-copier/trade-management#message-filters).
The copier also acts on management messages about the channel's open trade:
| Message | What the copier sends |
| ---------------------------------------------------------------- | --------------------------------------------------------------------- |
| "Set BE", "move SL to entry", "SL to breakeven" | Moves the stop loss of the channel's open trades to their entry price |
| "Close half", "close 1/2", "close 50%", "TP half", "taking half" | Closes that share of the channel's open trades |
These use the symbol and direction named in the message, or the channel's last trade when the message names none. They only apply to trades carrying the channel's comment, so trades from your other strategies are never touched. Instructions inside a new setup, such as "move SL to entry after 40 pips", are not acted on.
Merging and moving a stop to entry use modify commands. On an older EA the signal is rejected with error `7021` and the first trade keeps its original levels. Update the EA to use these features.
## Troubleshooting [#troubleshooting]
Your Telegram session was revoked, possibly because you logged out from another device or changed your Telegram password.
* Go to the Telegram Copier page, click **Connect Telegram**, and reconnect your account using either the QR code or your phone number
* Your channel configurations and templates are preserved
Telegram doesn't send login codes for the copier by SMS. The code arrives as a message from Telegram in the app on another device where you're already signed in, such as your phone.
The quickest way is to connect with the **QR code** instead: open Telegram on your phone, go to **Settings → Devices → Add Device**, and scan the code on your screen.
If signals appear to be detected but trades are not placed:
* Open the **Activity** tab and find the message. Its status tells you whether the copier sent it at all, and an expanded row shows the error if it failed
* Verify the channel is Active (not Paused)
* Check that the correct license is selected
* Ensure your MT4/MT5/cTrader account is connected and running
* Check the Signal Preview in the template builder to verify the syntax is correct
* If the group has topics, check the **Topic** setting in **Channel template**. The copier only reads the topic you chose, so a signal posted in another topic never shows in Activity
The dropdown only appears for a group that has **Topics** turned on in Telegram.
* In Telegram, open the group, then Edit, and check that **Topics** is on. Ask the group's admin if you can't change it
* Click the refresh icon under the channel list so the portal reloads your chats and notices the change
* Reopen **Channel template**. If the list is still empty, Telegram may not have returned the topics, so reload the page and try again
## FAQ [#faq]
Yes. Each channel can be configured independently with its own template and license. You can monitor as many channels as you need.
Yes. Multiple channels can be bound to the same license. All signals from those channels are executed on the accounts connected to it.
No. The copier only monitors channels you explicitly select for monitoring. Personal chats, DMs, and unmonitored channels are never accessed.
No. The copier reads channels through your own Telegram account, so the channel sees you as the same member you already are. Nothing in Telegram tells the admins that you copy the signals.
Yes. Open **Channel template** and select a different license from the dropdown at the bottom. The change takes effect on the next signal.
Yes. Some Telegram groups are split into topics (sub-groups), one per trader or signal type. When you set up a group like that, a **Topic** dropdown appears next to the license dropdown in **Channel template**. Pick the topic you want and the message list on the left switches to that topic's posts. The copier then ignores every other topic in the group.
Choose **All topics** to read the whole group again. You can change the topic at any time from **Channel template**, and it takes effect on the next message. See [Groups with Topics](#groups-with-topics).
Not with separate settings yet. A group is one monitored channel with one template and one license, and it reads either one topic or all of them. If two topics post in the same format and should go to the same account, choose **All topics** and use a [Message Filter](/telegram-copier/trade-management#message-filters) to skip the posts you don't want.
Pausing stops signal processing for that channel. Messages are not queued. Any signals sent while paused are skipped. Resume at any time to start processing again.
Channels often follow a signal with progress updates such as "TP1 hit", "TARGET 3 COMPLETE" or "SL hit". The copier recognizes these as updates about a trade that is already open and skips them, so they never open a new position or close an existing one. Your stop loss and take profit at the broker close the trade.
A message that tells you to close now, such as "CLOSE ALL", still closes positions.
# Signal Parsing & Templates (/telegram-copier/signal-parsing)
When you click **Monitor** on a channel (or **Channel template** on one you already monitor), the channel setup dialog opens. This dialog allows you to configure how signals are read, test against historical messages, and set defaults.
## Template Layout [#template-layout]
The setup dialog is divided into two main panels:
### Message Panel (Left) [#message-panel-left]
Displays the last 30 messages received from the channel. Select a message that contains a representative trading signal to configure and test your parsing template.
### Signal Configuration (Right) [#signal-configuration-right]
This is where you configure how signals are extracted from messages. A channel is read one of two ways, chosen with the controls at the top of the panel:
| Control | How it works |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Auto Detect** button | Builds a template from the selected message using regex patterns. Fast (\~100ms) and works well for standard signal formats (e.g., `BUY EURUSD @ 1.0850 SL 1.0820 TP 1.0900`). |
| **AI Parsing** switch | When on, AI reads every message from the channel, handling complex, non-standard, or natural language formats. The panel shows each message as the AI interprets it. Turn it off to go back to the template. |
There is no separate setting for mapping fields by hand. With AI Parsing off, you correct what the template reads directly in the panel: see [Editing Fields by Hand](#editing-fields-by-hand).
## Editing Fields by Hand [#editing-fields-by-hand]
After running **Auto Detect**, or on a saved template, you can customize what the template reads:
| To | Do this |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Leave a field out | Click the **✕** beside its name, or click its highlight in the message. The field is no longer sent, for this and every subsequent signal from the channel. Remove the stop loss or TP1 and your default value is used instead, if configured. |
| Map a field yourself | Select the value in the message, then click the field it belongs to. Pick a number that follows a label, such as the price after `SL:`. The label is used to identify the same field in the channel's future messages. |
The **Signal Preview** updates after each change, so it always shows what the edited template sends. Fields you removed are listed under the field boxes.
With **AI Parsing** on, the AI reads every message itself, so individual field mappings are not edited by hand. To send fewer targets on an AI Parsing channel, use [Limit Take Profits](/telegram-copier/trade-management#limit-take-profits). All trade management features—including [Override Order Execution](/telegram-copier/trade-management#override-order-execution), [Cancel at TP1](/telegram-copier/trade-management#cancel-at-tp1), and [Take Profit & Stop Loss Offset](/telegram-copier/trade-management#take-profit--stop-loss-offset)—apply to AI-parsed signals automatically. Turn the switch off to go back to the template and map fields yourself.
## Signal Preview [#signal-preview]
At the bottom of the configuration panel, the Signal Preview shows exactly what will be sent to your accounts when a matching message is received. This updates in real-time as you adjust settings, displaying your actual license code and all detected parameters.
If the message contains more than one order, the preview shows one line per order along with a badge telling you how many will be sent.
Always check the Signal Preview before saving. It shows the exact command your accounts will receive, so you can verify symbols, prices, and order types are correct.
## Multiple Orders in One Message [#multiple-orders-in-one-message]
A single message often carries more than one order: a hedged buy stop and sell stop pair, an entry ladder at several price levels, or the same setup restated once per broker. The copier reads every order in the message and sends each one to your accounts as a separate trade. This works with Auto Detect, AI Parsing, and saved templates.
In the message panel, the values belonging to each order are highlighted, so you can see exactly which numbers were picked up and which were ignored.
### Repeated Orders Are Merged [#repeated-orders-are-merged]
Some channels post the same trade twice, once per broker or prop firm. When the repeats quote identical entry, stop loss and take profit levels, the copier recognizes them as the same order and sends it once. The repeat appears dimmed in the message panel, so you can tell it was detected rather than missed.
Orders that differ in any price level are kept separate. An entry ladder with three different entry prices still creates three distinct orders.
A single message can create at most 10 orders.
### Trading Only Part of the Message [#trading-only-part-of-the-message]
If a channel restates the same orders per broker and each broker quotes slightly different prices, the copier cannot tell the repeats apart and will send all of them. Use the **Trade only part of the message** fields to pick the section you want:
| Field | Effect |
| ---------------- | ---------------------------------------- |
| Start reading at | Ignores everything above this text |
| Stop reading at | Ignores everything from this text onward |
Enter the text that marks the section boundary, such as the broker name or the divider line the channel uses between sections. You can use one field or both together to select a section in the middle of a message.
The header above the first order is always kept, so an instrument declared once at the top of the message still applies to the section you selected.
These fields appear once a message produces more than one order, or when you already have one configured.
## Entry Price Ranges [#entry-price-ranges]
Some channels quote the entry as a range or zone, such as `XAUUSD Sell 4151/4154` or `Buy gold 4115 - 4120`. With AI Parsing, a range with one stop loss and take profit set is **one order**, and the entry is the **first price as written**. It is not the lower price, the higher price, or the midpoint.
| Message | Entry used |
| ----------------------- | ---------- |
| `XAUUSD Sell 4151/4154` | `4151` |
| `Buy gold 4115 - 4120` | `4115` |
| `Buy gold 4120 - 4115` | `4120` |
Because the first price wins, a channel that writes the higher price first for a buy will have its order entered at the higher price.
Three or more prices joined by `/` or `-`, such as `4151/4154/4157`, are an entry ladder. Each price becomes its own order, as described in [Multiple Orders in One Message](#multiple-orders-in-one-message).
To enter at a different price from a range, select the number you want in the message preview with **Manual Mapping** and assign it to the entry field. The Signal Preview always shows the entry the copier will send before you save.
Without AI Parsing (Auto Detect or a saved template), a range sets no entry, so the order opens at market. Channels that post a quick call such as "SELL NOW" and then the range usually mean exactly that. To get the same result with AI Parsing, switch on **Force Market** under [Override Order Execution](/telegram-copier/trade-management#override-order-execution). It removes the entry price, so the order opens at market whichever way the message is read.
## Parsed Fields & Defaults [#parsed-fields--defaults]
The copier extracts these fields from each signal message:
| Field | Required | Unit Options | Description |
| -------------------- | -------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Symbol\*** | Yes | — | The trading instrument (e.g., `EURUSD`, `XAUUSD`, `US30`). Common aliases are automatically normalized. |
| **Action\*** | Yes | — | The trade direction: `BUY`, `SELL`, `BUYLIMIT`, `SELLLIMIT`, `BUYSTOP`, `SELLSTOP`, or close commands. |
| **Volume** | No | `Default`, `Fixed Lots`, `% of Balance`, `% of Equity`, `Dollar Risk` | Position sizing. If not detected in the message, the default volume configured in the template is used. |
| **Pending Level** | No | `Price`, `Pips`, `Percent` | The quoted entry price for limit or stop orders. |
| **Stop Loss** | No | `Price`, `Pips`, `Percent` | Protective stop level. If missing from the message, falls back to the default stop loss if configured. |
| **Take Profit 1..N** | No | `Price`, `Pips`, `Percent` | Multiple profit targets (TP1, TP2, TP3...). Left-out targets can be excluded via [Limit Take Profits](/telegram-copier/trade-management#limit-take-profits). |
| **Comment** | No | — | Identification label attached to the order ticket (defaults to `TG: ChannelName`). |
Only **Symbol** and **Action** are required. All other fields fall back to your configured defaults if not detected in the message.
### Default Settings [#default-settings]
Each channel template includes default settings that are applied when fields are not detected in a signal message:
| Setting | Options / Units | Description |
| ---------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| Default Volume | Number (e.g. `0.01` or `1`) | Position size used when volume is omitted in the signal message. |
| Volume Type | `Default`, `Fixed Lots`, `% of Balance`, `% of Equity`, `Dollar Risk` | How volume is calculated for your broker account. |
| Comment | String | A custom label attached to each trade ticket (defaults to `TG: ChannelName`). |
| Pending / SL / TP Type | `Price`, `Pips`, `Percent` | How numeric values in the signal are evaluated (absolute price level, distance in pips, or percentage distance). |
## Supported Symbols [#supported-symbols]
The copier automatically normalizes common symbol aliases to their standard broker format:
| Category | Aliases |
| ----------- | ------------------------------------------------------------------------------------------------------------ |
| Metals | `GOLD` → `XAUUSD`, `SILVER` → `XAGUSD` |
| Currencies | `CABLE` → `GBPUSD`, `FIBER` → `EURUSD`, `AUSSIE` → `AUDUSD`, `KIWI` → `NZDUSD`, `LOONIE` → `USDCAD` |
| Indices | `NASDAQ` / `NAS100` → `USTEC`, `DOW` / `DJ30` → `US30`, `DAX` → `DE40`, `NIKKEI` → `JP225`, `FTSE` → `UK100` |
| Crypto | `BTC` → `BTCUSD`, `ETH` → `ETHUSD`, `SOL` → `SOLUSD`, `XRP` → `XRPUSD`, `DOGE` → `DOGEUSD` |
| Commodities | `OIL` / `WTI` → `USOIL`, `BRENT` → `UKOIL`, `NATGAS` → `NATGAS` |
If your broker uses a different symbol name (e.g., `GOLD` instead of `XAUUSD`), you can use the [Symbol Mapping](/symbol-mapping) feature in the portal to create custom mappings.
## Troubleshooting [#troubleshooting]
This means the auto-detect regex could not find a symbol and action in the selected message.
* Try selecting a different message that contains a clearer signal
* Turn on AI Parsing instead. It handles non-standard and conversational formats better
* Manually select text in the message and assign fields
Check the badge above the Signal Preview for how many orders were detected.
* Repeats quoting identical prices are merged on purpose and count as one order
* If orders are missing entirely, the channel's layout may not start each order on its own line. Try turning on AI Parsing, which handles irregular layouts better
* A single message is capped at 10 orders
The channel is most likely restating the same orders for more than one broker, with each broker quoting slightly different prices. Identical repeats are merged automatically, but ones that differ by even a single price level cannot be.
* Use **Trade only part of the message** in the channel setup to select one broker's section
* Enter the broker name or the divider line the channel uses between sections
AI parsing relies on an external AI API and may occasionally time out under heavy load.
* Wait a moment and try again
* Use Auto Detect as a fallback for standard signal formats
* Manually map fields if both methods fail
## FAQ [#faq]
Turn on AI Parsing for non-standard, multilingual, or complex formats. AI parsing understands natural language and can extract trading parameters from virtually any format.
Yes. If a message contains several orders, such as a hedged pair or an entry ladder, each one is sent to your accounts as a separate trade. The Signal Preview shows one line per order before you save. Orders repeated at identical prices are merged and sent once.
With regex-based parsing (Auto Detect and saved templates), signals are detected and sent to your accounts within 100-500ms. AI parsing adds 1-5 seconds for the AI model analysis step.
# Trade Management (/telegram-copier/trade-management)
When configuring a channel in the Telegram Copier, you can attach automated protections, execution rules, and filters to every trade copied from that channel—even when the original message does not mention them.
Settings are organized into three dedicated sections in the template builder:
1. **Trade Management**: Position management rules (Trailing Stop and Breakeven) applied by the EA once trades are open on your trading platform.
2. **Signal & Order Rules**: Order translation rules (Execution Overrides, Cancel at TP1, Target Limits, and Price Offsets) evaluated by the copier when converting channel signals into broker commands.
3. **Message Filters**: Gating rules (Ignore Messages and Require Stop Loss) evaluated by the copier before any message is parsed into an order.
Toggle on any feature and fill in its values. These settings apply automatically to every trade produced by the channel, across both template-based and AI parsing modes.
## Features Overview [#features-overview]
| Feature | Section | What it does |
| ------------------------------ | -------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Trailing Stop | Trade Management | Stop loss trails behind market price as profit increases. Managed by the EA. |
| Breakeven | Trade Management | Stop loss jumps to entry (plus optional offset) once a profit target or trigger distance is hit. Managed by the EA. |
| Override Order Execution | Signal & Order Rules | Force trades to open immediately at market (`Force Market`) or wait as pending orders (`Force Pending`). |
| Cancel at TP1 | Signal & Order Rules | Automatically cancel a pending limit or stop order if market price touches TP1 before filling. |
| Limit Take Profits | Signal & Order Rules | Send only the first targets from the signal and omit the rest. |
| Take Profit & Stop Loss Offset | Signal & Order Rules | Shift all take profit targets and/or the stop loss level by a fixed distance (pips or currency). |
| Custom Take Profit Levels | Signal Configuration | Add your own targets beyond the signal's take profit with **+**, each with its own partial close. |
| Ignore Messages | Message Filters | Skip trading any message containing specified keywords or matching a regex pattern. |
| Require Stop Loss | Message Filters | Discard new trade signals that lack a stop loss. |
## Trade Management [#trade-management]
The **Trade Management** section controls automated position management rules that are attached to each signal and executed locally by the TradeSgnl EA on MetaTrader.
### Trailing Stop [#trailing-stop]
Attach an automatic trailing stop that follows behind profitable trades at a set distance:
* **Trigger**: The profit distance required before the trailing stop activates and begins tracking price.
* **Distance**: How far behind current market price the stop loss trails.
* **Step**: The minimum increment price must move before the stop loss updates.
For trailing stop values from the copier to take effect, your EA's **Trailing Stop Management** setting must be set to **Signal**. If the EA is configured to use EA Defaults or Disabled, trailing parameters sent from the copier are ignored. Breakeven has no such restriction and always takes effect. See [Signal Syntax](/signals) for the full parameter reference.
### Breakeven [#breakeven]
Protect profitable positions by automatically moving the stop loss to breakeven once price reaches your trigger:
* **Trigger**: The profit distance or target level that activates the breakeven rule.
* **Offset**: An optional distance added beyond entry to lock in extra profit or cover commissions/spread. Leave Offset empty to move the stop loss exactly to your entry price.
## Breakeven at a Take Profit Level [#breakeven-at-a-take-profit-level]
In addition to fixed distances, you can select **TP Level** as the unit type on the Breakeven trigger. The stop moves to breakeven when the signal's own take profit target is reached, adapting dynamically to whatever prices each signal carries.
A typical setup on a three-target signal: the copier sends all three targets, the trade scales out at TP1 and TP2, and with breakeven set to **TP2**, the stop on the remaining position moves to entry the moment TP2 is reached, allowing the final runner to target TP3 risk-free.
If the channel posts signals with varying numbers of targets, select **Before last TP** instead. It automatically binds to the target preceding the final one regardless of count: TP2 on a 3-target signal, TP3 on a 4-target signal, or TP1 on a 2-target signal.
Breakeven is skipped if a signal does not contain your selected target level, or if your chosen level is the signal's final target (since the position closes entirely at that point). The trade opens normally with its parsed stop loss and targets.
Breakeven with an empty Offset, the Percent unit, and TP Level require EA 0.69 or newer on MetaTrader.
### Unit Types [#unit-types]
Trailing stop and breakeven each feature a **unit type** selector on the trigger field that defines how values in that card are calculated:
| Unit Type | Meaning |
| --------- | ----------------------------------------------------------------------------------------------------------------------------- |
| Default | Uses the default unit configured in your EA settings. |
| Pips | Values are measured in pips. Ideal for forex currency pairs. |
| Currency | Values represent raw price distance (points). Best for gold, indices, and crypto where pip definitions differ across brokers. |
| Price | The trigger is an exact price level rather than a relative distance. |
| Percent | Values represent a percentage of the asset price, providing scale across any instrument. |
| TP Level | **Breakeven only.** The trigger tracks one of the signal's own take profit levels. |
The unit type selected on the **trigger** acts as the master type; the distance and step fields automatically inherit it. **TP Level** is the exception: because the trigger references the channel's target price, the Offset receives its own independent unit selector.
## Signal & Order Rules [#signal--order-rules]
The **Signal & Order Rules** section defines how parsed messages are translated into trade commands before dispatching to your connected broker accounts.
## Override Order Execution [#override-order-execution]
Signal providers format trade instructions differently. Some write `SELL 4196` meaning "sell now, current market price is near 4196". Others post pending limit or stop orders with entry prices when you would rather enter immediately at market. Switch on **Override Order Execution** to dictate exact order execution behavior:
| Mode | What it does |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Force Market** | Strips any entry price and converts limit or stop orders into immediate market orders (`BUY` or `SELL`). Perfect for channels that post pending orders or entry quotes when you prefer to enter immediately without waiting. |
| **Force Pending** | Any Buy or Sell that includes an entry price is converted into a pending order (`BUYLIMIT`, `SELLLIMIT`, etc.) waiting at that price, opening only when market price reaches the entry level. |
### Comparison of Execution Modes [#comparison-of-execution-modes]
| Signal | Default (Off) | Force Market | Force Pending |
| ---------------------------------- | ---------------------------- | ------------ | ------------------------- |
| `SELL 4196`, stop loss and targets | Sent as parsed (market Sell) | Market Sell | Sell Limit / Stop at 4196 |
| `BUY LIMIT 1.0850`, SL and TP | Buy Limit at 1.0850 | Market Buy | Buy Limit at 1.0850 |
| `BUY NOW`, no entry price | Market Buy | Market Buy | Market Buy |
On MetaTrader, when **Force Pending** is enabled, the EA automatically places the order as a limit or stop depending on where current market price sits relative to the signal's entry price.
When using **Force Pending**, a pending order fills only if price reaches its level. If the market moves away without filling, the order remains active on your account until cancelled or filled. The **Signal Preview** reflects the exact order type that will be sent.
## Cancel at TP1 [#cancel-at-tp1]
A pending order waits for price to pull back to its entry level. Occasionally, price moves directly to the first take profit target without filling the order. If the order filled later, you would enter an exhausted move after the target was already hit.
Switch on **Cancel at TP1** to automatically cancel pending orders from the channel as soon as market price touches TP1 without filling the entry. This monitoring is handled in real-time by the EA on your account.
| Situation | What happens |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| Price reaches entry first | The order fills and the trade runs with its defined stop loss and targets. |
| Price reaches TP1 first | The order is immediately cancelled, and the activity log records the cancellation with market prices. |
| The signal opens at market | The trade fills immediately, so Cancel at TP1 does not apply. |
| The order has no take profit | No target exists to monitor. Monitoring begins automatically if a follow-up message adds targets. |
| Price is past TP1 when placed | The order is preserved. It cancels only if price returns at least halfway toward entry and then touches TP1 again. |
Cancel at TP1 pairs naturally with [Override Order Execution](#override-order-execution) in **Force Pending** mode: one holds the order at your desired entry price, while the other removes the order once the setup has played out.
Cancel at TP1 requires MetaTrader running EA 0.80 or newer. When enabled, accounts on older EA versions, cTrader, or TradeLocker reject or do not place the pending order so that an order is never left unmonitored. See [Cancel at TP1](/signals#cancel-at-tp1) for the full parameter reference.
## Limit Take Profits [#limit-take-profits]
Channels frequently broadcast 3 to 5 profit targets when your strategy calls for exiting entirely at earlier levels. Switch on **Limit Take Profits** and configure **Targets to Send** to cap the number of targets dispatched to your accounts.
* Setting **Targets to Send** to `1` sends only TP1; the full trade volume closes upon hitting the first target.
* Setting **Targets to Send** to `2` sends TP1 and TP2, splitting volume across those two targets.
The limit applies to every signal from the channel regardless of how many targets the message specifies, as well as to subsequent messages that modify targets. In the template builder, excluded targets remain highlighted in the parsed message but are dimmed, and the **Signal Preview** shows only the targets that will be transmitted.
## Take Profit & Stop Loss Offset [#take-profit--stop-loss-offset]
Broker spreads, platform slippage, or stop hunts around obvious psychological levels can trigger premature stop-outs or cause missed take profit fills by fractions of a pip. Switch on **Take Profit & Stop Loss Offset** to shift profit targets and stop losses by a specified distance:
| Setting | Unit Options | How it adjusts |
| -------------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Target Offset** | Pips, Currency | Positive values extend profit targets further away from entry; negative values bring targets closer to entry for earlier fills. Applied across all targets (TP1, TP2, TP3...) uniformly. |
| **Stop Loss Offset** | Pips, Currency | Positive values widen the stop loss further from entry (extra breathing room); negative values tighten the stop loss closer to entry. |
### Offset Units [#offset-units]
* **Pips**: Calculated based on the instrument's pip size (e.g. `0.0001` for EURUSD, `0.01` for JPY pairs). Best for Forex currency pairs.
* **Currency**: Uses the raw price/point distance. Best for Gold (XAUUSD), Indices (US30, NAS100), and Crypto where pip definitions vary across brokers.
Offset calculations automatically adjust for trade direction: for a Buy order, a positive TP offset adds price distance while a positive SL offset subtracts price distance to widen the stop. For a Sell order, the reverse applies.
## Custom Take Profit Levels [#custom-take-profit-levels]
Many channels post a single take profit, while your strategy may call for taking part of the trade off at that target and letting the rest run. In the **Signal Configuration** fields of the template builder, add your own targets beyond the signal's take profit and choose how much closes at each. It works the same way as the take profit levels in the [Syntax Generator](/syntax-generator).
Next to **Take Profit 1** you will find a **Partial Close** field and a **+** button. Click **+** to add a **Take Profit 2** and its own **Partial Close**, and again for more levels. The **-** button removes the last level.
| Field | What it does |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Take Profit 1** | The channel's own take profit. It stays exactly where the channel puts it. |
| **Partial Close 1** | What closes at Take Profit 1. The selector sets how it is read: **Default** (the EA's Partial Close Type setting), **Percent** (a share of what is still open, from 0 to 1, so `0.5` closes half) or **Lots**. |
| **Take Profit 2, 3...** | How far past Take Profit 1 the level sits, in **Pips** or **Currency**. Each level is further out than the one before it. |
| **Partial Close 2, 3...** | What closes at that level. A level's Partial Close appears once the one before it has a value. Leave one empty to let the EA split as it likes. |
For example, a Sell XAUUSD signal with a take profit of 4165, Partial Close 1 set to Lots `0.3`, and Take Profit 2 set to `40` pips sends a second target at 4161 (gold pips are 0.10). If you open 0.5 lots, 0.3 lots close at 4165 and the remaining 0.2 lots run to 4161. The last level always closes whatever is left, so it needs no partial close.
Partial closes follow the same rules as in the Syntax Generator: with Percent, each value is a share of what is still open at that moment, so a third at each of three levels is `0.33`, then `0.5`.
* The levels are measured from the message's first take profit and replace any other targets the message gives.
* They work on signals whose take profit is a price or a number of pips, and need a take profit in the message.
* An existing [Take Profit & Stop Loss Offset](#take-profit--stop-loss-offset) moves Take Profit 1 first, and the levels are then measured from the moved target.
* Set a [Breakeven](#trade-management) on **Take Profit 1** to move the stop to entry once the first part has closed, or use Trailing Stop to protect the part that keeps running.
* Percent and Lots partial closes need EA 0.77 or newer.
## Message Filters [#message-filters]
The **Message Filters** section screens incoming channel messages before any trade orders are parsed or dispatched. Both filters run within the copier service before signals reach your broker.
| Filter | What it does |
| ----------------- | -------------------------------------------------------------------------------------------- |
| Ignore Messages | Discards any message containing specified words or matching a regular expression pattern. |
| Require Stop Loss | Prevents opening new positions if no stop loss is defined in the signal or channel template. |
Use filters for channels that post commentary, marketing, or preliminary heads-up alerts lacking stop losses. Skipped messages appear in the [Activity tab](/telegram-copier#activity-and-messages) with the skip reason logged for transparency.
### Ignore Messages [#ignore-messages]
Block messages containing specific words or phrases from triggering trades. Separate multiple phrases with a pipe character (`|`), for example `BUY NOW|SELL NOW`. Phrase matching is case-insensitive.
**Ignore Messages** supports full regular expressions. The template builder alerts you in the Signal Preview whenever a selected sample message matches the ignore pattern.
### Require Stop Loss [#require-stop-loss]
Ensure every open order has risk protection. When enabled, new trade signals that do not specify a stop loss are dropped.
If you have configured a default stop loss in your channel template, it counts as a valid stop loss and the trade is permitted. Modification and close signals for existing open positions are never blocked by this filter.
## Troubleshooting [#troubleshooting]
A message such as `SELL 4196` can represent an immediate execution advisory or a pending entry quote. By default, signals without explicit pending keywords execute at market. To force signals with entry prices to wait as pending limit or stop orders, enable [Override Order Execution](#override-order-execution) in the **Signal & Order Rules** section and choose **Force Pending**.
Check your EA inputs on MetaTrader. The EA's **Trailing Stop Management** setting must be configured to **Signal**. If set to EA Defaults or Disabled, the EA ignores trailing stop parameters transmitted from the copier. Breakeven does not require this setting and is always applied.
Cancel at TP1 requires MetaTrader running EA version 0.80 or newer. Older EA versions, cTrader, and TradeLocker accounts reject or do not place pending orders configured with `cancel_at=tp1` so that orders are never left unmonitored.
## FAQ [#faq]
Yes. Open the channel template, enable [Override Order Execution](#override-order-execution) in the **Signal & Order Rules** section, and select **Force Market**. The copier strips the entry price and executes the trade immediately as a market order.
Yes. When AI parsing is enabled, the AI model extracts trade parameters from the message, and then all configured rules—including **Override Order Execution**, **Cancel at TP1**, **Take Profit & Stop Loss Offset**, and **Limit Take Profits**—are applied to the extracted trades before dispatching them to your accounts.
Offsets shift the price levels sent to your broker. A positive Stop Loss offset gives the position more breathing room by widening the stop distance from entry. A negative Take Profit offset brings target prices closer to entry for earlier, higher-probability fills. Offsets can be set in pips or raw currency/price points.
Yes. Open the channel template and switch on [Cancel at TP1](#cancel-at-tp1) in the **Signal & Order Rules** section. The EA then cancels a pending order as soon as price reaches its first target without the order having filled. It requires a MetaTrader account on EA 0.80 or newer.
Yes. Open the channel template and use the **Trade Management** section to enable a trailing stop, a breakeven, or both. They are applied to every trade copied from that channel, even if the original signal message does not include them. Make sure the matching EA setting is set to **Signal** so the values take effect.