MetaTrader 5 koppelen aan uw eigen backend: 4 architecturen vergeleken

Home Blog MetaTrader 5 koppelen aan uw eigen backend: 4 architecturen vergeleken

Vroeg of laat loopt elk serieus MetaTrader-project tegen dezelfde muur aan: de logica die u nodig hebt, past niet in één Expert Advisor. U wilt een risk-engine die alle accounts ziet, een dashboard, een database, signalen uit uw eigen modellen of een copy-trading-dienst. Dan moet MetaTrader 5 praten met uw eigen backend. Daar zijn vier realistische manieren voor, en die verschillen enorm in latency, robuustheid en beheerkosten.

In dit artikel vergelijken we ze zoals we dat in klantprojecten doen: waar elke optie goed in is, waar het misgaat, en welke we in welke situatie zouden kiezen.

De vier opties in één oogopslag

Aspect 1. WebRequest (HTTP) 2. Native sockets 3. DLL-brug 4. Python-package
Richting Terminal haalt op (request/response) Twee kanten op, blijvende verbinding Twee kanten op, alles wat u zelf bouwt Extern proces stuurt de terminal aan
Latency Eén HTTP-roundtrip per aanroep, plus pollinginterval Laag: één open verbinding, push mogelijk Laagst: native code in het terminalproces Laag lokaal, maar één proces per terminal
Complexiteit Laag Gemiddeld (framing, reconnects) Hoog (native code, geheugenveiligheid) Laag tot gemiddeld
Beperkingen Alleen EA's en scripts, URL-whitelist, blokkerende aanroep Alleen EA's en scripts, host-whitelist "Allow DLL imports" nodig, niet op MQL5 VPS of Market Alleen Windows, terminal op dezelfde machine
Ideaal voor Rapportage, configuratie, licenties Signalen, copy trading, centraal risicobeheer Zwaar rekenwerk, bestaande native libraries Onderzoek, data-extractie, eenvoudige automatisering

1. WebRequest: HTTP vanuit de EA

MQL5 heeft een ingebouwde functie WebRequest(). Uw Expert Advisor stuurt een HTTP(S)-request naar uw API en krijgt een antwoord terug. Dit is de eenvoudigste optie, met tooling die elke backendontwikkelaar kent: een REST-endpoint, JSON en gewone TLS.

string url = "https://api.example.com/v1/positions";
char   body[], result[];
string headers = "Content-Type: application/json\r\n", resultHeaders;
StringToCharArray(payload, body, 0, StringLen(payload));
int status = WebRequest("POST", url, headers, 5000, body, result, resultHeaders);
if(status != 200) Print("Sync failed: ", status, " err=", GetLastError());

De keerzijde:

  • Het is een blokkerende aanroep. Zolang het request loopt, staat de event-handler van uw EA stil. Een trage API betekent een trage EA. Roep het nooit bij elke tick aan vanuit OnTick(); bundel en verstuur vanuit een timer.
  • Alleen ophalen. De terminal moet erom vragen; uw backend kan niets pushen. Om instructies te ontvangen moet u pollen. Dat telt het pollinginterval op bij uw latency en levert veel lege requests op.
  • Whitelisting. De URL moet op elke terminal worden toegevoegd onder Tools → Options → Expert Advisors → Allow WebRequest for listed URL. Prima voor uw eigen infrastructuur, lastig voor een product dat u aan honderden traders levert.
  • Niet beschikbaar in indicatoren, alleen in Expert Advisors en scripts.

Gebruik het voor: accountrapportage elke paar seconden, configuratie ophalen, licentiecontroles, exports aan het eind van de dag. Vermijd het voor: alles waarbij een seconde vertraging of een vastgelopen EA geld kost.

2. Native sockets: een blijvende verbinding

MQL5 heeft ook TCP-socketfuncties (SocketCreate, SocketConnect, SocketSend, SocketRead, plus SocketTlsHandshake voor TLS). De EA opent één verbinding met uw server en houdt die open. Nu kan uw backend direct een bericht pushen zodra er iets gebeurt, zonder dat de terminal erom hoeft te vragen.

Dit is de architectuur die wij het vaakst gebruiken voor copy trading, signaaldistributie en centrale risicomonitoring. U krijgt bijna realtime gedrag zonder de officiële, afgeschermde MQL5-omgeving te verlaten.

Wat u zelf moet bouwen, want een kale TCP-stream geeft u niets hiervan:

  • Message framing. TCP is een bytestroom, geen reeks berichten. Gebruik een lengteprefix of JSON per regel en vang gedeeltelijke reads op.
  • Heartbeats en reconnects. Verbindingen sterven geruisloos (VPS-herstart, NAT-timeouts). Stuur vanaf beide kanten elke paar seconden een heartbeat en maak opnieuw verbinding met backoff.
  • Niet-blokkerend lezen. Controleer SocketIsReadable() vanuit OnTimer(), zodat de EA nooit op het netwerk wacht.
  • Een protocol met bericht-ID's. Daarover hieronder meer, want dat geldt voor elke optie.

Sockets hebben dezelfde beperking als WebRequest: alleen Expert Advisors en scripts, en het serveradres moet in de lijst met toegestane adressen van de terminal staan.

3. DLL-brug: native code in de terminal

MQL5 kan via #import functies aanroepen in een Windows-DLL. Die DLL kan geschreven zijn in C++, C# (via een unmanaged export) of Rust (met een C-ABI), en daarin kunt u alles: een ZeroMQ- of gRPC-client draaien, shared memory gebruiken, bestaande quant-libraries aanroepen of berekeningen doen die in MQL5 tergend traag zouden zijn.

Dit is de krachtigste optie en ook de riskantste:

  • De DLL draait binnen het terminalproces. Een crash, deadlock of geheugenlek in uw DLL neemt MetaTrader mee onderuit. Een sterk argument om de brug in een geheugenveilige taal als Rust te schrijven en hem klein te houden.
  • Gebruikers moeten Allow DLL imports aanzetten. Producten met DLL's kunnen niet op de MQL5 Market worden verkocht, en DLL-aanroepen zijn niet toegestaan op de virtual hosting van MetaQuotes zelf, dus u hebt een eigen Windows-VPS nodig.
  • U levert en versioneert nu native binaries (32/64-bit, runtime-afhankelijkheden, valse meldingen van virusscanners).

Gebruik het als u rekenkracht of connectiviteit nodig hebt die MQL5 niet biedt, of als u een bestaande native library integreert. Ons werk aan MetaTrader-libraries volgt meestal dit patroon: een dunne, goed geteste native kern met een eenvoudige MQL5-interface erbovenop.

4. Het officiële Python-package: de terminal van buitenaf aansturen

MetaQuotes publiceert een Python-package MetaTrader5. Een Python-proces op dezelfde Windows-machine maakt verbinding met een draaiende terminal en kan koersen en ticks lezen, posities opvragen en orders versturen (initialize(), copy_rates_from(), order_send() enzovoort). Er is geen EA nodig.

Uitstekend voor onderzoek, data-extractie naar uw eigen database en eenvoudige automatisering vanuit een model dat u al in Python hebt. De grenzen worden zichtbaar bij schaal: alleen Windows, elk Python-proces praat met één terminal, en er is geen event-push, dus u pollt. Tientallen accounts betekent tientallen terminals en processen om te bewaken.

Voor brokers: de Manager- en Server-API's

Alles hierboven werkt aan de terminalkant: met elk account bij elke broker. Bent u zelf de broker, dan licentieert MetaQuotes server-side interfaces (de Manager API, plus Server- en Gateway-API's) die op de tradingserver zelf werken: alle accounts, alle deals, realtime events. Dat is een heel andere architectuur, en de juiste voor back-office-, risico- en CRM-koppelingen op brokerniveau. Zie broker-technologieadvies als dat op u van toepassing is.

Wat belangrijker is dan het transport

Welke optie u ook kiest, de meeste productie-incidenten die wij zien komen voort uit het protocol, niet uit de verbinding:

  1. Maak elke instructie idempotent. Geef elke orderintentie een uniek ID en sla dat op in het ordercommentaar of het magic number. Wordt een bericht na een reconnect opnieuw verstuurd, dan herkent de EA "dit heb ik al gedaan" in plaats van een tweede positie te openen.
  2. De terminal is de bron van waarheid voor uitvoering. Uw backend stuurt intenties; de EA meldt wat er echt gebeurde (fills, gedeeltelijke fills, weigeringen, requotes). Laat de backend niet aannemen dat een order bestaat omdat hij erom vroeg.
  3. Reconcilieer na elke reconnect. Na een verbreking stuurt de EA een volledig overzicht van posities en lopende orders, en de backend corrigeert zijn staat op basis daarvan.
  4. Normaliseer tijd. De servertijd van een broker is geen UTC en verschilt per broker. Zet om aan de rand en sla overal elders UTC op.
  5. Faal veilig. Bepaal expliciet wat de EA doet als de backend onbereikbaar is: open posities beheren met lokale regels, geen nieuwe openen, of alles sluiten. Laat het niet aan het toeval over.

Wat wij zouden kiezen

  • Rapportage, dashboards, licenties: WebRequest vanuit een timer. Simpel en goed genoeg.
  • Copy trading, signaaldistributie, centraal risicobeheer over accounts: native sockets met een klein, goed gedefinieerd berichtenprotocol.
  • Zwaar rekenwerk of een bestaande C++/Rust-library: een DLL-brug, zo klein mogelijk, op uw eigen VPS.
  • Onderzoek en datapipelines: het Python-package, dat uw eigen database vult.

Veel echte systemen combineren er twee: sockets voor het snelle pad en HTTP voor de rest. Ontwerpt u er een, dan is onze review van trading-systeemarchitectuur een goede plek om de keuze te toetsen voordat u gaat bouwen. Zie ook MetaTrader 5-ontwikkeling en MetaTrader-integratie.