C#调用Bloomberg DAPI自定义VWAP服务获取VWAP成交量等字段的技术问询
问题核心原因
你当前仅能获取VWAP计算价格的核心原因,是//blp/mktvwap自定义VWAP服务默认不会回传全量关联字段——如果构造请求时没有显式指定订阅的字段列表,服务只会默认返回按VWAP_START_TIME、VWAP_END_TIME计算完成的VWAP均价,不会主动附带成交量、窗口内行情拆分等其他信息。
获取VWAP成交量的操作步骤
- 第一步:构造请求时显式添加对应的成交量字段,不要使用空字段列表触发默认返回逻辑。和同窗口VWAP价格计算口径完全匹配的累计成交量字段名为
VWAP_VOLUME,返回值为你指定时间窗口内的累计成交股数/合约数,和VWAP价格的计算范围完全对齐,不是证券的全时段累计成交量。
以下为C#代码的对比示例:
之前触发默认返回的写法:
修改后可返回成交量的写法:// 空字段列表,服务仅返回默认VWAP_PRICE request["fields"] = Array.Empty<string>();// 显式指定需要返回的字段 request["fields"] = new string[] { "VWAP_PRICE", "VWAP_VOLUME", "VWAP_NUM_TRADES" }; - 第二步:响应解析时注意字段层级,不要只在消息根节点匹配字段值。
mktvwap服务的响应结构和常规行情快照服务有差异,部分计算类字段是嵌套在对应证券的fieldData子节点下,直接从消息顶层取字段会出现找不到值的情况。
错误的解析逻辑示例:
正确的解析逻辑:// 直接从消息根节点取值,会抛出字段不存在的异常 double vwapVol = message.GetElementAsFloat64("VWAP_VOLUME");// 先定位对应证券的data节点,再读取嵌套字段 Element securityData = message.GetElement("securityData"); Element fieldData = securityData.GetElement("fieldData"); if (fieldData.HasElement("VWAP_VOLUME")) { double targetVwapVol = fieldData.GetElementAsFloat64("VWAP_VOLUME"); }
其他响应字段的获取方法
- 无需依赖离线文档,可通过请求参数动态获取全量支持字段:在请求中添加
returnFieldCategories = true参数,服务首次响应会自动回传当前账号权限下、该服务支持的所有可订阅字段名、字段单位、适用品种范围,直接对齐当前服务版本的最新字段列表,不会因为文档滞后出现字段名不匹配的问题。 - 日常开发中高频用到的关联字段包括:
VWAP_OPEN_PRICE:指定窗口内第一笔成交对应的价格VWAP_HIGH_PRICE:指定窗口内的最高成交价格VWAP_LOW_PRICE:指定窗口内的最低成交价格VWAP_LAST_PRICE:指定窗口内最后一笔成交对应的价格ACTUAL_VWAP_START:服务实际用于计算的窗口起始时间(如果请求的时间落在非交易时段,服务会自动校准到最近的交易所开盘节点)ACTUAL_VWAP_END:服务实际用于计算的窗口结束时间(同理非交易时段会自动校准)
- 注意字段匹配规则:所有
mktvwap服务的计算类字段都带VWAP前缀,请求时不要混用其他行情服务的字段名——比如不带前缀的VOLUME字段不属于mktvwap服务的返回范围,请求这类不匹配的字段时,服务会直接返回字段不存在错误,不会做兜底适配。
常见问题排查
如果添加VWAP_VOLUME字段后仍无法获取有效值,依次检查两项配置:
- 确认当前DAPI账号已开通
mktvwap服务的量数据权限:部分基础权限账号仅能获取计算后的VWAP均价,没有权限读取窗口内的累计成交总量。 - 确认请求的时间窗口落在对应交易所的有效交易时段内:非交易时段的空计算窗口,
VWAP_VOLUME会返回0值,不是接口漏返数据。
内容的提问来源于stack exchange,提问作者Boris Kleynbok
相关产品推荐
相关产品推荐

