Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Просмотров:
383
Рейтинг:
(3)
Опубликован:
Обновлен:
\MQL5\Scripts\ \MQL5\Include\
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Библиотека позволяет делать расшифровку GZIP архивов из *.gz файлов или ответов с сайтов сжатых этим форматом. Проверено на файлах в которых упаковано до 0.5 Гб текста.

Библиотека может автоматически проверять по флагу в 4-м байте является ли архив сжатым файлом или сжатыми данными с сайта, во втором случае в данных отсутствует имя файла.

Входные данные для распаковки должны быть представлены в массиве типа char.

Для распаковки используется функция терминала CryptDecode(CRYPT_ARCH_ZIP, tmp, key, tx);

Класс GZIP содержит методы:

isGZIP(char& gz[])

- проверяет по первым трем символам полученных данных, сжаты ли они в GZIP формате.

После этой проверки можно вызвать одну из перегрузок метода unGZIP:

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

предпочтительный вариант использования по быстродействию и потреблению памяти. При распаковке заполняется char массив tx. Затем данные из него можно обработать CSV или JSON парсером. Таким образом получаем результат без склейки массива в строку, с последующей ее разделением по строкам или др. символам.

Если все же нужно получить строку, то можно использовать одну из перегрузок:

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

возвратит true при успешной распаковке, распакованная строка находится в строке out

или

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

вернет строку. Если распаковка не удалась, то строка будет пустая.

Следует с осторожностью использовать склейку данных в одну строку.
Если вы распаковали архив в котором 0.5 Гб данных, то строка потребует еще 0.5 Гб, затем вы можете её разбить в массив строк, он еще потребует 0.5Гб. Плюс затраты времени на все эти операции.

Пример использования для чтения сжатых данных с сайта и затем чтение из файла: (этот скрипт прикреплен для скачивания)

#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){//get next row
   for(int i=next; i<ArraySize(csv); i++){
      if(csv[i] == newLine){
         cols=StringSplit(CharArrayToString(csv,next,i-next),sep,outAr);// обрабатывать 1 строку отдельно - на 5-10 % быстрее parseCSV и е есть память для 1 большго массива
         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;
}

В этом примере происходит чтение файла из папки files, и его распаковка в массив.
Распечатаны первые и последние 100 символов из распакованного файла.
Затем массив можно отправить парсеру CSV или JSON. Для JSON в кодобазе есть библиотека JASON. Она может парсить данные полученные в виде char массива.

Пример вывода при распаковке сжатого CSV файла размером 120 МБ, исходный файл 463 МБ:

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

Распаковка длилась около 1.2 секунд.


EquiPeak Drawdown Tracker EquiPeak Drawdown Tracker

EquiPeak Drawdown Tracker - это индикатор, предназначенный для отслеживания и регистрации максимальной просадки вашего торгового счета в режиме реального времени. Это не просто индикатор текущей просадки; он особенно полезен для визуального сравнения текущей просадки с максимальной исторической просадкой, которую вы ожидаете или ранее зафиксировали.

Обратный отсчет 2.0 Обратный отсчет 2.0

Countdown - это продвинутый индикатор, предназначенный для трейдеров, которые хотят четко и эффективно отслеживать время, оставшееся до следующей свечи или следующего открытия рынка. Благодаря трем гибким режимам отображения (комментарий, границы графика или рядом с ценой), этот индикатор предлагает настраиваемое решение для удовлетворения ваших торговых потребностей.

Индиана Джонс Средняя реверсия EA Индиана Джонс Средняя реверсия EA

Это простой советник по возврату к среднему значению.

ColorXMA_Ishimoku_StDev - indicator for MetaTrader 5 ColorXMA_Ishimoku_StDev - indicator for MetaTrader 5

Индикатор XMA_Ishimoku с дополнительной индикацией силы тренда с помощью цветных точек, основанных на алгоритме стандартного отклонения. Оригинальный код в прикрепленной ссылке имел проблемы с построением.