欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

GZIP - 解码 - MetaTrader 5 库

author emer | 219 人阅读 | 0 人评论 |

该库允许您从 *.gz 文件或来自使用此格式压缩的站点的响应中解密 GZIP 存档。对包含最多 0.5 GB 文本的文件进行了测试。

库可以通过第 4 个字节中的标志自动检查存档是否是压缩文件或来自站点的压缩数据,在第二种情况下,数据中没有文件名。

解压的输入数据应以 char 类型的数组表示。

终端函数CryptDecode(CRYPT_ARCH_ZIP, tmp, key, tx)用于解压;

GZIP 类包含方法:

是GZIP(字符&gz[])

- 检查接收到的数据的前三个字符,看看它是否以 GZIP 格式压缩。

进行此检查后,可以调用 unGZIP 方法的重载之一:

布尔值解压缩(字符&gz[],字符& 发送[],细绳和名字,布尔值打印时间=错误的){}

就速度和内存消耗而言的首选用例。解压过程中,char数组tx被填充。然后来自它的数据可以由 CSV 或 JSON 解析器处理。这样我们就可以获得结果,而无需将数组粘合到字符串中,然后将其除以字符串或其他字符。

如果您仍然需要获取字符串,可以使用其中一个重载:

布尔值解压缩(字符&gz[],细绳& 出去,布尔值打印时间=错误的,单位代码页=CP_ACP){}

解包成功则返回true,解包后的字符串在字符串out中

细绳解压缩(字符&gz[],布尔值打印时间=错误的,单位代码页=CP_ACP){}

返回字符串。如果解包失败,字符串将为空。

将数据串联成单个字符串时应小心。
如果您解压包含 0.5GB 数据的存档,则该字符串将需要另外 0.5GB,然后您可以将其拆分为字符串数组,这将需要另外 0.5GB。加上所有这些操作的时间成本。

从网站读取压缩数据然后从文件读取的示例用例:(此脚本附在附件中以供下载)

#财产版权 “版权所有 2023,森林人”
#财产关联      “https://www.mql5.com”
#财产版本  “1.00”

#包括
GZIP 压缩;空白 启动时(){
      打印“GZipped 网页读取示例:”);
      细绳网址=“https://…………”;
      字符出去[]; 
      如果(http_req(url, 输出,“得到”,“接受编码:gzip、deflate\r\n”,1,0)){
          如果(gzip.isGZIP(输出)){
            打印“检测到 GZIP”);
            细绳TXT;如果(!gzip.unGZIP(out, txt,1,CP_UTF8)){返回;}//CP_ACP            打印(TXT);
         }别的{
        打印“没有 GZIP”);打印字符数组转字符串(出去,0,整个数组,CP_UTF8));
         }
      }
      
      打印“文件读取示例:”);
      布尔值is_common=1;
      细绳fn=“3.csv.gz”;
      布尔值是_zip=1;

      整数小时;
      如果(是_zip){
         小时=文件打开(fn,文件读取|文件_BIN|文件读取|(常见吗?FILE_COMMON0));
      }别的{
         小时=文件打开(fn,文件读取|文件_CSV|文件_ANSI|(常见吗?FILE_COMMON0));
      }
      如果(h!=INVALID_HANDLE){
        打印“启动gzip”);
        字符gz[],tx[];
        文件读取数组(h、gz);文件关闭(h); 
         
        如果(gzip.isGZIP(gz)){
            打印“检测到 GZIP”);
            细绳文件名;
            如果(!gzip.unGZIP(gz, tx,fname,1)){返回;}
            //字符串txt; if(!unGZIP(gz, txt, 1, CP_ACP)){return;}//CP_UTF8            //字符串txt=unGZIP(gz, 1, CP_ACP);if(txt==""){return;}            如果(fname!=无效的){打印“文件名: ”,fname,”,文件大小:“,数组大小(TX));}
            细绳时间=  字符数组转字符串(TX,0,100);打印“过滤内容:”,t);t=  字符数组转字符串(TX,数组大小(TX)-100,100);打印“……”,t);

            //ulong mcs = GetMicrosecondCount();            //字符串csvRow[];int columns=0, next=0; char sep=',', newLine='\n';            //while(getCSVRow(tx, csvRow, columns, next, sep, newLine) && !IsStopped()){//获取下一行              // for(int c=0; c<列; c++){              //打印();              // }              //打印(下一个);            //}            //Print("CSV解析时间:",(GetMicrosecondCount()-mcs),"mcs");            //ArrayPrint(csvRow);        }别的{}
      }
}整数获取CSVRow(字符&csv[],细绳&outAr[],整数& 列,整数& 下一个,字符& 九月,字符&换行){//获取下一行  为了整数我=下一个;我<数组大小(csv);我++){
      如果(csv[i] == newLine){
         列=字符串分割字符数组转字符串(csv,下一个,i-下一个),sep,outAr);// 分别处理 1 行 - 比 parseCSV 快 5-10%,并且 e 有 1 个大数组的内存。         下一个=i+1;
        返回 真的;
      }
   }
  返回 错误的;
}布尔值http_请求(细绳网址,字符& 出去[],细绳方法=“得到”,细绳标头_请求=无效的,布尔值打印时间=错误的,布尔值调试=错误的){
  乌龙mcs = (打印时间?获取微秒计数():0);
  布尔值保留值=错误的;
  重置最后一个错误();
  字符数据[];细绳标题=无效的;
  整数r=网络请求(方法、网址、headers_request、5000、数据、输出、标题);
  如果(r==-1){打印“WebRequest 错误。错误代码 =”,获取最后一个错误());消息框“需要添加地址”+网址+“'到“顾问”选项卡中允许的 URL 列表”,“错误”,MB_ICONINFORMATION);}
  别的{如果(r==200){ retVal=  真的; }别的{打印格式“下载错误‘%s’,响应代码 %d”,网址,r);打印“WebRequest 错误。错误代码 =”,获取最后一个错误());}}如果(调试){打印格式“响应标头:%s\r\n响应:”,标题);打印字符数组转字符串(出去));}//  如果(打印时间){打印“网络请求时间:”,(获取微秒计数()-mcs),“MC”);}
  返回retVal;
}

此示例从 files 文件夹中读取一个文件,并将其解压缩到一个数组中。
打印解压文件中的前 100 个字符和最后 100 个字符。
然后可以将该数组发送到 CSV 或 JSON 解析器。对于 JSON,kodobase 中有 JASON 库。它可以解析作为字符数组接收的数据。

解压 120 MB 的压缩 CSV 文件时的输出示例,源文件为 463 MB:

2025.05.12 15:08:40.510    GZipped 网页读取示例:
2025.05.12 15:08:41.319    网络请求时间:809637 mcs
2025.05.12 15:08:41.319    检测到 GZIP
2025.05.12 15:08:41.319    解压缩时间:3 mcs
2025.05.12 15:08:41.319    {"retCode":0,"retMsg":"OK","re​​sult":{"category":"线性","list":[... Юя
2025.05.12 15:08:41.319    文件读取示例:
2025.05.12 15:08:41.320    启动 gzip
2025.05.12 15:08:41.384    检测到 GZIP
2025.05.12 15:08:42.582    解压时间:1198136 mcs
2025.05.12 15:08:42.593    文件名:BTCUSD2025-05-09.csv,文件大小:486006135
2025.05.12 15:08:42.593    Filr 内容:时间戳、符号、边、尺寸、价格、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 秒。

周末交易缺口,能盈利吗?

该 MQL5 自定义指标可检测价格行为与动量震荡指标 (AO) 之间的背离,从而发出潜在的市场反转或延续信号。它在图表上绘制买入/卖出箭头,将 AO 显示为直方图,并绘制趋势线以突出显示差异。

EXSR.mq5:一款反趋势 MT5 EA,通过将 RSI(14) 极值与布林带突破和反转烛台相结合来捕获反转,并为每个交易品种进行一笔固定止损/止盈交易。

TradeReportExporter 脚本旨在将交易历史记录导出到方便的 CSV 文件中。它会自动收集安装它的工具去年所有交易的数据。该文件包括日期和时间、交易类型(买入/卖出)、价格、交易量、佣金和利润/亏损等数据。结果保存在可以在 Excel 或任何其他电子表格编辑器中打开的文件中。


附件下载

📎 gzip_test.mq5 (3.05 KB)

📎 gzip.mqh (8.89 KB)

Source: MQL5 #59309

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录