代码如下: '''backtest start: 2021-08-01 00:00:00 end: 2021-08-31 23:59:00 period: 1d basePeriod: 1h exchanges: [{“eid”:“Futures_CTP”,“currency”:“FUTURES”,“balance”:50000}] '‘’
#定义合约
contracttype = ‘rb888’
#变量定义
HH = 0 #N周期内最高价的最大值
LL = 0 #N周期内最低价的最小值
HC = 0 #N周期内收盘价的最大值
LC = 0 #N周期内收盘价的最小值
N = 5 #K线指标周期
Kup =0.5 #上轨系数
Kdown =0.5 #下轨系数
upTriggerPrice = 0 #上轨触发价
downTriggerPrice = 0 #下轨触发价
bar_arr = [] #获取的周期K线数据
arrlen = 0 #获取的K线数量
N_bar_arr=[] #截取N周期K线
exchange.SetContractType(‘rb888’)
#DUAL THRUST指标计算
def DUAL_THRUST():
global N,HH,LL,LC,HC,N_bar_arr,arrlen
bar_arr=exchange.GetRecords(PERIOD_D1)
lasttime = 0
arrlen=len(bar_arr)
if arrlen>N and bar_arr[arrlen-1]!=lasttime:
lasttime=bar_arr[arrlen-1].Time
Log(‘new K’)
HH = TA.Highest(bar_arr,N,‘High’)
def main(): #Log(exchange.GetAccount())
#主循环,执行策略
while True :
DUAL_THRUST()
Sleep(1000)
在DUAL THRUST函数中,按D1参数获取数据。按照在知乎网站上的文章,通过lasttime来判断新K线。那Log出来因该是每一根K一个Log。但实际运行是几秒就出一个Log。是什么原因呢?大神能否帮忙分析下? 回测日志:
网络文章:
zergor 补充一下,回测设置上K线周期是1天,基本K线周期是1分
zergor 我明白你的意思了。但我觉得这个回测机制或者这个GetRecoders函数有缺陷。既然手册里说明GetRecoerds是获取指定K线周期的数据,那么就应该返回这个K线走完固定之后的数据。但实际情况是在当前K线上,返回的是底层基础K线的数据。那么就造成在回测时,第一根K线就按模拟周期返回了底层K线数据。 我觉得应该有个currentBar函数来获取当前K线的实时数据。 也或许是我还没搞明白你们API的功能。
zergor 那我是不是可以理解为,getRecord获取的数据其实是tick,而不是tick数据合成后的K Bar? 那有没有函数来直接获取K Bar呢?