股票量化软件:赫兹量化中添加价格成交量
我们的 EA 已经具有了一些帮助交易的资源 — 我们在之前的文章中已陆续把这些资源加入。 然而,该 EA 在可视化和调整大小方面存在一些问题。 它们不会干扰交易,但在某些情况下,却会导致屏幕上出现混乱,直到您强制刷新屏幕。 此外,还缺少一些可以为我们提供有价值信息的东西。 这些都是具体的事情,但信息可能是必要的。
那么,我们开始实现这些新的改进。 这篇有趣的文章可以提供一些展示信息的新思路和方法。 与此同时,它能帮助修复项目中的小缺陷。
规划和实施新的价格成交量函数
1. 计划关于交易这是一件挺好奇的事情。 我们经常看到市场在某些价格区域堆积,当买入或卖出方触发止损时,价格会快速波动。 这种走势可以通过时序与交易(Times & Trade)。 我们在之前的文章时序与交易(I)和 时序与交易(II)中曾研究过这些。 在这些文章中,我们研究了如何创建一个替代图形系统,来读取和分析已执行的订单流。 如果您仔细观察,您会注意到,在某些时刻,价格往往会回到堆积区域,在该处它并不打算即刻离开。 但当我们观察价格成交量指标时,很难判定这个特定区域的价格在最近会有多大变化。 该指标已在文章添加价格成交量(I)中实现。 使用它,我们可以通过简单地更改分析起点,来分析最近的相对走势,而通过调整下图中所示对象的值也可完成:
实现
分析之前首先要做的是跟踪时间设置多久,您也许会设置 60、45、30、19、7 还是 1分钟。 尽管如此,我们建议使用足够倍数的值,以便跟踪系统真正有用。 出于实际原因,我们将采用 30 分钟跟踪来实现它,因此我们将在以下代码行中定义它:
#define def_MaxTrailMinutes 30
但为什么要恰恰是 30 分钟? 实际上,跟踪系统每分钟执行一次,但最长跟踪时间为 30 分钟。 即,您将始终有 30 分钟的跟踪,例如,当跟踪切换到第 31 分钟时,则首个交易分钟将不再显示。 它是如何实现的? 所用的捕获系统如下所示:
inline void SetMatrix(MqlTick &tick) { int pos; if ((tick.last == 0) || ((tick.flags & (TICK_FLAG_BUY | TICK_FLAG_SELL)) == (TICK_FLAG_BUY | TICK_FLAG_SELL))) return; pos = (int) ((tick.last - m_Infos.FirstPrice) / Terminal.GetPointPerTick()) * 2; pos = (pos >= 0 ? pos : (pos * -1) - 1); if ((tick.flags & TICK_FLAG_BUY) == TICK_FLAG_BUY) m_InfoAllVaP[pos].nVolBuy += tick.volume; else if ((tick.flags & TICK_FLAG_SELL) == TICK_FLAG_SELL) m_InfoAllVaP[pos].nVolSell += tick.volume; m_InfoAllVaP[pos].nVolDif = (long)(m_InfoAllVaP[pos].nVolBuy - m_InfoAllVaP[pos].nVolSell); m_InfoAllVaP[pos].nVolTotal = m_InfoAllVaP[pos].nVolBuy + m_InfoAllVaP[pos].nVolSell; m_Infos.MaxVolume = (m_Infos.MaxVolume > m_InfoAllVaP[pos].nVolTotal ? m_Infos.MaxVolume : m_InfoAllVaP[pos].nVolTotal); m_Infos.CountInfos = (m_Infos.CountInfos == 0 ? 1 : (m_Infos.CountInfos > pos ? m_Infos.CountInfos : pos)); m_Infos.Momentum = macroGetMin(tick.time); m_Infos.Momentum = (m_Infos.Momentum > (def_MaxTrailMinutes - 1) ? m_Infos.Momentum - def_MaxTrailMinutes : m_Infos.Momentum); if (m_Infos.memMomentum != m_Infos.Momentum) { for (int c0 = 0; c0 <= m_Infos.CountInfos; c0++) m_TrailG30[m_Infos.Momentum].nVolume[c0] = 0; m_Infos.memMomentum = m_Infos.Momentum; } m_TrailG30[m_Infos.Momentum].nVolume[pos] += tick.volume; }