欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件公式模型编写问题提交 → debugfile在序列计算模式下如何解决重复输出的问题

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有4609人关注过本帖树形打印复制链接

主题:debugfile在序列计算模式下如何解决重复输出的问题

帅哥哟,离线,有人找我吗?
popypopy
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:82 积分:0 威望:0 精华:0 注册:2020/9/21 10:56:16
debugfile在序列计算模式下如何解决重复输出的问题  发帖心情 Post By:2020/11/3 10:27:11    Post IP:111.202.190.20[只看该作者]

我的代码希望实现的目的:
当日内一旦命中买入规则,下单买入,并记入日志。当日内再发生命中买入规则的情况不再下单也不再记入日志

我参照了之前类似问题的帖子中的解决方法,写了如下代码:
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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:14496 积分:0 威望:0 精华:0 注册:2017/7/4 13:40:18
  发帖心情 Post By:2020/11/3 10:35:42    Post IP:58.246.57.26[只看该作者]

你的问题是过滤了重复的买入,但是日志没有实现过滤,多次写入?


命数如织,当如磐石。
 回到顶部
帅哥哟,离线,有人找我吗?
popypopy
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:82 积分:0 威望:0 精华:0 注册:2020/9/21 10:56:16
  发帖心情 Post By:2020/11/3 10:54:01    Post IP:111.202.190.20[只看该作者]

我的问题是当日内的重复买入和日志记录是过滤掉了,但是精细化历史回测显示把之后几日本来命中买入规则应该执行的买入也都给过滤掉了,之后几日里本应买入并记录的日志也给过滤掉了。

以个股“光莆股份”为例做历史回测,时间段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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:14496 积分:0 威望:0 精华:0 注册:2017/7/4 13:40:18
  发帖心情 Post By:2020/11/3 11:13:20    Post IP:58.246.57.26[只看该作者]

 你直接完整代码贴下。我们直接在你代码基础上调试看下。


命数如织,当如磐石。
 回到顶部
帅哥哟,离线,有人找我吗?
popypopy
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:82 积分:0 威望:0 精华:0 注册:2020/9/21 10:56:16
  发帖心情 Post By:2020/11/3 19:00:25    Post IP:111.200.53.18[只看该作者]

我的原始代码太长,我做了一个简化的版本,做精细化历史回测一样可以复现这个问题。

测试个股:光莆股份 测试周期: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:14496 积分:0 威望:0 精华:0 注册:2017/7/4 13:40:18
  发帖心情 Post By:2020/11/4 9:25:46    Post IP:58.246.57.26[只看该作者]

 你测试的交易周期是什么周期?


命数如织,当如磐石。
 回到顶部
帅哥哟,离线,有人找我吗?
FireScript
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:14496 积分:0 威望:0 精华:0 注册:2017/7/4 13:40:18
  发帖心情 Post By:2020/11/4 10:17:42    Post IP:58.246.57.26[只看该作者]

 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
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:82 积分:0 威望:0 精华:0 注册:2020/9/21 10:56:16
  发帖心情 Post By:2020/11/4 16:33:14    Post IP:111.200.53.18[只看该作者]

还是用之前的回测周期和光莆股份做案例,用精细化历史测评回测结果显示还是只有一次交易
debugfile输出如下:
2020-11-04 16:31:06.502    1200804:光莆股份建仓
2020-11-04 16:31:06.512    1200811:光莆股份清仓

我用的是日线周期

 回到顶部
帅哥哟,离线,有人找我吗?
FireScript
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:14496 积分:0 威望:0 精华:0 注册:2017/7/4 13:40:18
  发帖心情 Post By:2020/11/4 16:43:22    Post IP:58.246.57.26[只看该作者]

 日线级别肯定不行的啊。

日线上time函数是直接失效的。也就是
TIME>=145959 这个是无法正常执行的。并且如果是想在回测上体现到时间重置全局变量 这个是无法实现的,实际交易中是可用做到在这个时间重置全局变量的。






命数如织,当如磐石。
 回到顶部
帅哥哟,离线,有人找我吗?
popypopy
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:82 积分:0 威望:0 精华:0 注册:2020/9/21 10:56:16
  发帖心情 Post By:2020/11/4 17:08:31    Post IP:111.200.53.18[只看该作者]

明白了,我把time判断改成islastbar后生效了。

另外,日线级别的策略,采用序列计算,time函数是生效的吧?


 回到顶部
总数 26 1 2 3 下一页