Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Twitter!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Bibliotheken

MathTicker - Tickgenerator im mathematischen Modus - Bibliothek für den MetaTrader 5

Ansichten:
41
Rating:
(4)
Veröffentlicht:
\MQL5\Include\Forester\
MathTicker.mqh (31.16 KB) ansehen
MQL5 Freelance 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 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:

  1. 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.

  2. 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.


  3. 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:

  1. 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.
  2. Setzen Sie den Testmodus auf Mathe. Setzen Sie die Variable Aufgabe auf Run_Strategy_Fron_Archive.
  3. 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.

  4. 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.
  5. 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 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 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

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 Strong Historical Levels

Historisch starke S/Rs-Niveaus