- 显示:
- 97
- 等级:
- 已发布:
- 已更新:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
压缩勾选数据,以紧凑的形式存储,比 .tcs MQ 文件紧凑 3.5 倍。同时,由于读取 3 个字节所需的时间比读取 60 个字节的 MqlTick 结构所需的时间短,因此可以快速处理这些数据。
从截图中可以看到 2023 的文件大小,包括 Ask、Bid、time 和额外 ZIP 压缩的数据块:

2023 年 .tcs 格式的文件大小:

压缩 3.56 倍。
为了存储刻度,使用了卖出价和买入价与前一价格的差值。通常(高达 50...70% 的所有点差)不会超过 (-8...7) 点,可以用 4 位记录。卖出价和买入价合并为 1 个字节。
外加 1 个字节,用于存储 0 至 255 毫秒的时间差(代码中最高为 229,高于 229 的值用于编码超过 -8...7 点的刻度)。
如果价格或时间相差较大,则会打包到更多字节中。
为了进一步压缩,可以使用 ZIP 压缩。数据大小最多可压缩 2 倍。
或者,也可以将数据压缩为 3 个字节,将 -129 至 128 之间的 Ask 和 Bid 压缩为 8 位或 1 个字节。再加上 1 个字节的时间--大多数时间点的总计为 3 个字节。
有时(https://www.mql5.com/ru/forum/499639/page6#comment_58544810),如果压缩为 2 字节的刻度比压缩为 4 字节的刻度多,则压缩为 3 字节更有效。您必须查看仪器的统计数据。
您可以使用命令将最大压缩量切换为 3 字节:
#define compressTo3Bytes // 将刻度压缩为 3 字节而不是 2 字节。
以压缩形式存储的刻度元素
用于存储的勾选元素有 3 种:
- Ask, Bid, time_msc
- Ask, Bid, time_msc, volume_real
- 所有元素 Ask、Bid、Last、time_msc、volume_real、flags(int volume 根据 volume_real 计算)。
它们还可以另外压缩成 ZIP 格式。总共有 6 个变量
method=1;//1...6 BidAsk_=1, BidAskVolume_=2, All_=3, BidAsk_Zipped=4, BidAskVolume_Zipped=5, All_Zipped=6
在开始压缩之前,您需要将刻度存储的变量以及一些用于计算和价格正常化的标准参数传递给类。
TickCompressor Compressor2; double VolumeStep_=SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); Compressor2.Start(method,_Point,VolumeStep_,_Digits);
如果 "智能交易系统 "使用了标志,可以通过命令 "恢复 "价格变化。
#define RestoreFlags // 从改变要价、出价和成交量中恢复刻度标记 - 将使刻度生成时间从 869ms 增加 7% 至 931ms
压缩测试的智能交易系统已附上,它将提供有关速度和压缩率的统计数据。您可以看到压缩和解压缩刻度线的示例。
交易专家顾问的示例可在此处查看https://www.mql5.com/zh/code/65821。
2 字节和 3 字节压缩统计:
| 压缩至 2 字节: | 压缩至 3 字节 |
| 点数:47707712 压缩大小:135718404 将 2862666420 字节压缩为 135718404 字节 ==> 4.74% 压缩性能:764 MB/s 压缩性能:13.4 点数(百万)/秒。 压缩性能标准:281.7 解压缩性能:3550 MB/s 解压缩性能:62.0 Ticks(百万)/秒 解压缩性能标准:1308.8 来自专家的统计数据https://www。mql5.com/en/code/65821 for BTCUSDT -------------------- 统计数据: -------------------- 2 bytes: 70.1%, 50705359 ticks 4 bytes: 17.1%, 12350966 ticks 5 bytes: 12.7%, 9185484 ticks 6 bytes: 0.0%, 15274 ticks 11 bytes: 0.1%, 46214 ticks 12 bytes: 0.0%, 1 ticks 24 bytes: 0.0%, 1 ticks Total: 72303299 ticks, 197342036 bytes. Average: 2.729 bytes per tick UnZipped size: 197342036.已压缩大小:108302550。ZIP 压缩:54.9% 平均:每个刻度 1.498 字节 欧元兑美元 -------------------- 统计数据: -------------------- 2 字节:66.2%,29694779 个刻度 4 字节:2.3%,1022937 个刻度 5 字节:31.5%,14106637 个刻度 6 字节:0.0%, 25 ticks 7 bytes: 0.0%, 8 ticks 11 bytes: 0.0%, 800 ticks 12 bytes: 0.0%, 3 ticks 13 bytes: 0.0%, 4 ticks 24 bytes: 0.0%, 1 ticks Total: 44825194 ticks, 134023609 bytes. Average: 2.99 bytes per tick UnZipped size: 134023609.已压缩大小:95495454。ZIP 压缩率:71.3 % 平均:每个刻度 2.13 字节 | Ticks: 47707712 压缩大小:169378137 将 2862462720 字节压缩为 169378137 字节 ==> 5.92% 压缩性能:623 MB/s 压缩性能:10.9 Ticks (millions)/sec. 压缩性能标准:183.9 解压缩性能:3225 MB/s 解压缩性能:56.4 Ticks (millions)/sec. 解压缩性能标准:952.6 Correct = true Statistics from Experthttps://www.mql5.com/en/code/65821 for BTCUSDT -------------------- Statistics: -------------------- 3 bytes: 86.6%, 62644158 ticks 4 bytes: 0.6%, 412167 ticks 5 bytes: 12.7%, 9185484 ticks 6 bytes: 0.0%, 15274 ticks 11 bytes: 0.1%, 46214 ticks 12 bytes: 0.0%, 1 ticks 24 bytes: 0.0%, 1 ticks Total: 72303299 ticks, 236108596 bytes. Average: 3.266 bytes per tick UnZipped size: 236108596.已压缩大小:105802525。ZIP 压缩率:44.8% 平均:每个刻度 1.463 字节 欧元兑美元 3 字节:66.5%,29801633 个刻度 4 字节:2.0%,916083 个刻度 5 字节:31.5%,14106637 个刻度 6 字节:0.0%,25 个刻度 7 字节:0.0%, 8 ticks 11 bytes: 0.0%, 800 ticks 12 bytes: 0.0%, 3 ticks 13 bytes: 0.0%, 4 ticks 24 bytes: 0.0%, 1 ticks Total: 44825194 ticks, 163611534 bytes. Average: 3.65 bytes per tick UnZipped size: 163611534.已压缩大小:96541155。ZIP 压缩率:59.0% 平均:每个刻度 2.154 字节 |
代码示例
刻度压缩
逐块压缩:
int ZIPpos=0;//压缩字节计数器 if(Amount>ticks_per_block){// > 1 个区块 - 从 tmp 到 Ticks2 的粘合区块 for(int start=0; start<Amount; start+=ticks_per_block){ Compressor2.Compress(Ticks, tmp, start, (Amount > start + ticks_per_block ? ticks_per_block : Amount - start)); ZIPpos+=ArrayCopy(Ticks2,tmp,ZIPpos); //复制到 Ticks2 的末尾 } }else{//1 块 - 直接解包为 Ticks2 Compressor2.Compress(Ticks, Ticks2, 0, Amount); }
如果设置 1 个块中的刻度数大于数组中的刻度总数,则会压缩为 1 个块。
如果总是需要压缩成 1 个块,可以使用
Compressor2.Compress(Ticks,Ticks2);
但这样一个大块或超大块的解压缩速度可能会慢 2 倍。此外,大数据块还会消耗大量内存。
解压缩
解压缩时,最好能知道打包的刻度数。接收器数组必须有这样的大小。
ArrayResize(Ticks3,Amount); 例如,可以将大小保存在文件中。然后在解包时使用。
如果大小未知,可以在循环中根据块中的刻度数改变大小。
//减慢速度 ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //调整大数组的大小--比覆盖小块的速度慢
这段代码逐块获取刻度。如果只有一个大块,它也能正确计算。刻度点不会被收集到一个大数组中,而是可以立即被你的 Strategy(Ticks3[j]) 策略处理;
while (ZIPpos<ArraySize(Ticks2)){ nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//调整下一个区块的大小,将 ZIPpos 增加 4 uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // 将新区块复制到 tmp,大小为 nextSize //slower by the factor of 3 ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //resize a large array - works slower than overwriting a small block //total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//unpack the block and add it to Ticks3. total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); // 取消打包该代码块,并在 Ticks3 中覆盖它 ZIPpos+=nextSize; for (int j = 0; j < ticks; j++){ Strategy(Ticks3[j]);}//战略 };
将所有区块中的点数收集到一个大数组中:
while (ZIPpos<ArraySize(Ticks2)){ nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//调整下一个区块的大小,将 ZIPpos 增加 4 uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // 将新区块复制到 tmp,大小为 nextSize //slower ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //resize a large array - works slower than overwriting a small block total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//解包区块并将其添加到 Ticks3 中 //total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //unpack the block and overwrite it in Ticks3 ZIPpos+=nextSize; //for (int j = 0; j < ticks; j++){ Strategy(Ticks3[j]);}//strategy };
或单行。只记录 1 个区块。如果更多,则使用上述 2 种代码变体。
total_ticks=Compressor3.DeCompress(Ticks2,Ticks3);
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/66201
Report by Magic and currency MT5 indicator for account PNL and trade statistics exported to CSV
将全面的交易统计数据导出到 CSV 文件。
Daily Lot Statistics
现代指标,可直接在 MT5 图表上显示每日交易统计数据。通过漂亮的扁平化设计面板显示每天的交易手数、订单数和盈亏情况,跟踪您的交易表现。
Titik Impas Breakeven
手动调整单笔交易的止损以匹配其开盘价是一项相对简单的任务,但单独管理众多头寸则会非常繁琐且耗时。适用于 MT4/MT5 的 Titik Impas 盈亏平衡脚本简化了这一过程,为交易者处理多个仓位提供了效率和便利。
ATR Weighted Moving Averages
这是一个计算 ATR 加权移动平均线的指标。