Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
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
Ansichten:
77
Rating:
(3)
Veröffentlicht:
\MQL5\Scripts\ \MQL5\Include\
GZIP.mqh (8.89 KB) ansehen
MQL5 Freelance 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

ADX Indicator (MQL5) ADX Indicator (MQL5)

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.

Divergence Awesome Ocilator Divergence Awesome Ocilator

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.

AutoCloseOnProfitLoss Expert - Automatically Close All Positions on Profit/Loss AutoCloseOnProfitLoss Expert - Automatically Close All Positions on Profit/Loss

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.

Swaps Monitor for a Single Symbol Swaps Monitor for a Single Symbol

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.