Save
Saving
  • wdg wdg

    VNPY量化研究员

    工作性质:全职/实习

    职位要求:
    1、数学、物理、电子、计算机等理工科相关专业
    2、熟悉C编程的优先
    3、具有较强的数据统计、分析能力, 并熟练掌握至少一门统计语言(python和R优先)
    4、对金融市场有强烈兴趣、对钻研投资策略有激情、学习能力强、逻辑思维清晰
    5、ACM-ICPC或NOI、CMO/IMO、CPHO/IPHO等赛事获奖者优先考虑

    岗位职责:
    协助投资经理进行策略开发,以及交易系统的维护

    VNPY量化开发工程师(C++)

    工作性质:全职/实习

    职位描述:

    负责公司Linux平台下的软件开发,包括但不仅限于:后端交易程序,实时监控程序,量化研究流水线,各种工具软件等。
    负责对现有系统进行评估,测试,优化以及完善。
    维护现有各类交易业务的稳定高效运转。
    完善公司网络及数据存储体系。
    对Linux服务器做底层优化。
    完善公司各类作业的自动化运转。
    通过与交易员以及数据分析师紧密协作,实现并拓展公司的各类交易业务。
    

    职位要求:

    国内外重点大学本科及以上计算机相关专业。
    计算机体系结构有较深的了解。
    熟悉计算机网络原理以及网络编程,了解常用的网络协议。
    熟练掌握常用程序算法及数据结构,算法竞赛获奖者优先。
    熟练掌握c++11及以上标准,能熟练编写高效的c++代码。
    了解对程序性能分析的方法,对算法优化程序优化感兴趣。
    熟悉至少一门脚本语言,并能对简单数据进行程序化处理,包括获取,整理,算法应用,存储以及展示。
    能熟练阅读中英文技术文档,有较强的自学能力。
    善于沟通及团队协作,对金融行业,量化交易感兴趣,有好奇心,勇于挑战,善于挖掘业内前沿技术。
    9.熟练使用VNPY仿真柜台。
    

    其他信息

    工作地点:上海
    实习薪酬:500元/天,一周至少到岗3天,长期实习优先
    全职薪酬:高于市场平均水平

    公司背景:上海赫富投资有限公司注册资本1000万元,2016年3月成立于上海市。 公司研究团队来自北京大学,清华大学,复旦大学,上海交通大学,哥伦比亚大学和芝加哥大学等院校。核心团队成员曾获中国数学奥林匹克金牌;获得ACM(国际大学生程序设计竞赛)奖项等。公司合伙人曾在国内知名私募和美国顶尖对冲基金Laurion Capital Management担任投资经理。
    公司官网:highfortfunds.com

    申请方式:请发送简历至hr@highfortfunds.com,标题为:职位-实习/全职-学校-专业-学历-姓名

    VNPY仿真回测

    http://www.vnpy.cn/comm/topic/3411/

    posted in 期货,A股等API程序化量化开发技术交流 read more
  • wdg wdg

    今天发布了VNPY CTP仿真回测柜台

    VNPY CTP仿真柜台2.09发布支持所有CTP回测框架,可以丢弃第三方回测框架了
    VNPY仿真回测柜台

    2021年计划发布高级版本,计划开发的功能为:

    会批处理回测,复制多个备份采用不同参数,最后汇总给出结论,更多复杂图形显示。

    VNPY仿真回测柜台2.09 请在VNPY官网下载
    http://www.vnpy.cn

    用法见
    http://www.vnpy.cn/comm/topic/3401/

    https://www.zhihu.com/question/272156840

    开发环境:

    使用Visual Studio2015、Visual Studio2017及以后的版本打开Demo里的MyAutoTrader.sln,
    可以C++ Demo为基础进行二次开发

    当然VNPY CTP仿真柜台也支持多种编程语言,支持所有基于CTP的开源框架和自编程序,
    请根据框架和自编程序特点替换DLL和lib文件重新编译。

    Bin目录是编译好的程序,可以直接运行调试
    CTP Demo/Bin(已编译)/AutoTrader.exe 是原生CTP的Demo,已编译好的应用程序。
    VNPY For CTP Demo/Bin(已编译)/AutoTrader.exe 是VNPY Demo已编译好的应用程序,运行直接进行回测。

    上期CTP官网
    可以注册模拟账户,下载原生CTP api,CTP Demo可用于该模拟的程序化交易,
    http://www.simnow.com.cn/

    Ver2.61
    关闭控制台输出文字(蓝色文字);
    避免了回调函数安全性问题导致持仓和资金查询等方法无法正常回调的问题;

    Ver2.60
    针对CTP Ver6.3.15 增加至4个版本
    32位的Release
    32位的Debug
    64位的Release
    64位的Debug
    完善对中金所合约IF、IH、IC、T、TH支持

    Ver2.521
    减少不必需要文字输出
    Ver2.52
    更新API输出字体为蓝色
    Ver2.51
    增加对数据文件和订阅合约不一致的校验
    增加只允许订阅一个合约的校验,多合约订阅和回测将在未来的高级版本提供

    Ver2.5
    修复穿透式监管版本的API在部分计算机无法回测的问题。
    穿透式版本升级至2.5
    非穿透式版本保持2.3

    Ver2.4
    提供最新的CTP穿透式版本的VirtualApi,针对CTP 6.3.15版

    Ver2.3
    增加对查询投资者持仓响应OnRspQryInvestorPosition
    增加对查询资金账户响应OnRspQryTradingAccount回调支持

    Ver2.2
    功能升级

    Ver2.1
    修复了MD和TD资金数据同步的Bug
    增加配置文件setting.ini,
    可以通过修改setting.ini自由设置
    (1)初始资金
    (2)开仓手续费
    (3)平仓手续费
    (4)滑点

    posted in 期货,A股等API程序化量化开发技术交流 read more
  • wdg wdg

    在疫情迅速发展的2020年3月的全球市场剧烈波动中,不仅股神巴菲特管理的伯克希尔亏损接近500亿美金,而全球最大的对冲基金桥水也遭遇滑铁卢,资产大幅缩水,因为疫情导致的量化基金破产案例载入历史并被持久关注。这些因大额亏损濒临倒闭的量化基金,大多采用市场中性策略,基金经理们用这类策略的理由:无论市场涨跌,都可以稳定盈利,追求的是阿尔法,通过对冲和套利追求贝塔等于0。

    桥水基金管理的资产规模缩水了15%,主要原因是由于3月至4月期间,该基金主要的交易策略遭遇重大损失。桥水基金资管规模在4月底为1380亿美元,作为对比,该基金在2月底的资管规模曾达到1630亿美元。不过,据有关媒体称,桥水基金这次出现管理规模大幅缩水,主要原因是价值回撤,是其资产市场表现驱动的,而不是客户撤资。

    为什么市场中性的量化策略在今年的有疫情下的表现是失效并大幅亏损呢?

    其实基金经理的中性策略大多用的都是通过历史数据拟合训练的算法、也就是利用归纳法去预测未来,经常性的后尾的风险中最终崩溃。

    产生这个现象的原因有二:

    一、系统性风险导致黑天鹅产生
    下面这个实际发生的例子,可以很好的解释的市场中性量化策略的在系统性风险下失效过程。
    在2018年的4月,在数字货币发币越来越多,本来很多交易者采用的是在一个交易所做空,在另一个交易所做多中性策略。这种情况下,无论数字货币是涨还是跌,通过时间差的优势,总有稳定的收益。

    在2017年8月1日的比特币现金硬分叉(Bitcoin Cash hard fork)引发了与比特币和比特币现金相关的两个数字货币社区之间的争吵,为2018年的比特币崩盘埋下了伏笔。硬分叉最初导致比特币价值下跌,一部分是因为围绕该事件的负面影响。硬分叉之后引发了技术性抛售,随后又引发了全面的问题。

    有很多数字货币出现在短短几分钟从几百元暴跌到几毛钱,对刚刚采用中性投资者来说,一边做多的一方被爆仓,另一个边做空的数字货币归0,即便数量再多,价值也是0。 也就是这样原因,很多投资者倾家荡产了。

    人们往往高估了历史数据的价值,低估了不可预测的随机事件在其中的作用,无论再高明精准的技术分析或风险管理模型,所以不能减少投资者在超级股灾中损兵折将的可能。1998年由一群诺贝尔经济学家管理的美国长期资本管理公司破产,就是重视短期规律忽视黑天鹅的例子。

    http://www.hbapi.cn/

    app.png
    二、市场环境变化了,这个变化是再一个小级别小的规律放大更大的周期才发现并非是更大周期下的规律

    在国内分级债券市场就有一个典型的例子,在2012至2016年间,很多分级债券的年化收益达到了26%,曲线30度向上,很多分级债券在短短4年已经盈利超过200%,而且是一条平滑向上的斜曲线,但到了2016年由于宏观经济面的变化就突然失效了。

    下面五张图是局部到整体的例子可以清楚的表达短期规律和长期规律的差别

    上述2点提出的原因并不是完全平行的和对等的概念,事实上1恰好是2的一个极端情况,而2的另一个极端情况则是灰犀牛危机。

    然而在每一次、每一组黑天鹅事件的背后,都隐藏着一个巨大的灰犀牛危机。

    所有的量化交易策略,都需要经过大量历史数据的训练和拟合。只有回测和拟合成功的策略才有可能难道真是世界里作为交易的一句,就是那些在回测里始终盈利,放到样本外的环境里,依然盈利,拿到真实世界里交易后,依然盈利的策略。

    所有的量化交易策略,都是对过去已发生的事情的训练,试图从海量数据里总结出金融市场运作的规律,诸如小公司可能由市值因子增长率高、杠杆率低的公司在经济下行时表现好、产业链上下游公司的股票之间关联度高等等。

    一个量化交易算法,做的再好,做到极致,也不过是“充分学习了过去市场里发生的一切事件,并掌握了规律”。但是,通过归纳法总结出的参数永远无法预测从未发生过的事件。
    所有的量化策略都必须历史数据回测下通过归纳法进行总结,于是就不可避免的导致历史有效,未来一定失效的结果。

    这样的例子日复一日的在金融世界不断发生。
    这里不得不提到归纳法和演绎法的概念。
    下面这个例子可以很好的举例说明了归纳法:
    前提:目前观察到的所有天鹅都是白色的。 结论:所有天鹅都是白色的。

    量化交易本质上是不严谨的归纳法,这样的归纳法的bug是面对“黑天鹅”事件毫无办法,而另一个重要的逻辑论证法“演绎法”,我们知道,哲科思维的重要特征是基于一个正确的假设(公式或公理),然后经过严格的演绎逻辑推演得出结论,这种推理的方法就是演绎法,人类1%的知识来自于演绎法,但那1%可能是最重要的1%。

    但是在量化投资领域,量化交易很难通过演绎法实现,绝大多数的模型都是通过归纳得出的。
    技术分析相关的因子完全依赖于归纳。在回测之前,我们将很难通过演绎推理来判断价格将以动量还是反转来运行。我们将很难解释为什么股指期货在日内通常是动量的,而股票价格在20天的周期上通常是反转的。而即便是动量,我们也很难用演绎推理来判断动量的具体形式,也因此会诞生众多的技术指标。但是,通过回测,也就是通过对价格历史的归纳,我们将很容易得出结论。

    而基本面分析中归纳也是最关键步骤。我们可以通过各种财务信息对股票进行估值,也就是所谓的演绎方法。然而被低估的股票并不必然在未来带来超额收益。极有可能存在你不知道的基本面信息,长期压制股票价格。极有可能,市场将长期无效下去。然而,通过回测,也就是通过归纳,我们将很容易地总结出被低估的股票未来的价格走势。而反过来,即便一个研发者不知道任何基本面分析知识,仅仅通过归纳,也能通过遍历发现有效的基本面因子。

    那些量化基金经理们,没有人曾判断出来疫情会蔓延到美国和欧洲吗?

    一定有,但有两点原因阻碍了他们作出正确应对策略。

    1,他们是量化基金经理,使用量化手段制定交易原则是他们的交易原则,仅凭主观判断而拿出一部分本金去对冲或趋势策略做空并不是量化交易的风格。

    2,很多量化基金经理们,往往并不具备全天候的能力,没有能力作出正确判断,不理解也不愿意理解如何对冲到从未有相关处理经验的事件。

    这是为什么大型券商量化交易的领头人都不是IT出生,而是经济学家出生,一直坚持宏观基本面理论重要性,是因为人比程序策略更容易在大的趋势上掌控正确的方向。

    在很多行情特征,人一看就明了,而程序比较傻,量化具备的是突出的拟合曲线的能力,而人最重要的最重要的作用就是择时和降维。

    而如果没有了人控制,而将工作全部交给量化交易程序的话,我想拟合的极端就是采用高维度人工智能算法,而那将不可避免陷入过拟合的结果。更重要的是,那是一个所有人都将无法理解的黑盒子,任何人都无法理解人工智能策略的内部逻辑,也就无法判断策略什么时候失效。

    对基金经理而言,也许量化交易和程序化交易,确实降低了对人性要求的门槛,缩短了学成出师的时间,但若完全依赖量化交易和程序化交易,却终将难以成为投资大师!
    http://www.vnpy.cn

    http://www.vnpy.cn/comm/topic/3402/

    posted in 期货,A股等API程序化量化开发技术交流 read more
  • wdg wdg

    在期货市场中,想要实现达到自己财富自由的目的,我们最常听到的一种方法就是利用复利,找到某一种方法,然后利用这种方法去做,风险比较小,可以获得稳定的盈利,然后你坚持这种方法,随着时间的增加,你的账户权益就会不断增加,从而实现你的目标。

    但是这句话放在期货市场上是很难实现的。我所接触的一些资深交易者,无论是技术分析还是基本面分析,他们都有自己独到的地方,水平也是非常值得钦佩的, 但是他们大多数都遇到一个问题,那就是黑天鹅总在那里等着你,总有一个意外事件,把你打回原点。

    可能有些人利用自己的方法或者技术赚了几百万甚至上千万,觉得自己就是稳定的盈利,其实我认为并不是的。我所接触的一些交易者,他们运用自己的技术分析也好,基本面分析也好,水平确实很高,几次都是从小资金做到千万级别的,但是在通往亿的路上,总有一个黑天鹅把你打回起点,不止一次!

    这大概就是所谓的“有术无道,止于术”,他们自己交易的术已经很厉害了,但是极限就在那里了,当然,他们想要的更多,希望有更多的财富,来做一件事情,而百万千万对他们来说,改变不了自己的生活或者人生所以,对于这类的交易者,已经不屑于谈技术了,开始追求道的层面。

    大多数人都信奉复利,但是我没见过任何一个人,他是利用复利的方式在商品期货市场达到暴富的。

    然而现实中的一个问题就是,整个私募行业都是拿着过去的历史业绩曲线来作为自己盈利能力的证明,如果过去的曲线很好,就证明他们具有稳定盈利的能力吗,完全错误,就像我上面右侧的图中的那样,总有一个黑天鹅等着他们。

    如果不信的话,可以看一下,在期货市场,复利很难做到长期持续。如果过去的曲线能够代表未来,那么他为什么要发产品呢,用极少的资金,利用复利,利用所谓稳定的盈利,就可以实现暴富。

    而对私募基金来说,能不能稳定高收益率的盈利不重要,重要的是最大规模收管理费。

    用各种方式让人相信,他们是专业的,他们是能够稳定盈利的,让投资者把钱给他们,但实际上,过去不代表将来,过去的业绩也不代表将来,资金规模最大是首要目标,至于业绩曲线、所谓的专业、所谓的稳定盈利能力,只不过是做大规模的手段。

    采用的技术分析也好,基本面分析也好,各种套利,各种策略,我认为这些都脱离不了术的范畴,只要是术,一定是有漏的。有漏的东西就不可能实现所谓的稳定的盈利,我认为整个期货市场上流传一些观点,大多都是错误的,流传的越广泛,往往错误越严重。

    过去,我是比较赞同复利的,因为上学的时候学过,当时觉得复利真美好,当交易久了之后,你会发现,复利是金融市场上最大的骗局,尤其是在期货市场上。我认为没有任何一个人和一个机构能够做到稳定的盈利。

    如果有人能够在期货市场上做到稳定盈利,他哪有时间给你说什么稳定的盈利即是暴利,但凡鼓吹稳定盈利的人,基本上都是没有稳定盈利的人,或者一两年赚钱了甚至三五年赚钱了,就认为自己是稳定盈利了,其实差的很远。

    如果过去一条非常漂亮的净值曲线能够代表一个人或者一个机构稳定盈利的话,那么干嘛需要发产品收管理费呢,既然可以做到稳定盈利,那么只要有原始的启动资金,很快就会成为世界首富了,然而世界首富并不是做投资出来的。

    我们所听说的期货市场中赚大钱的,都不是通过稳定的盈利或者复利的方式实现财富的爆发式增长。

    看一下国内那些真正在期货市场中暴富的,同时名气比较大的人,没有人靠的是复利,而都是一两次大机会的暴利。

    我们先后和宏源期货,东方期货,华安期货,徽商期货,申万岂会哦,光大期货,建立了合作关系。

    这4家期货公司都可以提供较低的保证金和手续费,和较高的返佣。
    期货低佣金开户 :http://www.kaihucn.cn
    http://taoli.kucps.com

    http://www.coolquant.cn

    http://www.ctponline.cn

    posted in 期货,A股等API程序化量化开发技术交流 read more
  • wdg wdg

    替代文字
    http://www.mdshare.cn
    分7个目录2017.11~2018.11期货全品种TICK数据解压后100Gb(DataCollect格式)百度网盘下载
    2019.11.22~2019.12.13 期货全市场行情数据
    https://pan.baidu.com/s/1br3Tpc8pMdgQIJMuEoEHaw
    2019.11.1~2019.11.19 期货全市场行情数据
    https://pan.baidu.com/s/1wXBrX8rTL9v4NrdSM6Dbxg

    2019.10.8~2019.10.31期货全市场行情数据
    https://pan.baidu.com/s/1mDZwiOEelqkPidf36wwu8Q

    2017.8.23~2019.9.30期货全市场行情数据
    https://pan.baidu.com/s/17Cs_Md8bAT4cCFzdCapqBQ

    2017.7 ~2019.8.1期货全市场行情数据
    https://pan.baidu.com/s/1TF-6tqLo89v7OstEbxPyLQ

    Virtualapi (CTP 本地TICK级仿真回测接口)
    http://www.virtualapi.cn

    期货实盘低佣金开户,支持CTP接口
    http://www.kaihucn.cn/

    上期CTP官网
    http://www.simnow.com.cn

    量化代码资源打包下载
    http://mdshare.cn/source.zip
    量化资源
    http://www.coolquant.cn
    开户中国,期货低佣金开户
    http://www.kaihucn.cn

    分7个目录2017.11~2019.5期货全品种TICK数据解压后300Gb(DataCollect格式)百度网盘下载
    期货TICK数据下载
    链接:https://pan.baidu.com/s/1VEp-6Okaqpyj-peGQdE_Ow
    提取码:2bqh

    2018.11.30~2019.1.31期货全品种TICK数据解压后33Gb (DataCollect格式)百度网盘下载
    https://pan.baidu.com/s/1AkdR4tYsg7moqP03VBxx2w

    https://pan.baidu.com/s/1iUgsBvEHpf44-zI6528PSQ
    2012年期货全品种TICK数据
    https://pan.baidu.com/s/1Ta44lVsZG0Qp4Mv8u3g02Q
    2013年期货全品种TICK数据
    https://pan.baidu.com/s/1CUG-oiyV1ksM32sy8w6FyQ
    2014年期货全品种TICK数据
    https://pan.baidu.com/s/1SXeZXQp4ZF6i0Hl8kWETaQ
    2015年期货全品种TICK数据
    《量化交易资源导航》
    111.png
    http://www.pythonpai.cn

    《程序化交易工具打包下载》
    http://www.pythonpai.com/topic/8/%E7%A8%8B%E5%BA%8F%E5%8C%96%E4%BA%A4%E6%98%93%E5%B7%A5%E5%85%B7%E6%89%93%E5%8C%85%E4%B8%8B%E8%BD%BD

    量化资源打包下载
    http://mdshare.cn/source.zip
    《Quicklib采用的异步IO架构的特点》
    http://www.pythonpai.com/topic/183/quicklib%E9%87%87%E7%94%A8%E7%9A%84%E5%BC%82%E6%AD%A5io%E6%9E%B6%E6%9E%84%E7%9A%84%E7%89%B9%E7%82%B9

    《Quicklib CTP框架完整Demo运行时的文件引用流程》
    http://www.pythonpai.com/topic/182/quicklib-ctp%E6%A1%86%E6%9E%B6%E5%AE%8C%E6%95%B4demo%E8%BF%90%E8%A1%8C%E6%97%B6%E7%9A%84%E6%96%87%E4%BB%B6%E5%BC%95%E7%94%A8%E6%B5%81%E7%A8%8B

    《做程序化交易,你真的需要数据库吗?》
    http://www.pythonpai.com/topic/181/%E5%81%9A%E7%A8%8B%E5%BA%8F%E5%8C%96%E4%BA%A4%E6%98%93-%E4%BD%A0%E7%9C%9F%E7%9A%84%E9%9C%80%E8%A6%81%E6%95%B0%E6%8D%AE%E5%BA%93%E5%90%97

    《python派程序化交易社区手机APP 2.5下载》
    http://www.pythonpai.com/topic/69/python%E6%B4%BE%E7%A8%8B%E5%BA%8F%E5%8C%96%E4%BA%A4%E6%98%93%E7%A4%BE%E5%8C%BA%E6%89%8B%E6%9C%BAapp-2-2%E4%B8%8B%E8%BD%BD

    http://www.pythonpai.com/category/8/quicklib%E5%92%8Cpython%E7%A8%8B%E5%BA%8F%E5%8C%96%E4%BA%A4%E6%98%93%E6%95%99%E5%AD%A6%E5%92%8C%E8%B5%84%E6%BA%90

    http://jobping.cn/
    vnpy
    http://www.vnpy.cn

    《期货跟单软件视频教学4集》

    《量化界社区http://www.lhjie.net》

    python量化交易
    《Quicklib程序化交易框架www.quicklib.cn》
    http://www.mdshare.cn/comm/topic/2750/

    《酷操盘手期货跟单软件》
    《开户中国期货低佣金开户》
    《mdshare财经数据接口包》
    《某python量化交易框架性能评测》

    posted in 期货,A股等API程序化量化开发技术交流 read more
  • wdg wdg

    我是林,我是一名来自量化基金的CTP开发者,我做CTP已经有5个年头了。

    我在这里会分享对CTP开发的一些见解,希望对大家有用。

    通常我们从上期网址下载CTP接口的API后,从网上找到1个CTP DEMO就开始搭建第一个CTP程序。

    其实CTP的例子很多,但大多只涉及了交易部分的简单例子,对有基础的初学者来说,可以很快理解了如何调用CTP接口,并从CTP回调函数获取数据的方法。

    5年前我也是这样开始了CTP开发之路,CTP对我来说已经是生活的一部分。

    CTP开发过程中最麻烦的事就是回测问题, 回测涉及到数据的采集。数据清洗,数据回测框架,实盘程序接入回测框架等等步骤。

    很多CTP开发者没有自己开发回测框架,就利用上期的SIMNOW (http://www.simnow.com.cn)进行测试,但其实Simnow应该只作为功能测试而不是策略回测。

    在大名鼎鼎的CTP体系下,最著名的是Virtualapi (http://www.virtualapi.cn )、VNPY、优矿、聚宽等。

    其中Virtualapi久负盛名,可以说是CTP最优秀的回测方案,而且申请了国家发明专利,Virtualapi可用于本地TICK级别回测。

    VNPY (http://www.vnpy.cn)以大而全著称,但是回测模块就显的差强人意了。好在Virtualapi可以完美支持VNPY,Virutalapi不仅支持VNPY,还支持所有CTP自编CTP程序和各种CTP框架进行回测,因为Virtualapi本身就是完全仿真了CTP嘛。

    优矿和聚矿据说更适合在线回测,A股的多因子回测, 做期货的一般都用Virtualapi for CTP在本机进行TICK级回测。

    策略回测我们应该使用Virtualapi (http://www.virtualapi.cn )这样的TICK级本地仿真API,有了它我们做ctp的工作就简单多了。

    VirtualApi诞生的技术背景
    现在的量化回测软件和方法有三类,一类是通过文华、TB、MC等商业软件,在商业软件中通过编写交易指标和交易公式,或通过加载用户自己开发的第三方策略库进行交易策略的开发和回测;第二类是直接使用交易所、券商、API软件服务商提供的API或券商等机构提供的行情和交易API直接开发交易策略,或通过一些回测框架调用这些原生API进行回测;第三类是利用聚宽、优矿的网站在线平台进行回测。
    若采用第一类商业软件开发量化交易回测系统,虽然对从事量化交易的人来说,开发策略需要的工作量较少,对开发者编程能力要求不高。但缺点也是显而易见的,除了商业软件本身需要收费提高了交易成本以外,采用商业软件开发交易策略不够灵活,使得很多交易策略无法实现。
    若采用第二类直接使用API开发策略或采用针对API的回测框架,例如python的各种回测框架、matlaba的各种回测框架、R语言的各种回测框架,PyAlgoTrade、Zipline等、虽然开发策略较为灵活,但缺点是开发交易策略的实盘代码并不能直接进行回测,必须要采用引入回测框架进行回测,待回测完毕,再将回测完成的参数接入实盘策略代码中或删除回测框架部分的代码接入实盘交易的API,使得量化交易回测代码和实盘的代码有较大的改动,增加了策略开发者的工作,也增加了量化交易爱好者时间成本,甚至对很多编程能力有限的量化爱好者来说提搞了研究难度的门槛。
    若采用第三类在线回测平台进行回测,由于需要将编写的策略在网站指定的服务器上运行,由于是多用户共享一台服务器,所以回测性能无法得到保证、网站更倾向于采用精度不高的数据进行回测。还由于对策略开发者来说不是使用原生API进行开发策略,所以策略开发的自由度也不够,很多想法也无法实现。更重要的是,选择网站在线平台的方式来开发量化交易策略,就等于默认了网站管理员可随时查看自己辛辛苦苦开发的策略代码,保密性让人担忧,从事量化交易的专业机构几乎不会采用在线网站的回测方式。
    近年来,量化交易在金融领域应用的越来越广发,回测系统的设计是量化交易中不可缺失的一部分,但同时也暴露出一些问题,例如商业软件成本高、自己搭建会测框架时间成本高,难度大、采用第三方回测框架难度大、回测到实盘交易的代码改动较大、量化策略保密性不高等等。
    为了克服现有技术存在的上述不足,VirtualApi仿真API的回测技术应运而生,它是模拟原生API来实现的。例如通过模拟原生交易API和行情API,例如通过模拟原生API的库方法的定义、头文件的定义等,使得回测和实盘交易代码,简单的将实盘代码替换为仿真API,对底层代码可不作改动或改动较少即可实现回测和参数优化。
    支持的编程语言
    VirtualApi Api支持多种编程语言,包括C++、Python、Java、C#、Golang、易语言等 。
    支持的操作系统
    VirtualApi Api支持Windows操作系统,版本要求Windows7、Windows2008及以上。
    支持的量化交易框架
    VirtualApi 支持各种基于CTP接口的自编程序和框架,例如vn.py、Quicklib、海风等。
    CTP实盘程序流程图(C++)
    典型CTP实盘程序流程图

    VirtualApi回测程序流程图(C++)
    VirtualApi For CTP回测程序流程图

    代码
    代码
    CTP库文件

    CTP Api是C++库,理论上可以用于包括C++、Python、Java、C#、等在内的多种编程语言的调用。

    VirtualApi For CTP一样是采用C++开发,目前只支持Windows操作系统,运行采用VirtualApi Api的计算机和TradeAgent.exe的计算机采用要求Windows7、Windows2008及以上系统,对于Windwo7和Windows Server2008这些较为陈旧的Windows系统安装微软运行时库redist2015补丁。

    以最常用的CTP无中继代理模式为例(于2019.6.14实施的穿透式和老的非穿透式),CTP API Windows版本含以下文件:

    其中ThostFtdcMdApi.h、ThostFtdcTraderApi.h、ThostFtdcUserApiDataType.h、ThostFtdcUserApiStruct.h 是头文件,thostmduserapi.dll、thosttraderapi.dll、thostmduserapi.lib、thosttraderapi.dll。
    VirtualApi库文件
    VirtualApi For CTP库文件

    包含以下文件:

    可以看到VirtualApi 库在原CTP库基础上增加了list.csv,Price.exe,Graph.exe这3个文件,而对于thostmduserapi.dll、thosttraderapi.dll、thostmduserapi.lib、thosttraderapi.dll这4个文件是VirtualApi提供模拟CTP的实现,而ThostFtdcMdApi.h、ThostFtdcTraderApi.h、ThostFtdcUserApiDataType.h、ThostFtdcUserApiStruct.h 这4个头文件则保持和CTP对应版本一模一样。

    list.csv作用:该程序放到回测程序的目录下,用于指定csv格式的数据文件的存放路径,并非自己存放Tick数据,在回测时VirtualApi会从上至下依次读取list.csv种这些文件的Tick数据,并触发CTP方法里的深度行情通知回调函数 virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData),使得和CTP的OnRtnDepthMarketData回调方法一致。 值得注意的是,list.csv指定的数据文件库的字段顺序目前不能更改,将来可能提供字段顺序的自定义设置功能。

    localtime (本机写入TICK的时间),
    InstrumentID (合约名),
    TradingDay (交易日),
    ActionDay (业务日期),
    UpdateTime (时间),
    UpdateMillisec(时间毫秒),
    LastPrice (最新价),
    Volume(成交量) ,
    HighestPrice (最高价),
    LowestPrice(最低价) ,
    OpenPrice(开盘价) ,
    ClosePrice(收盘价),
    AveragePrice(均价),
    AskPrice1(申卖价一),
    AskVolume1(申卖量一),
    BidPrice1(申买价一),
    BidVolume1(申买量一),
    UpperLimitPrice(涨停板价),
    LowerLimitPrice(跌停板价),
    OpenInterest(持仓量),
    Turnover(成交金额),
    PreClosePrice (昨收盘),
    PreOpenInterest (昨持仓),
    PreSettlementPrice (上次结算价),

    Graph.exe作用:该程序放到回测程序的目录下。在回测时,回测程序通过API会自动打开Graph.exe,在回测时自动绘制资金曲线分时图;回测完成后,也可以将回测数据文件拖入Graph.exe窗口打开资金曲线分时图;

    Price.exe作用:该程序放到回测程序的目录下。在回测的过程中或回测技术后,可以将回测数据文件拖入price.exe窗口,绘制回测时间段内的行情多日分时图,可以和Graph.exe显示的资金曲线进行对照。
    C++ Demo

    C++ Demo采用Visual Studio2015、Visual Studio2017、Visual Studio2019 编译,运行test.sln打开Demo项目。

    微软最新版本的Visual Studio下载: https://visualstudio.microsoft.com/zh-hans/downloads/

    AutoTrader.cpp

    #include <stdio.h>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <windows.h>
    #include <time.h>
    #include <iomanip>
    #include <vector>
    #include <algorithm>
    #include <stdlib.h>
    using namespace std;

    #include “.\ThostTraderApi\ThostFtdcTraderApi.h”
    #include “.\ThostTraderApi\ThostFtdcMdApi.h”
    #include “TraderSpi.h”
    #include “MdSpi.h”
    #include “Common.h”
    #include “DataSniffer.h”
    #include “MyTrader.h”

    #pragma warning(disable : 4996)
    // UserApi对象
    CThostFtdcTraderApi *pUserApi;
    // MdApi对象
    CThostFtdcMdApi *pMdApi;

    // 配置参数
    char FRONT_ADDR_1A[] = “tcp://180.168.146.187:10000”; // 前置地址1交易:实盘
    char FRONT_ADDR_1B[] = “tcp://180.168.146.187:10010”; // 前置地址2行情:实盘

    char FRONT_ADDR_2A[] = “tcp://180.168.146.187:10000”; // 前置地址1交易:盘后
    char FRONT_ADDR_2B[] = “tcp://180.168.146.187:10010”; // 前置地址2行情:盘后

    char FRONT_ADDR_3A[] = “tcp://180.168.146.187:10000”; // 前置地址3交易:仿真 17:00开始
    char FRONT_ADDR_3B[] = “tcp://180.168.146.187:10010”; // 前置地址3行情:仿真 17:00开始

    TThostFtdcBrokerIDType BROKER_ID = “9999”; // 实盘:经纪公司代码 国泰君安=7090
    TThostFtdcInvestorIDType INVESTOR_ID = “038997”; // 实盘:投资者代码
    TThostFtdcPasswordType PASSWORD = “000000wdg”; // 实盘:用户密码
    //TThostFtdcBrokerIDType BROKER_ID = “2030”; // 经纪公司代码:仿真
    //TThostFtdcInvestorIDType INVESTOR_ID = “00092”; // 投资者代码:仿真
    //TThostFtdcPasswordType PASSWORD = “888888”; // 用户密码:仿真

    TThostFtdcInstrumentIDType INSTRUMENT_ID = “rb1910”; // 交易合约代码
    TThostFtdcDirectionType DIRECTION; // 交易买卖方向
    TThostFtdcOffsetFlagType MARKETState; // 开平仓
    TThostFtdcPriceType LIMIT_PRICE; // 交易价格

    //char *ppInstrumentID[] = {“IF1910”, “rb1910”,“ag1910”, “ru1910”, “cu1910”, “j1910”, “SR1910”, “m1910”, “y1910”, “p1910”}; // 行情订阅列表
    //int iInstrumentID = 10; // 行情订阅数量

    char *ppInstrumentID[] = { “rb1910”}; // 行情订阅列表
    int iInstrumentID = 1; // 行情订阅数量
    bool ReceiveTick = false;

    // 请求编号
    int iRequestID = 0;
    // 交易时间
    bool JustRun = false; //正在启动标志

    TThostFtdcDateExprType TradingDay;

    // User行情数据

    extern char *InstrumentID_name; //
    extern string Q_BarTime_s; //时间字符串
    extern int Q_BarTime_1; //时间采用秒计
    extern double Q_BarTime_2; //时间格式0.145100
    extern double Q_UpperLimit;
    extern double Q_LowerLimit;

    extern double NewPrice;
    extern int FirstVolume; //前一次成交量数据

    extern double Mn_open[3]; //
    extern double Mn_high[3]; //
    extern double Mn_low[3]; //
    extern double Mn_close[3]; //

    extern double BuyPrice; //开仓价
    extern double SellPrice; //开仓价
    extern int BNum; //开仓次数
    extern int SNum; //开仓次数

    extern bool BuySignal;
    extern bool SellSignal;

    extern double BSVolume; //开仓量

    extern int TickABS;
    extern double TickAPrice[4];
    extern int TickBNum;
    extern double TickBPrice[4];

    extern char LogFilePaths[80];

    // 会话参数
    extern TThostFtdcFrontIDType FRONT_ID; //前置编号
    extern TThostFtdcSessionIDType SESSION_ID; //会话编号
    extern TThostFtdcOrderRefType ORDER_REF; //报单引用

    void main(void)
    {
    void Erasefiles();
    void Sniffer();
    void Trading();
    bool ReadConfiguration(char *filepaths);
    void WriteConfiguration(char *filepaths);

    Erasefiles();
    Sleep(2000);
    
    cerr << "--->>> " << "Welcom MyAutoTrader System!" << endl;
    cerr << "--->>> " << "Version 1.0.0!" << endl;
    // 初始化UserApi
    pUserApi = CThostFtdcTraderApi::CreateFtdcTraderApi("./thosttraderapi.dll");		// 创建UserApi//"./thosttraderapi.dll"
    CTraderSpi* pUserSpi = new CTraderSpi();
    pUserApi->RegisterSpi((CThostFtdcTraderSpi*)pUserSpi);			// 注册事件类
    pUserApi->SubscribePublicTopic(THOST_TERT_RESTART);				// 注册公有流
    pUserApi->SubscribePrivateTopic(THOST_TERT_RESTART);			// 注册私有流
    pUserApi->RegisterFront(FRONT_ADDR_1A);							// connect
    pUserApi->Init();
    cout << pUserApi->GetApiVersion() << endl;
    cout << "--->>> " << "Initialing TradeApi" << endl;
    
    // 初始化MdApi
    pMdApi = CThostFtdcMdApi::CreateFtdcMdApi("./thostmduserapi.dll");					// 创建MdApi//"./thostmduserapi.dll"
    CThostFtdcMdSpi* pMdSpi = new CMdSpi();
    pMdApi->RegisterSpi(pMdSpi);									// 注册事件类
    pMdApi->RegisterFront(FRONT_ADDR_1B);							// connect		优先行情地址
    pMdApi->RegisterFront(FRONT_ADDR_2B);							// connect		备用行情地址,1B断开,自动连接2B地址
    cout << pMdApi->GetApiVersion() << endl;
    pMdApi->Init();
    cout << "--->>> " << "Initialing MdApi" << endl;
    //pMdApi->Join();
    //pMdApi->Release();
    
    Sleep(6000);
    ReadConfiguration("./AutoTrader.dat");			//自定义数据,如持仓数据等均可
    cout << "--->>> " << "初始化完成!" << endl;
    
    
    while(1)
    {
    	//指标计算,下面只是个简单例子
    	//可自建函数,进行复杂处理  见DataSniffer.h
    	Sniffer();
    	//下单控制
    	//可自建函数,单独复杂处理	见MyTrader.h
    	Trading();
    	Sleep(50);
    }
    

    }

    stdafx.h

    #pragma once
    #ifndef _WIN32_WINNT // 允许使用特定于 Windows XP 或更高版本的功能。
    #define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
    #endif
    #include <stdio.h>
    #include <tchar.h>
    #include <string.h>
    #include <windows.h>
    #include <iostream>
    using namespace std;

    TraderSpi.h

    #pragma once
    #include “stdafx.h”
    #include “…\…\Library(C++)\ThostFtdcTraderApi.h”

    class CTraderSpi : public CThostFtdcTraderSpi
    {
    public:
    ///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。
    virtual void OnFrontConnected();

    ///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。
    ///@param nReason 错误原因
    ///        0x1001 网络读失败
    ///        0x1002 网络写失败
    ///        0x2001 接收心跳超时
    ///        0x2002 发送心跳失败
    ///        0x2003 收到错误报文
    virtual  void OnFrontDisconnected(int nReason);
    
    ///登录请求响应
    //	virtual  void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast) ;
    virtual  void OnRspUserLogin(char *username, char *password);
    
    ///登出请求响应
    virtual  void OnRspUserLogout(CThostFtdcVirtualApiLogoutField *pUserLogout, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
    
    ///错误应答
    virtual  void OnRspError(CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
    
    ///报单录入请求响应
    virtual  void OnRspOrderInsert(COrderField *pInputOrder, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
    
    ///请求查询投资者持仓响应
    virtual  void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
    
    virtual  void OnRtnOrder(CThostFtdcTradeOrderField *pOrder);
    

    public:
    ///请求查询资金账户
    void ReqQryTradingAccount();

    ///请求查询投资者持仓
    void ReqQryInvestorPosition();
    
    ///报单录入请求
    void ReqOrderInsert(int Sid, char *Instrument, int Volume, double Price, double LastPrice, int Direction, char *Remark);
    
    ///报单操作请求
    void ReqOrderAction(CThostFtdcTradeOrderField *pOrder);
    
    // 是否收到成功的响应
    bool IsErrorRspInfo(CThostFtdcVirtualApiRspInfoField *pRspInfo);
    
    // 是否我的报单回报
    bool IsMyOrder(CThostFtdcTradeOrderField *pOrder);
    
    // 是否正在交易的报单
    bool IsTradingOrder(CThostFtdcTradeOrderField *pOrder);
    

    };

    TraderSpi.h

    #include
    #include
    #include
    #include
    using namespace std;
    #include “stdafx.h”
    #include “…\…\Library(C++)\ThostFtdcTraderApi.h”
    #include “TraderSpi.h”

    #pragma warning(disable : 4996)

    // USER_API参数
    extern CThostFtdcTraderApi* pTdApi;

    // 配置参数
    extern char FRONT_ADDR[]; // 前置地址
    extern char BROKER_ID[]; // 经纪公司代码
    extern char INVESTOR_ID[]; // 投资者代码
    extern char PASSWORD[]; // 用户密码
    extern char* ppInstrumentID[];
    extern int iInstrumentID;
    extern char INSTRUMENT_ID[]; // 合约代码
    extern TThostFtdcDirectionType DIRECTION; // 买卖方向
    extern TThostFtdcOffsetFlagType MARKETState;//开平仓
    extern TThostFtdcPriceType LIMIT_PRICE; // 价格
    #define TYPE_NUM 20
    extern double Q_UpperLimit;
    extern double Q_LowerLimit;

    extern bool JustRun; //正在启动标志

    							// 会话参数
    

    TThostFtdcFrontIDType FRONT_ID; //前置编号
    TThostFtdcSessionIDType SESSION_ID; //会话编号
    TThostFtdcOrderRefType ORDER_REF; //报单引用

    extern int needstate;
    void CTraderSpi::OnFrontConnected()
    {
    cerr << “—>>> " << FUNCTION << endl;
    char username[51] = { 0 };
    char password[51] = { 0 };
    pTdApi->GetLoginInfoUsername(username);
    pTdApi->GetLoginInfoPassword(password);
    pTdApi->ReqUserLogin(username, password);
    printf(”[%s] are logging into the TradeAgent server…\n", username);
    ///用户登录请求
    //ReqUserLogin();
    Sleep(500);
    }

    void CTraderSpi::OnRspUserLogin(char *username, char *password)
    {
    cerr << "—>>> " << FUNCTION << endl;

    /*
    if (pRspUserLogin == NULL)
    {
    cout << "--->>>指针错误OnRspUserLogin" << endl;			  //指针检查
    //WirteTradeRecordToFileMainThread(0, "OnRspUserLogin指针错误");
    Sleep(5000);
    ReqUserLogin();// 自己添加
    return;
    }
    
    if (IsErrorRspInfo(pRspInfo))
    {
    cerr << "--->>> 交易登录错误: " << pRspInfo->ErrorID << pRspInfo->ErrorMsg << endl;
    //WirteTradeRecordToFileMainThread(0, "交易登录错误");
    
    Sleep(5000);
    ReqUserLogin();// 自己添加
    
    }
    
    if (bIsLast && !IsErrorRspInfo(pRspInfo))
    {
    // 保存会话参数
    FRONT_ID = pRspUserLogin->FrontID;
    SESSION_ID = pRspUserLogin->SessionID;
    int iNextOrderRef = atoi(pRspUserLogin->MaxOrderRef);
    iNextOrderRef++;
    sprintf(ORDER_REF, "%d", iNextOrderRef);
    //cerr << "--->>> 报单引用 = " << ORDER_REF << endl;
    ///获取当前交易日
    
    char TradingDay[9] = { "0" };
    strcpy(TradingDay, pTdApi->GetTradingDay());
    cerr << "--->>> 获取当前交易日 = " << pTdApi->GetTradingDay() << endl;
    
    }
    */
    

    }

    void CTraderSpi::OnRspUserLogout(CThostFtdcVirtualApiLogoutField *pUserLogout, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
    {
    }

    extern double YestayAllAmount;
    extern double TodayAllAmount;
    //extern double UserAmount;

    int JsReqQryTradingAccountFailer = 0;
    void CTraderSpi::ReqQryTradingAccount()
    {
    /*
    CThostFtdcQryTradingAccountField req;
    memset(&req, 0, sizeof(req));
    strcpy(req.BrokerID, BROKER_ID);
    strcpy(req.InvestorID, INVESTOR_ID);
    int iResult = pTdApi->ReqQryTradingAccount(&req, ++iRequestID);
    //cerr << "—>>> 请求查询资金账户: " << ((iResult == 0) ? “成功” : “失败”) << endl;

    if (iResult == 0)
    {
    JsReqQryTradingAccountFailer=  0;
    }
    else
    {
    JsReqQryTradingAccountFailer++;
    if (JsReqQryTradingAccountFailer > 20)
    {
    printf("请求查询资金账户资金X失败");
    }
    }
    */
    

    }

    double UserAmount = 0;

    void CTraderSpi::ReqQryInvestorPosition()
    {
    /*
    CThostFtdcQryInvestorPositionField req;
    memset(&req, 0, sizeof(req));
    strcpy(req.BrokerID, BROKER_ID);
    strcpy(req.InvestorID, INVESTOR_ID);
    strcpy(req.InstrumentID, InstrumentID_n[0]);
    int iResult = pTdApi->ReqQryInvestorPosition(&req, ++iRequestID);
    //cerr << "—>>> 请求查询投资者持仓: " << ((iResult == 0) ? “成功” : “失败”) << endl;

    if (iResult == 0)
    {
    JsReqQryInvestorPositionFailer=0;
    }
    else
    {
    JsReqQryInvestorPositionFailer++;
    if (JsReqQryInvestorPositionFailer > 20)
    {
    printf("请求查询投资者持仓X失败");
    }
    }
    */
    

    }

    bool FindStr(int id, char * str)
    {

    //char * pdest1 = strstr(InstrumentID_n[id], str);
    //int  result1 = pdest1 - InstrumentID_n[id] + 1;
    //printf("%s  %s\n", InstrumentID_n[id], str);
    
    //if (stricmp(InstrumentID_n[id], str) == 0)
    //if (pdest1 != NULL)
    //{	//printf("在%s发现%s\n", InstrumentID_n[id],str );
    return true;
    //}
    //else
    //{
    //printf("%s 没有在%s发现\n", str, InstrumentID_n[id]);
    //	return false;
    //}
    

    }

    int SaveInstrumentID = { 0 };
    bool checkstate = false;
    bool TypeCheckState_B_Today[TYPE_NUM] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false };
    bool TypeCheckState_S_Today[TYPE_NUM] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false };

    bool TypeCheckState_B_History[TYPE_NUM] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false };
    bool TypeCheckState_S_History[TYPE_NUM] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false };

    int Trade_dataA_Amount_S_History[TYPE_NUM] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //空头持仓
    int Trade_dataA_Amount_S_Today[TYPE_NUM] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //空头持仓

    int Trade_dataA_Amount_B_History[TYPE_NUM] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //多头持仓
    int Trade_dataA_Amount_B_Today[TYPE_NUM] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //多头持仓

    																											//int	Trade_dataA_Amount_B_Today = 0;		//多头持仓
    																											//int	Trade_dataA_Amount_S_Today = 0;		//多头持仓
    

    bool orderstate = false;

    ///请求查询投资者持仓响应
    void CTraderSpi::OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
    {

    }

    extern int iRequestID;
    extern int MAX_TRADENUM;
    extern double totlemoney;

    void CTraderSpi::ReqOrderInsert(int Sid, char *Instrument, int Volume, double Price, double LastPrice, int Direction, char *Remark)
    {
    COrderField req;
    memset(&req, 0, sizeof(req));
    req.Sid = Sid; //策略ID编号
    strcpy(req.InstrumentID, Instrument); //股票代码
    _snprintf_s(req.Remark, sizeof(req.Remark), sizeof(req.Remark) - 1, “%s”, Remark); //备注,也可以输出策略程序的变量等

    req.Volume = Volume;                     //下单数量
    req.Price = Price;                    //委托价格
    req.LastPrice = LastPrice;                    //委托价格
    
    req.Direction = Direction;            //买卖方向
    int iRequestID = 1;
    int iResult = pTdApi->ReqOrderInsert(&req, ++iRequestID);
    cerr << "--->>> 报单录入请求: " << ((iResult == 0) ? "成功" : "失败") << endl;
    

    }

    void CTraderSpi::ReqOrderAction(CThostFtdcTradeOrderField *pOrder)
    {

    }

    void CTraderSpi::OnRspOrderInsert(COrderField *pInputOrder, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
    {
    cerr << "—>>> " << FUNCTION << endl;

    SYSTEMTIME sys_time;
    GetLocalTime(&sys_time);
    double system_times;
    system_times = (double)((sys_time.wHour) / 10e1) + (double)((sys_time.wMinute) / 10e3) + (double)((sys_time.wSecond) / 10e5);	//格式时间0.145100
    
    //cerr << "--->>> 报单: " <>> " << __FUNCTION__ << endl;
    if (IsMyOrder(pOrder))
    {
    	if (IsTradingOrder(pOrder))
    		ReqOrderAction(pOrder);
    	else if (pOrder->OrderStatus == THOST_FTDC_OST_Canceled)
    		cout << "--->>> 撤单成功" << endl;
    }
    

    }

    void CTraderSpi::OnFrontDisconnected(int nReason)
    {
    cerr << "—>>> " << “OnFrontDisconnected” << endl;
    cerr << "—>>> Reason = " << nReason << endl;
    }

    void CTraderSpi::OnRspError(CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
    {
    cerr << "—>>> " << “OnRspError” << endl;
    IsErrorRspInfo(pRspInfo);
    }

    bool CTraderSpi::IsErrorRspInfo(CThostFtdcVirtualApiRspInfoField *pRspInfo)
    {
    // 如果ErrorID != 0, 说明收到了错误的响应
    bool bResult = ((pRspInfo) && (pRspInfo->ErrorID != 0));
    if (bResult)
    cerr << “—>>> ErrorID=” << pRspInfo->ErrorID << “, ErrorMsg=” << pRspInfo->ErrorMsg << endl;
    return bResult;
    }

    bool CTraderSpi::IsMyOrder(CThostFtdcTradeOrderField *pOrder)
    {
    //return ((pOrder->FrontID == FRONT_ID) &&
    //(pOrder->SessionID == SESSION_ID) &&
    //(strcmp(pOrder->OrderRef, ORDER_REF) == 0));

    return (strcmp(pOrder->OrderRef, ORDER_REF) == 0);
    

    }

    bool CTraderSpi::IsTradingOrder(CThostFtdcTradeOrderField *pOrder)
    {
    return ((pOrder->OrderStatus != THOST_FTDC_OST_PartTradedNotQueueing) &&
    (pOrder->OrderStatus != THOST_FTDC_OST_Canceled) &&
    (pOrder->OrderStatus != THOST_FTDC_OST_AllTraded));
    }

    《Quicklib程序化交易框架www.quicklib.cn》
    http://www.mdshare.cn/comm/topic/2750/
    《期货跟单软件视频教学4集》
    《开户中国期货低佣金开户》
    《mdshare财经数据接口包》
    《某python量化交易框架性能评测》
    《QuicklibTrade A股行情接口,Level2接口》

    python量化交易

    《优秀量化资源导航》
    《TradeApi A股程序化交易接口》
    《酷操盘手期货跟单软件》

    posted in 期货,A股等API程序化量化开发技术交流 read more
  • wdg wdg

    virtualapi官方网址
    http:.//www.virtualapi.cn
    virtualapi是一种简单易用的回测方式,这种方式可以在不修改一行代码的情况下进行回测,即回测代码即实盘代码,该方案通过模拟原始API的方式进行回测,回测精度高,支持自定义手续费设置,并申请了国家专利。

    VNPY,Quicklib,支持C++、python程序、JAVA、C# 等,可以说无所不兼容。并且实盘代码可以在不改动
    一行代码前提下实现回测。
    VirtualApi申请了国家发明专利,如果有类似CTP API需要

    VirtualApi 支持期货CTP API接口
    CTP API是上海期货交易所的API,支持所有期货公司期货实盘账户和SIMNOW CTP模拟账户
    模拟账户注册网址
    http://www.simnow.com.cn
    实盘期货账户(商品期货、股指期货)开户网址
    http://www.kaihucn.cn

    支持所有自编程序和框架进行回测

    Ver2.5
    修复穿透式监管版本的API在部分计算机无法回测的问题。
    穿透式版本升级至2.5
    非穿透式版本保持2.3

    Ver2.4
    提供最新的CTP穿透式版本的VirtualApi

    Ver2.3
    增加对查询投资者持仓响应OnRspQryInvestorPosition
    增加对查询资金账户响应OnRspQryTradingAccount回调支持

    Ver2.2
    功能升级

    Ver2.1
    修复了MD和TD资金数据同步的Bug
    增加配置文件setting.ini,
    可以通过修改setting.ini自由设置
    (1)初始资金
    (2)开仓手续费
    (3)平仓手续费
    (4)滑点

    Ver2.0
    修复在某些软硬件环境下回测的死锁问题

    Ver1.1~Ver1.9
    完善功能修复Bug

    Ver1.0
    正式发布

    《优秀量化资源导航》
    《TradeApi A股程序化交易接口》
    《酷操盘手期货跟单软件》
    python量化交易
    《开户中国期货低佣金开户》
    《mdshare财经数据接口包》
    《某python量化交易框架性能评测》
    量化交易资源下载
    .

    posted in 期货,A股等API程序化量化开发技术交流 read more
  • wdg wdg

    量贝金融数据接口官方网站
    量贝.A股Level2行情数据接口、金融数据接口​
    http://www.mdapi.cn

    以公募量化基金、私募量化基金为核心客户的金融数据产品

    量贝数据提供Level2实时数据、历史数据、涵盖A股、基金、债券、指数、衍生品、市场咨询、港股、宏观行业等几十个大表、上百个主题的完整数据产品。

    产品1

    QTS A股实时行情数据

    产品2

    QTS指数通
    基于QTS接口,通过API接口获取实时行情数据
    2万/年

    产品3
    GTA 财经数据库
    涵盖A股、基金、债券、指数、衍生品、市场咨询、港股、宏观行业等几十个大表、上百个主题

    产品4

    A股历史数据
    自1990年以来所有的Level2历史数据,数据集合庞大,2万/年

    系统可靠稳定

    稳定性高:系统运行高稳定,双系统双备份,保证客户行情稳定和准确。
    通信多样:通信既有基于托管机房局域网组播的通信方式,页有互联网和专线的TCP通信方式。
    权控灵活:可按市场(7大交易所)、Level1、Level2,逐笔、实时行情、指数、个股代码灵活订阅。
    并发量大:单个分发服务可支持全品种10万代码的券消息类型订阅,分发服务支持冰箱和级联扩展。

    支持的编程语言多样

    支持常见的C++、C#、JAVA、Python接口。
    支持Windows和Linux

    《Quicklib程序化交易框架www.quicklib.cn》
    http://www.mdshare.cn/comm/topic/2750/
    《期货跟单软件视频教学4集》

    《virtualapi》
    《tradeapi》
    《酷操盘手期货跟单软件》
    《开户中国期货低佣金开户》
    《mdshare财经数据接口包》

    posted in 期货,A股等API程序化量化开发技术交流 read more
  • wdg wdg

    众所周知,Quicklib 是一款基于 CTP的量化交易开源框架,

    今天Quicklib刚刚发布了 CTP期货程序化交易接口穿透式版本2.5,对应的CTP版本位6.3.15,请大家及时更新。

    Quicklib官网也做了调整,删除了以前CTP2和资管Python框架的内容,因为马上到年底或2020年初,自主知识产权的资管系统就要发布了。

    到时候会提供新的Python资管框架,可以说稳定性和易用性都会比第三方的更加稳定和强大。

    对Python的支持也升级到Python3系列
    可以说,这次发布的Python3支持CTP穿透式监管的版本将遵循极简的原则,也是将来Quicklib框架遵循的原则。

    请及时在首页下载
    http://www.quicklib.cn
    http://www.quicklib.cn/download/Quicklib_ctp_futures_windows.rar
    资源打包下载
    http://mdshare.cn/source.zip

    CTP TICK级回测接口官网,这个是极力推荐的
    http://www.virtualapi.cn

    数据是进行量化交易的基础和关键, mdshare提供一种更经济便捷的方式来获取数据, 通过特别的采集工具, 以csv的格式存储,便于后续进行量化交易分析。
    提供的工具软件叫 DataCollectServer,这本身是原来Quicklib提供的一个模块,但是已经作为独立产品放到了mdshare中,并100%兼容Virtualapi的字段顺序格式。

    http://www.mdshare.cn

    而资管系统又属于这个系列
    http://www.kucps.com/

    http://www.kaihucn.cn/

    posted in 期货,A股等API程序化量化开发技术交流 read more
  • wdg wdg

    随着CTP api穿透式监管的实施,老的CTP api已经不再能使用,采集工具更新到最新的CTP API6.3.15,并增加到所有期货品种的采集支持,并采用了无锁队列,进一步提高了稳定性,可以实现365X24小时不间断采集数据。
    下载地址
    http://mdshare.cn/DataCollect.zip

    采集的数据100%兼容支持CTP TICK级回测
    http://www.virtualapi.cn/
    期货实盘开户支持CTP接口

    http://www.kaihucn.cn/

    上期CTP接口官网,支持实盘和模拟注册
    http://www.simnow.com.cn

    采集的历史数据网盘下载
    http://www.pythonpai.com/topic/4206/
    4.8
    修复郑州交易所2020年以后合约编码错误

    4.7.0
    升级到CTP穿透式API
    升级到高性能无锁队列,并提高稳定性
    完善对新品种订阅,增加棉纱、苹果、红枣、二债的采集支持

    4.6.0
    升级功能
    4.5.0
    消除了日志窗口不自动清理导致内存不断增加的BUG,长时间运行内存超过系统限制比如15天以上可能导致程序崩溃的问题。

    4.3.5
    提高了健壮性,对长时间运行遇到异常行情数据导致程序溢出崩溃的问题

    4.3.3
    修复行情分时图显示字段错误
    修复周六夜盘0点以后交易日为下周一的日期(csv文件的文件名)

    4.3.2
    更新为按本地日期分类,删除TICK级目录
    4.3
    修复磁盘写入时,打不开文件可能导致崩溃的问题(之前1个月出现一次)
    4.2
    完善郑州合约的收集,增加对本月合约的订阅

    4.1
    增加时间流模式的存储,即所有合约按时间顺序记录到一个文件里
    时间流模式和合约模式(老的模式)都增加一个字段(本机写入TICK时间)

    4.0
    增加对原油和苹果合约的采集

    3.9
    增加稳定性

    3.8
    增加合约焦炭j,删除无用的settion.ini配置文件中的字段
    3.3
    修复数据保存时,UpperLimitPrice(涨停板价)
    LowerLimitPrice(跌停板价)缺少","作为分隔符的问题

    3.2
    增加了对CTP时间段的过滤
    一般每天早上6-8点,从CTP服务器会重复发送前一天夜盘的行情,为了避免重复写入数据,
    在配置文件提供了停止存储的时间段(2个时间段),如果不设置的话,默认系统会过滤掉15:30~20:40和3:00~8:40的行情数据,即便接收到行情也不做存储。
    可以自行更改

    3.1
    支持盘中实时行情和历史行情连续回播,开盘时间申请到当前行情时间段也不会缺行情,
    当数据服务器将文件历史行情回播完成后,开始接着播放实时行情,直到通过python api
    调用方法,通知服务器停止回播实时行情。
    目前不支持并发,对同一个品种多次调用回播api,会导致回播行情数据顺序错乱。
    对不同品种多次调用回播api,可能因为cpu占用过大,会导致服务器UI没有响应。后面升级版本会
    完整的并发解决方案。

    3.0
    (1)TCP网络连接由同步模式改为异步模式,解决某些网络状况无法连接数据采集服务器的问题
    (2)提供了互联网服务器 data.quicklib.cn 但目前性能未作优化,并不能做大量并发连接。
    未来升级版本将优化性能

    《Quicklib程序化交易框架www.quicklib.cn》
    http://www.mdshare.cn/comm/topic/2750/
    《期货跟单软件视频教学4集》
    《开户中国期货低佣金开户》
    《mdshare财经数据接口包》
    《某python量化交易框架性能评测》
    《QuicklibTrade A股行情接口,Level2接口》

    python量化交易

    《优秀量化资源导航》
    《TradeApi A股程序化交易接口》
    《酷操盘手期货跟单软件》

    posted in 期货,A股等API程序化量化开发技术交流 read more