Unisciti alla nostra fan page
- Visualizzazioni:
- 70
- Valutazioni:
- Pubblicato:
-
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

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.

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.

Aggiornamento Dual Trix 1.

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