以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://222.73.7.161/bbs/index.asp) -- 公式模型编写问题提交 (http://222.73.7.161/bbs/list.asp?boardid=4) ---- debugfile在序列计算模式下如何解决重复输出的问题 (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=182842) |
-- 作者:popypopy -- 发布时间:2020/11/3 10:27:11 -- debugfile在序列计算模式下如何解决重复输出的问题 我的代码希望实现的目的: 当日内一旦命中买入规则,下单买入,并记入日志。当日内再发生命中买入规则的情况不再下单也不再记入日志 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都解决不了这个问题 请大神帮忙看看该如何解决这个问题 |
-- 作者:FireScript -- 发布时间:2020/11/3 10:35:42 -- 你的问题是过滤了重复的买入,但是日志没有实现过滤,多次写入? |
-- 作者:popypopy -- 发布时间:2020/11/3 10:54:01 -- 我的问题是当日内的重复买入和日志记录是过滤掉了,但是精细化历史回测显示把之后几日本来命中买入规则应该执行的买入也都给过滤掉了,之后几日里本应买入并记录的日志也给过滤掉了。 以个股“光莆股份”为例做历史回测,时间段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光莆股份清仓 |
-- 作者:FireScript -- 发布时间:2020/11/3 11:13:20 -- 你直接完整代码贴下。我们直接在你代码基础上调试看下。 |
-- 作者:popypopy -- 发布时间:2020/11/3 19:00:25 -- 我的原始代码太长,我做了一个简化的版本,做精细化历史回测一样可以复现这个问题。 测试个股:光莆股份 测试周期: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 光莆股份建仓 |
-- 作者:FireScript -- 发布时间:2020/11/4 9:25:46 -- 你测试的交易周期是什么周期? |
-- 作者:FireScript -- 发布时间:2020/11/4 10:17:42 -- 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 你再试试。
|
-- 作者:popypopy -- 发布时间:2020/11/4 16:33:14 -- 还是用之前的回测周期和光莆股份做案例,用精细化历史测评回测结果显示还是只有一次交易 debugfile输出如下: 2020-11-04 16:31:06.502 1200804:光莆股份建仓 2020-11-04 16:31:06.512 1200811:光莆股份清仓 我用的是日线周期
|
-- 作者:FireScript -- 发布时间:2020/11/4 16:43:22 -- 日线级别肯定不行的啊。 日线上time函数是直接失效的。也就是 TIME>=145959 这个是无法正常执行的。并且如果是想在回测上体现到时间重置全局变量 这个是无法实现的,实际交易中是可用做到在这个时间重置全局变量的。 |
-- 作者:popypopy -- 发布时间:2020/11/4 17:08:31 -- 明白了,我把time判断改成islastbar后生效了。 另外,日线级别的策略,采用序列计算,time函数是生效的吧?
|