Demo van een Pseudo-Indicator met Asynchrone Multi-Threaded Berekeningen voor MetaTrader 5

Mike 2020.01.17 05:13 22 0 0
Bijlage

Deze indicator is een pseudo-indicator zonder buffers. Het hoofddoel is om de techniek van multi-threaded berekeningen te demonstreren. De indicator kan opdrachten geven voor langdurige berekeningen die in aparte threads worden uitgevoerd, aangemaakt voor grafiekobjecten met een werkende expert advisor. De klassen die in het meegeleverde headerbestand - MultiThreadedObjectWorker.mqh - zijn opgenomen, creëren automatisch de grafiekobjecten en passen een sjabloon toe met de opgegeven werkende expert advisor in elk object. Zodra de berekening is voltooid, wordt het object automatisch van de grafiek verwijderd.

Dit voorbeeld is bedoeld voor gebruikers met een programmeerachtergrond.

Het idee komt voort uit een artikel over Multi-Threaded Asynchronous WebRequests. Hier vind je alle technische details over hoe de berichten (evenementen) worden verzonden en hoe middelen worden gebruikt om gegevens tussen grafieken door te geven in het artikel.

De indicator maakt gebruik van een 'compactere' implementatie van de techniek dan in het artikel door grafiekobjecten te gebruiken in plaats van volwaardige grafiekvensters. Voor meer details kun je de forum raadplegen.

Zorg ervoor dat de werkende expert advisor - MultiThreadedObjectWorker - is gecompileerd voordat je de indicator zelf - MultiThreadedIndicator - compileert en uitvoert.

Invoergegevens

  • sinput int _Cores = 1; - aantal threads om te gebruiken (gebruik niet meer dan beschikbare fysieke cores)
  • sinput int _Tasks = 1; - aantal pseudo-taken dat parallel moet worden uitgevoerd (gebruik een groter aantal dan het aantal cores om de parallelle prestaties te zien)
  • input string MultiThreadedScriptPath = "Experts\MultiThreadedObjectWorker.ex5"; - moet het pad van de werkende expert advisor aangeven

Elke pseudo-taak berekent een aantal sqrt-functies (alleen voor demonstratiedoeleinden). Dit kan in jouw MQL-projecten worden gewijzigd naar andere tijdrovende algoritmen.

Om parallelle berekeningen te starten nadat de indicator aan een grafiek is gekoppeld, klik je op de grafiek. Alle belangrijke fasen van het proces (zowel in de client als in de werkende MQL5-programma's) worden gelogd.

Het client MQL-programma dat parallelle berekeningen aanvraagt, kan niet alleen indicatoren zijn, maar ook expert advisors. Scripts en diensten worden niet ondersteund door het platform.

Met behulp van het headerbestand MultiThreadedObjectWorker.mqh moet je je eigen datamarshalling tussen de MQL5-client en de werkende expert advisor implementeren.

Hier zijn 2 voorbeelden van de logs.

Uitvoering van 4 taken op 2 cores (2 threads parallel)

Uitvoering van 4 taken op 2 cores (2 threads parallel)

Bij het uitvoeren van 4 taken op 2 cores zijn er 2 parallelle threads, wat zorgt voor een twee keer zo snelle uitvoering als op 1 core (vergelijk 3354ms hierboven en 6240ms hieronder).

Uitvoering van 4 taken op 1 core (enkele thread - standaard MQL-programma)

Uitvoering van 4 taken op 1 core (enkele thread - standaard MQL-programma)

Hoe meer cores, hoe sneller de uitvoering.

Lijst
Reactie 0