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
- Ansichten:
- 77
- Rating:
- Veröffentlicht:
-
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Die Bibliothek ermöglicht die Entschlüsselung von GZIP-Archiven aus *.gz-Dateien oder Antworten von Websites, die mit diesem Format komprimiert wurden. Getestet mit Dateien, die bis zu 0,5 GB Text enthalten.
Die Bibliothek kann anhand des Flags im 4. Byte automatisch prüfen, ob es sich bei dem Archiv um eine komprimierte Datei oder um komprimierte Daten von der Website handelt, im zweiten Fall ist kein Dateiname in den Daten enthalten.
Die Eingangsdaten für die Dekomprimierung sollten in einem Array vom Typ char dargestellt werden.
Die Terminalfunktion CryptDecode(CRYPT_ARCH_ZIP, tmp, key, tx) wird zur Dekompression verwendet;
Die GZIP-Klasse enthält Methoden:
isGZIP(char& gz[])
- prüft anhand der ersten drei Zeichen der empfangenen Daten, ob sie im GZIP-Format komprimiert sind.
Nach dieser Prüfung kann eine der Überladungen der Methode unGZIP aufgerufen werden:
bool unGZIP(char& gz[], char& tx[], string& fname, bool printTime=false){}
der bevorzugte Anwendungsfall im Hinblick auf Geschwindigkeit und Speicherverbrauch. Bei der Dekomprimierung wird das char-Array tx gefüllt. Dann können die Daten daraus von einem CSV- oder JSON-Parser verarbeitet werden. Auf diese Weise erhalten wir das Ergebnis, ohne das Array in eine Zeichenkette zu kleben und es dann durch Zeichenketten oder andere Zeichen zu teilen.
Wenn Sie dennoch einen String benötigen, können Sie eine der Überladungen verwenden:
bool unGZIP(char& gz[], string& out, bool printTime=false, uint codepage=CP_ACP){}
return true wenn das Entpacken erfolgreich war, die entpackte Zeichenkette ist in der Zeichenkette out
oder
string unGZIP(char& gz[], bool printTime=false, uint codepage=CP_ACP){}
return string. Wenn das Entpacken fehlschlägt, ist die Zeichenkette leer.
Vorsicht ist geboten bei der Verkettung von Daten zu einer einzigen Zeichenkette.
Wenn Sie ein Archiv mit 0,5 GB Daten entpackt haben, benötigt die Zeichenkette weitere 0,5 GB, dann können Sie sie in ein Array von Zeichenketten aufteilen, was weitere 0,5 GB erfordert. Hinzu kommen die Zeitkosten für all diese Vorgänge.
Anwendungsbeispiel für das Lesen komprimierter Daten von einer Website und das anschließende Lesen aus einer Datei: (dieses Skript ist zum Download beigefügt)
#property copyright "Copyright 2023, Forester" #property link "https://www.mql5.com" #property version "1.00" #include <GZIP.mqh> GZIP gzip; void OnStart(){ Print("GZipped webpage read sample:"); string url="https://............"; char out[]; if(http_req(url, out,"GET","Accept-Encoding: gzip, deflate\r\n", 1,0)){ if(gzip.isGZIP(out)){ Print("GZIP detected"); string txt; if(!gzip.unGZIP(out, txt, 1, CP_UTF8)){return;}//CP_ACP Print(txt); }else{ Print("No GZIP");Print(CharArrayToString(out, 0, WHOLE_ARRAY, CP_UTF8)); } } Print("File read sample:"); bool is_common=1; string fn="3.csv.gz"; bool is_zip=1; int h; if(is_zip){ h = FileOpen(fn,FILE_READ|FILE_BIN|FILE_READ|(is_common?FILE_COMMON:0)); }else{ h = FileOpen(fn,FILE_READ|FILE_CSV|FILE_ANSI|(is_common?FILE_COMMON:0)); } if( h!=INVALID_HANDLE){ Print ("Start gzip"); char gz[],tx[]; FileReadArray(h, gz); FileClose(h); if(gzip.isGZIP(gz)){ Print("GZIP detected"); string fname; if(!gzip.unGZIP(gz, tx,fname,1)){return;} //string txt; if(!unGZIP(gz, txt, 1, CP_ACP)){return;}//CP_UTF8 //string txt=unGZIP(gz, 1, CP_ACP);if(txt==""){return;} if(fname!=NULL){Print("File name: ",fname,", file size: ",ArraySize(tx));} string t= CharArrayToString(tx,0,100);Print("Filr content: ",t);t= CharArrayToString(tx,ArraySize(tx)-100,100);Print("... ",t); //ulong mcs = GetMicrosecondCount(); //string csvRow[];int columns=0, next=0; char sep=',', newLine='\n'; //while(getCSVRow(tx, csvRow, columns, next, sep, newLine) && !IsStopped()){///Nächste Zeile ermitteln // for(int c=0; c<Spalten; c++){ //Drucken(); // } //Drucken(next); //} //Drucken("CSV-Analysezeit: ",(GetMicrosecondCount()-mcs)," mcs"); //ArrayPrint(csvRow); }else{} } } int getCSVRow(char& csv[], string& outAr[], int& cols, int& next, char& sep, char& newLine){//Nächste Zeile abrufen for(int i=next; i<ArraySize(csv); i++){ if(csv[i] == newLine){ cols=StringSplit(CharArrayToString(csv,next,i-next),sep,outAr);// 1 Zeile separat verarbeiten - 5-10% schneller als parseCSV und e hat Speicher für 1 großes Array. next=i+1; return true; } } return false; } bool http_req(string url, char& out[],string method="GET",string headers_request=NULL, bool printTime=false,bool debug=false){ ulong mcs = (printTime?GetMicrosecondCount():0); bool retVal=false; ResetLastError(); char data[];string headers=NULL; int r=WebRequest(method, url, headers_request, 5000, data, out, headers); if(r==-1){Print("Error in WebRequest. Err code =",GetLastError());MessageBox("It is necessary to add the address '"+url+"' to the list of allowed URLs in the 'Advisors' tab","Error",MB_ICONINFORMATION);} else{if(r==200){ retVal= true; }else{PrintFormat("Download error '%s', responce code %d",url,r);Print("Error in WebRequest. Err code =",GetLastError());}}if(debug){PrintFormat("Responce headers: %s\r\nResponce:",headers);Print(CharArrayToString(out));}// if(printTime){Print("WebRequest time: ",(GetMicrosecondCount()-mcs)," mcs");} return retVal; }
Dieses Beispiel liest eine Datei aus dem Dateiordner und dekomprimiert sie in ein Array.
Die ersten und letzten 100 Zeichen der entpackten Datei werden ausgegeben.
Das Array kann dann an einen CSV- oder JSON-Parser gesendet werden. Für JSON gibt es die JASON-Bibliothek in kodobase. Sie kann Daten parsen, die als Char-Array empfangen werden.
Beispiel für die Ausgabe beim Entpacken einer komprimierten CSV-Datei von 120 MB, die Quelldatei ist 463 MB groß:
2025.05.12 15:08:40.510 GZipped webpage read sample:
2025.05.12 15:08:41.319 WebRequest time: 809637 mcs
2025.05.12 15:08:41.319 GZIP detected
2025.05.12 15:08:41.319 UnGZIP time: 3 mcs
2025.05.12 15:08:41.319 {"retCode":0,"retMsg":"OK","result":{"category":"linear","list":[... Юя
2025.05.12 15:08:41.319 File read sample:
2025.05.12 15:08:41.320 Start gzip
2025.05.12 15:08:41.384 GZIP detected
2025.05.12 15:08:42.582 UnGZIP time: 1198136 mcs
2025.05.12 15:08:42.593 File name: BTCUSD2025-05-09.csv, file size: 486006135
2025.05.12 15:08:42.593 Filr content: timestamp,symbol,side,size,price,tickDirection,trdMatchID,grossValue,homeNotional,foreignNotional,RP
2025.05.12 15:08:42.593 ... 36.00,ZeroPlusTick,e92fbea7-1471-591e-95f7-4dc0edde771c,971.4774228646926,1,9.714774228646926e-06,0
Das Entpacken dauerte etwa 1,2 Sekunden.
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/59309

Der ADX (Average Directional Index) Smoothed-Indikator verbessert den Standard-ADX, indem er zwei exponentielle Glättungsfilter anwendet, um Rauschen zu reduzieren und klarere Trendsignale zu liefern. Er stellt drei Linien dar: den geglätteten +DI (blau), den -DI (rot) und die Hauptlinie des ADX (grün). Diese verfeinerte Version hilft Händlern, Trendstärke und potenzielle Richtungsänderungen zu erkennen und Fehlsignale zu reduzieren. Der Indikator zeichnet sich dadurch aus, dass er etablierte Trends bestätigt und vor nachlassender Dynamik warnt, bevor es zu tatsächlichen Kursumkehrungen kommt, was ihn sowohl für Trendfolgestrategien als auch für die Bestimmung optimaler Einstiegs- und Ausstiegspunkte wertvoll macht.

Dieser benutzerdefinierte MQL5-Indikator erkennt Divergenzen zwischen dem Preisgeschehen und dem Awesome Oscillator (AO) und signalisiert potenzielle Marktumkehrungen oder -fortsetzungen. Er stellt Kauf-/Verkaufspfeile auf dem Chart dar, zeigt den AO als Histogramm an und zeichnet Trendlinien, um Divergenzen hervorzuheben.

Der AutoCloseOnProfitLoss Expert Advisor (EA) ist ein leistungsstarkes Automatisierungstool für MetaTrader 5, das alle offenen Positionen schließt, wenn vordefinierte Gewinn- oder Verlustziele erreicht werden.

Ein einfaches Dienstprogramm zur Überwachung von Long- und Short-Swaps für ein einzelnes Symbol. Wenn die Swaps Ihres Broker-Dealers in Punkten statt in der Kontowährung angegeben sind, konvertiert dieses Dienstprogramm automatisch Punkte in die Kontowährung. Die Swaps werden am Mittwoch verdreifacht. Die horizontale und vertikale Ausrichtung kann in den Eingaben angepasst werden.