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

TickCompressor - MetaTrader 5 脚本

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

TickCompressor - script for MetaTrader 5

TickCompressor - script for MetaTrader 5

在 MQL 中,报价存储在一个特殊的结构中 - MqlTick。这是通用的,但有点胖。如果您的算法处理大型刻度数组,则可能会成为 RAM 短缺的原因。 TickCompressor 类提供了一个简单的解决方案来最小化内存利用率。 

它不是标准结构 MqlTick,而是提供使用 2 种新数据类型:用于外汇/差价合约的 MqlTickBidAsk 和用于交易所的 MqlTickBidAskLastVolume,以及一系列在它们之间来回转换的方法。

让我们比较标准 MqlTick 和迷你刻度结构。

结构体 MQTick{ 
  日期时间     时间;
  双倍的       出价;
  双倍的       问;
  双倍的       最后的;
  乌龙        体积;
  长的         时间_MSC;
  单位         旗帜;
  双倍的       实际体积;
};

“time”字段过多,因为它重复了“time_msc”,但精度较低。

事实上,价格字段不必是双倍的。对于大多数符号来说,float 类型已经足够了。当涉及到价格计算时,确实 double 是必须的,但只要是被动存储的问题,float 就可以胜任。

此外,对于中心化市场(而非交易所)的交易品种,“last”价格始终为 0。此外,“volume”和“volume_real”也未使用。

最后,“flags”字段可以轻松放入 ushort 中。

因此,外汇和差价合约的 MqlTickBidAsk 看起来相当精简。 

结构体MqlTick买价
{
  漂浮      出价;
  漂浮      问;
  长的       时间_MSC;
  超短     旗帜;
};

MqlTickBidAskLastVolume 更详细,但仍然紧凑。 

结构体MqlTickBidAskLastVolume
{
  漂浮      出价;
  漂浮      问;
  漂浮      最后的;
  乌龙      体积;
  长的       时间_MSC;
  超短     旗帜;
};

实际上,在这两种情况下,我们都可以使用“ushort spread”代替“float Ask”,并从“bid”构建“ask”,但它保留为一个选项。

测试脚本将原始和缩小的刻度输出到日志中。

TickCompressor - script for MetaTrader 5

对于 GBPUSD,它使用 MqlTickBidAsk,对于 S&P 500 迷你期货,它使用 MqlTickBidAskLastVolume。

如您所见,MqlTickBidAsk 比 MqlTick 小 3 倍,MqlTickBidAskLastVolume 小 2 倍。

滴答压缩器可以提供帮助的领域之一是使用滴答数组进行虚拟测试和优化。例如,图书馆虚拟的提供了虚拟交易的方法:

静止的 整数测试仪(常量 MQTick刻度线(&T)[], ...)

其中 Ticks 数组应通过调用代码在内存中提供。

如果一个策略要在很长的历史(几年)上进行测试,tick 数组可以轻松增长到许多 Gb 并超过物理 RAM。在这种情况下,可以存储缩小的数组(压缩的刻度),然后修补虚拟库以通过解压缩消耗迷你刻度,保持所有内部逻辑完好无损(与标准刻度相同的方式)。

  #ifdefTICK_COMPRESSOR
  模板<类型名TC>
  静止的 整数测试仪TC(常量TC &Ticks[],常量战略 战略,常量 双倍的余额=DBL_MIN,常量 布尔值停止=真的,常量 布尔值b净额结算=错误的)
  {
    常量 整数句柄 = VIRTUAL::GetHandle();
    常量 布尔值资源=::数组大小(刻度)&& VIRTUAL::SelectByHandle(VIRTUAL::Create(余额,(刻度[0].time_msc/1000/(24*3600)) * (24*3600), b净额结算));

    如果(研究)
    {
      VIRTUAL::NewTickTC(报价,策略);

      如果(停止)
        虚拟::停止();
    }

    返回(资源?句柄:-1);;
  }
  
  模板<类型名TC>
  静止的 空白NewTickTC(常量TC &Ticks[],常量策略 策略 =无效的)
  {
    如果(虚拟::选择订单)
    {
      常量 整数尺寸=::数组大小(蜱);
      
      MQTick结果;

      如果(战略)
      {
        为了整数我=0; (i < 大小)  && (!::已停止());我++)
        {
          TickCompressor::解压缩(Ticks[i], 结果);
          VIRTUAL::SelectOrders.NewTick(结果);

          战略();
        }
      }
      别的      {
        为了整数我=0;我<尺寸;我++)
        {
          TickCompressor::解压缩(Ticks[i], 结果);
          VIRTUAL::SelectOrders.NewTick(结果);
        }
      }
    }
  }
  #endif

此外,刻度压缩器可用于以更紧凑的方式将刻度数组存储在文件中。


附件下载

📎 tickcompressor.mq5 (1.64 KB)

📎 tickcompressor.mqh (4.61 KB)

Source: MQL5 #30791

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