Two MT4 terminals on the same VPS. The source opens EURUSD. The destination trades EURUSD.m. Nothing happens, nothing errors, and the log says the copy succeeded. This is the MT4 side of signal copying — what the platform gives you, what it withholds, and where the silent failures live.
Two MT4 terminals sit on the same VPS. The source account opens 0.40 lots of EURUSD. Forty seconds later the destination account still holds nothing. There is no error dialog, no red text in the Experts tab, and the copier's own log line reads copy dispatched ok.
The destination broker calls the pair EURUSD.m. As far as the software was concerned it sent an order for an instrument that does not exist on that account, the terminal declined it, and nobody wrote that down. This is the single most common way MT4 copying fails, and it is representative of the whole category: MT4 does not shout when something is wrong, it just quietly does less than you thought.
This is the MT4 side of signal copying. If your interest is in getting trades out of a Telegram channel and into a terminal, that is a different pipeline and it is covered separately; what follows is about the terminal itself.
MT4 is a client-only surface for retail traders. There is no public server API you can call with an account number and a password from outside — the manager and administrator APIs exist, but they belong to the broker, not to you. Everything a retail copier does, it does through a program running inside a terminal that is logged in to the account.
That single fact sets the boundaries:
MQL4/Files, with a shared Common/Files folder that all terminals on the machine can see. That shared folder is what makes local copying possible at all.There are two architectures and they solve different problems. Choosing the wrong one is an expensive detour.
Source and destination terminals run on the same machine. The source program writes an event — ticket, symbol, type, volume, open price, stop, target — into the common folder or into shared memory. The destination program reads it and acts.
The limits are just as clear. Every account has to live on one machine, which means you own or control all of them, and you are constrained by the RAM that eight or ten MT4 terminals need. It cannot copy to another person, another continent, or a prop firm dashboard you do not host.
The source terminal publishes events to a remote service. Destination terminals — anywhere, on any machine, for any account — subscribe and execute. This is what commercial copiers do, and it is what our own copier hub does.
The costs are a network hop measured in tens to low hundreds of milliseconds, a credential model you have to trust, and a much harder reconnection story, because now two independent sides can each go away and come back.
TIP
For copying between your own two or three accounts on one VPS, local is genuinely the better engineering answer. The moment a fourth account lives somewhere else, or somebody else's account is involved, local stops being simpler and starts being a workaround.
This deserves its own section because it causes more failed copies than everything else combined.
Brokers decorate symbol names. The decoration is not standardised and it is not documented anywhere central. In the wild you will meet:
EURUSD.m, EURUSD.r, EURUSDpro, EURUSD_i, EURUSD.raw, EURUSDmicro, EURUSD-ECN.mEURUSD or fxEURUSD.XAUUSD, GOLD, GOLDmicro or XAUUSD.s. The Dow appears as US30, DJ30, WS30, DOW or USA30. The Nasdaq appears as NAS100, USTEC, NDX100 or US100.EURUSD.raw and another sees EURUSD.std at the same broker.A copier that maps literally will fail on the first of these. A copier that strips a hardcoded list of suffixes will fail on the third. What actually works is enumeration plus normalisation:
The two skip paths matter more than the match path. A copier that silently proceeds on an ambiguous match will one day copy your gold trade onto a gold futures CFD with a different contract size, and the position will be wrong by a factor you did not choose.
Once the symbol maps, three per-symbol properties decide whether the volume is right. All three differ between brokers on the same instrument.
Contract size. A standard lot of EURUSD is 100,000 units at most brokers. On a micro or cent account it may be 1,000, or the account may be denominated in cents. Copying 0.40 lots from a standard account to a micro account without adjusting for contract size gives you a hundredth of the intended exposure, and the trade quietly does nothing for weeks before anyone notices.
Digits. Four-digit and five-digit brokers both exist. A pip on a five-digit EURUSD is ten points. Any stop distance expressed in points rather than price will be out by 10x across that boundary — and on JPY pairs the same problem appears as two digits versus three.
Tick value and lot step. MT4 exposes these per symbol. Risk-based sizing needs the tick value on that account, in that account currency, and the result has to be rounded to the symbol's lot step, then clamped to its minimum and maximum lot. Round the wrong way on a symbol with a 0.01 step and a 0.01 minimum and a small calculated size becomes zero, which the terminal will reject.
WARNING
Test sizing against a destination whose account currency differs from the source. A USD source copying to a EUR destination has a currency conversion sitting inside the tick value, and a copier that ignores it is wrong by the exchange rate on every single trade.
A few more MT4-specific traps worth knowing before you go live.
NO_SYMBOL skip with a visible reason.Eight tests. None of them take long, and each one corresponds to a failure that is invisible until real money is on it.
If your source is a Telegram channel rather than another MT4 account, the parsing and update-handling half of the problem is covered in /blog/telegram-signal-copier-guide. And for the engine behind server-side copying — the reconcile loop, attribution, and what stops an account that is both a source and a destination from copying itself — see /blog/trade-replication-engine-explained.