用户67055353625 回复
用户67055353625:
#处理分钟K线生成事件 def OnBar(context,code,bartype): #过滤掉不需要的行情通知 if code != g.poscode : return #只处理1分钟K线和30分钟K线 if bartype != BarType.Min and bartype != BarType.Min30 : return #处理30分钟K线 if bartype == BarType.Min30 : g.hhBarCount += 1
n = len(g.hhBlockList) print ("主力合约30钟K线有%s个区间: "%(n)) for blk in g.hhBlockList : blk.blockShow() if g.hhCurBlock.completed == False : g.hhCurBlock.blockShow()
在OnBar()函数里处理1分钟k线时最终调用到这里,在第一根1分钟K线(9:31)时到这里就变了,在9:30时还没有被改变。
g.hhBlockList[0]是一个在8:40就生成的数据,按程序逻辑不会变了。
def OnBar(context,code,bartype):
#过滤掉不需要的行情通知
if code != g.poscode :
return
#只处理1分钟K线和30分钟K线
if bartype != BarType.Min and bartype != BarType.Min30 :
return
#处理30分钟K线
if bartype == BarType.Min30 :
g.hhBarCount += 1
n = len(g.hhBlockList)
print ("主力合约30钟K线有%s个区间: "%(n))
for blk in g.hhBlockList :
blk.blockShow()
if g.hhCurBlock.completed == False :
g.hhCurBlock.blockShow()
ProcessM30Kline()
return
g.minBarCount += 1
if g.minBarCount <= 1 :
return
#检查最近两根K线
option = PBObj()
option.EndDate = GetCurrentTime()
option.Count = 65
kline = GetHisData(g.poscode, BarType.Min, option)
K1 = kline[-1]
K2 = kline[-2]
这里是处理分钟K线的OnBar函数里查询历史数据的代码
option = PBObj()
option.EndDate = GetCurrentTime()
option.Count = 20
klhign = GetHisDataByField(g.poscode, BarType.Min30, ["high"], option)
kllow = GetHisDataByField(g.poscode, BarType.Min30, ["low"], option)
rctBarsHigh = np.max(klhign[-N:-1])
rctBarsLow = np.min(kllow[-N:-1])
kline = GetHisData(g.poscode, BarType.Min30, option)
K1 = kline[-1]
g.hhBlockList确实有可能在其他地方被修改,但是我一步步通过打印调试跟踪到这里,发现g.hhBlockList[0]的值就是在这里改变的。
这里的程序是多线程吗?运行这段赋值代码的同时还可能同时运行我的其他代码?
问题是我本来要给g.minCurBlock赋值,而且这段代码后赋值也是对的,但同时g.hhBlockList[0]的值也被改了,和g.minCurBlock一样了(从打印信息看是同时发生的,而且其它地方不应该修改g.hhBlockList[0]的值)。
可以检查 g.hhBlockList是否有在策略的其他地方被修改,因为这是一个全局变量,可以在程序的其他地方被修改