und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5
MathTicker - Tickgenerator im mathematischen Modus - Bibliothek für den MetaTrader 5
- Ansichten:
- 41
- Rating:
- Veröffentlicht:
-
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Alternative für die EAToMath-Bibliothek https://www.mql5.com/de/code/61283
Zeichnet Ticks im Real-Tick-Modus auf und liest sie im Mathe-Modus, wobei Ihre Strategie mit jedem aufgezeichneten Tick aufgerufen wird.
Grund für die Erstellung: MQ-Tester, der jedes Mal, wenn der Optimierer ausgeführt wird, Tickdateien in jeden Agenten schreibt. Ich habe 36 Agenten, die jeweils 10 GB für eines der Tools und den Testzeitraum schreiben - insgesamt 360 GB auf einer 480-GB-Festplatte. Dieser Vorgang dauert vor jeder Optimierung etwa 1 Stunde. Typische SSDs haben eine Lebensdauer von 500-1000 Schreibzyklen. Wenn jedes Mal 360 GB neu geschrieben werden, ist die Ressource sehr schnell erschöpft. Diese Bibliothek schreibt nur eine Datei und alle 36 Agenten lesen dann Daten aus dieser einen Datei. All dies war der Grund für das Schreiben der Bibliothek: Wir verwenden nur 1 Datei + Einsparung von 1 Stunde für das Schreiben von Daten an jeden Agenten + Beschleunigung im Vergleich zu MQ-Tester und sogar zu Virtual im Real-Ticks-Modus.
Das Problem wurde gleichzeitig mit fxsaber (dem Autor von EAToMath) untersucht, jeder mit seiner eigenen Version. Mein Code ist für mich übersichtlicher, deshalb verwende ich ihn.
Für Handelsoperationen wird die MT4Orders Bibliothek verwendet https://www.mql5.com/de/code/16006
Für den virtuellen Handel ist es notwendig, die Virtual Bibliothek zu verwenden https://www.mql5.com/de/code/22577
Um die Handelsergebnisse zu betrachten, kann man MT4Orders QuickReport https://www.mql5.com/de/code/47816 oder Report
verwenden Um Ticks zu komprimieren TickCompressorhttps://www.mql5.com/de/code/66201
Um eventuell unnötige Ticks zu entfernen wird die Control_Trade_Sessions Bibliothek https://www.mql5.com/de/code/48059 angeschlossen, zum Beispiel, wenn eine Kurs-Session größer ist als eine Handels-Session. Sie kann auch gelöscht werden, wenn alle Ticks verwendet werden, d.h. die Sessions übereinstimmen.
Unterschiede zu EAToMath:
Vorteile:
- Der Code ist kürzer und einfacher, nur 5 Plug-in-Bibliotheken. Wenn Sie ihn ändern müssen, ist er leichter zu verstehen.
- Die Daten werden aufgrund eines anderen Algorithmus besser komprimiert https://www.mql5.com/de/code/66201. Wenn nur time_msc, ask und bid gespeichert werden, werden bis zu 86% der Ticks als 3 Char-Nummern, d.h. 3 Bytes, gespeichert. Durchschnittliche Größe pro Tick = 3,266 Bytes beim Speichern von BTCUSDT-Tickdaten für 2023.
Beim Speichern mit Volumes durchschnittlich = 4,835 Bytes. Und beim Speichern eines kompletten Ticks = 8,439 Bytes. Unten finden Sie die Tabelle mit den Testergebnissen.
Zusätzlich können Sie die integrierte ZIP-Archivierung verwenden. Die Dateigröße wird um das 2-fache reduziert. Eine solche Datei benötigt 245 MB, während die Summe der Dateigrößen in .tcs für 2023 364 MB beträgt, d.h. die Komprimierung ist 1,5 mal besser als in MQ. Und die Geschwindigkeit der Tick-Erzeugung im Mathe-Modus ist ~2 mal schneller. Siehe die Tabelle unten. - Es gibt mehr Optionen zum Speichern:

- Die Datei kann entweder auf SSD oder RAM-Disk gespeichert werden, indem eine Verknüpfung im System hergestellt wird. Dateien können viel Speicherplatz beanspruchen und das RAM-Laufwerk reicht möglicherweise nicht aus, so dass Sie sich für das Speichern auf dem primären Laufwerk entscheiden können. Die Lesegeschwindigkeiten von SSD und RAM sind in etwa gleich. Ich habe gelesen, dass die SSD bis zu 5 % der vollen Kapazität der am häufigsten angeforderten Daten zwischenspeichert.
Die SSD wird beim Lesen etwas stärker beansprucht, da man die Speicherzellen häufiger überschreiben muss als beim Speichern ohne Lesen. Ich kenne die genauen Zahlen nicht, aber zum Beispiel 1 Überschreiben pro 10 Lesevorgänge oder pro 1000 Lesevorgänge.... Aber das ist von geringer Bedeutung im Vergleich zur Abnutzung der Scheibe durch den MQ-Tester.
Nachteile:
- Die Anbindung von Virtual muss selbst vorgenommen werden (Anleitung hier https://www.mql5.com/de/code/22577), EAToMath übergibt Ihre Strategie selbst an Virtual.
Die Geschwindigkeit der BidAsk-Variante ist mit der von EAToMath vergleichbar. Andere Varianten sind langsamer, weil sie entweder mehr Daten enthalten oder eine zusätzliche ZIP-Kompression haben.
Merkmale der Verwendung:
Sie können die Standardfunktionen Symbol(), Digits( ) (=4), Point() (=0.0001) nicht in der Strategie verwenden, da sie Standardwerte erzeugen, die nichts mit dem zu testenden Symbol zu tun haben. Verwenden Sie stattdessen _Symbol, _Digits, _Point , die bei aus der Datei gelesenen Werten außer Kraft gesetzt werden. Außerdem wurden die neuen Konstanten _TickSize und _TickValue mit Werten aus dem aufgezeichneten Symbol hinzugefügt - sie sind für die korrekte Berechnung von Gewinn, Provision und Swaps in der Depotwährung notwendig.
Die Reihenfolge der Arbeit mit der beim Speichern von Ticks ausgewählten Testperiode:
- Wählen Sie den Testmodus durch reale Ticks, das gewünschte Instrument und die Testdaten. Setzen Sie die Aufgabenvariable auf Speichern und wählen Sie die Option zum Speichern von Ticks. Starten Sie das Prüfgerät. Daraufhin wird eine Datei mit Ticks im angegebenen Ordner erstellt.
- Setzen Sie die Task-Variable auf Run_Strategy. Sie können den Modus mit echten Ticks verlassen, um später zu vergleichen. Starten Sie den Tester. Die Berechnungen werden mit echten Ticks durchgeführt, nicht aus der Datei. Holen Sie das Ergebnis.

- Setzen Sie den Testmodus auf mathematische Berechnungen. Starten Sie das Prüfprogramm. Die Berechnungen werden mit Ticks aus der Datei durchgeführt. Vergleichen Sie mit dem Ergebnis aus Schritt 2. Es sollte dasselbe sein, aber um ein Vielfaches schneller.
Die Reihenfolge der Arbeit mit dem Archiv:
- Erstellen Sie ein Archiv mit allen Ticks aus der Historie: Wählen Sie den Modus der Prüfung durch echte Ticks, das gewünschte Instrument. Legen Sie die Prüfdaten von <= erster Tick bis >= letzter Tick in der verfügbaren Historie fest. Setzen Sie die Task-Variable auf eine der Variablen Save...To_Archive und wählen Sie die Option zum Speichern von Ticks. Starten Sie den Tester. Danach wird ein Ordner mit dem Namen des Tools im angegebenen Ordner erstellt, in dem die Dateien mit den Ticks für jedes Jahr gespeichert werden. Das letzte Jahr kann bei Bedarf überschrieben werden, wählen Sie dazu in den Daten nur das aktuelle Jahr aus, um das Überschreiben der vorherigen Jahre zu vermeiden.
- Setzen Sie den Testmodus auf Mathe. Setzen Sie die Variable Aufgabe auf Run_Strategy_Fron_Archive.
- Im MathTicker: unter Verwendung der vollständigen Archivgruppe, setzen Sie:
Instrument - auf den Instrumentennamen (muss mit dem Namen des Ordners übereinstimmen, in dem die Ticks gespeichert sind), Start- und Enddatum des Tests.

- Starten Sie das Testgerät. Die Berechnungen werden anhand der Ticks aus den erforderlichen Jahresdateien durchgeführt. Da die Arbeit nicht mit einer, sondern mit mehreren Dateien erfolgt, ist sie etwas langsamer, da das Öffnen und Schließen der Dateien Zeit in Anspruch nimmt. Anstelle von 1,7 Sekunden dauert es beispielsweise 2,7 Sekunden, um die Ticks für 3 Jahre zu erzeugen.
- Die Summe der Ticks, die der Expert Advisor unten ermittelt, kann um einen kleinen Wert von einem ersten Tick abweichen. Beim Testen mit benutzerdefinierten Zeichen im Modus "Echte Ticks" erzeugt der erste Tick nur Ask oder Bid (wenn Sie nicht beide gespeichert haben). Wenn Sie aus dem Archiv testen, werden beide aus den vorherigen Ticks wiederhergestellt.
Ein Beispiel für den einfachsten Expert Advisor, um die Arbeitsgeschwindigkeit abzuschätzen:
#property tester_no_cache #include <Forester\MathTicker.mqh> // Anschluss des Gewerbes im mathematischen Modus input int rep=0;//Wiederholungen zur Optimierung sinput bool AddVolumes=true; void OnInit(){} void OnTick(){ static MqlTick Tick; if (SymbolInfoTick(_Symbol, Tick)){ #ifdef _MathTick_ if(MathTick.SaveTick(Tick)){ return; }//wenn wir Ticks speichern, dann beenden und nicht handeln. #endif Strategy(Tick); } } double Sum = 0;int tk=0; void Strategy(MqlTick& Tick){ // die einfachste Strategie - zum Vergleich der Lesegeschwindigkeit mit EAToMath Sum += Tick.bid+Tick.ask+(AddVolumes?Tick.volume_real:0.0); tk++; //if(tk<100){Drucken(Tick.time," " ",Tick.ask," ",Tick.bid," ",Tick.last," ",Tick.volume_real," ",Tick.flags);} } ulong StartTime = GetMicrosecondCount(); double OnTester(){ #ifdef _MathTick_ // mit MathTick laufen - es zählt Symbolparameter aus der Datei mit Ticks. Für Tests im Mat-Modus if(MathTick.SaveTicksEnd()){return 0;}// Schließen der Datei nach Aufzeichnung der Ticks und Beenden if(MathTick.ReadSymbolVars()){ MathTick.Ticker();// im Mattenmodus werden alle Ticks an Strategy(MqlTick &Tick) übergeben. } #endif Print("ticks: ",tk); long work_time = (long)(GetMicrosecondCount() - StartTime)/1000; //return(NormalizeDouble(work_time, 1)); // um die Geschwindigkeit der Arbeit zu erhalten und return Sum;// um die Berechnungsergebnisse zu vergleichen }
Sie können 1 Einstellung umschalten:
//#define RestoreFlags // восстановить флаги тика из изменения ask, bid, volume - добавит 7% к времени генерации тиков 931 вместо 869 мс
Bei der Erzeugung von Ticks werden Statistiken über die Tick-Komprimierung angezeigt.
Unten finden Sie Ausdrucke von Statistiken, Volumen und Zeit der Tick-Erzeugung.
-----------
MQ-Tester ohne Volumina
pass 1 zurückgegebenes Ergebnis 4345830621850.311523 in 0:00:08.232
| C ZIP-Komprimierung | |
|---|---|
| AskBid. Dateigröße: 225 mb -------------------- Statistik: -------------------- 3 Bytes: 86.6%, 62644158 Ticks 4 Bytes: 0.6%, 412167 Ticks 5 Bytes: 12.7%, 9185484 Ticks 6 Bytes: 0.0%, 15274 Ticks 11 Bytes: 0.1%, 46214 Ticks 12 Bytes: 0.0%, 1 Ticks 24 Bytes: 0.0%, 1 Ticks Insgesamt: 72303299 Ticks, 236108596 Bytes. Durchschnitt: 3.266 Bytes pro Tick Endsaldo 0.00 USD pass 10 zurückgegebenes Ergebnis 4345830621850.311523 in 0:00:01.485 keine Normalisierung pass 1 zurückgegebenes Ergebnis 4345830621850.311523 in 0:00:00.892 | AskBid_Zipped. Dateigröße: 106 mb -------------------- Statistik: -------------------- 3 bytes: 86.6%, 62644158 ticks 4 bytes: 0.6%, 412167 ticks 5 bytes: 12.7%, 9185484 ticks 6 bytes: 0.0%, 15274 Ticks 11 Bytes: 0.1%, 46214 Ticks 12 Bytes: 0.0%, 1 Ticks 24 Bytes: 0.0%, 1 Ticks Insgesamt: 72303299 Ticks, 236108596 Bytes. Durchschnitt: 3.266 Bytes pro Tick Ungezippte Größe:236108596. Gezippte Größe:111720863. ZIP-Komprimierung: 47,3% pass 10 zurückgegebenes Ergebnis 4345830621850.311523 in 0:00:02.548 keine Normalisierung pass 2 zurückgegebenes Ergebnis 4345830621850.311523 in 0:00:01.890 |
MQ-Tester mit Volumina
Durchgang 1 lieferte das Ergebnis 4345879117123.356445 in 0:00:07.962
| C ZIP-Komprimierung | |
|---|---|
| AskBidVolume. Dateigröße: 333 mb -------------------- Statistik: -------------------- 4 Bytes: 60.4%, 43684907 ticks 5 Bytes: 1.1%, 809676 ticks 6 Bytes: 33.5%, 24194111 ticks 7 bytes: 4.9%, 3548666 ticks 8 bytes: 0.0%, 7909 ticks 12 bytes: 0.1%, 40022 ticks 13 bytes: 0.0%, 17964 ticks 14 bytes: 0.0%, 2 Ticks 19 Bytes: 0.0%, 41 Ticks 32 Bytes: 0.0%, 1 Tick Insgesamt: 72303299 Ticks, 349571243 Bytes. Durchschnitt: 4.835 Bytes pro Tick Durchlauf 1 zurückgegebenes Ergebnis 4345879117123.356445 in 0:00:02.803 keine Normalisierung Durchlauf 4 zurückgegebenes Ergebnis 4345879117123.356445 in 0:00:01.659 | AskBidVolume_Zipped. Dateigröße: 204 mb -------------------- Statistik: -------------------- 4 bytes: 60.4%, 43684907 ticks 5 bytes: 1.1%, 809676 ticks 6 bytes: 33.5%, 24194111 ticks 7 bytes: 4.9%, 3548666 ticks 8 bytes: 0.0%, 7909 Ticks 12 Bytes: 0.1%, 40022 Ticks 13 Bytes: 0.0%, 17964 Ticks 14 Bytes: 0.0%, 2 Ticks 19 Bytes: 0.0%, 41 Ticks 32 Bytes: 0.0%, 1 Tick Insgesamt: 72303299 Ticks, 349571243 Bytes. Durchschnitt: 4.835 Bytes pro Tick Ungezippte Größe:349571243. Gezippte Größe: 214897079. ZIP-Komprimierung: 61,5% Durchgang 2 lieferte das Ergebnis 4345879117123.356445 in 0:00:04.260 keine Normalisierung Durchgang 2 lieferte das Ergebnis 4345879117123.356445 in 0:00:03.096 |
| Alle. Dateigröße: 582 mb -------------------- Statistik: -------------------- 8 bytes: 61.5%, 44494583 ticks 9 bytes: 33.5%, 24194111 ticks 10 bytes: 4.9%, 3548666 ticks 11 bytes: 0.0%, 7909 ticks 15 bytes: 0.1%, 40022 ticks 16 bytes: 0.0%, 17964 ticks 17 bytes: 0.0%, 2 Ticks 22 Bytes: 0.0%, 41 Ticks 44 Bytes: 0.0%, 1 Tick Insgesamt: 72303299 Ticks, 610166056 Bytes. Durchschnitt: 8.439 Bytes pro Tick Durchgang 2 liefert Ergebnis 4345879117123.356445 in 0:00:03.768 keine Normalisierung Durchgang 1 liefert Ergebnis 4345879117123.356445 in 0:00:02.256 | All_Zipped. Dateigröße: 245 mb -------------------- Statistik: -------------------- 8 bytes: 61.5%, 44494583 ticks 9 bytes: 33.5%, 24194111 ticks 10 bytes: 4.9%, 3548666 ticks 11 bytes: 0.0%, 7909 ticks 15 bytes: 0.1%, 40022 Ticks 16 Bytes: 0.0%, 17964 Ticks 17 Bytes: 0.0%, 2 Ticks 22 Bytes: 0.0%, 41 Ticks 44 Bytes: 0.0%, 1 Tick Insgesamt: 72303299 Ticks, 610166056 Bytes. Durchschnitt: 8.439 Bytes pro Tick Ungezippte Größe:610166056. Gezippte Größe: 257105213. ZIP-Komprimierung: 42,1 % pass 1 zurückgegebenes Ergebnis 4345879117123.356445 in 0:00:05.388 keine Normalisierung pass 10 zurückgegebenes Ergebnis 4345879117123.356445 in 0:00:03.936 |
Die Größe der .tcs-Dateien für das gleiche Jahr 2023:

Alle Varianten mit ZIP, sogar mit voller Tick-Speicherung sind kompakter (3,5 bis 1,5 mal).
Expert Advisor Beispiel für virtuelles Trading und Berichtsausgabe:
#property tester_no_cache #include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006 #include <Forester\MathTicker.mqh> // Anschluss des Gewerbes im mathematischen Modus #define ORDER_CURRENCY_DIGITS 2 // Einstellung der Ziffern für die Berechnung des Gewinns/der Provision/des Swaps bei der Platzierung in der Handelshistorie. #define VIRTUAL_LIMITS_TP_SLIPPAGE // Limiter und TPs werden zum ersten Annahmepreis ausgeführt - positive Slippages #define ORDER_COMMISSION -0 // Provisionszuweisung = Lose * ORDER_COMMISSION. #include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/de/code/22577 #define REPORT_TESTER // Das Prüfgerät zeichnet automatisch Berichte auf #define REPORT_BROWSER // Erstellen eines Berichts beim Start des Browsers - erfordert DLL-Berechtigung. #define USE_highcharts //- Sie können alle Highcharts-Produkte kostenlos herunterladen und ausprobieren. Sobald Ihr Projekt/Produkt einsatzbereit ist, erwerben Sie eine kommerzielle Lizenz. https://shop.highcharts.com/ #include <MT4Orders_QuickReport.mqh>// enum VirtTyp {MQ_Tester=0,Virtual1=1,Virtual2=2}; sinput VirtTyp tester1=1;//Tester 1 sinput VirtTyp tester2=2;//Tester 2 input int rep=0;//Wiederholungen zur Optimierung bool isOptimization = false, isTester=false; double balInit=0; VIRTUAL_POINTER Virtual[10]; void OnInit(){ Virtual[0] = 0; // 0 - reale Handelsumgebung Virtual[1] = VIRTUAL::Create(AccountBalance()); // Erstellt Virtualisierung 1. Virtual[2] = VIRTUAL::Create(AccountBalance()); // Erstellt Virtualisierung 2. //Virtual[tester1].Select(); isOptimization = MQLInfoInteger(MQL_OPTIMIZATION) ; isTester = MQLInfoInteger(MQL_TESTER); balInit=AccountBalance(); } void OnTick(){ //Virtual[0].Select(); VIRTUAL::NewTick();// Senden Sie das Häkchen an die aktuelle virtuelle Maschine static MqlTick Tick; if (SymbolInfoTick(_Symbol, Tick)){ #ifdef _MathTick_ if(MathTick.SaveTick(Tick)){ return; }//wenn das Schreiben von Ticks die Funktion beendet, wird Strategy() nicht aufgerufen #endif Strategy(Tick);//Handel } } void Strategy(MqlTick& Tick){ // die einfachste Strategie - zum Vergleich der Lesegeschwindigkeit mit EAToMath if(Tick.ask==0 || Tick.bid==0){return;}//MQ-Tester handelt bei einem fehlgeschlagenen Tick, Virtual nicht. Verbot auch für MQ if(tester1>0){Virtual[tester1].Select(); VIRTUAL::NewTick(Tick);}//Virtualisierung 1 auswählen und ein Häkchen setzen if(tester2>0){Virtual[tester2].Select(); VIRTUAL::NewTick(Tick);}//Virtualisierung 2 auswählen und ein Häkchen setzen if(isNewHour(Tick.time)){//der erste Tick jeder Stunde if(GetHour0(Tick.time) % 2==0){// Kauf zu geraden Stunden in Tester 1 Virtual[tester1].Select();//Virtualisierung auswählen 1 OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, Tick.ask - 100 * _Point, Tick.ask + 100 * _Point); }else{//Verkauf zu ungeraden Zeiten in Tester 2 Virtual[tester2].Select();//Virtualisierung auswählen 2 OrderSend(_Symbol, OP_SELL, 1, Tick.bid, 0, Tick.bid + 100 * _Point, Tick.bid - 100 * _Point); } } } double OnTester(){ #ifdef _MathTick_ // mit MathTick ausgeführt werden - es werden Symbolparameter aus der Tick-Datei gelesen. Für Tests im Mat-Modus if(MathTick.SaveTicksEnd()){return 0;}//Rückkehr nach dem Speichern von Ticks if(MathTick.isMath && MathTick.ReadSymbolVars()){ if(tester1==0){Alert(" >>>>>>>>> Virtual tester 1=MQ. In math mode can be used only virtual tester. <<<<<<<<");return 0;} if(tester2==0){Alert(" >>>>>>>>> Virtual tester 1=MQ. In math mode can be used only virtual tester. <<<<<<<<");return 0;} SYMBOL_BASE sb; sb.Point=_Point; sb.Digits=_Digits; sb.Symbol=_Symbol; sb.SymbolID=0; sb.TickSize=_TickSize; sb.TickValue=_TickValue / _TickSize;//this.TickValue_ /= this.TickSize_; //wie in SetSymbol() in \fxsaber\Virtual\Symbol_Base.mqh Virtual[1].Select(); VIRTUAL::SetSymbolBase(sb); Virtual[2].Select(); VIRTUAL::SetSymbolBase(sb); //minFreezeLevel = _minFreezeLevel*_Point; minStopLevel = _minStopLevel*_Point; Virtual[tester1].Select(); MathTick.Ticker();// im Mattenmodus werden alle Ticks an Strategy(MqlTick &Tick) übergeben. } #endif double ret_val=0; for (int v = 0 ; v <= VIRTUAL::Total(); v++){ if(Virtual[v].Select()){ if(v > 0){ VIRTUAL::Stop(); #ifdef _MathTick_ // mit MathTick ausgeführt werden - es werden Symbolparameter aus der Tick-Datei gelesen. Für Tests im Mat-Modus if(MathTick.isMath){ VIRTUAL::CalcSwaps( MathTick.swapShort, MathTick.swapLong, 0, MathTick.swap3days ); }//tauscht aus der Tick-Datei else{VIRTUAL::CalcSwaps( _Symbol, 0 );} #else VIRTUAL::CalcSwaps( _Symbol, 0 );//Swaps berechnen - alle Geschäfte haben einen Swap, d.h. wenn es sich um 2+ verschiedene Instrumente handelt, haben beide den Swap des Hauptsymbols. #endif }// unvollständige Geschäfte zum Preis des letzten Ticks schließen, wie im Tester if( !isOptimization){QuickReport("report_"+(string)v, true, v,false,true);} Print((string)v+" AccountBalance = ",AccountBalance(), " AccountEquity = ",AccountEquity()); double prib=AccountBalance()-balInit; ret_val += prib; // }} return ret_val;// um die Berechnungsergebnisse zu vergleichen } bool isNewHour (datetime &t){ static int next_h=-1; if(t < next_h){ return false; } else { next_h = (GetHour0(t)+1)*3600;return true;}} int GetHour0 (datetime &t){return((int)( t / 3600));}//aktuelle Stunde vom 1. Januar 1971
In diesem Beispiel werden 2 virtuelle Maschinen mit unterschiedlichem Handel erstellt. Zu geraden Stunden kauft ein Tester, der andere verkauft zu ungeraden Stunden.
Es handelt sich um ein komplexes Beispiel mit 2 Testern, das vereinfacht werden kann, wenn Sie nur mit einem Tester arbeiten möchten.
Sie können auch den MQ-Tester auswählen und ihn mit den Ergebnissen der virtuellen Tester vergleichen, um die Richtigkeit der Berechnungen zu kontrollieren. Nur die Provision kann nicht übereinstimmen, da es viele verschiedene Provisionen gibt und nur eine Variante im virtuellen Tester programmiert ist.
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/65821
Funktion zur Berechnung der Losgröße aus dem Risiko pro Einlage
Die Funktion berechnet die Losgröße einer offenen Position. Als Parameter werden der Eröffnungskurs eines Geschäfts, der Preis des Stop-Loss-Levels und das Risiko pro Geschäft in Prozent der Einlage übergeben
ATR Cycles
Ein Volatilitätsfilter, der auf 3 ATRs basiert: einem schnellen ATR, einem mittleren ATR und einem langsamen ATR
SAR ADX Signal
SAR ADX Signal mit mobiler Benachrichtigung, umgeschrieben von der MT4 Version (Quelle nicht mehr gefunden). Dies ist ein nachmalbarer Indikator, bitte seien Sie vorsichtig, wenn Sie ihn benutzen.
Strong Historical Levels
Historisch starke S/Rs-Niveaus