Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 383
- Рейтинг:
- Опубликован:
- Обновлен:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Библиотека позволяет делать расшифровку 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 - это индикатор, предназначенный для отслеживания и регистрации максимальной просадки вашего торгового счета в режиме реального времени. Это не просто индикатор текущей просадки; он особенно полезен для визуального сравнения текущей просадки с максимальной исторической просадкой, которую вы ожидаете или ранее зафиксировали.
Обратный отсчет 2.0
Countdown - это продвинутый индикатор, предназначенный для трейдеров, которые хотят четко и эффективно отслеживать время, оставшееся до следующей свечи или следующего открытия рынка. Благодаря трем гибким режимам отображения (комментарий, границы графика или рядом с ценой), этот индикатор предлагает настраиваемое решение для удовлетворения ваших торговых потребностей.
Индиана Джонс Средняя реверсия EA
Это простой советник по возврату к среднему значению.
ColorXMA_Ishimoku_StDev - indicator for MetaTrader 5
Индикатор XMA_Ishimoku с дополнительной индикацией силы тренда с помощью цветных точек, основанных на алгоритме стандартного отклонения. Оригинальный код в прикрепленной ссылке имел проблемы с построением.