VNPY官方网址
http://www.vnpy.cn
VNPY3.0版开源地址
https://gitee.com/vnpypro/vnpy
- 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类的
///深度行情通知
virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData) {};
CThostFtdcMdSpi类的完整代码如下
class CThostFtdcMdSpi
{
public:
///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。
virtual void OnFrontConnected(){};
///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。
///@param nReason 错误原因
/// 0x1001 网络读失败
/// 0x1002 网络写失败
/// 0x2001 接收心跳超时
/// 0x2002 发送心跳失败
/// 0x2003 收到错误报文
virtual void OnFrontDisconnected(int nReason){};
///心跳超时警告。当长时间未收到报文时,该方法被调用。
///@param nTimeLapse 距离上次接收报文的时间
virtual void OnHeartBeatWarning(int nTimeLapse){};
///登录请求响应
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///登出请求响应
virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///请求查询组播合约响应
virtual void OnRspQryMulticastInstrument(CThostFtdcMulticastInstrumentField *pMulticastInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///错误应答
virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///订阅行情应答
virtual void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///取消订阅行情应答
virtual void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///订阅询价应答
virtual void OnRspSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///取消订阅询价应答
virtual void OnRspUnSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
///深度行情通知
virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData) {};
///询价通知
virtual void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp) {};
};
(2) vnctpmd.dll、 vnctpmd.py
vnctpmd.py通过ctypes方式调用vnctpmd.dll中的方法
行情回调
def OnRtnDepthMarketData(self, a):
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 文件。
MyCTPMarket类继承自CTPMarket类
class MyCTPMarket(vnctpmd, QtCore.QThread):
loginstate = False
def ReqUserLogin(self):
pass
def OnRtnDepthMarketData(self, tickdatacontents):
tickdata = tickdatacontents[0]
update_depthMarketData(tickdata)
module_strategy.StrategyManager(tickdata)
self.signal_md_tick.emit([tickdata.InstrumentID, tickdata.LastPrice, tickdata.Volume,
tickdata.TradingDay, tickdata.UpdateTime,
tickdata.UpdateMillisec])
try:
globalvar.thistoday = int(tickdata.TradingDay)
except Exception as e:
pass
- 这是从CTP Tick由vnctpmd.dll 在本机生成的K线,可以直接按下标方式取得,速度快vnctptd.dll、vnctpmd.py、vnctptd.ini
- 这是从服务器获得当日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文件