Een EA die alleen in de visuele MT5-tester werkt vraagt onderzoek naar zijn invoer. Komt het besluit uit expliciete data of uit een object op de grafiek? Vergelijk eerst versies, modi, gegevens en de eerste logafwijking voordat je regels verandert. Het voorbeeld hieronder voert geen MT5 uit en verstuurt geen order. Het scheidt een getal van onbeschikbare invoer.

Wat visuele modus daadwerkelijk verandert

MetaQuotes beschrijft dat grafische objecten buiten visueel testen niet worden getekend en eigenschappen van een aangemaakt object bij zulke tests nulwaarden opleveren. Voor visuele modus geldt die beperking niet. Dat is gedocumenteerd platformgedrag, geen door ons uitgevoerde proef op jouw EA en geen diagnose van iedere testafwijking.

Als de EA een lijnprijs of knoptoestand als invoer leest, registreer die stap apart van indicator- of koersdata. Bepaal eerst of de gevraagde waarde in die modus bestaat. Een expliciete beschikbaarheidsstatus voorkomt dat een technische nul ongemerkt als echte prijs geldt. Een zichtbare grafiek bewijst evenmin dat iedere benodigde invoer gereed is.

Een getal en een grafiekobject scheiden

Het zelfgemaakte niet-handelsmodel verklaart een positief signaal 1,1050 en drempel 1,1040. De voorwaarde is “signaal groter dan drempel”. Een expliciet getal wordt vergeleken met een objectlezing die als onbeschikbaar is gemarkeerd. Dit zijn toegewezen waarden, geen echte MT5-koersen of uitvoeringslogs.

Onbeschikbaar is geen nulprijs

Een waarde of geen invoerZelfgemaakte niet-handelende simulatie met positief signaal 1,1050 en drempel 1,1040. Geen echte koers, geen EA-uitvoeringslog.REKENVOORBEELDExpliciete waarde1,1050 > 1,1040Onbeschikbaar objectnullFoutieve vervanging0 > 1,1040Gelijke waarden1,1040 > 1,1040
Een waarde of geen invoer. Zelfgemaakte niet-handelende simulatie met positief signaal 1,1050 en drempel 1,1040. Geen echte koers, geen EA-uitvoeringslog.

Controleer beschikbaarheid vóór de vergelijking. Onze null is een modelstatus en geen verklaring over het teruggeeftype van MT5-objectfuncties.

Expliciete waarde
1,1050 > 1,1040 – Waar als afzonderlijke modelvergelijking.
Onbeschikbaar object
null – Geen conditieresultaat berekenen.
Foutieve vervanging
0 > 1,1040 – Onwaar lijkt normaal maar verbergt ontbrekende invoer.
Gelijke waarden
1,1040 > 1,1040 – Onwaar, maar wel met geldige invoer beoordeeld.

Het expliciete getal 1,1050 is groter dan 1,1040: waar in het model. Voor het onbeschikbare object bewaren we null en beoordelen we de voorwaarde niet. De afzonderlijke foutieve variant vervangt ontbreken door nul: 0 > 1,1040 wordt onwaar. Zo lijkt een invoerprobleem een gewone negatieve conditie. Bij de omgekeerde voorwaarde “kleiner dan” zou die nul zelfs ten onrechte voldoen.

Null is onze gekozen representatie, niet de verklaring dat een MT5-objectfunctie null teruggeeft. De documentatie en de redeneervariant blijven gescheiden. Voeg geen willekeurige terugvalwaarde toe om een aantrekkelijkere uitkomst te krijgen. Een oud grafiekgetal is niet automatisch passende vervanging.

Scheid gegevens van een grafiekobject

Dit leervoorbeeld werkt lokaal in je browser: geen verbinding met een rekening of API, geen verzending en geen blijvende opslag van je invoer. Vul geen wachtwoorden of persoonsgegevens in.

Dit simuleert onze regel, geen EA-test in MT5. Gebruik positieve getallen met een decimale komma of ondubbelzinnige punt, van 10⁻⁸ tot 10⁸, maximaal 15 cijfers en zonder duizendtalscheiding. Ontbrekende objectgegevens zijn null; een afzonderlijke foutieve variant vervangt die door nul. Dit stelt niet de oorzaak van jouw EA-fout vast.

De lokale oefening laat twee positieve eindige getallen veranderen tussen 10⁻⁸ en 10⁸, met maximaal vijftien cijfers. Gebruik de aangegeven decimale komma of ondubbelzinnige punt zonder duizendtalscheiding; technische code behoudt haar puntnotatie. De moduskeuze neemt in deze demonstratie aan dat het object in visueel model de signaalwaarde bevat en anders niet beschikbaar is.

De browser leest geen grafiek of rekening, voert geen platformtest uit en maakt geen beleggingssignaal. Hij verzendt of bewaart de invoer niet blijvend. Een ware vergelijking bewijst geen andere criteria, rechten of orderuitvoering. De oefening laat zien waarom onwaar en niet te beoordelen verschillende toestanden zijn.

Nieuw afzonderlijk EUR-tegenvoorbeeld: neem een fictieve beslisregel die alleen een bekende geplande verliesraming van maximaal EUR 20 accepteert. Bij twee duizend EUR basishoeveelheid, instap 1,1000 en modelstop 1,0900 USD per EUR is prijsverlies USD 20. Met aangenomen conversie 1,25 USD per EUR is dat EUR 16 vóór kosten, dus EUR 4 onder de limiet. Ontbreekt de stop, dan is die raming onbekend. Haar als EUR 0 invoeren zou de limiet schijnbaar laten slagen. Het voorbeeld berekent gepland verlies, geen gegarandeerd maximaal verlies en geen echte order. Een beschikbaarheidscontrole is dus relevant vóór een financiële formule, niet pas na een gunstige uitkomst.

Modus registreren zonder handelen

MQL_TESTER, MQL_VISUAL_MODE en MQL_OPTIMIZATION beschrijven de programmaomgeving. TERMINAL_BUILD geeft de terminalbuild. Sla werkelijke lezingen op in plaats van de modus uit de vorm van een venster af te leiden. Deze velden alleen bewijzen niet dat data en parameters gelijk zijn.

De zelfstandige diagnostische EA hieronder logt in OnInit en heeft een lege OnTick. Hij verzendt of wijzigt geen orders, berekent geen signaal en beheert geen posities. OnInit beschrijft de initialisatiesignatuur; PrintFormat de geformatteerde uitvoer. Bewaar als afzonderlijk MQ5-bestand en compileer in je eigen MetaEditor. De broncode blijft ongewijzigd; hier is geen compilatie of MT5-run uitgevoerd.

#property strict
int OnInit()
{
   PrintFormat("tester=%d visual=%d optimization=%d build=%d symbol=%s period=%d",
      (int)MQLInfoInteger(MQL_TESTER),
      (int)MQLInfoInteger(MQL_VISUAL_MODE),
      (int)MQLInfoInteger(MQL_OPTIMIZATION),
      (int)TerminalInfoInteger(TERMINAL_BUILD),
      _Symbol, (int)_Period);
   return INIT_SUCCEEDED;
}
void OnTick() {}

Voeg geen tweede OnInit aan een bestaande EA toe en vervang diens initialisatie niet blind. Gerichte logging moet de bestaande volgorde bewaren. De testerdocumentatie noemt bij optimalisatie een uitzondering voor Print/PrintFormat binnen OnInit. Ontbrekende printregels uit andere fasen bewijzen daarom niet dat die fasen nooit zijn uitgevoerd.

Zoek het eerste verschil, niet het hoogste winsttotaal

Bewaar een gepaard dossier met visueel/niet-visueel, terminal- en codeversie, parameters, symbool, timeframe, tickmodel, gewenste en echte start, dataset, kosten en begintoestand. Archiveer instellingenbestanden en versies. Zijn verklaringen verschillend, schrijf het hele resultaatverschil niet aan het grafiekvenster toe. Dezelfde backtest, ander resultaat: vergelijk twee vastgelegde runs helpt die gegevens vergelijken.

Zoek de vroegste afwijking in ophalen, beschikbaarheid, tijdstempel, indicatorgereedheid, signaal, conditie of besluit. “Winst 120 in plaats van 80” noemt geen oorzaak. Bewaar originele logs en maak er een kleine vergelijkingstabel naast. Bedenk geen waarden die destijds niet werden geregistreerd.

Gebruik stabiele observatie-ID’s en bewaar welke invoer en tijd of volgnummer is gevraagd en of die geaccepteerd werd. Alles loggen zonder koppeling kan het verschil juist verbergen. Dit zijn ontwerpkeuzes voor onderzoek, geen garantie dat ieder ontbrekend verband vanzelf uit logs komt.

De signaallaag laten bestaan zonder tekening

Laat de berekening een expliciete waarde met beschikbaarheidsstatus leveren. De grafische laag kan die tonen; tekenen uitzetten hoeft dan niet doelbewust de gegevensbron te veranderen. Controleer dezelfde module op bekende invoer, ontbrekende invoer en exact gelijke waarde en drempel. Bij 1,1040 > 1,1040 is de vergelijking onwaar, maar zij is wél beoordeeld.

Deze ingreep adresseert één mogelijke afhankelijkheid. Versies, andere code, gegevens en kosten blijven relevant, dus gelijke totale resultaten zijn niet gegarandeerd. De visuele uitzondering uit de MetaQuotes-uitleg verklaart een platformgrens zonder je eigen programma te certificeren.

Heb je geen broncode, geef de ontwikkelaar het gepaarde dossier en de eerste gedocumenteerde afwijking. Vervang diagnose niet door live proeforders. Backtesten in MT4 en MT5: ticks, kosten en klokken controleren behandelt bredere voorbereiding en de grenzen van de modelleringskeuze.

Een kleine diagnose voorbereiden

  1. Bewaar één gepaard modusdossier en markeer onbevestigde velden. Dezelfde EA-naam bewijst geen identieke omgeving.
  2. Controleer eerst de modelwaarden 1,1050 en 1,1040 en daarna gelijke waarden. Het onbeschikbare pad blijft null ongeacht de getalvergelijking.
  3. Verzamel in een aparte testerconfiguratie niet-handelende logs met observatie-ID’s en vergelijk de eerste afwijkende fase.
  4. Wijzig één oorzaak tegelijk en behoud de oude rapporten. Een betere eindwinst verklaart niet waarom de uitkomst veranderde.