文章 "开发回放系统 — 市场模拟(第 01 部分):首次实验(I)"

 

新文章 开发回放系统 — 市场模拟(第 01 部分):首次实验(I)已发布:

如何创建一个系统,让我们在闭市后也能研究市场,甚至模拟市场情况? 在此,我们将开始一系列新的文章,在其中我们将应对这个主题。

此段代码将创建周期为 1 分钟的柱线,这是平台创建任何其它周期图表的最低要求。 高亮显示的部分并非代码本身的一部分,但对于分析 1 分钟柱线很有用。 我们需要检查它是否真的在此时间帧内创建。 因为如果创建时间超过 1 分钟,我们就不得不对此做点什么。 如果在不到一分钟的时间内创建它,这可能表明该系统立即可用。

执行此系统后,我们会得到以下视频中显示的结果:



作者:Daniel Jose

 

下面的代码有什么意义?

 17        struct st00
 18       {
 19           datetime dt;
 20           int      milisec;
 21           double   Bid,
 22                    Ask,
 23                    Last;
 24           long     Vol;
 25           uchar    flag;
 26       }st00 m_ArrayInfoTicks[];
 53      m_ArrayInfoTicks[m_ArrayCount].dt = macroRemoveSec ( StringToTime ( StringSubstr (szInfo, 0 , 19 ))); 
 54      m_ArrayInfoTicks[m_ArrayCount].milisec = ( int ) StringToInteger ( StringSubstr (szInfo, 20 , 3 ));   
如果在第 53 行中删除了秒,那么在第 54 行中毫秒和毫秒的使用就失去了意义。
不过,你还是将它们添加到了结构中。
定时器事件是独立产生的。每个刻度都是根据计时器来计算的,而不是以毫秒和秒(已删除)为单位。
毫秒现在就像额外的内存空间一样沉重。以及不必要的填充操作。
 
此外,您还没有解决另一个可以减少分钟柱状图结构的问题。
例如,用红色和蓝色标出的时间是相同的,而最后的价格可能相同,也可能不相同。
可以压缩这些刻度线,大大减少构建分钟柱状图所需的时间。
 449      2021.10 . 22        09 : 00 : 38.649      107900    107905                    6
 450      2021.10 . 22        09 : 00 : 38.651                      107900    1.00000000        88
 451      2021.10 . 22        09 : 00 : 38.651                      107895    5.00000000        88
 452      2021.10 . 22        09 : 00 : 38.651                      107890    5.00000000        88
 453      2021.10 . 22        09 : 00 : 38.651                      107885    3.00000000        88
 454      2021.10 . 22        09 : 00 : 38.651                      107880    15.00000000       88
 455      2021.10 . 22        09 : 00 : 38.651                      107880    3.00000000        88
 456      2021.10 . 22        09 : 00 : 38.651                      107875    16.00000000       88
 457      2021.10 . 22        09 : 00 : 38.651                      107870    2.00000000        88
 458      2021.10 . 22        09 : 00 : 38.654                      107875    1.00000000        88
 459      2021.10 . 22        09 : 00 : 38.654                      107875    1.00000000        88
 460      2021.10 . 22        09 : 00 : 38.654                      107880    1.00000000        88
 461      2021.10 . 22        09 : 00 : 38.659                      107880    2.00000000        88
 462      2021.10 . 22        09 : 00 : 38.659                      107885    2.00000000        88
 463      2021.10 . 22        09 : 00 : 38.660                      107885    1.00000000        88
 464      2021.10 . 22        09 : 00 : 38.660                      107890    3.00000000        88
 465      2021.10 . 22        09 : 00 : 38.662                      107885    3.00000000        88
 466      2021.10 . 22        09 : 00 : 38.662                      107880    3.00000000        88
 467      2021.10 . 22        09 : 00 : 38.662                      107875    2.00000000        88
 468      2021.10 . 22        09 : 00 : 38.662                      107895    3.00000000        88
 469      2021.10 . 22        09 : 00 : 38.662                      107900    1.00000000        88
 470      2021.10 . 22        09 : 00 : 38.664                      107880    1.00000000        88       
但是,你在第 53 行删除了秒。

53      m_ArrayInfoTicks[m_ArrayCount].dt = macroRemoveSec ( StringToTime ( StringSubstr (szInfo, 0 , 19 ))); 
54      m_ArrayInfoTicks[m_ArrayCount].milisec = ( int ) StringToInteger ( StringSubstr (szInfo, 20 , 3 ));   
而在第 54 行留下了毫秒。
这使得你无法准确执行压缩。毫秒与秒之间没有绑定,它已被移除。
当然,毫秒值移动到下一秒,甚至在下一个刻度中继续移动的可能性很低。但它确实存在。
只有在从分钟条 移动 到下一个分钟条时,才能保证 100% 的准确性 - 毫秒与分钟之间存在绑定。
 
你需要毫秒来压缩未来的刻度吗?我的理解对吗?
嗯,"未来"--对我来说--我还没读下去。我想,对你来说,这已经是 "过去 "了......)))
如果是这样,那么我同意可以去掉秒针--巧合的可能性极低。)
 
哦,奇迹出现了!如果压缩毫秒,那么分烛的形成时间就是 00:01:06。对阵 00:01:52 - 未压缩。我们赢了 46 秒!)))
 

因此,在进行了所有编辑之后。


共设立了 1153 809 个流动职位。

删除的刻度 = 1066231

检查 执行速度 .2023.12.02 01:52:21 ---- 2023.12.02 01:53:17

建立第一根蜡烛的时间:00:00:56 秒。)

我们赢了 56 秒!

刚好一半
 

感谢您的出色工作!

我有一个问题。有没有可能在重播中增加倒带选项?我的意思是回到之前的蜡烛,然后重新播放。