Inspiration
Trade copying on MetaTrader usually means running a terminal for every account, usually on a VPS you have to rent, patch and babysit. It gets worse when the accounts are on different platforms. Many traders have an MT4 master and an MT5 follower (or the other way round), because their brokers made them choose, and the usual copier tools are built for one platform at a time.
I wanted a copier that you just sign up for: add the accounts, draw a link between them, and the trades follow. No VPS, no terminal left running, and MT4 to MT5 (and back) treated as a normal case instead of a hack.
What it does
SnapCopier is a cloud trade copier for MetaTrader 4 and 5. Trades opened, modified and closed on a master account are copied to one or more follower accounts, including across platforms.
- MT4 ↔ MT5 in both directions, plus MT4→MT4 and MT5→MT5.
- Lot sizing by multiplier, fixed lot, or proportional to balance, with a maximum lot, a margin guard, and stop loss / take profit copying.
- Symbol mapping between brokers (XAUUSD, GOLD, XAUUSD.m and so on), with a per-link whitelist and magic number filter.
- Cent accounts are understood: lots and balances are converted between cent and standard accounts, and the app shows a sample calculation before anything is copied.
- Read-only accounts use the investor password and can never receive an order.
- A live dashboard and a copy log explain every copy, and every skipped or refused one, with its reason.
- A master can feed many followers, and a follower can follow several masters. Master defaults are inherited by followers, which can override any field.
It is in free beta at https://snapcopier.com.
How I built it
- Nodes (.NET 10): a platform-neutral core with pure domain logic (lot calculation, symbol mapping, currency conversion, copy planning, reconciliation), and two executables, one for MT4 and one for MT5. Each wraps its vendor library.
- Separate processes per platform. The two vendor libraries never share a process, so a crash or hang in one cannot take down the other platform.
- Leased accounts. Many nodes per platform claim accounts from Postgres with
FOR UPDATE SKIP LOCKEDleases. A crashed node's accounts move to others after the lease expires, and a node only sends orders while it holds a confirmed lease, so two nodes can never trade the same follower. - The copy engine runs on the follower's node. Master events travel over NATS with epoch and sequence numbers. A gap, an unseen epoch or a heartbeat ahead of the last event triggers a reconcile, so a lost message is repaired, never ignored.
- No database round-trip on the copy path. The order goes out first. A batched writer records events afterwards, and follower orders carry a magic number and a comment (
mc<masterTicket>), so the state can be rebuilt after a crash. - Web (Next.js, App Router): users, accounts, links, dashboard and admin, plus a set of guides on copy trading. Live updates reach the browser over WebSocket, routed through NATS so any node can serve any browser.
- Postgres with dbmate migrations and monthly partitioned event tables; Caddy as the gateway; the whole stack runs from
docker compose.
Challenges I ran into
- MT4 and MT5 describe the same trade differently. An MT4 partial close is a close plus a new ticket with a
from #Xcomment; MT5 just reduces the position. The MT4 adapter normalises this into one event type so the engine never sees the difference. - Blocking vendor calls. MT4 order calls block a thread for the broker's whole answer. On the .NET thread pool, 810 closes at once needed freshly created threads for each call and took 125–190 ms just for that. Moving them to a dedicated pool of long-lived threads fixed it.
- Getting sizing right for cent accounts. A "just set the multiplier to 100" fix quietly cancels the cent conversion and gives a different risk for every pair of balances. Proportional sizing and an explicit warning turned out to be the right answer.
- Broker symbol chaos. Prefixes, suffixes, futures contracts that look like spot, twin symbols where only one is tradable. Mapping them needs care and an honest "I can't tell" instead of a guess.
- Never trading twice. Preventing duplicate copies when nodes crash, restart or lose their lease meant fencing every order and every account write with the lease.
- A database constraint once stalled a node's event writer. The writer now retries a refused batch row by row, drops only the bad rows, and reports its own health.
Accomplishments that I'm proud of
- A design sized for thousands of accounts: leases, per-follower lanes (one position's operations stay in order, different positions run in parallel) and a reconciler that makes lost messages harmless.
- MT4↔MT5 copying that works in both directions and is boringly reliable.
- Guardrails that take the sharp edges off copying (read-only accounts, margin guard, cent-account warnings, a copy log that says why a trade was skipped).
- Real people signed up and linked accounts during the beta, many of them finding the site through AI assistants and search, with no ad spend.
What I learned
- Most of the work in a copier is not the copying, it is the edge cases: tickets that change, symbols that differ, lots that mean different things.
- Make "lost" a normal state. Systems that assume nothing is ever dropped fail in odd ways; systems that detect a gap and reconcile just carry on.
- Measure before optimising. The thread-creation cost was invisible until I replayed a burst of 810 closes.
- Writing clear documentation and guides turned out to be a real feature: people arrive with specific problems (cent accounts, symbol names, no VPS) and a straight answer is what they need.
What's next for SnapCopier
- Leaving the free beta with a clear, simple plan structure.
- Region-aware nodes, so an account is served from a node close to its broker.
- More broker coverage and more checks around symbol mapping.
- Keep improving the guides and the copy log, so a skipped copy is never a mystery.
Built With
- .net
- c#
- cloudflare
- go
- metatrader-4
- metatrader-5
- next.js
- postgresql
- react
- rest-api
- websockets

Log in or sign up for Devpost to join the conversation.