Python量化交易平台开发教程系列5-底层接口对接

恒生t2sdk java_t2sdk_delphi 恒生电子的T2平台 编程接口以及源代码demo,需要用 实现自己的交易软 可 Finance-Stock software system 金融证券系... 文件名称: t2sdk_delphi下载 收藏√ [5 4 3 2 1]开发工具: Delphi文件大小: 5336 KB上传时间: 2016-01-29下载次数: 0提 供 者: bailey详细说明:恒生电子的T2平台Delphi编程接口以及源代码demo,需要用delphi实现自己的交易软件的可以参考。-Hang Seng Electronics T2 platform De... 阅读详情

原创文章,转载请注明出处:用Python的交易员

前言

从本篇教程开始,所有的开发都会在Python环境中进行(谢天谢地可以和C++说再见了)。

通常情况下,一个交易程序的架构会由以下三个部分组成:

  • 底层接口:负责对接行情和交易API,将数据推送到系统核心中,以及发送指令(下单、数据请求等)

  • 中层引擎:用于整合程序中的各个组件(包括底层接口、数据库接口等等)到一个对象中,便于顶层UI调用

  • 顶层GUI:用于显示数据和调用中层引擎暴露的主动函数,实现各项具体功能

AlgoTrader架构

上面这张图展示的是国外的一款开源交易平台AlgoTrader的架构:

  • 两边的Adapters代表的是底层接口(左边数据,右边交易)

  • 红色圆柱形中包括的是中层引擎架构,事件驱动方面使用了Esper复杂事件处理(CEP)引擎,同时内置了一些常用的功能引擎,如期权定价引擎、外汇对冲模块、投资组合管理模块等

  • 上方的Strategy1、2等代表的是顶层应用(算法策略、GUI界面等),通过调用中层引擎的功能来实现用户所需的业务

vn.py和AlgoTrader的比较:

这里对两个项目做一个简单的比较。

vn.py优势:

  • 语言易用:Java语言比Python啰嗦

  • 架构简洁:Java的编程理念(纯面向对象,大量使用框架等)更是比Python的编程理念(人生苦短,我们的目标是搞定问题)繁琐

  • 事件驱动引擎:AlgoTrader使用的Esper引擎尽管功能强大,使用起来也过于复杂,对于国内绝大部分的量化业务而言完全用不着

  • 本地化:vn.py完全为中国市场设计,在功能设计上更符合国人的使用习惯,而AlgoTrader则是针对欧美市场设计

AlgoTrader优势:

  • 静态语言:Java在开发时可以进行静态检查,同时相对较低的灵活性使得其更适合大型团队使用(即每个成员未必对项目整体非常了解)

  • 国外接口:已有大量的国外经纪商和行情提供商接口,如果用户主要做欧美市场基本可以开箱即用

  • 成熟度:AlgoTrader从2009发布至今已经有6年的历史,同时有着相当数量的机构客户

两个项目的相似之处:

  • 作者在最初都是为了交易某种期权策略而开发了该项目

  • 整体框架设计类似(底层接口、中层引擎、顶层GUI)

  • 都可以非常方便的开发全自动交易策略

  • 都是开源项目,目前托管在Github上(废话),用户可以根据自己的需求随意定制相关功能

  • 都可以应用于高频交易(毫秒级延迟),不适用于超高频交易(微秒级延迟)

教程说明

本篇教程将会介绍底层接口的开发,后面的若干篇则是关于中层引擎和各种顶层GUI组件。

相关的示例都是基于vn.demo中的LTS接口DEMO,发布在:https://github.com/vnpy/vnpy/tree/master/vn.demo/ltsdemo

底层接口对接

通过前面的教程,我们已经获得了和原生C++ API功能完全相同的Python封装API。通常情况下,为了将某个API对接到我们的程序中,需要以下两步:

  1. 将API的回调函数收到的数据推送到程序的中层引擎中,等待处理

  2. 将API的主动函数进行一定的简化封装,便于中层引擎调用

vn.lts中的API接口在使用时需要由用户继承后实现回调函数对应的具体功能,下面的内容以行情接口为例。

接口对象设计

########################################################################
class DemoMdApi(MdApi):
    """
    Demo中的行情API封装
    封装后所有数据自动推送到事件驱动引擎中,由其负责推送到各个监听该事件的回调函数上

    对用户暴露的主动函数包括:
    登陆 login
    订阅合约 subscribe
    """

    #----------------------------------------------------------------------
    def __init__(self, eventEngine):
        """
        API对象的初始化函数
        """
        super(DemoMdApi, self).__init__()

        # 事件引擎,所有数据都推送到其中,再由事件引擎进行分发
        self.__eventEngine = eventEngine

        # 请求编号,由api负责管理
        self.__reqid = 0

        # 以下变量用于实现连接和重连后的自动登陆
        self.__userid = ''
        self.__password = ''
        self.__brokerid = ''

        # 以下集合用于重连后自动订阅之前已订阅的合约,使用集合为了防止重复
        self.__setSubscribed = set()

        # 初始化.con文件的保存目录为\mdconnection,注意这个目录必须已存在,否则会报错
        self.createFtdcMdApi(os.getcwd() + '\\mdconnection\\')
  1. DemoMdApi类继承自MdApi类,并实现了回调函数的具体功能。

  2. 创建DemoMdApi的对象时,用户需要传入的参数是事件驱动引擎对象eventEngine。

  3. 每次调用API的主动函数时,需要传入一个reqid的参数,作为本次请求的唯一标识,绝大部分情况下我们不需要在意每个请求的标识情况,因此选择将该参数交给DemoMdApi对象来维护,每次调用主动函数时自动加1。

  4. 我们在DemoMdApi的对象中保存用户名、密码和经纪商编号,用于前置机连接完成后的自动登录功能,以及断线重连相关的操作。

  5. __setSubscribed对应的是一个Python集合,用于保存我们通过订阅函数订阅过的合约,在断线重连后自动进行订阅,之所以选择set而不是list是为了保证合约的唯一性,避免重复订阅(尽管重复订阅也没影响)。

  6. 在创建对象DemoMdApi对象的同时,自动调用createFtdcMdApi来初始化连接接口,选择使用当前目录下的mdconnection文件夹来保存.con通讯文件。

回调函数

    #----------------------------------------------------------------------
    def onFrontConnected(self):
        """服务器连接"""
        event = Event(type_=EVENT_LOG)
        event.dict_['log'] = u'行情服务器连接成功'
        self.__eventEngine.put(event)

        # 如果用户已经填入了用户名等等,则自动尝试连接
        if self.__userid:
            req = {}
            req['UserID'] = self.__userid
            req['Password'] = self.__password
            req['BrokerID'] = self.__brokerid
            self.__reqid = self.__reqid + 1
            self.reqUserLogin(req, self.__reqid)

...

    #----------------------------------------------------------------------
    def onRspUserLogin(self, data, error, n, last):
        """登陆回报"""
        event = Event(type_=EVENT_LOG)

        if error['ErrorID'] == 0:
            log = u'行情服务器登陆成功'
        else:
            log = u'登陆回报,错误代码:' + unicode(error['ErrorID']) + u',' + u'错误信息:' + error['ErrorMsg'].decode('gbk')

        event.dict_['log'] = log
        self.__eventEngine.put(event)

        # 重连后自动订阅之前已经订阅过的合约
        if self.__setSubscribed:
            for instrument in self.__setSubscribed:
                self.subscribe(instrument[0], instrument[1])

...

    #----------------------------------------------------------------------  
    def onRtnDepthMarketData(self, data):
        """行情推送"""
        # 行情推送收到后,同时触发常规行情事件,以及特定合约行情事件,用于满足不同类型的监听

        # 常规行情事件
        event1 = Event(type_=EVENT_MARKETDATA)
        event1.dict_['data'] = data
        self.__eventEngine.put(event1)

        # 特定合约行情事件
        event2 = Event(type_=(EVENT_MARKETDATA_CONTRACT+data['InstrumentID']))
        event2.dict_['data'] = data
        self.__eventEngine.put(event2)
...
  1. 通过回调函数收到API的数据推送后,创建不同类型的事件Event对象(来自于事件驱动引擎模块),在事件对象的数据字典dict_中保存需要具体推送的数据,然后推送到事件驱动引擎中,由其负责处理。

  2. 回调函数收到的数据中,data和error分别对应的是保存主要数据(如行情)和错误信息的字典,n是该回调函数对应的请求号(即调用主动函数时的reqid),last是一个布尔值,代表是否为该次调用的最后返回信息。

  3. 我们主要对data字典感兴趣,因此选择在事件中整体推送。

  4. 而error字典每次收到后应当立即检查是否包含错误信息(因为即使没有发生错误也会推送),若有则自动保存为一个日志事件(通过日志监控控件显示出来)。

  5. 服务器连接完成后(onFrontConnected),检查是否已经填入了用户名等登录信息,若有则自动登录(请参考后面主动函数中的示例)。

  6. 登陆完成后(onRspUserLogin),自动订阅__setSubscribed中之前已经订阅过的合约。

  7. 收到行情推送后(onRtnDepthMarketData),我们选择创建两种事件,一种是常规行情事件(通常适用于市场行情监控GUI等对所有行情推送都关注的组件),另一种是特定合约行情事件(通常适用于算法等仅关注特定合约行情的组件)。

  8. 当我们调用会有返回信息的主动函数时,需要传入本次请求的编号,此时我们先将__reqid自加1,再作为参数传入主动函数中。

主动函数

    #----------------------------------------------------------------------
    def login(self, address, userid, password, brokerid):
        """连接服务器"""
        self.__userid = userid
        self.__password = password
        self.__brokerid = brokerid

        # 注册服务器地址
        self.registerFront(address)

        # 初始化连接,成功会调用onFrontConnected
        self.init()

    #----------------------------------------------------------------------
    def subscribe(self, instrumentid, exchangeid):
        """订阅合约"""
        req = {}
        req['InstrumentID'] = instrumentid
        req['ExchangeID'] = exchangeid
        self.subscribeMarketData(req)

        instrument = (instrumentid, exchangeid)
        self.__setSubscribed.add(instrument)
  1. 主动函数仅封装了两个功能,登录login和订阅合约subscribe。这里假设通常我们不会做登出(直接杀进程)和退订合约(不一定)之类的操作,有需求的话可以自行封装对应的函数。

  2. 对于登录函数login而言,传入参数包括服务器前置机地址address,用户名userid,密码password以及经纪商代码brokerid。函数调用后,我们先将userid,password和brokerid保存下来,然后注册服务器地址registerFront,并初始化连接init。连接完成后,onFrontConnected回调函数会被自动调用,然后发生的操作请参考前一段落的回调函数工作流程。

  3. LTS的API在订阅行情时,需要传入合约的代码以及合约所在的交易所(因为存在两个证券交易所相同代码的情况),而CTP的API在期货方面则不存在该问题,只需传入合约代码。发送订阅请求后,将该订阅请求保存在__setSubscribed集合中,使得断线重连时可以自动重新订阅。

总结

在交易程序的开发中,所有的API对接原理均大同小异,除了类CTP API以外,国内的恒生接口、FIX引擎接口等等也可以同样遵照以上的原理进行对接设计。

恒生UFX交易接口基本介绍说明 1、恒生UFT和UFX有什么区别?   UFT是一个极速交易系统,UFX是一个统一接入系统。交易系统很显然是可以进行股票交易的,UFX是所有后台交易系统的接入系统,不管后台是什么样子的交易系统都是可以通过UFX进行委托交易,UFX将交易系统的差异化屏蔽掉,让周边的接入者不用关心后台的交易系统,只需要调用UFX周边的功能接口实现自己想要的个性化功能就可以了   UFX有相应的统一介入控... 阅读详情

相关推荐

python量化交易入门教程_搞金融的同学三小时快速入门python从零入门量化交易系列...

【本文比较长,有4000多字和大量配图,并且需要实际操作,建议在电脑端打开】前面,我们讲了为什么要做量化交易,什么是量化交易,以及量化交易的解决方案。作为一个屌丝,这里我们选择开源(Bu Yao QIan)的解决方案:VN.PY来开始我们的量化交易旅程。然而要想使用VN.PY你得懂一点Python,不用太多,一点就好。在之前和很多搞金融的同学交流的时候,很多人都是因为觉得要花上几个月学编程,所以打...

weixin_39928106的博客 1万+

恒生UFX 统一接入介绍

1、恒生UFT和UFX有什么区别? UFT是一个极速交易系统,UFX是一个统一接入系统。交易系统很显然是可以进行股票交易的,UFX是所有后台交易系统的接入系统,不管后台是什么样子的交易系统都是可以通过UFX进行委托交易,UFX将交易系统的差异化屏蔽掉,让周边的接入者不用关心后台的交易系统,只需要调用UFX周边的功能接口实现自己想要的个性化功能就可以了 UFX有相应的统一介入控制平台和相应的接入开发协议,它屏蔽了后台业务系统的差异,可以用来对接uf20, 多金融等等好多业务系统;对于开发人员来说,直接打交道的

Reach Higher 7967

Python量化交易入门

Python量化交易知识归纳

曲折旅程,艰难人生 6514

恒生t2sdk java_AsyDemo 恒生电子T2平台的Java开发编程接口以及源代码demo例子程序 - 下载 - 搜珍网...

AsyDemo/AsyDemo/.classpathAsyDemo/.projectAsyDemo/.settings/AsyDemo/.settings/org.eclipse.core.resources.prefsAsyDemo/.svn/AsyDemo/.svn/all-wcpropsAsyDemo/.svn/entriesAsyDemo/.svn/prop-base/AsyDemo/.s...

weixin_39663933的博客 1081

基于Python3.5的量化交易系统开发实践:为亘沣定制的量化交易平台

量化交易,作为金融行业与信息技术结合的产物,正成为投资者和交易者越来越关注的领域。量化交易系统是实现量化交易的关键技术平台,它能够自动执行复杂的交易策略,结合强大的数据处理和分析能力,为交易决策提供科学依据。量化交易系统的核心作用体现在以下几个方面:策略自动化执行:系统能够基于预设的算法模型自动执行买卖指令,无需人工干预,提高执行效率。风险管理:量化交易系统通常集成风险评估模块,能够在交易过程中实时监控风险并采取应对措施。数据分析。

weixin_28721743的博客 998

恒生UFT介绍文档

非常详细的UFT介绍文档,供恒生系统对接的开发者使用

【量化】Python量化交易平台vnpy开发-汇总笔记

文章目录0.引言1.类CTP交易API的工作原理2.类CTP交易API的Python封装设计3.vn.py项目中API封装的编译4.事件驱动引擎原理和使用5.底层接口对接6.中层引擎设计7.顶层GUI界面开发(1)8.顶层GUI界面开发(2) 文章专栏:https://zhuanlan.zhihu.com/vn-py 开源代码:https://github.com/vnpy/vnpy [5年前的文...

GreatXiang888的博客 3643

证券交易系统周边接口规范

恒生电子 证券交易系统周边接口规范,绝对真实

[转载]Python量化交易平台开发教程系列0-引言

原文出处:http://vnpy.org/2015/03/04/20150304_Python%E9%87%8F%E5%8C%96%E4%BA%A4%E6%98%93%E5%B9%B3%E5%8F%B0%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%E7%B3%BB%E5%88%970-%E5%BC%95%E8%A8%80/ 为什么用Python来开发量...

dijiesa4351的博客 501

恒生统一接入平台_周边接口规范(T2).rar_star9xg_t2接口_恒生_恒生T2接口_恒生t2

恒生T2接口,用于调试恒生的服务的接口说明文档

5G协议栈逆向工程:基于开源模拟器的核心网信令分析实战

本文详细介绍了基于开源模拟器Free5GC和UERANSIM的5G协议栈逆向工程实战,涵盖核心网信令分析、环境搭建、认证协议解析及安全漏洞验证。通过NGAP/NAS信令交互解密和异常流量注入测试,帮助研究人员深入理解5G网络安全机制,并提供实用的安全加固建议。

weixin_29250573的博客 678

VNPY 开源量化交易平台开发框架教程

VNPY 开源量化交易平台开发框架教程 项目介绍 VNPY 是一个基于 Python 的开源量化交易平台开发框架,旨在为量化交易爱好者、高校、证券公司、基金管理公司等金融企业提供一个简单易用的量化交易工具。VNPY 提供了完整的量化交易解决方案,包括回测、实盘交易等功能,支持国内149家期货公司的CTP接入,适用于股指期货、股指期权、商品期货、商品期权的程序化交易和量化交易的仿真回测。 项目快速启...

gitblog_00776的博客 1775

RK3588部署Zipformer模型问题总结

本文分享了在RK3588嵌入式设备上部署小米Zipformer语音识别模型时遇到的问题及解决方法。主要遇到两个问题:1)在rknn_model_zoo例程编译时出现静态库版本不兼容,通过重新编译kaldi-native-fbank库并修改链接路径解决;2)sherpa-onnx编译时提示缺少portaudio库,通过修改编译脚本启用相关宏定义后成功编译。最终成功在RK3588上运行Zipformer模型,测试结果显示该模型具有较好的识别效果和实时性(RTF=0.22),验证了其在边缘设备上的适用性。

pkyang2004的博客 2149

证券api接口,一个开源Python量化交易平台项目需要考虑哪些方面

开源Python量化交易平台项目建议,涉及开发、性能、用户定位、社区、安全等。比如利用相关库加快开发,考虑学习成本,明确用户定位,注重社区参与,保证安全性。

股票量化交易自动交易程序化交易接口 2175

异步FIFO的隐形陷阱:复位信号同步化实战解析

本文深入解析异步FIFO设计中复位信号同步化的隐形陷阱,重点分析赛灵思xpm_fifo_async原语在FPGA应用中的常见问题。通过实战代码和系统集成方案,提供复位同步化的最佳实践,帮助工程师避免跨时钟域通信故障,提升系统可靠性。

keras9composer的博客 247

R语言笔记十:独立性检验函数

1.独立性检验函数        独立性检验是根据频数信息判断两类因子彼此相关或相互独立的假设检验。所谓独立性就是指变量之间是独立的,没有关系。 独立性检验算法:卡方检验、Fisher检验、Cochran-Mantel-Haenszel检验 2.假设检验 假设检验(Hypothesis Testing)是数理统计学中根据一定假设条件由样本推断总体的一种方法。 原假设——没有发生 备择假设——发生了 具体做法:根据问题的需要对所研究的总体作

weixin_44384631的博客 4111

python量化交易:基础知识_基于Python的开源量化交易平台开发框架vnpy-转自github

基于Python的开源量化交易平台开发框架 http://www.vnpy.com By Traders, For Traders. vn.py是一套基于Python的开源量化交易系统开发框架,自2015年1月正式发布以来,在开源社区5年持续不断的贡献下一步步成长为全功能量化交易平台,目前国内外金融机构用户已经超过300家,包括:私募基金、证券自营和资管、期货资管和子公司、高校研究机构...

santirenpc的博客 7191

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3184

哪些券商可申请量化接口对接实盘?

量化交易需券商提供量化接口对接实盘,部分券商有此服务且特点与要求各异,了解这些券商对量化交易者很重要。

股票量化交易自动交易程序化交易接口 2196

半导体器件仿真:MOSFET仿真_(3).MOSFET仿真软件介绍

在半导体器件仿真领域,MOSFET(金属氧化物半导体场效应晶体管)的仿真是一项非常重要的任务。MOSFET是现代电子设备中最基本的元件之一,广泛应用于集成电路设计、功率电子、射频电路等众多领域。为了准确预测和分析MOSFET在不同条件下的性能,仿真软件成为了不可或缺的工具。本节将介绍几种常用的MOSFET仿真软件,包括它们的基本功能、主要特点以及应用场景。

2401_87715305的博客 1227

散户渡劫指南:从炼气期到化神期的量化之路

经常有人问我普通人怎么学习量化交易,我就在想怎么学了量化就不是普通人了吗,可能他的意思是类比修仙,量化素人如何修炼进阶,今天就将量化学习每个阶段均对标修仙境界的核心能力与心法要诀一一介绍,助你从“交易凡人”蜕变为“量化金仙”。

木头大左的博客 1338

python量化开发【初级入门】

α 策略:β 是与市场同涨共跌的部分,α 是独立于市场波动以外的部分,具体的做法可以通过做多股票组合(α+β),同时做空股指期货(-β),最终就剩下了绝对收益 α。利润表:净利润率【合同拿到手的钱】、期末现金及现金等价物余额【实际拿到的钱】通过参加股东大会、给企业高管打电话的方式:判断年报是否造假。2、技术面:股票收盘价、K线(日/周/月/年)、均线(5/10/20/60日)1、基本面:居民消费指数、人均国内生产总值(GDP)、净资产收益率(ROE)成交低靡:1%-2%成交温和:2%-3%

weixin_43837268的博客 4551

AgentScope 实战训练营-A2UI的完整实现:从概念到部署全流程

本文详细介绍了如何在AgentScope框架中实现Google的A2UI(Agent-to-Agent UI)协议,构建一个能生成可交互UI的智能体应用。文章涵盖了从环境准备、架构设计、核心代码实现到测试部署的完整流程,包括A2UI协议解析、技能系统、客户端实现、通信机制等核心技术点,适合AI Agent和前端开发人员学习参考。

program哲学 206

量化交易接口对接有哪些注意事项?怎样确保安全稳定地进行对接?

量化交易接口对接需考虑技术、安全等多方面,注意数据准确性、接口兼容性,采取多种措施保障安全稳定对接。

股票量化交易自动交易程序化交易接口 1045

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python股票投资,A股量化交易接口是连接证券公司和量化交易平台

A股量化交易接口的功能,包括获取行情数据、执行交易指令、查询账户信息等,还有散户使用该接口的步骤及MATLAB与之连接的方式。

股票量化交易自动交易程序化交易接口 1280

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

自己做量化交易软件(16)用小白通通量化AI框架打造自己的量化平台

最近一段时间,我主要学习python3和tkinter的窗口开发,对tkinter编程逐步了解。 此外,应广大朋友要求,我写了 一本学习python3学习书籍<小白学Python3实战搭建量化投资平台>. <小白学Python3实战搭建量化投资平台>内容提要 python3是2018年最热门的计算机语言,也将成为未来的应用趋势。本书是通过Python3学习各项热门应用知识的...

hepu8的博客 3万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: Python量化交易平台开发教程系列4-事件驱动引擎原理和使用
下一篇: Python量化交易平台开发教程系列6-中层引擎设计
Trader_Python
博客等级 码龄11年 392粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值