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中只能执行一次修改。