VeighNa量化社区
你的开源社区量化交易平台
Member
离线
23 帖子
声望: 0

为何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格式,我想将其用于价差策略,按下面步骤改了一下,但好像有问题,策略一直不被执行,哪位大神帮我看看问题所在:

  1. 把引入的cta_engine 改成spread_engine:

    # from vnpy.app.cta_strategy import CtaStrategyApp
    from vnpy.app.spread_trading import SpreadTradingApp

  2. 把run_child中的主引擎改成spread引擎
    # cta_engine = main_engine.add_app(CtaStrategyApp)
    spread_engine = main_engine.add_app(SpreadTradingApp)

  3. 把后面的初始化改成:

    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计算那些特征值? 相关代码能否贴上?

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】