等级: 新手上路
- 注册:
- 2023-4-14
- 曾用名:
|
如下图,模拟盘开单正常,但是突然出现个6.1日的日志。
bar时间的计算如下: dts = (context.now).strftime("%Y-%m-%d %H:%M:%S");
这句日志是在handle_bar中触发。
6月27日的模拟盘,为何会出现6月1日的一条日志?还是数据获取不够的日志。
开单情况如下
部分代码如下:
def handle_bar(context):
context.lyportfolio=get_portfolio (context.lystockcode,2);#扣减未成交
context.lyportfoliowcj=get_portfolio (context.lystockcode,2,calc=False);#不扣减未成交品种
#回测时使用,在回测最后一天如果有未平仓单就清掉
if context.run_info.run_type =="backtest":
dtnow = context.now;
if dtnow.year == context.run_info.end_date.year and dtnow.month == context.run_info.end_date.month and dtnow.day == context.run_info.end_date.day :
#WriteTxtLog(context,"还剩{0}分钟收盘,将进行强制清仓动作,此时不允许开单".format(60-dtnow.minute));
context.ordertype ="回测结束平仓";
ClearAllPortfolio(context);
return;
else:#非回测状态下才需要执行
getmainstock(context);#获取主力合约
daysdif = getdaysdif(context);#获取距离交割日的天数
if daysdif <=5:#距离交割日不到3个交易日必须清仓且不开新仓
context.ordertype ="交割平仓";
ClearAllPortfolio(context);
#context.lyportfolio=get_portfolio (context.lystockcode,2);#扣减未成交
#context.lyportfoliowcj=get_portfolio (context.lystockcode,2,calc=False);#不扣减未成交品种
#获取当前账户的可用资金,根据此可计算出开仓手数。
context.lyaccountcash= get_account(19);
#获取收盘价及开盘价的数组
dataopen = history_bars(context.lystockcode,context.k_length+3,context.lytradeperiod, 'open',True,False,True);
dataclose = history_bars(context.lystockcode,context.k_length+3,context.lytradeperiod, 'close',True,False,True);
datahigh = history_bars(context.lystockcode,context.k_length+3,context.lytradeperiod, 'high',True,False,True);
datalow = history_bars(context.lystockcode, context.k_length+3,context.lytradeperiod, 'low',True,False,True);
dataamaclose = history_bars(context.lystockcode,150,context.lytradeperiod, 'close',True,False,True);
#dataselfclose = history_bars(context.lystockcode, context.ma_period+1,context.lytradeperiod, 'close',True,False,True);
#判断获取的数据量,如果数据量都不满足需要的最低Bar,就返回不执行
if len(dataclose) < context.k_length or len(dataopen) < context.k_length or len(datahigh) < context.k_length or len(datalow) < context.k_length or len(dataamaclose) < 150 :
if context.run_info.run_type !="backtest":
WriteTxtLog(context,"当前k线数量不足,无法计算满足条件的均线值,请等待...");
return;
#获取主力合约代码
def getmainstock(context):
nowlystockcode = get_dynainf (context.lystockcode, 210);#获取当前合约对应的主力合约代码
if nowlystockcode != context.lystockcode:#主力合约已更换
if context.lyportfoliowcj.buy_quantity == 0 and context.lyportfoliowcj.sell_quantity == 0: #没有持仓时才能切换到新合约
WriteTxtLog(context,"切换合约:上一个合约{0},新的合约{1}".format(str(context.lystockcode),str(nowlystockcode)));
context.lystockcode = nowlystockcode;
context.lyportfolio=get_portfolio (context.lystockcode,2);#扣减未成交
context.lyportfoliowcj=get_portfolio (context.lystockcode,2,calc=False);#不扣减未成交品种
else:
WriteTxtLog(context,"目前有持仓未平,无法切换新合约,多仓{0},空仓{1}".format(str(context.lyportfoliowcj.buy_quantity),str(strcontext.lyportfoliowcj.sell_quantity)));
#计算距离交割日的时间
def getdaysdif(context):
if context.run_info.run_type =="backtest":
return 100;
jgdate = get_dynainf (context.lystockcode, 226);#获取当前合约对应的交割日期
return int(jgdate/60/60/24);
|
|