Guarda come scaricare robot di trading gratuitamente
Ci trovi su Twitter!
Unisciti alla nostra fan page
Script interessante?
Pubblica il link!
lasciare che altri lo valutino
Ti è piaciuto lo script? Provalo nel Terminale MetaTrader 5
Visualizzazioni:
70
Valutazioni:
(3)
Pubblicato:
\MQL5\Scripts\ \MQL5\Include\
GZIP.mqh (8.89 KB) visualizza
Freelance MQL5 Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance

La libreria consente di decriptare gli archivi GZIP da file *.gz o le risposte da siti compressi con questo formato. Testata su file con un massimo di 0,5 GB di testo.

La libreria è in grado di verificare automaticamente, tramite il flag nel 4° byte, se l'archivio è un file compresso o un dato compresso dal sito; nel secondo caso non c'è alcun nome di file nei dati.

I dati di input per la decompressione devono essere rappresentati in un array di tipo char.

Per la decompressione si utilizza la funzione terminale CryptDecode(CRYPT_ARCH_ZIP, tmp, key, tx);

La classe GZIP contiene metodi:

isGZIP(char& gz[])

- controlla i primi tre caratteri dei dati ricevuti per verificare se sono compressi in formato GZIP.

Dopo questo controllo, è possibile richiamare uno dei sovraccarichi del metodo unGZIP:

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

il caso d'uso preferito in termini di velocità e consumo di memoria. Durante la decompressione, l'array di char tx viene riempito. Quindi i dati possono essere elaborati da un parser CSV o JSON. In questo modo si ottiene il risultato senza incollare l'array in una stringa e poi dividerlo per stringhe o altri caratteri.

Se si ha ancora bisogno di ottenere una stringa, si può usare uno dei sovraccarichi:

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

restituisce true se lo spacchettamento è riuscito, la stringa spacchettata è nella stringa out

oppure

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

return string. Se la decompressione fallisce, la stringa sarà vuota.

Occorre prestare attenzione quando si utilizza la concatenazione dei dati in un'unica stringa.
Se si scompatta un archivio con 0,5 GB di dati, la stringa richiederà altri 0,5 GB, poi si potrà dividere in un array di stringhe, che richiederà altri 0,5 GB. Più il costo temporale di tutte queste operazioni.

Esempio di utilizzo per la lettura di dati compressi da un sito web e poi la lettura da un file: (questo script è allegato per il download)

#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;}
            //stringa txt; if(!unGZIP(gz, txt, 1, CP_ACP)){return;}//CP_UTF8
            //stringa 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();
            //stringa csvRow[];int columns=0, next=0; char sep=',', newLine='\n';
            //mentre(getCSVRow(tx, csvRow, columns, next, sep, newLine) && !IsStopped()){//ottenere la riga successiva
              // for(int c=0; c<colonne; c++){
               //Stampa();
              // }
               //Stampa(successivo);
            //}
            //Stampa("Tempo di analisi CSV: ",(GetMicrosecondCount()-mcs)," mcs");
            //ArrayPrint(csvRow);

        }else{}
      }
}

int getCSVRow(char& csv[], string& outAr[], int& cols, int& next, char& sep, char& newLine){//ottenere la riga successiva
   for(int i=next; i<ArraySize(csv); i++){
      if(csv[i] == newLine){
         cols=StringSplit(CharArrayToString(csv,next,i-next),sep,outAr);// elabora 1 riga separatamente - 5-10% più veloce di parseCSV e ha memoria per 1 array di grandi dimensioni.
         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;
}

Questo esempio legge un file dalla cartella dei file e lo decomprime in un array.
Vengono stampati i primi e gli ultimi 100 caratteri del file decompresso.
L'array può quindi essere inviato a un parser CSV o JSON. Per JSON esiste la libreria JASON in kodobase. Può analizzare i dati ricevuti come array di caratteri.

Esempio di output durante la decompressione di un file CSV compresso di 120 MB, il file di origine è di 463 MB:

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 decompressione ha richiesto circa 1,2 secondi.


Tradotto dal russo da MetaQuotes Ltd.
Codice originale https://www.mql5.com/ru/code/59309

ADX Indicator (MQL5) ADX Indicator (MQL5)

L'indicatore ADX (Average Directional Index) Smoothed migliora l'ADX standard applicando un doppio filtro di smoothing esponenziale per ridurre il rumore e fornire segnali di tendenza più chiari. Traccia tre linee: +DI (blu), -DI (rosso) e la linea ADX principale (verde). Questa versione raffinata aiuta i trader a identificare la forza del trend e i potenziali cambiamenti di direzione con una riduzione dei falsi segnali. L'indicatore eccelle nel confermare le tendenze consolidate e nel segnalare l'indebolimento del momentum prima che si verifichino le effettive inversioni di prezzo, rendendolo prezioso sia per le strategie di trend following che per determinare i punti di entrata/uscita ottimali.

MACD - Any higher timeframe MACD - Any higher timeframe

Questo indicatore si basa sul MACD semplice, ma consente di scegliere anche il timeframe dell'indicatore, diverso da quello attuale. È possibile scegliere il timeframe corrente del grafico (allora l'indicatore mostra gli stessi valori del MACD comune) o qualsiasi timeframe superiore.

Dual Trix UpGrade_1 Dual Trix UpGrade_1

Aggiornamento Dual Trix 1.

MartGreg MartGreg

Expert Advisor su due MACD con gestione del capitale secondo il metodo della martingala.

Il sito usa i cookie. Scopri di più sulla nostra Informativa sui cookie.