900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 股票量化交易软件:以 delta 指标为例开发股票交易量控制指标

股票量化交易软件:以 delta 指标为例开发股票交易量控制指标

时间:2024-06-20 12:10:28

相关推荐

股票量化交易软件:以 delta 指标为例开发股票交易量控制指标

概述

正如我们所知道的,赫兹股票量化广播两类交易量。:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

tick(逐笔报价) 交易量, 即柱线形成过程中收到的逐笔报价 (报价数据变化) 的次数;

real(实际) 交易量, 即柱线形成期间抵达得的交易次数。

在终端中,实际交易量被简单地表示为交易量。 它才是我们感兴趣的。 由于终端历史记录的特点,以及时间和买卖,现在有可能将其开发为股票指标。 它们令我们能够看到“幕后”正在发生的事情,即实际成交量由什么组成:成交量和交易频率,以及特定时期买卖双方的相关性。 这意味着我们现在可以将交易量扩展为组件。 这些数据可以显著提高我们的交易预测准确性。 同时,与常规方法相比,开发这样的指标更困难。 本文详细介绍了股票指标开发的先后顺序和细微之处,以及它们的工作特点和测试特点。 作为一个示例,赫兹股票量化将依据实际交易量开发买入和卖出交易量的 delta(差值)指标。 所开发的指标,其依据逐笔报价的工作规则也会一同说明。

然而,赫兹股票量化应该记住,只有在集中式(交易所)市场上才有真正的交易量。 这意味着它不能用于金融市场,因为那是场外交易市场。 我们将通过莫斯科交易所衍生品市场(FRTS)的示例来研究实际成交量。 如果您对 FORTS 不熟悉,我强烈推荐您阅读有关 兑换定价 的文章。

目标读者

有关逐笔报价数据的问题近来在 论坛 中已相当普遍。 这种功能相对来说是新出现的,并且在不断改进。 首先,本文旨在帮助那些已经知道如何编写指标,并愿意提高 MetaTrader 5 应用程序开发技能的程序员。 那些希望掌握股票市场,以及对涉及 delta 指标 和/或 类似逐笔报价指标分析的交易员,都会对本文感兴趣。

1. 准备。 选择服务器

矛盾的是,开始开发指标时应从选择交易服务器起始。 股票指标精准运行的必要条件:券商的服务器应可持续更新数据。 不幸的是,券商的服务器版本没有广播,并且难以立即解释数据是否准确。

希望市场深度能帮助赫兹股票量化解决这个问题。 若要打开它,请单击左上角金融产品名称附近的表格图标(如果没有显示,请检查“查看”选项卡上的“显示快速交易按钮”(F8)选项是否被选中)或按 Alt+B。 在市场深度窗口中,点击“显示时间和买卖”按钮。 此外,请确保未使用右键单击表格来设置最小交易量过滤器。

如果服务器没有更新数据,它会向市场深度广播所谓的“不确定方向”成交。 赫兹股票量化来更详细地查验它们。 每笔业务都有一个发起人:买方或卖方。 这意味着业务属性(买入或卖出)应可清晰地指明。 如果成交方向没有确定(在市场深度中标记为 N/A),这会影响由该指标计算的 delta(买卖交易量之间的差值)构造精度。 以下提供了更新和未更新的市场深度(图例 1):

编辑

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

图例 1. 更新的 (左侧) 和旧的 (右侧) 市场深度

规则 1. 检查服务器是否更新。

此外,我强烈建议选择一个响应速度快的服务器。 ping 值越低,终端就能够更快地与券商服务器交换数据。 如果赫兹股票量化深入观察图例 1,赫兹股票量化广播精度为毫秒级,因此 ping 值越小,您获得并处理成交数据的速度就越快。 在终端的右下角检查连接当前服务器(如果需要的话更改服务器)的 ping 值:

编辑

添加图片注释,不超过 140 字(可选)

图例 2. 选定服务器的延迟为 30.58 毫秒。

此外,请注意,客户终端应该更新为构建 1881 或更高版本,因为这个构建修复了关于逐笔报价数据的所有当前已知错误。

2. 获取逐笔报价的方法。 MqlTick 格式

假设赫兹股票量化选择了一台服务器为我们提供正确的逐笔报价历史数据。 我们如何获得历史数据? MQL5 语言具有两个函数:

CopyTicks() 意指从某个日期获得必要大小的逐笔报价;

CopyTicksRange() 是指在某个日期范围内获取逐笔报价。

我们的指标将需要全部两个函数。 它们将允许我们按照 MqlTick 格式获取逐笔报价。 这种结构存储数据的时间、价格、交易量,以及新逐笔报价中哪些数据已被明确改变。 我们可以得到三种类型的逐笔报价历史。 此类型由标志定义。:

COPY_TICKS_INFO – 返回竞买 和/或 竞卖价格变化造成的逐笔报价;

COPY_TICKS_TRADE – 返回上次价格和交易量变化造成的逐笔报价;

COPY_TICKS_ALL – 返回所有变化造成的逐笔报价。

我们需要一个交易逐笔报价流(COPY_TICKS_TRADE)来达到我们的目的。 在 CopyTicks 函数描述中找到有关逐笔报价类型的更多信息。

MqlTick 结构可令我们分析以下字段的值:

volume - 目前的最后一笔成交价格的成交量。 我们指标中的逐笔价格没啥用,不像该逐笔报价上的交易量,它会被重用;

time_msc - 最后更新时间,以毫秒为单位。 我们将使用此参数来确定逐笔报价所属的蜡烛并获取下一个逐笔报价的请求时间;

flags - 逐笔报价标记,变化数据的 ID。 我们将使用标志来摘选买入(TICK_FLAG_BUY 和 卖出(TICK_FLAG_SELL)类型。

简言之,该指标执行以下操作:它获取每根蜡烛的所有逐笔交易价格,跟踪买入和卖出交易量,并将其差值(delta)显示为直方图。 如果蜡烛的买方更多,则直方图柱线为蓝色。 否则,它是红色的。 一切都很简单!

3. 首次启动。 历史计算

CTicks _ticks (Ticks_article.mqh 文件) 在指标中作为主要对象来处理逐笔报价。 它将用于执行逐笔报价的所有操作。

指标操作将分为两个主要模块:历史计算和实时计算

//+------------------------------------------------------------------+ //| 自定义指标迭代函数 | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- 检查首次启动 if(prev_calculated>0) // 若非首次启动 { // 模块 2 } else // 如果是首次启动 { // 模块 1 } //--- return( rates_total ); }

在终端首次启动或单击终端中的刷新按钮(模块1)时,赫兹股票量化应该依据历史记录计算指标。 最初,我计划制作一个通用计算函数,用于历史记录和实时计算。 然而,我最终决定改变观念,以便提高简单性并加快计算速度。 首先,依据完整的柱线计算历史(CalculateHistoryBars())。 之后计算当前柱线(CalculateCurrentBar())。 所有这些动作如下所述:

//--- 1. 按初始值初始化指标缓冲区 BuffersInitialize(EMPTY_VALUE); //--- 2. 重置重复控制参数的值 _repeatedControl=false; _controlNum=WRONG_VALUE; //--- 3. 重置保存逐笔报价的柱线时间(单击“刷新”按钮) _ticks.SetTime(0); //--- 4. 设置已形成柱线的逐笔报价的下载开始时刻 _ticks.SetFrom(inpHistoryDate); //--- 5. 检查下载开始的时刻 if(_ticks.GetFrom()<=0) // 如果没有设定时刻 return(0); // 退出 //--- 6. 设置已形成柱线结束历史下载的时刻 _ticks.SetTo( long( time[ rates_total-1 ]*MS_KOEF - 1 ) ); //--- 7. 下载形成的柱线历史 if(!_ticks.GetTicksRange()) // 如果不成功 return(0); // 错误推出 //--- 8. 依据历史成形柱线计算 CalculateHistoryBars( rates_total, time, volume ); //--- 9. 重置保存逐笔报价的柱线时间 _ticks.SetTime(0); //--- 10. 设置最后一根柱线开始下载逐笔报价的时刻 _ticks.SetFrom( long( time[ rates_total-1 ]*MS_KOEF ) ); //--- 11. 设置最后一根柱线结束下载逐笔报价的时刻 _ticks.SetTo( long( TimeCurrent()*MS_KOEF ) ); //--- 12. 下载当前柱线历史 if(!_ticks.GetTicksRange()) // 如果不成功 return(0); // 错误推出 //--- 13. 复位复制结束时刻 _ticks.SetTo( ULONG_MAX ); //--- 14. 记住所获得的最后一次逐笔报价历史的时刻 _ticks.SetFrom(); //--- 15. 当前柱线计算 CalculateCurrentBar( true, rates_total, time, volume ); //--- 16. 设置后续实时复制逐笔报价的数量 _ticks.SetCount(4000);

指标代码有大量的注释,所以我将只关注要点。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。