QMT中ContextInfo的使用注意

1.系统对象ContextInfo 逐K线保存的机制

ContextInfo是由底层维护并传递给init、handlebar等系统函数的参数,同一个bar(不是bar里面的tick,下同)内ContextInfo本质上是同一个变量且对其进行的修改只会对本次handlebar调用的下文所起作用。handlebar里对ContextInfo做的修改在该bar结束后才会进行保存,也就是说,对ContextInfo做的修改会在下一个bar体现出来。

具体来说,ContextInfo不同于一般python对象,做了逐k线更新设计,盘中主图品种每个level1分笔到达会触发handlebar函数调用,但只有k线结束时最后一个分笔触发的handlebar调用,对ContextInfo的修改才有效。每次handlebar函数调用前会对ContextInfo对象进行深拷贝, 下一次分笔行情到来时,如果新的分笔不是新k线bar第一个分笔,则判断上一个分笔不是k线最后分笔,ContextInfo对象被回退为之前深拷贝的那个. ContextInfo对象逐k线更新机制设计的目的,是为了在盘中时模拟k线的效果,只在k线结束的分笔触发的handlebar函数运行时生效一次,丢弃所有其他分笔的修改。 该机制有两个影响,一是在ContextInfo对象中存数据每次分笔到达时会被深拷贝,拖慢策略运行;二是ContextInfo适用于记录逐k线生效的交易信号(quickTrade参数传0),不适宜立刻下单的情况。 如不需要模拟k线效果,希望调用交易函数后立刻下单,quickTrade参数可以传2, 下单记录可以用普通的全局变量保存, 不能存在ContextInfo对象的属性里(实现可以参考实盘示例7-调整至目标持仓Demo)。

#encoding:gbk

import pandas as pd
import numpy as np
import talib

count=0

def init(ContextInfo):
    ContextInfo.cnt=0
    
def handlebar(ContextInfo):
    global count
    ContextInfo.cnt=ContextInfo.cnt+1
    count=count+1
    print('barpos='+str(ContextInfo.barpos),'ContextInfo.cnt='+str(ContextInfo.cnt),'count='+str(count))

虽然每个tick都会执行handlebar,但是ContextInfo下声明的变量在同一个bar中只能执行一次修改。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值