简单二进制编码(SBE)解码器(处理CME MDP3消息)

sbedecoder的Python项目详细描述


构建状态

基于python的简单二进制编码(sbe)解码器

概述

sbedecoder是一个简单的python包,用于解析sbe编码的数据。

sbedecoder根据格式的xml描述动态生成sbe解析器。这是通过 创建sbeschema()的实例并用文件名调用它的parse()方法:

from sbedecoder import SBESchema
schema = SBESchema()
schema.parse('path/to/schema.xml')

sbeschema()可以使用include_message_size_header=true初始化 需要额外的2字节(unit16)帧消息头字段(即用于CME MDP 3.0)。

默认情况下,消息名称派生自架构中消息定义的"名称"字段。 在某些情况下(即cme mdp 3.0),消息定义的消息"description"字段提供 更友好的消息名称。要使用消息描述作为消息的名称, 使用Use_description_as_message_name=true初始化sbeschema

为了方便起见,sbeschema()mdpschema()子类提供了include\u message\u size\u header=true 以及将"描述"用作"消息"name=true专门用于处理CME组MDP 3.0架构。

从任何看起来像包含原始二进制文件的缓冲区的结构中分析消息 数据(缓冲区、str、bytearay等)。将sbe编码的数据解析为基于 架构实例,只需调用sbemessage.parse_message()

from sbedecoder import SBEMessage
message = SBEMessage.parse_message(schema, msg_buffer, offset=0)

offset是一个可选参数,指示消息缓冲区中的位置 开始(如果架构已设置include_message_size_header,则包括大小标题)。

解析后的消息表示为sbemessage()类的实例。sbemessages()是 由零个或多个sbedecoder.message.sbefield()实例和零个或多个 sbedecoder.message.sberepeatinggroup()实例。sbefield()对象可以是一个基元 typeMessageField()、asetMessageField()或anenumMessageField()

注意:除非使用代码生成,否则无法存储消息以供以后处理。 必须在每次迭代中处理消息,因为消息重用 字段对象,用新值包装它们。

cme组以包含4字节序列号的数据包发送mdp 3.0消息。 以及8字节的时间戳。另外,一个包中可以有多个消息 并且每个消息都用上面提到的2字节(unit16)消息大小字段框起来。

要解析这些消息,可以创建一个mdpschema(),使用它来创建 mdpMessageFactory()然后创建一个sbeparser()它可以在 像这样的包:

from sbedecoder import MDPSchema
from sbedecoder import MDPMessageFactory
from sbedecoder import SBEParser

schema = SBESchema()
schema.parse('path/to/schema.xml')
message_factory = MDPMessageFactory(schema)
message_parser = SBEParser(message_factory)

for packet in SOME_DATASOURCE:
   for message in message_parser.parse(packet, offset=12):
       process(message)

通过创建sbemessagefactory()

有关SBE的更多信息,请参见http://www.fixtradingcommunity.org/pg/structure/tech-specs/simple-binary-encoding" rel="nofollow">http://www.fixtradingcommunity.org/pg/structure/tech-specs/simple binary encoding

安装

sbedecoder项目在pypi上可用:

pip install sbedecoder

如果从源安装:

python setup.py install

注意:sbe解码器仅用python 2.7和3.6进行过测试。在windows上,我们通常使用 蟒蛇分布。anaconda不分发python的测试代码。如果你有 DPKT问题(Iimporterror:没有名为test的模块),您可以安装最新的dpkt 从源代码(https://github.com/kbandla/dpkt)或注释掉导入(从测试导入 pystone)在..\anaconda\lib\site packages\dpkt\decorators.py中。DPKT的新版本否 有这种依赖性的时间更长。

mdp_decoder.py

mdp_u decoder.py用作使用sbedecoder包的示例。它是处理cme组的完整解码器。 来自PCAP文件的MDP 3.0(MDP3)消息。有关使用mdp_解码器的帮助。py:

mdp_decoder.py --help

CME Group MDP 3.0市场数据的SBE模板可在 ftp://ftp.cmegroup.com/sbefix/production/templates/templates\u fixbinary.xml

示例输出:

:packet - timestamp: 2015-06-25 09:45:01.924492 sequence_number: 93696727 sending_time: 1435243501924423666 
::MDIncrementalRefreshVolume -  transact_time: 1435243501923350056 match_event_indicator: LastVolumeMsg (2)
:::no_md_entries - num_groups: 1
::::md_entry_size: 4483 security_id: 559884 rpt_seq: 2666379 md_update_action: New (0) md_entry_type: e 
::MDIncrementalRefreshBook -  transact_time: 1435243501923350056 match_event_indicator: LastQuoteMsg (4)
:::no_md_entries - num_groups: 2
::::md_entry_px: 18792.0 ({'mantissa': 187920000000, 'exponent': -7}) md_entry_size: 1 security_id: 559884 rpt_seq: 2666380 number_of_orders: 1 md_price_level: 1 md_update_action: Delete (2) md_entry_type: Bid (0) 
::::md_entry_px: 18746.0 ({'mantissa': 187460000000, 'exponent': -7}) md_entry_size: 6 security_id: 559884 rpt_seq: 2666381 number_of_orders: 1 md_price_level: 10 md_update_action: New (0) md_entry_type: Bid (0) 

示例输出(使用--pretty):

packet - timestamp: 2016-03-10 15:33:21.301819 sequence_number: 76643046 sending_time: 1454679022595400091
    Message 1 of 2: TID 32 (MDIncrementalRefreshBook) v6
        TransactTime (60): 02/05/2016 07:30:22.595256135 (1454679022595256135)
        MatchEventIndicator (5799): LastQuoteMsg
        NoMDEntries (268): 1
        Entry 1
            MDEntryPx (270): 98890000000 (9889.0)
            MDEntrySize (271): 296
            SecurityID (48): 807004
            RptSeq (83): 14273794
            NumberOfOrders (346): 16
            MDPriceLevel (1023): 2
            MDUpdateAction (279): Change
            MDEntryType (269): Offer
    Message 2 of 2: TID 32 (MDIncrementalRefreshBook) v6
        TransactTime (60): 02/05/2016 07:30:22.595256135 (1454679022595256135)
        MatchEventIndicator (5799): LastImpliedMsg, EndOfEvent
        NoMDEntries (268): 8
        Entry 1
            MDEntryPx (270): 475000000 (47.5)
            MDEntrySize (271): 296
            SecurityID (48): 817777
            RptSeq (83): 1573080
            NumberOfOrders (346): Null
            MDPriceLevel (1023): 2
            MDUpdateAction (279): Change
            MDEntryType (269): ImpliedBid
        Entry 2...

mdp_book_builder.py

mdp_book_builder.py是使用sbedecoder包为给定合同生成限制订单的示例。

有关使用mdp_book_builder.py的帮助:

mdp_book_builder.py --help

版本控制

sbedecoder支持字段、枚举数、组等的sinceversion属性,因此它可以 解码旧的(例如存档的)二进制数据,只要模式已经正确地发展以保持支持 对于旧格式

性能

sbedecoder本身并没有针对性能进行优化,但是它可以满足简单的后验场景amd 交易后分析。由于mdp_u decoder.py执行的打印量很大,因此解析大型 PCAP文件。

皮比

为了提高性能(4到5倍),sbedecoder将在pypy下运行。假设pypy安装在/opt:

from sbedecoder import SBESchema
schema = SBESchema()
schema.parse('path/to/schema.xml')
0

代码生成

sbe类生成器脚本可用于生成一个python文件,该文件包含与 通过sbeschema.parse方法动态创建的。

有关使用sbe_class_generator的帮助。py:

from sbedecoder import SBESchema
schema = SBESchema()
schema.parse('path/to/schema.xml')
1

用法是(从生成器目录):

/sbe_class_generator.py--schema schema.xml--output generated.py--template./sbe_message.tmpl

此命令将输出一个名为generated.py的文件,其中包含动态创建的类定义 分析"schema.xml"文件时。用于生成类的模板文件包含在sbe_message.tmpl中。

生成的.py文件可以简单地用于检查类构造,也可以替换 在sbedecoder核心项目中生成.py文件。通过替换sbedecoder包中生成的.py文件, 开发人员可以访问IDE中的类定义。

为了使用生成代码的标准解析器功能,应该使用sbeschema.load 方法而不是解析方法。

下面是一个如何执行此操作的示例,该示例包含在mdp_book_builder.py脚本中:

from sbedecoder import SBESchema
schema = SBESchema()
schema.parse('path/to/schema.xml')
2

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用Spring和JSF向客户端授予临时权限   java除了Array/ArrayList之外,还有其他保存矩阵元素的方法吗   java BeanValidation不适用于单选按钮   通过java程序连接到配置单元数据库时出错   java如何使用maven解决二级依赖关系   JfreeChart/Java中带有图例的数据表   合并数组时发生java运行时错误   安全性如何在JavaEE中保护WebSocket端点?   java有没有一种方法可以使用insert方法为树插入值   java编程“静态”的另一种方式:代码可以吗?   java阅读文本文件时如何跳过3行   %04X在C中的含义以及如何在java中编写   java我如何验证一个方法不是仅在一个测试范围内对模拟调用的?   java如何在mac中使用启动appium desktop 1.6.1。球棒   仅匹配最多10位小数的java正则表达式