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

适用于时间敏感应用程序的高性能 iTimeSeries - MetaTrader 5 库

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

High-performance iTimeSeries for time-sensitive applications - library for MetaTrader 5

High-performance iTimeSeries for time-sensitive applications - library for MetaTrader 5

MQL5 的主要问题之一是删除了内置时间序列函数。虽然这样做给程序员提供了更有限的开发自由度,但由于每次需要访问某些时间序列数据时都需要创建和销毁新的内存位置,因此也减慢了速度。

...
  如果复制时间(符号、时间范围、时间、1,检查蜡烛)==1)
     {
...

让我们看一下流行的 iBarShift 算法。为了按日期时间返回柱的索引 - 我们首先必须调用::CopyTime(...),它创建一个动态数组,调整其大小,复制数据,然后将其销毁在内存中。对于一些偶然的调用来说这不是问题,但由于时间序列函数通常在许多不同的时间范围内被调用多次,因此这种内存开销可能会增加,从而导致速度显着减慢。考虑一下每次程序使用这些类型的方法调用任何时间序列数据时分配新内存所需的所有潜在的臃肿开销和资源浪费。

为了加快速度,该库实现了标准库的 CObject 和 CArrayObj 类来复制费率数组一次,然后从该特定交易品种和周期的所有时间序列调用中重新访问它。这可能是一把双刃剑,因为初始化阶段比典型实现花费的时间更长,但所有后续调用都可以在大约 1/100 的时间内访问数据。在 iBarShift() 的示例中,这种新算法通过创建一个 int[] 数组来更快地工作,该数组将柱的索引整数存储在数组中,然后使用时间(转换为 int 类型)作为数组地址来访问它。换句话说,您将时间作为访问数据的直接地址传递。

这给我们带来了一些警告:

大部分时间消耗在初始化阶段。如果您不打算访问时间序列数据超过几千(总计)次每期栏您可能需要考虑另一种方法。

CiTimeSeries 类的对象设置为在形成新柱时自动刷新存储的数据。将其设置为“false”将使对象进入高性能模式允许从关键任务“热路径”进行闪电般的快速呼叫,但在后续维护周期中需要手动刷新。

#包括//--- iTimeSeries 对象的全局声明CiTime系列iBar;整数 初始化时()
{//--- 初始化阶段   iBar.Init(  无效的,
              PERIOD_CURRENT,              错误的  //布尔值自动刷新                             );//---  返回初始化成功);
}//+------------------------------------------------------------------+
//|专家勾选功能                                            |
//+------------------------------------------------------------------+
空白 勾选()
{//---  如果(热路径操作)
   {  //例子      索引 = iBar.Shift(时间);
   }
  别的 如果(维护路径操作)
   {
      iBar.Refresh();   
   }
}

此外,您可以直接调用全局函数(就像在 MQL4 中一样),而无需实例化 CiTimeSeries 对象,但首次访问时间会很慢,因为它必须首先在幕后初始化全局对象。如果您只调用任何时间序列函数几次,以这种方式使用该库可能会更慢,但是,当您的算法需要从同一交易品种+周期集中调用 (>) 数千次时间序列数据迭代时,会具有明显的性能优势。

(当前)最流行的 iBarShift 算法的开发人员为“​​iBarShift”进行了竞争性基准测试,您可以在这里找到https://www.mql5.com/en/code/1864

High-performance iTimeSeries for time-sensitive applications - library for MetaTrader 5

由于这是最准确和最快的方法(在撰写本文时),我决定使用它作为测试基准。

High-performance iTimeSeries for time-sensitive applications - library for MetaTrader 5

100,000 次直接(全局)函数调用的计算时间为速度提高 50 倍比当前可用的最快方法,而在“性能模式”下初始化后调用公共方法是速度快 100 倍以上

可用的公共方法和全局函数:

注意:全局函数与 MetaTrader 4 相同,例如iBarShift、iTime 等

//--- 初始化一个交易品种和周期;将性能模式的自动刷新设置为 false  布尔值              初始化(细绳            符号=无效的,
                          ENUM_TIMEFRAMES   期间      =PERIOD_CURRENT,
                          常量 布尔值        自动刷新=真的   );//--- 初始化一个交易品种和 ENUM_TIMEFRAMES 数组中的所有周期;将性能模式的自动刷新设置为 false  布尔值              初始化(细绳            象征,
                          ENUM_TIMEFRAMES   &时期[],
                          常量 布尔值        自动刷新=真的   );


//--- 初始化所有周期  布尔值初始化所有期间 (  细绳            符号      =无效的,
                        常量 布尔值        自动刷新=真的);


//--- 将自动刷新设置为 false 以手动管理数据刷新  空白              自动刷新(常量 布尔值 参考) { m_autoRefresh=参考;     }
  布尔值              自动刷新()常量{返回m_autoRefresh;          }


//--- 手动刷新调用;刷新所有初始化周期的数据  布尔值              刷新();



附件下载

📎 itimeseries_nicholishen_v2.mqh (42.05 KB)

📎 itimeseries_example_1.mq5 (4.5 KB)

Source: MQL5 #18305

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