VeighNa量化社区
你的开源社区量化交易平台
easibay's Avatar
Member
离线
59 帖子
声望: 4

封装的合约信息好像没有涨跌停字段,在结合竞价阶段,没有tick数据推送吧?如何获取合约的涨跌停价格?

数据源采用聚宽连续合约,标的铁矿石,参数设置如下:

# 样本外检验
# 配置合约信息
# 缺TA8888 CF8888 SM8888 SC8888 ZC8888
# 合约大小写按交易所格式
vt_symbols = [
    "i8888.DCE"
]

rates = {s: 0.001 for s in vt_symbols}
slippages = {s: 0 for s in vt_symbols}
sizes = {s: contract_sizes[s] for s in vt_symbols}
priceticks = {s: 0.01 for s in vt_symbols}

# 创建回测引擎
engine = BacktestingEngine()

engine.set_parameters(
    vt_symbols=vt_symbols,
    interval=Interval.MINUTE,
    start=datetime(2019, 1, 1),
    end=datetime(2022, 4, 30),
    rates=rates,
    slippages=slippages,
    sizes=sizes,
    priceticks=priceticks,
    capital=10_000_000,
)

setting = {
    "entry_window": 20,
    "exit_window": 10,
    "n_window": 20,
    "unit_limit": 2
}
engine.add_strategy(TurtleStrategy, setting)

engine.load_data()
engine.run_backtesting()

df = engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()

回测发现问题,如图,在2020年2月3日位置,发现净值跳跃

description

查看文华财经,铁矿石加权价格数据,2月3日为春节后,第一天,价格跳空,如图

description

通过函数engine.daily_results,engine.trades 导出合成的日线close和 成交明细数据,发现三个问题,需要请教:

第1个问题
在2020年2月3日,跳空前的几天,随机抽取两天1月20日,1月22日,发现 合成的收盘价,是23:00。跳空后的几天,随机抽取两天,合成的收盘价 是在15:00,为什么2月3日的前几天,合成的收盘价会取23:00?

1月20日
description

1月22日
description

2月6日

description

第2个问题
2020年2月3日跳空当天,分钟数据,价格基本都是在600附近,合成的2月3日收盘价 693.5 是如何得出来的?

description

第3个问题
向下跳空后,按道理,应该是向下突破做空吧?成交明细中,是买多,为什么会开多仓?

description

description

海龟策略精析课程中,组合回测之后,请问如何将 品种的原始收盘价曲线数据、回测净值曲线数据,回测统计指标 打印到excel文件? 这几个数据存储在engine的哪个位置?

请问在 no_ui 模式下,是否可以用 on_order 和 on_trade 函数? 使用文档 的案例中没用到这两个

1、10:15之前发单还正常,15分钟休市,10:30之后,发单,有的单子就收不到信息回报了
2、发单了,但是信息的状态 一直是 提交中,没有更新,也就是没有收到 on_order推送

description

3、期货公司后台查询,没收到订单(收盘很久了,所以查不到柜台是否拒单)
4、期货公司问是否封装了这几个函数?

description

description

5、用的是阿里云,感觉网络问题的可能性较小

请问,有可能是什么原因,导致发单了,但却发送不到交易所? 10:15之前都是正常的,10:30之后,有些单子,就没发出去,有些单子是成功的

启动VN Station 加密策略文件成功了。
但尝试了一下,加密非策略文件,譬如加密回测的backtesting.py,报错,加密vnpy/app/cta_strategy/ 中的engine.py文件也报类似的错误。
请问是什么原因?

c:\vnstudio\lib\site-packages\Cython\Compiler\Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: C:\vnstudio\Lib\site-packages\vnpy\app\cta_strategy\backtesting.py
  tree = Parsing.p_module(s, pxd, full_module_name)

Error compiling Cython file:
------------------------------------------------------------
...

    def write_log(self, msg: str, strategy: CtaTemplate = None):
        """
        Write log message.
        """
        msg = f"{self.datetime}\t{msg}"
             ^
------------------------------------------------------------

Lib\site-packages\vnpy\app\cta_strategy\backtesting.py:1057:14: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.
Traceback (most recent call last):
  File "c:\vnstudio\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\vnstudio\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "c:\vnstudio\Scripts\easycython.exe\__main__.py", line 9, in <module>
  File "c:\vnstudio\lib\site-packages\begin\main.py", line 54, in start
    collector=self._collector)
  File "c:\vnstudio\lib\site-packages\begin\cmdline.py", line 253, in apply_options
    return_value = call_function(func, signature(ext), opts)
  File "c:\vnstudio\lib\site-packages\begin\cmdline.py", line 236, in call_function
    return func(*pargs, **kwargs)
  File "c:\vnstudio\lib\site-packages\easycython\easycython.py", line 77, in main
    ext_modules = cythonize(ext_modules),
  File "c:\vnstudio\lib\site-packages\Cython\Build\Dependencies.py", line 1102, in cythonize
    cythonize_one(*args)
  File "c:\vnstudio\lib\site-packages\Cython\Build\Dependencies.py", line 1225, in cythonize_one
    raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: C:/vnstudio/Lib/site-packages/vnpy/app/cta_strategy/backtesting.py
Compiling C:/vnstudio/Lib/site-packages/vnpy/app/cta_strategy/backtesting.py because it changed.
[1/1] Cythonizing C:/vnstudio/Lib/site-packages/vnpy/app/cta_strategy/backtesting.py

加密失败。

在本地机中,复制examples中的trader文件夹,可以实现在本地 登录不同账号的功能

请问 ,如果购买了阿里云
想几个人都利用这台阿里云,分别交易不同账户或者同一个账号(譬如在本地不同电脑下单),如何实现?
好像有个rpc功能,能阿里云拖几台本地机么?
能不能指导一下步骤,非常感谢

版本号 2.1.9
目的是想将修改后的cta_strategy组件放置在run.py对应的路径下,不影响site-packages中的原文件
但是,启动后,发现策略没有了,不知道哪个路径还需要修改一下
实施步骤:
1、建立examples文件夹
2、examples文件下新建vn_trader 文件夹
3、vn_trader 文件夹中拷贝.vtrader , cta_strategy , gateway , strategies 文件夹, demo_script.py , run.py 文件

description

4、修改 run.py 中的启动接口

description

在run.py路径下,shift+右键,输入python run.py启动
但是启动结果是,找不到策略了,还需要修改cta_strategy中的哪个文件才能实现将cta_strategy迁移至run.py所在的路径下?

description

大连品种,开多一张,再开空一张,保证金是双边收取。

快期V2 软件 有个组合保证金功能, 进入——大商所组合,选自动组合,这样多一张、空一张下单之后(快期要一直开启),锁仓是按单边来收取保证金的。

请问vnpy如何实现 实时组合保证金?(这样就不用再开快期V2软件了)

快期功能说明地址:
https://www.shinnytech.com/blog/dashangsuo-zuhe/

description

发送订单
第1 发单 cover_vt_orderid = self.cover(cover_price, abs(order_volume))
发单之后INFO信息会返回一个Order Object
第2 打印 self.write_log(f'买入平仓 , pos:{self.pos}, local_pos:{self.local_pos}, \
orderid:{cover_vt_orderid}, symbol:{self.vt_symbol}, price:{cover_price}, volume:{order_volume}')
返回信息 和打印信息如下:

2021-07-02 09:03:05,599  INFO: original_req:OrderRequest(symbol='SP jm2108&jm2110', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, type=<OrderType.LIMIT: '限价'>, volume=1.0, price=116.5, offset=<Offset.CLOSE: '平'>, reference='')
2021-07-02 09:03:05,599  INFO: req_list:[OrderRequest(symbol='SP jm2108&jm2110', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, type=<OrderType.LIMIT: '限价'>, volume=1.0, price=116.5, offset=<Offset.CLOSE: '平'>, reference='')]
2021-07-02 09:03:05,617  INFO: req:OrderRequest(symbol='SP jm2108&jm2110', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, type=<OrderType.LIMIT: '限价'>, volume=1.0, price=116.5, offset=<Offset.CLOSE: '平'>, reference='')
2021-07-02 09:03:05,617  INFO: ex_long jm2108&jm2110: 买入平仓 , pos:50, local_pos:0,                         orderid:['CTP.6_1679360163_1'], symbol:SP jm2108&jm2110.DCE, price:116.5, volume:1

请问,怎么才能第一时间在策略的内部主动获取这个Order Object的信息
cover_vt_orderid = self.cover(cover_price, abs(order_volume))
譬如在上述发单命令之后,在策略的内部调用self.cta_engine.main_engine.get_order(cover_vt_orderid),获取不到这个order Object,得到的是 None

提交一个挂单,然后再撤单,收到的订单回报正确顺序应该为: 提交中,未成交,已撤单。
但是,发现在收到已撤单前一瞬间,会收到上一个未成交信息的重复推送,变成了:提交中,未成交,未成交,已撤单
请问是我改代码的原因,还是版本的原因? 2.1.1版本。
不知道部分成交撤单会不会出现类似情况

2021-06-25 10:12:48,083  INFO: 行情服务器连接成功
2021-06-25 10:12:48,083  INFO: 交易服务器连接成功
2021-06-25 10:12:48,349  INFO: 交易服务器授权验证成功
2021-06-25 10:12:48,349  INFO: 行情服务器登录成功
2021-06-25 10:12:48,364  INFO: 交易服务器登录成功
2021-06-25 10:12:49,833  INFO: 结算信息确认成功
2021-06-25 10:12:56,552  INFO: 合约信息查询成功
2021-06-25 10:13:01,521  INFO: CTA策略引擎初始化成功
2021-06-25 10:13:05,755  INFO: in_mark_long pp2109开始执行初始化
2021-06-25 10:13:05,755  INFO: in_mark_long pp2109: 策略初始化
2021-06-25 10:13:05,755  INFO: in_mark_long pp2109初始化完成
2021-06-25 10:13:06,224  INFO: in_mark_long pp2109: 策略启动
2021-06-25 10:13:23,786  INFO: cta_engine strategy.name:in_mark_long pp2109
2021-06-25 10:13:23,786  INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 23, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:23,786  INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:23,786  INFO: in_mark_long pp2109: buy_orderids:['CTP.21_331284613_000000001432'], sell_orderids:[],             short_orderids:[], cover_orderids:[]
2021-06-25 10:13:23,864  INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 22, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:23,864  INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:23,873  INFO: in_mark_long pp2109: buy_orderids:['CTP.21_331284613_000000001432'], sell_orderids:[],             short_orderids:[], cover_orderids:[]
2021-06-25 10:13:46,114  INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 22, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:46,114  INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:46,114  INFO: in_mark_long pp2109: buy_orderids:['CTP.21_331284613_000000001432'], sell_orderids:[],             short_orderids:[], cover_orderids:[]
2021-06-25 10:13:46,177  INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.CANCELLED: '已撤销'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 22, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:46,177  INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:46,177  INFO: in_mark_long pp2109: ask_price:8508.0, bid_price:8507.0,             ask_volume:59, bid_volume:12
2021-06-25 10:13:46,177  INFO: in_mark_long pp2109: on_order算法补单
2021-06-25 10:13:46,177  INFO: in_mark_long pp2109: buy_orderids:[], sell_orderids:[],             short_orderids:[], cover_orderids:[]

关于手动交易组件里面的实时价格显示,代码中有实时价格的定义,控件也在布局中定义了,为什么手动交易控件中没有显示实时价格呢? 印象中1.9版本的能显示,现在用的是2.1.1版本,目前没有看到显示。 是不是打开方式不对?能看到实时价格显示的正确步骤应该是怎样的?
description

description

尝试了一下跟踪其他软件手动下单,订单在vnpy中的处理过程,cta_gateway.py -->gateway.py-->eventengine,这三个位置都用log打印出来,看看发生了什么。
cta_gateway.py中,添加打印如下:

    def onRtnOrder(self, data: dict):
        """
        Callback of order status update.
        """
        symbol = data["InstrumentID"]
        exchange = symbol_exchange_map.get(symbol, "")
        if not exchange:
            self.order_data.append(data)
            return

        frontid = data["FrontID"]
        sessionid = data["SessionID"]
        order_ref = data["OrderRef"]
        orderid = f"{frontid}_{sessionid}_{order_ref}"

        order = OrderData(
            symbol=symbol,
            exchange=exchange,
            orderid=orderid,
            type=ORDERTYPE_CTP2VT[data["OrderPriceType"]],
            direction=DIRECTION_CTP2VT[data["Direction"]],
            offset=OFFSET_CTP2VT[data["CombOffsetFlag"]],
            price=data["LimitPrice"],
            volume=data["VolumeTotalOriginal"],
            traded=data["VolumeTraded"],
            status=STATUS_CTP2VT[data["OrderStatus"]],
            time=data["InsertTime"],
            gateway_name=self.gateway_name
        )
        self.gateway.on_order(order)

        self.sysid_orderid_map[data["OrderSysID"]] = orderid

        # 无问西东 
        logger.info(f"gateway.on_order:{order}") 
        logger.info(f"data["OrderSysID"]:{data["OrderSysID"]}")

gateway.py中 on_event ,添加打印如下:

    def on_event(self, type: str, data: Any = None) -> None:
        """
        General event push.
        """
        event = Event(type, data)
        self.event_engine.put(event)

        # 无问西东 
        logger.info(f"gateway.py on_event event.type:{event.type}") 
        logger.info(f"gateway.py on_event event.data:{event.data}")

eventengine中,添加打印如下:

    def _run(self) -> None:
        """
        Get event from queue and then process it.
        """
        while self._active:
            try:
                event = self._queue.get(block=True, timeout=1)
                # 无问西东 
                logger.info(f"_run event_engine event.type:{event.type}") 
                logger.info(f"_run event_engine event.data:{event.data}")

                self._process(event)
            except Empty:
                pass

1、请问在gateway.on_order函数中,为什么要推送两次?一次是EVENT_ORDER,一次是EVENT_ORDER + order.vt_orderid,两个的作用分别是什么?

    def on_order(self, order: OrderData) -> None:
        """
        Order event push.
        Order event of a specific vt_orderid is also pushed.
        """
        self.on_event(EVENT_ORDER, order)
        self.on_event(EVENT_ORDER + order.vt_orderid, order)

2、打印出来的结果如下,会发现EVENT_ORDER的event在eventengine中的_run中的队列中被提取掉,并被后续的mainengine处理,而EVENT_ORDER + order.vt_orderid对应的事件在_run函数中没有被提取,也就是没有被打印出来,导致后续所有的下单(包括vnpy自带的下单控件下的单就没有响应,可能是跟队列中,有没被提取的事件导致阻塞有关)。请问为什么平时vnpy自带的下单控件下单对应的EVENT_ORDER + order.vt_orderid事件能被处理,而用其他软件下单对应的EVENT_ORDER + order.vt_orderid事件不能被提取?:

2021-03-10 22:58:33.213 | INFO     | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.

2021-03-10 22:58:33.213 | INFO     | vnpy.event.engine:_run:66 - _run event_engine event.type:eOrder.

2021-03-10 22:58:33.227 | INFO     | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')

2021-03-10 22:58:33.227 | INFO     | vnpy.event.engine:_run:67 - _run event_engine event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')

2021-03-10 22:58:33.227 | INFO     | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.CTP.21_-647510950_000000000056

2021-03-10 22:58:33.227 | INFO     | vnpy.trader.engine:process_order_event:400 - mainengine event.type:eOrder.

2021-03-10 22:58:33.227 | INFO     | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')

2021-03-10 22:58:33.227 | INFO     | vnpy.trader.engine:process_order_event:401 - mainengine event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')

2021-03-10 22:58:33.243 | INFO     | vnpy.app.cta_strategy.engine:process_order_event:178 - cta_engine event.type:eOrder.

2021-03-10 22:58:33.243 | INFO     | vnpy.app.cta_strategy.engine:process_order_event:179 - cta_engine event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')

2021-03-10 22:58:33.259 | INFO     | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.

2021-03-10 22:58:33.259 | INFO     | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 3, 11, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')

2021-03-10 22:58:33.259 | INFO     | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.CTP.21_-647510950_000000000056

2021-03-10 22:58:33.259 | INFO     | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 3, 11, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')

请问一下,如果是其他交易软件手动下的单,如何通过vnpy获取该手动订单的订单信息以及成交回报信息?想实现手动开仓,vnpy自动风控

目前看到的样例是轮询驱动

while engine.strategy_active:
    ......
    sleep(1)

自己想到的接近on_tick的模式是,不断轮询,判断tick的datetime是否有更新,最大误差就是sleep的时间

while engine.strategy_active:
    for i in range(10):
        tick = engine.get_tick(vt_symbol, use_df=True)
        if tick['datetime'][0] != tick_pre['datetime'][0]:
            break    # 如果是新tick数据,则跳出循环
        sleep(0.1)
    ......

请问 jupyter notebook是否可以on_tick或on_trade事件驱动触发?可不可以举个简单例子?
非常感谢

vnpy版本1.9.2
onTick触发时,程序开始和结束的时候,都记录本地时间,并writeCtaLog出来

def onTick(self, tick):
    self.writeCtaLog(u'本地时间: %s' %(datetime,datetime.now())
    tickstarttime = datetime.datetime.now()
    策略主体
    tickendtime = datetime.datetime.now()
    passtime = str(tickendtime - tickstarttime)
    self.writeCtaLog(u'onTick程序运行时长: %s' %(passtime))

一、发现两个现象
有时候打印出来的Log时间差大于onTick程序实际的运行时间,有时候Log时间差又小于onTick程序实际的运行时间,如下:
1、onTick程序运行时间0.001s,Log记录的时间差有0.007s (即23,598 - 23,591)

2019-12-23 13:43:23,591  INFO: CTA_STRATEGY p2005 LongStrategy:本地时间: 2019-12-23 13:43:23.588000
2019-12-23 13:43:23,592  INFO: CTA_STRATEGY p2005 LongStrategy:pos     ****  :0
2019-12-23 13:43:23,592  INFO: CTA_STRATEGY p2005 LongStrategy:self.auto[self.vtSymbol]  :on
2019-12-23 13:43:23,594  INFO: CTA_STRATEGY p2005 LongStrategy:askprice askvolume:6014.0 595
2019-12-23 13:43:23,595  INFO: CTA_STRATEGY p2005 LongStrategy:bidprice bidvolume:6012.0 525
2019-12-23 13:43:23,595  INFO: CTA_STRATEGY p2005 LongStrategy:拒单数 撤单数:0 0
2019-12-23 13:43:23,595  INFO: CTA_STRATEGY p2005 LongStrategy:仓位:0
2019-12-23 13:43:23,596  INFO: CTA_STRATEGY p2005 LongStrategy:self.lastTick.lastVolume:0
2019-12-23 13:43:23,596  INFO: CTA_STRATEGY p2005 LongStrategy:self.lastTick.volume:2501110
2019-12-23 13:43:23,596  INFO: CTA_STRATEGY p2005 LongStrategy:self.limitVolume[self.vtSymbol]:200
2019-12-23 13:43:23,596  INFO: CTA_STRATEGY p2005 LongStrategy:order.price:6000.0
2019-12-23 13:43:23,598  INFO: CTA_STRATEGY p2005 LongStrategy:onTick程序运行时长  :0:00:00.001000

2、onTick程序运行时间0.005s,Log记录的时间只有0.004s (即07,096 - 07,092),
且记录的起始时间比程序本身的时间要晚0.020s,即第一条程序时间13:51:07.072000,Log时间13:51:07,092

2019-12-23 13:51:07,092  INFO: CTA_STRATEGY p2005 LongStrategy:本地时间: 2019-12-23 13:51:07.072000
2019-12-23 13:51:07,092  INFO: CTA_STRATEGY p2005 LongStrategy:pos     ****  :0
2019-12-23 13:51:07,094  INFO: CTA_STRATEGY p2005 LongStrategy:self.auto[self.vtSymbol]  :on
2019-12-23 13:51:07,094  INFO: CTA_STRATEGY p2005 LongStrategy:askprice askvolume:6024.0 415
2019-12-23 13:51:07,094  INFO: CTA_STRATEGY p2005 LongStrategy:bidprice bidvolume:6022.0 660
2019-12-23 13:51:07,095  INFO: CTA_STRATEGY p2005 LongStrategy:拒单数 撤单数:0 0
2019-12-23 13:51:07,095  INFO: CTA_STRATEGY p2005 LongStrategy:仓位:0
2019-12-23 13:51:07,095  INFO: CTA_STRATEGY p2005 LongStrategy:self.lastTick.lastVolume:0
2019-12-23 13:51:07,095  INFO: CTA_STRATEGY p2005 LongStrategy:self.lastTick.volume:2561906
2019-12-23 13:51:07,095  INFO: CTA_STRATEGY p2005 LongStrategy:self.limitVolume[self.vtSymbol]:200
2019-12-23 13:51:07,095  INFO: CTA_STRATEGY p2005 LongStrategy:order.price:6000.0
2019-12-23 13:51:07,096  INFO: CTA_STRATEGY p2005 LongStrategy:onTick程序运行时长  :0:00:00.005000

二、问题
1、writeCtaLog函数记录的时候和程序主体运行是什么样的关系?Log时间差一会大,一会小,感觉是相互独立的
2、如果onTick中运用了较多的writeCtaLog函数来记录,譬如20个策略,每个策略onTick中写出30个writeCtaLog函数,这样在效率上会影响onTick程序的运行么?
3、假如writeCtaLog函数较多会影响onTick程序的效率,怎么提高效率呢,Log的信息改用pandas输出?还是说用多进程multiprocessing包?

非常感谢!

易盛 极星 内盘,在期货数据方面有些优势,譬如郑商所的商品期货,数据有免费五档行情,以及tick切片是0.25s,优势很明显,请问易盛 极星 内盘的数据api接口有没有上线的计划?谢谢

description

目的是添加一个手动开仓的UI,按钮链接到策略的sendOrder,然后策略自动平仓(譬如止损),但失败了,启动半个小时左右,UI就 无响应了
版本 vnpy1.8.1
具体实施的步骤如下:
1、在主窗口增加了一个 “测试” 菜单
description
2、‘’测试‘下拉菜单里,添加按钮,连接到弹出窗口
测试按钮代码:

        # 帮助
        helpMenu = menubar.addMenu(vtText.HELP)
        helpMenu.addAction(self.createAction(vtText.CONTRACT_SEARCH, self.openContract, loadIconPath('contract.ico')))
        helpMenu.addAction(self.createAction(vtText.EDIT_SETTING, self.openSettingEditor, loadIconPath('editor.ico')))
        helpMenu.addSeparator()
        helpMenu.addAction(self.createAction(vtText.RESTORE, self.restoreWindow, loadIconPath('restore.ico')))
        helpMenu.addAction(self.createAction(vtText.ABOUT, self.openAbout, loadIconPath('about.ico')))
        helpMenu.addSeparator()
        helpMenu.addAction(self.createAction(vtText.TEST, self.test, loadIconPath('test.ico'))) 
       # 测试
        testMenu = menubar.addMenu(vtText.TEST)
        testMenu.addAction(self.createAction(u'参数配置', self.openSettingParameter, loadIconPath('editor.ico')))
        testMenu.addAction(self.createAction(u'sniper', self.sniperTrade, loadIconPath('editor.ico')))**

弹出窗口函数

    def sniperTrade(self):
        """打开手动交易"""
        try:
            self.widgetDict['sniperTrade'].show()
        except KeyError:
            self.widgetDict['sniperTrade'] = SniperTradingWidget(self.mainEngine, self.eventEngine, self.ctaEngine)    # 无问西东 新建窗体 新增传入ctaEngine
            self.widgetDict['sniperTrade'].show()

3、弹出窗口是参照“简单交易组件”照搬过来,增加了几个下单的按钮(可以连接到策略中的sendOrder)

class TradingWidget(QtWidgets.QFrame):

class SniperTradingWidget(QtWidgets.QFrame):

description

这个UI界面中没有耗时程序,基本updateTick函数,更新UI时间在10ms内

description

一般能正常启动和正常运行,半个小时到一个小时后,UI就无响应了(包括MainWindow),UI虽然无响应,但是后台的策略程序在正常运行。

description

请问这样加载一个新的弹出窗口的程序步骤是正确的么?无响应的问题会出在哪个环节?谢谢

按照知乎帖子“vn.trader的tick-to-trade延时测试”一文,链接为https://zhuanlan.zhihu.com/p/24242972,想测试一下本机的内部耗时,vnpy为1.8.1版本,在visual studio 2013 (boost为boost_1_68_0版本)编译的时候,出现如下错误:
错误 2 error C2039: “task_time”: 不是“Task”的成员
错误 3 error C2039: “t”: 不是“MdApi”的成员
错误 4 error C2228: “.QuadPart”的左边必须有类/结构/联合
5 IntelliSense: class "Task" 没有成员 "task_time"

原文代码的github链接失效了,所以不知道具体还改了哪些地方,我只改了“vn.trader的tick-to-trade延时测试”一文中提到的内容,不知道为什么会出现这样的错误(boost版本的原因?),请指点一下,谢谢

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

沪公网安备 31011502017034号

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