为何VNPY自己合成的bar数据总有一些错误的异常数据?
经常出现一些偏离很远的价格,在其他行情软件上都没有这个价格,但vnpy合成的bar就有这个错误价格,哪位大神知道是什么原因吗?能否解决呢?
完整代码如下:
`engine.connect_gateway(ctp_setting, "CTP")
sleep(10)
subscribe_list = []
mindiff_dict = {}
ContractMultiplier_dict = {}
# 持续运行
while True:
positions = engine.get_all_positions(use_df=False)
for item in positions:
volume = item.volume
if volume != 0:
vt_symbol = item.vt_symbol
if vt_symbol not in subscribe_list:
engine.subscribe(vt_symbol)
subscribe_list.append(vt_symbol)
contract = engine.get_contract(vt_symbol)
mindiff_dict[vt_symbol] = contract.pricetick
ContractMultiplier_dict[vt_symbol] = contract.size
sleep(2)
mindiff = mindiff_dict[vt_symbol]
ContractMultiplier = ContractMultiplier_dict[vt_symbol]
# print(item.pnl, mindiff*ContractMultiplier*volume)
tick = engine.get_tick(vt_symbol=vt_symbol)
if not tick:
print("no tick")
continue
if item.pnl < -mindiff*ContractMultiplier*volume:
direction = item.direction
frozen = item.frozen
print(vt_symbol, direction, volume, frozen)
if frozen > 0:
active_orders = engine.get_all_active_orders()
for item in active_orders:
if item.vt_symbol == vt_symbol:
vt_orderid = item.vt_orderid
engine.cancel_order(vt_orderid)
pass
else:
if direction == Direction.LONG:
engine.sell(vt_symbol, tick.limit_down, volume)
else:
engine.cover(vt_symbol, tick.limit_up, volume)
# 等待3秒进入下一轮
sleep(3)`
我想做一个止损程序,用script_trader,但这个程序要针对所有期货合约,由于合约太多,所以我不想一开始就订阅行情,希望能够在判断有持仓后,才订阅行情,然后再根据行情来判断是否要止损。
我写了如下一些代码,然后实际运行中,却无法获得行情,返回的tick为None,哪位大神帮忙看看是什么问题?
engine.connect_gateway(ctp_setting, "CTP")
subscribe_list = []
while True:
positions = engine.get_all_positions(use_df=False)
for item in positions:
volume = item.volume
if volume != 0:
if vt_symbol not in subscribe_list:
engine.subscribe(vt_symbol)
subscribe_list.append(vt_symbol)
tick = engine.get_tick(vt_symbol=vt_symbol)
以上最后一句,tick总是取不到。
用portfolio strategy模块就可以实现
我也碰上这个问题,自己折腾了好几天没解决,来论坛一看,果然有解决办法,确认方法可用,已经解决问题。
在价差策略中用self.buy发出订单,到了spread_strategy_engine里面的def send_order中,这时req经过了一次converter的转换:
req_list = self.offset_converter.convert_order_request(
original_req, lock)
返回的是一个空的list,后面发单就不会成功。
进一步跟踪发现,是converter.py中,def convert_order_request_shfe()里面有个:
if req.volume > pos_available:
return []
而pos_available一直等于0,导致返回的是空值。
pos_available = self.short_pos - self.short_pos_frozen
最终发现,这里的self.short_pos 和 self.short_pos_frozen 始终等于0.
请问这个问题该如何解决呢?
我也碰到这个问题,如果没有回报的话,请问成交后要在哪里获取成交信息?
目前的spread_setting模板好像有问题,哪位大神改成正确的啊?
我debug后,发现价差引擎中(app/spread_trading/engine.py)中,创建价差的时候,读取设置文件,把读出来的数据当作列表list来处理,后来在创建策略的时候,却把读取出来的设置数据当dict处理了,前后不一致,导致无法继续。
@ chwei2ch 感谢回答,我看了你的贴子,是cta策略的,我是想把它改成价差的,你看看我楼上那个修改法是对的吗?我发现读取spread_trading_setting 时候好像会出问题。
仿照ctp的no ui格式,我想将其用于价差策略,按下面步骤改了一下,但好像有问题,策略一直不被执行,哪位大神帮我看看问题所在:
把引入的cta_engine 改成spread_engine:
# from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.spread_trading import SpreadTradingApp
把run_child中的主引擎改成spread引擎
# cta_engine = main_engine.add_app(CtaStrategyApp)
spread_engine = main_engine.add_app(SpreadTradingApp)
把后面的初始化改成:
spread_engine.start()
main_engine.write_log("spread策略初始化完成")
spread_engine.init_all_strategies()
sleep(10) # Leave enough time to complete strategy initialization
main_engine.write_log("spread策略全部初始化")
spread_engine.start_all_strategies()
main_engine.write_log("spread策略全部启动")
这样修改后,策略一直没有反应,请问是哪里错了?
一直在用vnpy1.9,好不容易下决心要切换到新版本,却发现很多功能没有啊,望大神们给予解答:
1、 1.9版本有个ctatratdng,想新开一个账号,直接复制一下这个文件夹就可以,同时要交易什么品种,直接在文件夹里面的cta_setting里面设置,每个文件夹可以不同的设置。但现在2.0版本,设置要到C盘下面的一个隐藏目录去更改? 这样岂非很麻烦?
2、 1.9版本的策略里面有个同步参数self.syncList, 可以在策略重启时读取之前保存的参数值, 2.0版本的策略模板里面好似没有这个了?要如何才能保存参数呢?
2.0.9版本价差引擎中的setting_filename在哪里?
setting_filename = "spraed_trading_strategy.json", 但找不到spraed_trading_strategy.json这个文件。
之前总感觉加载的历史数据有问题,算出来的指标和其他软件不一致,用了一年多才发现,原来数据库中保存的K线中,夜盘的时间竟然算到了第二天,导致加载数据时,昨天晚上夜盘的数据总是在今天白天数据之后,所以算出来的指标就都错了。
这个好像又牵涉到合成K线的问题,请问群主有办法解决吗?
实盘运行过程中,经常会预见策略发出错误指令,然后返回一个错误的提示,策略中要如何读出这个错误提示从而调整某些参数呢?
常见的例如策略有持仓,实际没有持仓,策略发出平仓指令,交易所就返回错误提示说清仓量超过持仓量,这时候如果不修改策略持仓数据,就会一直不停发出平仓指令,也就一直收到错误提示,这种情况该如何避免?
感谢群主解答,根据提示,我先订阅了行情,确实可以取到了,代码如下:
vtSymbol = "rb1910"
contract = self.ctaEngine.mainEngine.getContract(vtSymbol)
from vnpy.trader.vtGateway import VtSubscribeReq
req = VtSubscribeReq()
req.symbol = contract.symbol
req.exchange = contract.exchange
self.ctaEngine.mainEngine.subscribe(req, 'CTP')
tick2 = self.ctaEngine.mainEngine.getTick(vtSymbol)
请教个问题,在某个品种的策略运行中,怎么取到另一个品种的tick数据? 我在vtEngine中看到一个函数gettick(),但用此取出来是个None值
不是很明白在vnpy中怎么调用,我的理解是:用ArrayManager中的数据代替mongodb读取的数据,运行机器学习后生成模型clf_selected,然后用clf_selected.predict()生成结果1,-1,0,再据此开仓,对吗?
请问在VNPY中调用时,怎么使用ArrayManager计算那些特征值? 相关代码能否贴上?