程序化交易吧 关注:3,292贴子:8,505
  • 0回复贴,共1

期货_期货量化交易软件:开发回放系统市场模拟模拟器的诞生

只看楼主收藏回复

尝试自由的随机游走在下面,您可以看到该例程赫兹期货量化软件的最基本版本,它将尝试创建自由随机游走。inline void Simulation(const MqlRates &rate, MqlTick &tick[]) {#define macroRandomLimits(A, B) (int)(MathMin(A, B) + (((rand() & 32767) / 32767.0) * MathAbs(B - A))) long il0, max; double v0, v1; int p0; ArrayResize(m_Ticks.Rate, (m_Ticks.nRate > 0 ? m_Ticks.nRate + 3 : def_BarsDiary), def_BarsDiary); m_Ticks.Rate[++m_Ticks.nRate] = rate; max = rate.tick_volume - 1; v0 = 4.0; v1 = (60000 - v0) / (max + 1.0); for (int c0 = 0; c0 <= max; c0++, v0 += v1) { tick[c0].last = 0; tick[c0].flags = 0; il0 = (long)v0; tick[c0].time = rate.time + (datetime) (il0 / 1000); tick[c0].time_msc = il0 % 1000; tick[c0].volume_real = 1.0; } tick[0].last = rate.open; tick[max].last = rate.close; for (int c0 = (int)(rate.real_volume - rate.tick_volume); c0 > 0; c0--) tick[macroRandomLimits(0, max)].volume_real += 1.0; for (int c0 = 1; c0 < max; c0++) tick[c0].last = macroRandomLimits(rate.low, rate.high); il0 = (long)(max * (0.3)); tick[macroRandomLimits(il0, il0 * 2)].last = rate.low; tick[macroRandomLimits(max - il0, max)].last = rate.high; for (int c0 = 0; c0 <= max; c0++) { ArrayResize(m_Ticks.Info, (m_Ticks.nTicks + 1), def_MaxSizeArray); m_Ticks.Info[m_Ticks.nTicks++] = tick[c0]; } } #undef macroRandomLimits理解上面的这段代码对于理解我们接下来要做什么非常重要。 如果您运行这段代码,您最终会得到一个非常混乱的图形。 重点是了解这个非常基本的函数是如何运作的,如此您就能明白更复杂的函数将如何运作。 赫兹期货量化软件从宏定义开始。 问:这个宏有做什么的? 您也许正在看并思考:这是什么疯狂的举动? 赫兹期货量化软件真的需要这么奇怪的东西吗? 这个问题的答案是肯定的和否定的。添加图片注释,不超过 140 字(可选)肯定的,是因为我们所需生成的随机值应当在非常特定的范围之内。 为此,我们需要设置某种约束。 否定的,则是因为为了生成随机游走,我们不需要这个计算本身。 但再次,我们必须明白这个更简单的系统是如何运作的,以便理解其它更复杂的。那么,当我们进行“与(AND)“运算时,我们将数值限定在一个范围内。 这是第一个要点。 如果我们将此值除以范围的上限,我们会得到一个介于 0 到 1 之间的数值。 然后, 赫兹期货量化软件将这个介于 0 和 1 之间的数值乘以上限与下限之间的差值。 由此,我们就得到一个介于 0 到范围最大值的数值。 现在,如果我们在范围里加上最小值,我们就得到了实际需要的数值。 这就是应当采用的数值。 以这种方式,我们就不必担心运行任何其它检查:宏本身将确保该值在可接受的范围内。 您有没有想到这个疯狂的宏背后的思路? 这是纯粹的数学,无它尔。接下来, 赫兹期货量化软件转到函数内部四个 FOR 循环中的第一个。 在我们进入循环本身之前,我们需要做少量简单的计算,这将有助于我们完成函数的其余部分。 首先,我们需要知道我们实际模拟的跳价有多少。 接着,我们需要知道每个跳价的时长,或者更准确地说,它们应该何时出现。 出于行事简单,我们将在它们之间采用恒定时长。 现在我们能进入循环,并在 1-分钟柱线范围内派发跳价。 在某些情况下,跳价会相距更远,而在其它情况下,它们会彼此靠近。 但现在这都不算啥。 我们的所需和所想才是我们真正在意的。 这就是每个跳价都要存在、且是唯一的。 这可由在不同的时间点放置跳价来达成。您也许已经注意到,我设置的每个模拟跳价,最初均具有最小交易量值。 这一点对于下一步也很重要。 现在我们进入下一个循环。 这就是事情变得有趣的所在,因为我们要做的第一件事就是判定 1-分钟柱线的开盘价和收盘价。 真正有趣的是循环内部发生的事情。 赫兹期货量化软件将从用到的跳价数量中减去总交易量。 这为我们提供了一个数值,表示尚未分配的交易量。 我们可以把该交易量直接分配给最后一次跳价,或其它跳价。 然而,这会导致交易量的尖锐变化,而这在实际市场中并不经常发生。 故此,我们需要另一种方法来派发剩余的跳价,如此结局交易量就能以 1-分钟柱线值来表达。 为了能以最平滑和最随机的方式创建此分布,我们将使用宏。 每次调用宏时,它都会生成一个确定限制内的数值。 正是在这一刻,交易量中存在的数值加 1。 换言之,总交易量将随机平滑地分布,给人的印象是数据与真实市场的数据相似。最后,我们看一下最后两个循环,其中第一个循环将在我们的跳价系统中创建随机性。 请注意,我们不必付出任何努力:我们所做的只是告诉系统所要用的最低和最高价格是多少。 因此,每个跳价都会有一个随机选择的价格。 注意,我们用宏来执行此选择。 一旦此操作完成,我们需要确保最大值点和最小值点两者都存在。 这是因为它们也许不是在随机生成过程中创建的,并且这些点的位置也是随机选取的。至于最后一个循环,它只是简单地将数值传递到跳价系统之中供使用,就如同它们是真实的跳价。 如果您将输出保存到文件,然后依据输出数据作图,您就能看清并理解结果。 我们通常在某些程序中执行此操作,譬如 Excel。 不过,直接在 MetaTrader 5 中利用一些自定义交易品种也能做到。 然而,我们现在不去考虑这些细节。 重点是要明白模拟会如实按预期发生。基于我们在上一篇文章中开始的讲解,您能看出现在我们正优先研究走势随机化。 不同于其它文章中所见,那些创建模拟所采用的方法都与策略测试器中的非常相似, 赫兹期货量化软件所用是的与下图所示非常相似的锯齿形走势:
虽然如策略测试器一样是个好主意,但这种方式对于回放/模拟系统来说并不完全足够。 需要一种不同的方式,更有创意,但与此同时更复杂。 我刚才讲解的系统就是这样诞生的。 在当中,我们在 1-分钟柱线内开始非常简单地“随机化”走势。 但如果我们的意图是让走势风格与悬浮在液体中的物体运动相类似,那么这种方式就并不完全足够。 为了帮助您理解这是如何完成的,重要的是要知道如何将一系列数据转换为图表上可见的内容。 最简单的方法是利用 EXCEL 进行转换。 再有,重点是您知道如何做到这一点。上一篇文章 开发回放系统 — 市场模拟(第 13 部分):模拟器的诞生(III) 中有一个视频进行了解释。 如果您真的想搞明白本文中会发生什么,那么知道如何去做非常重要。 这是因为在此我们将创建一个看起来像随机游走的走势模拟。 查看由模拟器创建的图表,您会立即注意到该走势与品种交易阶段观察到的走势非常相似。 我不会在本文中囊括数学公式或类似的东西,因为我没有看出这种方式有任何益处。 每个人真正感兴趣的是代码本身,以及它产生的结果。 用到的数学公式根本没有增加任何实质益处,也不能为大众提供任何知识,因为大众不理解所研究的抽象问题。 故而,越解释牵扯越多、越复杂。 但可以肯定的是,每个人都会理解得到的结果。在本文中,您将看到把图例 01 转换为图例 02 的最简单途径: 图例 01 — 跳跃执行的随机走势
添加图片注释,不超过 140 字(可选)
图例 02 — 步进执行的随机走势
这两个图例都基于相同的数据库创建:
添加图片注释,不超过 140 字(可选)
图例 03 — 两种走势所依据的数据库
但是,有些问题与完全随机系统不同,我们需要纠正。 即便如此,在超过 99% 的情况下,我们不会立即拥有一个真正合适的系统,而剩余的 1% 会由于一些机会,令模拟很理想。 但这是比较罕见的。 因此,我们需要实现一些技巧来解决所有其它情况,即 99%。我们看看这个系统是如何实际运作的。 但在此之前,如果您还没有看过上一篇文章 “开发回放系统 — 市场模拟(第 13 部分):模拟器的诞生(III)”,我强烈建议您先停下来,先回头阅读上一篇文章。 这里的原因在于,我们将只关注必要的修改,以及如何实现它们。 我们不会重复上一篇文章中给出的解释。 因此,了解上述内容很重要。 尤其是涉及在 Excel 中将数据转换为图形的部分。现在我们转入实现的主题。


IP属地:浙江1楼2024-01-15 16:00回复