Voir comment télécharger gratuitement des robots de trading
Retrouvez-nous sur Twitter !
Rejoignez notre page de fans
Un script intéressant ?
Poster un lien vers celui-ci -
laisser les autres l'évaluer
Vous avez aimé le script ? Essayez-le dans le terminal MetaTrader 5
Vues:
86
Note:
(3)
Publié:
\MQL5\Scripts\ \MQL5\Include\
GZIP.mqh (8.89 KB) afficher
MQL5 Freelance Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance

Cette bibliothèque vous permet de décrypter des archives GZIP à partir de fichiers *.gz ou de réponses provenant de sites compressés avec ce format. Testée sur des fichiers contenant jusqu'à 0,5 Go de texte.

La bibliothèque peut vérifier automatiquement, à l'aide de l'indicateur du quatrième octet, si l'archive est un fichier compressé ou des données compressées provenant du site ; dans le second cas, les données ne contiennent pas le nom du fichier.

Les données d'entrée pour la décompression doivent être représentées dans un tableau de type char.

La fonction terminale CryptDecode(CRYPT_ARCH_ZIP, tmp, key, tx) est utilisée pour la décompression ;

La classe GZIP contient des méthodes :

isGZIP(char& gz[])

- vérifie les trois premiers caractères des données reçues pour voir si elles sont compressées au format GZIP.

Après cette vérification, l'une des surcharges de la méthode unGZIP peut être appelée :

bool unGZIP(char& gz[], char& tx[], string& fname, bool printTime=false){}

le cas d'utilisation préféré en termes de vitesse et de consommation de mémoire. Pendant la décompression, le tableau de caractères tx est rempli. Les données qu'il contient peuvent ensuite être traitées par un analyseur CSV ou JSON. De cette manière, nous obtenons le résultat sans avoir à coller le tableau dans une chaîne de caractères et à le diviser ensuite par des chaînes de caractères ou d'autres caractères.

Si vous avez toujours besoin d'obtenir une chaîne de caractères, vous pouvez utiliser l'une des surcharges :

bool unGZIP(char& gz[], string& out, bool printTime=false, uint codepage=CP_ACP){}

return true si le décompactage est réussi, la chaîne décompactée est dans la chaîne out

ou

string unGZIP(char& gz[], bool printTime=false, uint codepage=CP_ACP){}

return string. Si le déballage échoue, la chaîne sera vide.

Il convient d'être prudent lors de l'utilisation de la concaténation de données en une seule chaîne.
Si vous avez décompressé une archive contenant 0,5 Go de données, la chaîne nécessitera encore 0,5 Go, puis vous pourrez la diviser en un tableau de chaînes, ce qui nécessitera encore 0,5 Go. Sans compter le coût en temps de toutes ces opérations.

Exemple de cas d'utilisation pour la lecture de données compressées à partir d'un site web, puis à partir d'un fichier : (ce script est joint pour téléchargement)

#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
            //chaîne de caractères 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()){//obtenir la ligne suivante
              // for(int c=0 ; c<columns ; c++){
               //Imprimer() ;
              // }
               //Imprimer(suivant) ;
            //}
            //Print("CSV parse time : ",(GetMicrosecondCount()-mcs)," mcs") ;
            //ArrayPrint(csvRow) ;

        }else{}
      }
}

int getCSVRow(char& csv[], string& outAr[], int& cols, int& next, char& sep, char& newLine){//obtient la ligne suivante
   for(int i=next; i<ArraySize(csv); i++){
      if(csv[i] == newLine){
         cols=StringSplit(CharArrayToString(csv,next,i-next),sep,outAr);// traite chaque ligne séparément - 5-10% plus rapide que parseCSV et e a de la mémoire pour un grand tableau.
         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;
}

Cet exemple lit un fichier à partir du dossier files et le décompresse dans un tableau.
Les 100 premiers et derniers caractères du fichier décompressé sont imprimés.
Le tableau peut ensuite être envoyé à un analyseur CSV ou JSON. Pour JSON, il existe la bibliothèque JASON dans la kodobase. Elle peut analyser les données reçues sous la forme d'un tableau de caractères.

Exemple de sortie lors de la décompression d'un fichier CSV compressé de 120 Mo, le fichier source étant de 463 Mo :

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

La décompression a pris environ 1,2 seconde.


Traduit du russe par MetaQuotes Ltd.
Code original : https://www.mql5.com/ru/code/59309

ADX Indicator (MQL5) ADX Indicator (MQL5)

L'indicateur ADX (Average Directional Index) Smoothed améliore l'ADX standard en appliquant deux filtres de lissage exponentiel afin de réduire le bruit et de fournir des signaux de tendance plus clairs. Il trace trois lignes : +DI lissé (bleu), -DI (rouge) et la ligne ADX principale (verte). Cette version affinée aide les traders à identifier la force de la tendance et les changements de direction potentiels en réduisant les faux signaux. L'indicateur excelle à confirmer les tendances établies et à avertir de l'affaiblissement de la dynamique avant que les prix ne s'inversent, ce qui le rend précieux pour les stratégies de suivi de tendance et pour déterminer les points d'entrée et de sortie optimaux.

MACD - Any higher timeframe MACD - Any higher timeframe

Cet indicateur est basé sur le MACD simple mais vous permet de choisir une période de temps différente de la période actuelle. Vous pouvez choisir l'horizon actuel du graphique (l'indicateur affiche alors les mêmes valeurs que le MACD ordinaire) ou un horizon supérieur.

Dual Trix UpGrade_1 Dual Trix UpGrade_1

Dual Trix Upgrade 1.

MartGreg MartGreg

Expert Advisor sur deux MACD avec gestion du capital par la méthode martingale.