Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Facebook!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Visualizações:
44
Avaliação:
(2)
Publicado:
2025.06.12 11:56
\MQL5\Scripts\ \MQL5\Include\
Freelance MQL5 Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

A biblioteca permite descriptografar arquivos GZIP de arquivos *.gz ou respostas de sites compactados com esse formato. Testada em arquivos com até 0,5 GB de texto compactado.

A biblioteca pode verificar automaticamente, pelo sinalizador no 4º byte, se o arquivo é um arquivo compactado ou dados compactados do site; no segundo caso, não há nome de arquivo nos dados.

Os dados de entrada para descompressão devem ser representados em uma matriz do tipo char.

A função de terminal CryptDecode(CRYPT_ARCH_ZIP, tmp, key, tx) é usada para descompressão;

A classe GZIP contém métodos:

isGZIP(char& gz[])

- verifica os três primeiros caracteres dos dados recebidos para ver se eles estão compactados no formato GZIP.

Após essa verificação, uma das sobrecargas do método unGZIP pode ser chamada:

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

o caso de uso preferido em termos de velocidade e consumo de memória. Durante a descompressão, a matriz de caracteres tx é preenchida. Em seguida, os dados desse array podem ser processados pelo analisador CSV ou JSON. Dessa forma, obtemos o resultado sem colar a matriz em uma string e depois dividi-la por strings ou outros caracteres.

Se você ainda precisar obter uma string, poderá usar uma das sobrecargas:

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

return true se a descompactação for bem-sucedida e a string descompactada estiver na string out

ou

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

return string. Se a descompactação falhar, a cadeia de caracteres estará vazia.

Deve-se tomar cuidado ao usar a concatenação de dados em uma única cadeia de caracteres.
Se você descompactou um arquivo com 0,5 GB de dados, a cadeia de caracteres exigirá outros 0,5 GB e, em seguida, você poderá dividi-la em uma matriz de cadeias de caracteres, o que exigirá outros 0,5 GB. Além do custo de tempo de todas essas operações.

Exemplo de caso de uso para leitura de dados compactados de um site e, em seguida, leitura de um arquivo: (esse script está anexado para 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;}
            //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()){//get next row
              // for(int c=0; c<columns; c++){
               //Print();
              // }
               //Print(next);
            //}
            //Print("CSV parse time: ",(GetMicrosecondCount()-mcs)," mcs");
            //ArrayPrint(csvRow);

        }else{}
      }
}

int getCSVRow(char& csv[], string& outAr[], int& cols, int& next, char& sep, char& newLine){//obter a próxima linha
   for(int i=next; i<ArraySize(csv); i++){
      if(csv[i] == newLine){
         cols=StringSplit(CharArrayToString(csv,next,i-next),sep,outAr);// processa 1 linha separadamente - 5 a 10% mais rápido que o parseCSV e tem memória para 1 matriz grande.
         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;
}

Esse exemplo lê um arquivo da pasta files e o descomprime em uma matriz.
Os primeiros e os últimos 100 caracteres do arquivo descompactado são impressos.
A matriz pode então ser enviada para um analisador CSV ou JSON. Para JSON, há a biblioteca JASON no kodobase. Ela pode analisar os dados recebidos como uma matriz de caracteres.

Exemplo de saída ao descompactar um arquivo CSV compactado de 120 MB, o arquivo de origem tem 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

A descompactação levou cerca de 1,2 segundos.


Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/59309

ADX Indicator (MQL5) ADX Indicator (MQL5)

O indicador ADX (Average Directional Index) Smoothed aprimora o ADX padrão aplicando filtros de suavização exponencial dupla para reduzir o ruído e fornecer sinais de tendência mais claros. Ele traça três linhas: +DI suavizado (azul), -DI (vermelho) e a linha ADX principal (verde). Essa versão refinada ajuda os traders a identificar a força da tendência e as possíveis mudanças de direção com menos sinais falsos. O indicador é excelente para confirmar tendências estabelecidas e alertar sobre o enfraquecimento do momentum antes que ocorram reversões reais de preço, o que o torna valioso tanto para estratégias de acompanhamento de tendências quanto para determinar os pontos ideais de entrada/saída.

RSI Expert Advisor - Automated Trading Tool Based on RSI RSI Expert Advisor - Automated Trading Tool Based on RSI

O RSI Expert Advisor (EA) é uma ferramenta de negociação automatizada desenvolvida para a plataforma MetaTrader 5 (MT5). Esse EA utiliza o Índice de Força Relativa (RSI) para identificar sinais de compra e venda, incorporando gerenciamento de risco, fechamento parcial de posição e restrições de horário de negociação para otimizar o desempenho da negociação.

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

O Expert Advisor (EA) AutoCloseOnProfitLoss é uma poderosa ferramenta de automação para o MetaTrader 5, projetada para fechar todas as posições abertas quando metas predefinidas de lucro ou perda são atingidas

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

Um utilitário simples para monitorar swaps longos e curtos de um único símbolo. Se os swaps de sua corretora forem especificados em pontos em vez da moeda da conta, esse utilitário converterá automaticamente os pontos em moeda da conta. Os swaps são triplicados na quarta-feira. O alinhamento horizontal e vertical pode ser ajustado nas entradas.