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
TickCompressor - mit Komprimierung von 1 Tick auf durchschnittlich 2-3 Bytes - Bibliothek für den MetaTrader 5
- Ansichten:
- 44
- Rating:
- Veröffentlicht:
- Aktualisiert:
-
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Komprimierung der Tick-Daten zur Speicherung in einer kompakten Form, die bis zu 3,5 Mal kompakter ist als .tcs MQ-Dateien. Und für schnelles Arbeiten mit ihnen, da es weniger Zeit braucht, 3 Bytes als 60 Bytes der MqlTick-Struktur zu lesen.
Die Dateigröße für 2023 mit Ask, Bid, Time mit zusätzlicher ZIP-Kompression der Datenblöcke ist auf dem Screenshot zu sehen:

Dateigröße im .tcs-Format für 2023:

3,56-fache Komprimierung.
Zur Speicherung von Ticks werden die Differenzen von Ask und Bid zum vorherigen Kurs verwendet. Oft (bis zu 50...70% aller Ticks) übersteigt sie (-8...7) Punkte nicht und kann mit 4 Bit aufgezeichnet werden. Ask und Bid werden in 1 Byte zusammengefasst.
Plus 1 Byte zur Speicherung der Zeitdifferenz von 0 bis 255 Millisekunden (im Code bis 229, Werte über 229 werden zur Codierung von Ticks verwendet, die über -8...7 Punkte hinausgehen).
Wenn sich Preise oder Zeiten um größere Werte unterscheiden, werden sie in eine größere Anzahl von Bytes gepackt.
Zur zusätzlichen Komprimierung können Sie die ZIP-Archivierung anwenden. Die Größe der Daten wird dabei um das bis zu 2-fache reduziert.
Alternativ kann eine Komprimierung auf 3 Byte erfolgen, wobei Ask und Bid von -129 bis 128 auf 8 Bit bzw. je 1 Byte komprimiert werden. Plus 1 Byte für die Zeit - insgesamt 3 Byte für die meisten Ticks.
Manchmal(https://www.mql5.com/ru/forum/499639/page6#comment_58544810), wenn mehr Ticks auf 2 Byte als auf 4 Byte komprimiert sind, ist es effizienter, auf 3 Byte zu komprimieren. Sie müssen sich die Instrumentenstatistiken ansehen.
Sie können die maximale Komprimierung mit dem Befehl auf 3 Bytes umstellen:
#define compressTo3Bytes // Komprimierung der Ticks auf 3 statt 2 Bytes.
Zu speichernde Tick-Elemente in komprimierter Form
Es sind 3 Varianten von Tick-Elementen für die Speicherung programmiert:
- Ask, Bid, time_msc
- Ask, Bid, time_msc, volume_real
- Alle Elemente Ask, Bid, Last, time_msc, volume_real, flags (int volume wird aus volume_real berechnet).
Sie können auch zusätzlich in ZIP komprimiert werden. Es wird insgesamt 6 Varianten geben
method=1;//1...6 BidAsk_=1, BidAskVolume_=2, All_=3, BidAsk_Zipped=4, BidAskVolume_Zipped=5, All_Zipped=6
Bevor Sie die Komprimierung starten, müssen Sie der Klasse die Variante der Tick-Speicherung und einige Standardparameter übergeben, die für die Berechnungen und die Normalisierung der Preise verwendet werden.
TickCompressor Compressor2; double VolumeStep_=SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); Compressor2.Start(method,_Point,VolumeStep_,_Digits);
Wenn der Expert Advisor Flags verwendet, können diese bei Preisänderungen mit dem Befehl
#define RestoreFlags // Wiederherstellung der Tick-Flags aus der Änderung von Ask, Bid, Volume - fügt 7% zur Tick-Erzeugungszeit hinzu 931 statt 869ms
Der Expert Advisor für den Kompressionstest ist beigefügt, er liefert Statistiken über die Geschwindigkeit und die Komprimierungsrate. Sie können ein Beispiel für die Komprimierung und Dekomprimierung von Ticks in ihm sehen.
Ein Beispiel für den Expert Advisor für den Handel ist hier zu sehen: https://www.mql5.com/de/code/65821.
Statistiken für die Komprimierung auf 2 und 3 Bytes:
| Komprimierung auf 2 Bytes: | Komprimierung auf 3 Bytes |
| Ticks: 47707712 Komprimierte Größe: 135718404 Komprimierte 2862666420 Bytes in 135718404 Bytes ==> 4,74% Komprimierungsleistung: 764 MB/s Komprimierungsleistung: 13,4 Ticks (Millionen)/sec. Komprimierungsleistung Kriterium: 281.7 Dekomprimierungsleistung: 3550 MB/s Dekomprimierungsleistung: 62.0 Ticks (Millionen)/sec. Dekomprimierungsleistung Kriterium: 1308.8 Statistiken vom Experten https://www.mql5.com/de/code/65821 für BTCUSDT -------------------- Statistiken: -------------------- 2 Bytes: 70.1%, 50705359 Ticks 4 Bytes: 17.1%, 12350966 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, 197342036 Bytes. Durchschnitt: 2.729 Bytes pro Tick Ungezippte Größe: 197342036. Gezippte Größe: 108302550. ZIP-Komprimierung: 54,9% Durchschnitt: 1,498 Bytes pro Tick Für EURUSD -------------------- Statistik: -------------------- 2 Bytes: 66,2%, 29694779 Ticks 4 Bytes: 2,3%, 1022937 Ticks 5 Bytes: 31,5%, 14106637 Ticks 6 Bytes: 0.0%, 25 Ticks 7 Bytes: 0.0%, 8 Ticks 11 Bytes: 0.0%, 800 Ticks 12 Bytes: 0.0%, 3 Ticks 13 Bytes: 0.0%, 4 Ticks 24 Bytes: 0.0%, 1 Ticks Insgesamt: 44825194 Ticks, 134023609 Bytes. Durchschnitt: 2.99 Bytes pro Tick Ungezippte Größe: 134023609. Gezippte Größe: 95495454. ZIP-Komprimierung: 71,3 % Durchschnitt: 2,13 Byte pro Tick | Ticks: 47707712 Komprimierte Größe: 169378137 Komprimierte 2862462720 Bytes in 169378137 Bytes ==> 5.92% Komprimierungsleistung: 623 MB/s Komprimierungsleistung: 10.9 Ticks (Millionen)/sec. Komprimierungsleistungskriterium: 183.9 Dekomprimierungsleistung: 3225 MB/s Dekomprimierungsleistung: 56.4 Ticks (Millionen)/sec. Dekomprimierungsleistungskriterium: 952.6 Korrekt = wahr Statistik von Expert https://www.mql5.com/de/code/65821 für BTCUSDT -------------------- Statistiken: -------------------- 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: 105802525. ZIP-Komprimierung: 44,8% Durchschnitt: 1,463 Bytes pro Tick Für EURUSD 3 Bytes: 66,5%, 29801633 Ticks 4 Bytes: 2,0%, 916083 Ticks 5 Bytes: 31,5%, 14106637 Ticks 6 Bytes: 0,0%, 25 Ticks 7 Bytes: 0.0%, 8 Ticks 11 Bytes: 0.0%, 800 Ticks 12 Bytes: 0.0%, 3 Ticks 13 Bytes: 0.0%, 4 Ticks 24 Bytes: 0.0%, 1 Tick Insgesamt: 44825194 Ticks, 163611534 Bytes. Durchschnitt: 3.65 Bytes pro Tick Ungezippte Größe: 163611534. Gezippte Größe: 96541155. ZIP-Komprimierung: 59,0% Durchschnitt: 2,154 Bytes pro Tick |
Code-Beispiele
Tick-Komprimierung
Block für Block:
int ZIPpos=0;//komprimierter Byte-Zähler if(Amount>ticks_per_block){> 1 Block - Kleben von Blöcken aus tmp in Ticks2 for(int start=0; start<Amount; start+=ticks_per_block){ Compressor2.Compress(Ticks, tmp, start, (Amount > start + ticks_per_block ? ticks_per_block : Amount - start)); ZIPpos+=ArrayCopy(Ticks2,tmp,ZIPpos); //Kopieren an das Ende von Ticks2 } }else{//1 Block - Entpacken direkt in Ticks2 Compressor2.Compress(Ticks, Ticks2, 0, Amount); }
Wenn Sie die Anzahl der Ticks in einem Block größer als die Gesamtzahl der Ticks im Array einstellen, wird dieser in 1 Block komprimiert.
Wenn Sie immer eine Komprimierung in 1 Block benötigen, können Sie
Compressor2.Compress(Ticks,Ticks2);
Aber die Geschwindigkeit der Dekomprimierung eines solchen großen oder sehr großen Blocks kann 2 mal langsamer sein. Außerdem wird für einen großen Block viel Speicherplatz benötigt.
Entpacken von Ticks
Beim Entpacken ist es wünschenswert, die Anzahl der gepackten Ticks zu kennen. Das Empfänger-Array muss diese Größe haben.
ArrayResize(Ticks3,Amount); Die Größe kann z.B. in einer Datei gespeichert werden. Dann kann man sie beim Auspacken verwenden.
Wenn die Größe nicht bekannt ist, kann man die Größe innerhalb der Schleife um die Anzahl der Ticks im Block ändern
//langsamer fahren ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //Großes Array neu skalieren - arbeitet langsamer als das Überschreiben eines kleinen Blocks
Dieser Code erhält die Ticks blockweise. Wenn es nur einen großen Block gibt, wird auch dieser korrekt gezählt. Die Ticks werden nicht in einem großen Array gesammelt, sondern können sofort von Ihrer Strategy(Ticks3[j]) Strategie verarbeitet werden;
while (ZIPpos<ArraySize(Ticks2)){ nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//Größe des nächsten Blocks, ZIPpos um 4 erhöhen uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // neuen Block nach tmp mit Größe nextSize kopieren //sind um den Faktor 3 langsamer ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //neue Größe eines großen Arrays - arbeitet langsamer als das Überschreiben eines kleinen Blocks //total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//entpacken Sie den Block und fügen Sie ihn zu Ticks3 hinzu. total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //Den Block auspacken und in Ticks3 überschreiben ZIPpos+=nextSize; for (int j = 0; j < ticks; j++){ Strategy(Ticks3[j]);}//strategie };
Sammelt die Ticks aus allen Blöcken in einem großen Array:
while (ZIPpos<ArraySize(Ticks2)){ nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//Größe des nächsten Blocks, ZIPpos um 4 erhöhen uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // neuen Block nach tmp mit Größe nextSize kopieren //slower ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //resize a large array - arbeitet langsamer als das Überschreiben eines kleinen Blocks total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//Den Block auspacken und zu Ticks3 hinzufügen //total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //den Block entpacken und in Ticks3 überschreiben ZIPpos+=nextSize; //for (int j = 0; j < ticks; j++){ Strategie(Ticks3[j]);}///Strategie };
Oder eine Zeile. Es sollte nur 1 Block aufgezeichnet werden. Wenn mehr - verwenden Sie die 2 obigen Code-Varianten.
total_ticks=Compressor3.DeCompress(Ticks2,Ticks3);
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/66201
Report by Magic and currency MT5 indicator for account PNL and trade statistics exported to CSV
Exportiert umfassende Handelsstatistiken in eine CSV-Datei.
Daily Lot Statistics
Moderner Indikator, der Ihre täglichen Handelsstatistiken direkt auf Ihrem MT5-Chart anzeigt. Verfolgen Sie Ihre Handelsleistung mit einem schönen flachen Design-Panel, das die gehandelten Lots, die Anzahl der Aufträge und den Gewinn/Verlust für jeden Tag anzeigt.
Titik Impas Breakeven
Während die manuelle Anpassung des Stop-Loss eines einzelnen Trades an den Eröffnungskurs eine relativ einfache Aufgabe ist, kann die Verwaltung zahlreicher einzelner Positionen mühsam und zeitintensiv sein. Das Titik Impas Breakeven-Skript für MT4/MT5 rationalisiert diesen Prozess und bietet Effizienz und Komfort für Händler, die mit mehreren Positionen handeln.
ATR Weighted Moving Averages
Dies ist ein Indikator zur Berechnung von ATR-gewichteten gleitenden Durchschnitten.