MTF wrote:
- 华鑫目前只提供了3.7版本的API,所以没法集成
- vnpy_tora仓库里应该写了最少要3.3.0以上的vnpy核心库才行
请问我用3.3核心库,使用python3.7,集成vnpy_tora是否可以解决上述问题
MTF wrote:
- 华鑫目前只提供了3.7版本的API,所以没法集成
- vnpy_tora仓库里应该写了最少要3.3.0以上的vnpy核心库才行
您说的很对。这两点我都表示赞同。
但是我对比了3.3.0核心代码和之前2.x的区别,和tora对接方面,好像除包结构改动外,并没有什么特别之处啊。我试了华鑫最新版的demo,是可以跑通的,test的demo如下:
import xmdapi
class MdSpi(xmdapi.CTORATstpXMdSpi):
def init(self, api):
xmdapi.CTORATstpXMdSpi.init(self)
self.__api = api
def OnFrontConnected(self):
print("OnFrontConnected")
#请求登录,目前未校验登录用户,请求域置空即可
login_req = xmdapi.CTORATstpReqUserLoginField()
self.__api.ReqUserLogin(login_req, 1)
def OnRspUserLogin(self, pRspUserLoginField, pRspInfoField, nRequestID):
if pRspInfoField.ErrorID == 0:
print('Login success! [%d]' % nRequestID)
'''
订阅行情
当sub_arr中只有一个"00000000"的合约且ExchangeID填TORA_TSTP_EXD_SSE或TORA_TSTP_EXD_SZSE时,订阅单市场所有合约行情
当sub_arr中只有一个"00000000"的合约且ExchangeID填TORA_TSTP_EXD_COMM时,订阅全市场所有合约行情
其它情况,订阅sub_arr集合中的合约行情
'''
sub_arr = [b'00000000']
ret = self.__api.SubscribeMarketData(sub_arr, xmdapi.TORA_TSTP_EXD_SSE)
if ret != 0:
print('SubscribeMarketData fail, ret[%d]' % ret)
else:
print('SubscribeMarketData success, ret[%d]' % ret)
sub_arr = [b'00000000']
ret = self.__api.UnSubscribeMarketData(sub_arr, xmdapi.TORA_TSTP_EXD_SSE)
if ret != 0:
print('UnSubscribeMarketData fail, ret[%d]' % ret)
else:
print('SubscribeMarketData success, ret[%d]' % ret)
else:
print('Login fail!!! [%d] [%d] [%s]'
%(nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg))
def OnRspSubMarketData(self, pSpecificSecurityField, pRspInfoField):
if pRspInfoField.ErrorID == 0:
print('OnRspSubMarketData: OK!')
else:
print('OnRspSubMarketData: Error! [%d] [%s]'
%(pRspInfoField.ErrorID, pRspInfoField.ErrorMsg))
def OnRspUnSubMarketData(self, pSpecificSecurityField, pRspInfoField):
if pRspInfoField.ErrorID == 0:
print('OnRspUnSubMarketData: OK!')
else:
print('OnRspUnSubMarketData: Error! [%d] [%s]'
%(pRspInfoField.ErrorID, pRspInfoField.ErrorMsg))
def OnRtnMarketData(self, pMarketDataField):
print("SecurityID[%s] SecurityName[%s] LastPrice[%.2f] Volume[%d] Turnover[%.2f] BidPrice1[%.2f] BidVolume1[%d] AskPrice1[%.2f] AskVolume1[%d] UpperLimitPrice[%.2f] LowerLimitPrice[%.2f]"
% (pMarketDataField.SecurityID, pMarketDataField.SecurityName, pMarketDataField.LastPrice, pMarketDataField.Volume,
pMarketDataField.Turnover, pMarketDataField.BidPrice1, pMarketDataField.BidVolume1, pMarketDataField.AskPrice1,
pMarketDataField.AskVolume1, pMarketDataField.UpperLimitPrice, pMarketDataField.LowerLimitPrice))
if name == "main":
# 打印接口版本号
print(xmdapi.CTORATstpXMdApi_GetApiVersion())
# 创建接口对象
api = xmdapi.CTORATstpXMdApi_CreateTstpXMdApi()
# 创建回调对象
spi = MdSpi(api)
# 注册回调接口
api.RegisterSpi(spi)
# 注册单个行情前置服务地址
api.RegisterFront("tcp://10.0.1.101:6402")
# 注册多个行情前置服务地址,用逗号隔开
#api.RegisterFront("tcp://10.0.1.101:6402,tcp://10.0.1.101:16402")
# 注册名字服务器地址,支持多服务地址逗号隔开
#api.RegisterNameServer('tcp://10.0.1.101:52370')
#api.RegisterNameServer('tcp://10.0.1.101:52370,tcp://10.0.1.101:62370')
# 启动接口
api.Init()
# 等待程序结束
input()
# 释放接口对象
api.Release()
如果问题一成立的话,请问最新的station如何集成vnpy_tora呢?
各位大佬,我最近在接tora的接口。发现几个奇怪的情况:
一、目前vnpy最新版的station是3.4,使用的是python3.10的版本,安装后并没有华鑫奇点的接口。我在gitee上找到vnpy_tora,支持python3.7,我猜测是否是因为python版本的问题不把tora打包到最新版安装包中?
二、把最新的vnpy_tora集成到支持python3.7的vnpy2.x版本中,登录专业交易仿真账号,登录后行情地址和交易地址成功,但是成功日志输出后,会迅速报错:
Process finished with exit code -1073740791 (0xC0000409)
为了解决这一问题, 我做了如下尝试:
1)把日志打在这一行
def process_contract_event(self, event: Event) -> None:
""""""
contract = event.data
print("contract : {}", contract)
self.contracts[contract.vt_symbol] = contract
日志输出:
event : {} ContractData(gateway_name='TORASTOCK', symbol='110038', exchange=<Exchange.SSE: 'SSE'>, name='济川转债', product=<Product.BOND: '债券'>, size=1, pricetick=0.001, min_volume=10, stop_supported
=False, net_position=True, history_data=False, option_strike=0, option_underlying='', option_type=None, option_expiry=None, option_portfolio='', option_index='')
Process finished with exit code -1073740791 (0xC0000409)
2)配置Configure中的Execution->Emulate terminal in output console,还是上面的报错,且没有打出具体报错。
3)尝试run方式(不是debugger)运行,会打出很多合约日志,但是报错依旧:
contract : {} ContractData(gateway_name='TORASTOCK', symbol='501200', exchange=<Exchange.SSE: 'SSE'>, name='科创加银', product=<Product.FUND: '基金'>, size=1, pricetick=0.001, min_volume=100, stop_supporte
d=False, net_position=True, history_data=False, option_strike=0, option_underlying='', option_type=None, option_expiry=None, option_portfolio='', option_index='')
contract : {} ContractData(gateway_name='TORASTOCK', symbol='501201', exchange=<Exchange.SSE: 'SSE'>, name='科创红土', product=<Product.FUND: '基金'>, size=1, pricetick=0.001, min_volume=100, stop_supporte
d=False, net_position=True, history_data=False, option_strike=0, option_underlying='', option_type=None, option_expiry=None, option_portfolio='', option_index='')
Process finished with exit code -1073740791 (0xC0000409)
4)尝试设置vm参数
-Xms1024m
-Xmx2048m
还是没有效果。
请问该如何定位解决这个问题?
请问楼主找到vnpy接入实盘XTP获取行情数据的方式了吗?
中泰证券已经停止为vnpy新客户提供对接,请问vnpy还有其他方式可以接入实盘XTP吗?
Derew wrote:
已在网上找到答案。谢谢关注
为减少其它同学的困难,我这里把答案复制过来,呵呵。
解决方案:
第一步:找到vnpy的QT的bin路径,例如我的是:C:\vnstudio\Lib\site-packages\PyQt5\Qt\bin
第二步:找到Qt5Bluetooth.dll,并重命名为其它名,例如:Qt5Bluetooth.dll1就行了!
简单的方式在阿里云上换个操作系统,直接升级window server版本到最新就行了。
jingsiaosing wrote:
一个类似的问题:开盘第一个tick的时间戳是20:59:00,第二个tick的时间戳是21:00:00, 他俩的minute不一样,所以在收到第二个tick的时候就会推送bar,bar的时间戳是20:59:00,是这样吗?
自己合成的话可能会有这种问题,但事实上,米筐数据的处理方式是把20:59的数据合成到21:00上作为开盘价。是不会出现20:59的bar数据的。
订单成交会在on_trade中发出止损单,在tick打到止损价时check_stop_order会发出限价单,同时stop_order状态变成triggered,这里有两个疑问:
1、此时发出的限价单一定会成功吗?在on_order中会监控止损单发出的限价单状态,如果是reject怎么处理?重新挂吗,这时候已经不能和止损单关联上了,部分成交是撤了重挂还是继续等?
2、止损单状态已是被触发,不区分成功或失败,有办法通过on_stop_order监控并处理它vt_orders的限价单状态吗?还是说必须用on_order订单状态去控制了?
换句话说订单的缓存是存在本地的哪里,找了一圈没找到本地持久化的地方。是在.vnstation下的.dat文件里放着吗?
# 发出限价单买1手
self.buy(self.current_close, 1)
# 发出止损单止损1手
self.sell(self.stop_price, self.buy_fix, True)
如果希望撤单同时撤掉这两个单子,怎么操作,求思路!
找到问题原因了,vnpy默认使用的是sqlite,vnstation和jupyterbook都是默认sqlite。但是jupyterbook用的是vnpy-master的代码启动的,而vnstation可以是另一套环境。关键在于,如果使用的.vntrader不是一套的话,就会出现各自访问各自数据库的问题。要关注当前环境访问的是哪个数据库。
在jupterbook回测时候报这个错
在vnstation上可以进行回测。
现象:登录失败,服务器无法启动。
解决思路:使用命令行查看解决如下:
C:\Users\Administrator>python -m vnstation
qt.network.ssl: QSslSocket: cannot resolve EVP_PKEY_param_check
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_ciphersuites
qt.network.ssl: QSslSocket: cannot resolve SSL_set_psk_use_session_callback
qt.network.ssl: QSslSocket: cannot resolve SSL_SESSION_is_resumable
qt.network.ssl: QSslSocket: OpenSSL >= 1.1.1 is required; OpenSSL 1.1.0i 14 Aug 2018 was found instead
qt.network.ssl: QSslSocket: OpenSSL >= 1.1.1 is required; OpenSSL 1.1.0i 14 Aug 2018 was found instead
qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
qt.network.ssl: QSslSocket: OpenSSL >= 1.1.1 is required; OpenSSL 1.1.0i 14 Aug 2018 was found instead
原因: OpenSSL版本低,更换版本。具体操作参考:https://blog.csdn.net/xiaolong1126626497/article/details/105220160
安装完新的SSL后,将libcrypto-1_1.dll 和libssl-1_1.dll两个文件,替换vnstudio下的这两个文件(而不是替换lib中的)。
重启。