Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
- Visualizações:
- 44
- Avaliação:
- Publicado:
- 2025.06.12 11:56
-
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

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.

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.

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

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.