登录  | 立即注册

游客您好!登录后享受更多精彩

QQ登录

只需一步,快速开始

查看: 9893|回复: 0

VNPY3.0行情数据调用的5种方式

[复制链接]

65

主题

110

帖子

1347

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1347
发表于 2022-1-10 02:30:30 | 显示全部楼层 |阅读模式
其他参考文章
《快速入门教程》
https://q.vnpy.cn/comm/thread-13-1-1.html
《新版策略自动生成回测文件功能代码解析》
https://q.vnpy.cn/comm/thread-22-1-1.html
《VNPY3.0以后的版本为什么不用数据库设计架构?》
https://q.vnpy.cn/comm/thread-21-1-1.html
《VNPY3.0行情数据调用的5种方式 》
https://q.vnpy.cn/comm/thread-24-1-1.html
《VNPY新手常见问题说明》
https://q.vnpy.cn/comm/thread-3-1-1.html
《VNPY3.0 架构图》
https://q.vnpy.cn/comm/thread-25-1-1.html
《A股\期货解决方案》
http://www.vnta.cn


VNPY官网
https://www.vnpy.cn
VNTA 证券和期货方案
http://www.vnta.cn
《用户福利》
https://www.vnpy.cn/kaihu/

1. marketdata 是 实时Tick数据


        可参考 strategyfile/talib_MA.py  

        参数marketdata 行情来自CTP接口的的TICK回调数据
       thostmduserapi_se.dll(CTP原生行情API) ->  vnctpmd.dll   (这是代理API,是CTP和PY之间的桥梁,代码项目名vnctpmd,需要和thostmduserapi_se.lib 、thostmduserapi_se.h一起编译) ->vnctpmd.py ->module_md.py
        (1)CTP原生API thostmduserapi_se.dll  、 C++ 头文件 thostmduserapi_se.h 中CThostFtdcMdSpi类的
  1.     ///深度行情通知
  2.     virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData) {};
复制代码

CThostFtdcMdSpi类的完整代码如下
  1. class CThostFtdcMdSpi
  2. {
  3. public:
  4.     ///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。
  5.     virtual void OnFrontConnected(){};
  6.    
  7.     ///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。
  8.     ///@param nReason 错误原因
  9.     ///        0x1001 网络读失败
  10.     ///        0x1002 网络写失败
  11.     ///        0x2001 接收心跳超时
  12.     ///        0x2002 发送心跳失败
  13.     ///        0x2003 收到错误报文
  14.     virtual void OnFrontDisconnected(int nReason){};
  15.         
  16.     ///心跳超时警告。当长时间未收到报文时,该方法被调用。
  17.     ///@param nTimeLapse 距离上次接收报文的时间
  18.     virtual void OnHeartBeatWarning(int nTimeLapse){};
  19.    

  20.     ///登录请求响应
  21.     virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

  22.     ///登出请求响应
  23.     virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

  24.     ///请求查询组播合约响应
  25.     virtual void OnRspQryMulticastInstrument(CThostFtdcMulticastInstrumentField *pMulticastInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

  26.     ///错误应答
  27.     virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

  28.     ///订阅行情应答
  29.     virtual void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

  30.     ///取消订阅行情应答
  31.     virtual void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

  32.     ///订阅询价应答
  33.     virtual void OnRspSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

  34.     ///取消订阅询价应答
  35.     virtual void OnRspUnSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

  36.     ///深度行情通知
  37.     virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData) {};

  38.     ///询价通知
  39.     virtual void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp) {};
  40. };
复制代码



      (2) vnctpmd.dll、 vnctpmd.py

vnctpmd.py通过ctypes方式调用vnctpmd.dll中的方法
  1. # 行情回调
  2.     def OnRtnDepthMarketData(self, a):
  3.         pass
复制代码

        (3) module_md.py
      module_md.py的MyCTPMarket类继承自 vnctpmd.py的vnctpmd类
      MyCTPMarket类中的OnRtnDepthMarketData获得回调后,不直接更新UI,是通过signal_md_tick是信号,将数据发送给UI更新。
       OnRtnDepthMarketData还将驱动策略文件进行计算,策略文件保存在strategyfile目录下,比如 talib_MA.py 就是策略文件,该目录下同名 talib_MA.ini 文件为策略配置文件。
         回测时,系统会自动根据 talib_MA.py 生成strategyfilebacktest目录下的同名 talib_MA.py 文件。

  1. # MyCTPMarket类继承自CTPMarket类
  2. class MyCTPMarket(vnctpmd, QtCore.QThread):
  3.     loginstate = False

  4.     def ReqUserLogin(self):
  5.         pass

  6.     def OnRtnDepthMarketData(self, tickdatacontents):
  7.         tickdata = tickdatacontents[0]
  8.         update_depthMarketData(tickdata)
  9.         module_strategy.StrategyManager(tickdata)
  10.         self.signal_md_tick.emit([tickdata.InstrumentID, tickdata.LastPrice, tickdata.Volume,
  11.                                   tickdata.TradingDay, tickdata.UpdateTime,
  12.                                   tickdata.UpdateMillisec])
  13.         try:
  14.             globalvar.thistoday = int(tickdata.TradingDay)
  15.         except Exception as e:
  16.             pass
复制代码






2. 这是从CTP Tick由vnctpmd.dll 在本机生成的K线,可以直接按下标方式取得,速度快
vnctptd.dll、vnctpmd.py、vnctptd.ini


该数据是由CTP实时Tick在vnctptd.dll中合成的,存储在用户计算机内存中,通过vnctpmd.py的GetKline(self, InstrumentID, ID)方法调用
如果用户网络中断的话,可能导致该数据不完整。

  1.     def GetKline(self, InstrumentID, ID):
  2.         try:
  3.             # data = self.fGetKline(InstrumentID.encode("utf-8"),ID)
  4.             data = self.fGetKline(InstrumentID, ID)
  5.             return cast(data, POINTER(KLineDataType))
  6.         except Exception as e:
  7.             print("GetKline Error:" + repr(e))
复制代码


3. 这是从服务器获得当日K线取法,禁止频繁调用  vnklineservice.dll、vnklineservice.py、vnklineservice.ini


vnklineservice.py文件的vnklineservice类,通过ctypes方式调用vnklineservice.dll中的GetServerKline()方法


4. 这是当前显示K线图数据暂存,数据来自于 vnctpmd.dll  和 vnklineservice.dll,策略计算不用这个。


    当系统启动和断线重连时,会先从vnklineservice.dll获取最近的M1周期K线数据,然后通过vnctpmd.dll从CTP接口TICK合成K线追加数据。


    其中vnklineservice.dll 服务是可选项,如果没有该服务,那么数据的唯一来源就是CTP接口,程序启动时会从第一个线开始计算。
   

    vnklineservice.dll 服务需要用户通过客户端主动调用,不仅用于K线显示,也可以用于策略计算。


5. 历史数据
backtestdata目录下的CSV文件







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|VNPY官方Python开源量化社区 ( 沪ICP备17025576号 )

GMT+8, 2024-12-31 01:11 , Processed in 0.069633 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表