我的代码希望实现的目的:
当日内一旦命中买入规则,下单买入,并记入日志。当日内再发生命中买入规则的情况不再下单也不再记入日志
我参照了之前类似问题的帖子中的解决方法,写了如下代码:GLOBALVARIABLE:x:=0;
...
if buycondi>0 then begin
if x=0 then begin
tbuy(1,1000,lmt,买入价1);
if islastbar then begin
str:=NUMTOSTR(date+19000000,0)&stkname&' 建仓:' ;
DEBUGFILE('C:\testlog.txt',str,0);
end
x:=1;//开仓时候重置x为1
end else begin
//if TISREMAINEX( 1,'',STKLABEL)=0 and islastbar then begin
if TIME>=145959 then begin
x:=0;//当日收盘重置为0
end
end
end
但这段代码导致做精细化历史回测时,同一只股在整个测试周期内只交易了一次,后续几天本来命中买入规则的交易都被忽略掉了。
不管是我用if TISREMAINEX( 1,'',STKLABEL)=0 and islastbar then begin 还是用if TIME>=145959 then begin都解决不了这个问题
请大神帮忙看看该如何解决这个问题
我的问题是当日内的重复买入和日志记录是过滤掉了,但是精细化历史回测显示把之后几日本来命中买入规则应该执行的买入也都给过滤掉了,之后几日里本应买入并记录的日志也给过滤掉了。
以个股“光莆股份”为例做历史回测,时间段20200415-20201015,如果代码写正确达到设计目标的话,应该买卖交易2次,对应的日志应该是这样的:
2020-11-03 09:31:34.926 20200827光莆股份20200827建仓:
2020-11-03 09:31:35.477 20200831光莆股份清仓
2020-11-03 09:38:04.478
20200908光莆股份20200908建仓:
2020-11-03 09:39:18.167 20200909光莆股份清仓
但加入上述代码之后,只能交易一次,交易明细里显示只有一次交易的记录,日志输出结果也只有一次:
2020-11-03 09:31:34.926 20200827光莆股份20200827建仓:
2020-11-03 09:31:35.477 20200831光莆股份清仓
你直接完整代码贴下。我们直接在你代码基础上调试看下。
我的原始代码太长,我做了一个简化的版本,做精细化历史回测一样可以复现这个问题。
测试个股:光莆股份 测试周期:20200615-20201025
代码:
GLOBALVARIABLE:X:=0,Y:=0;
//条件判断
MA5:MA(CLOSE,5);
MA10:MA(CLOSE,10);
CONDBUY:=CROSS(MA5,MA10);
CONDSELL:=CROSS(MA10,MA5);
//开仓和平仓
if CONDBUY then begin
if X=0 then begin
TBUY(1,1,LMT,CLOSE);
if islastbar then begin
DEBUGFILE('C:\testlog1.txt',STKNAME()& '建仓',0);
end
X:=1;//开仓时候重置x为1
end else begin
//if TISREMAINEX( 1,'',STKLABEL)=0 then begin
if TIME>=145959 then begin
X:=0;//当日收盘重置为0,次日起又可以在命中买入条件时下单
end
end
end
持仓:=THOLDING();
if 持仓>0 and CONDSELL then begin
if Y=0 then begin
tsell(持仓>0,0,mkt,0,0);
if islastbar then begin
DEBUGFILE('C:\testlog1.txt',STKNAME()& '清仓',0);
end
Y:=1;
end else BEGIN
if TIME>=145959 then begin
Y:=0;//当日收盘重置为0,次日可以在命中卖出条件后再次卖出
end
end
end
日志输出结果只有一次交易:
2020-11-03 18:51:54.458 光莆股份建仓
2020-11-03 18:51:54.458 光莆股份清仓
----------------------------------------------------------
如果把代码中的过滤重复输出debugfile的代码删掉后如下:
//条件判断
MA5:MA(CLOSE,5);
MA10:MA(CLOSE,10);
CONDBUY:=CROSS(MA5,MA10);
CONDSELL:=CROSS(MA10,MA5);
//开仓和平仓
if CONDBUY then begin
TBUY(1,1,LMT,CLOSE);
if islastbar then begin
DEBUGFILE('C:\testlog1.txt',STKNAME()& '建仓',0);
end
end
持仓:=THOLDING();
if 持仓>0 and CONDSELL then begin
tsell(持仓>0,0,mkt,0,0);
if islastbar then begin
DEBUGFILE('C:\testlog1.txt',STKNAME()& '清仓',0);
end
end
则日志输出显示有3次半的交易:
2020-11-03 18:59:30.448 光莆股份建仓
2020-11-03 18:59:30.448 光莆股份清仓
2020-11-03 18:59:30.448 光莆股份建仓
2020-11-03 18:59:30.458 光莆股份清仓
2020-11-03 18:59:30.458 光莆股份建仓
2020-11-03 18:59:30.458 光莆股份清仓
2020-11-03 18:59:30.458 光莆股份建仓
GLOBALVARIABLE:X:=0,Y:=0;
//条件判断
MA5:MA(CLOSE,5);
MA10:MA(CLOSE,10);
CONDBUY:=CROSS(MA5,MA10);
CONDSELL:=CROSS(MA10,MA5);
//开仓和平仓
if CONDBUY then
begin
if X=0 then
begin
TBUY(1,1,LMT,CLOSE);
DEBUGFILE('C:\testlog1.txt',NUMTOSTR(date,0)&':'&STKNAME()& '建仓',0);
end
X:=1;//开仓时候重置x为1
end
if TIME>=145959 then
begin
X:=0;//当日收盘重置为0,次日起又可以在命中买入条件时下单
end
持仓:=THOLDING();
if 持仓>0 and CONDSELL then
begin
if Y=0 then
begin
tsell(持仓>0,0,mkt,0,0);
DEBUGFILE('C:\testlog1.txt',NUMTOSTR(date,0)&':'&STKNAME()& '清仓',0);
Y:=1;
end
if TIME>=145959 then begin
Y:=0;//当日收盘重置为0,次日可以在命中卖出条件后再次卖出
end
end
你再试试。
还是用之前的回测周期和光莆股份做案例,用精细化历史测评回测结果显示还是只有一次交易debugfile输出如下:
2020-11-04 16:31:06.502 1200804:光莆股份建仓
2020-11-04 16:31:06.512 1200811:光莆股份清仓
我用的是日线周期
日线级别肯定不行的啊。
日线上time函数是直接失效的。也就是
TIME>=145959 这个是无法正常执行的。并且如果是想在回测上体现到时间重置全局变量 这个是无法实现的,实际交易中是可用做到在这个时间重置全局变量的。
明白了,我把time判断改成islastbar后生效了。
另外,日线级别的策略,采用序列计算,time函数是生效的吧?