金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 660|回复: 13

序列变量异常行为(逐K模式下),是什么原因?

[复制链接]

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
发表于 2025-2-28 11:32 | 显示全部楼层 |阅读模式
你好! 我测试序列变量的REF能否正常获取,结果发现异常行为(由日志打印数值得出是异常).
我的代码如下:
// version: 0.1

RUNMODE : 0; //指定逐K模式

DBG_PATH := 'D:\'; //调试输出文件路径
DBG_LOG_FILE := DBG_PATH & 'debug_Variable.txt'; //调试输出文件名

VARIABLE : UNINIT_VAL = -99999;
IF BARPOS=1 THEN
BEGIN
        EXTGBDATASET(STKLABEL&'ccd', UNINIT_VAL); //第一根K初始化全局变量值
END

//IF NOT(ISLASTBAR) OR BARPOS < 100 THEN EXIT;


//////////////////////////////////////////////////////////////////
//                  调试输出最新K时间戳相关
//////////////////////////////////////////////////////////////////
reldate := DATE+19000000;  
current_date_str := NUMTOSTR(reldate,0); //日期字符串   
current_time_str := NUMTOSTR(HOUR,0) & ':' & NUMTOSTR(MINUTE,0) & ':' & NUMTOSTR(SECOND,0);  
k_stamp := '[' & current_date_str & ' ' & current_time_str & ']  ';
//////////////////////////////////////////////////////////////////
//                 end of 调试输出最新K时间戳相关
//////////////////////////////////////////////////////////////////

//DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL & ' k_pos:' & NUMTOSTR(k_pos,0),0);

DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL & ' BARPOS:' & NUMTOSTR(BARPOS,0), 0);

CCD := STKINDI('','MARGIN_AMP.DBZ',0,-1,0);
g_ccd := EXTGBDATA(STKLABEL&'ccd');  //取保存的ccd值 即CCD前值
pre_ccd := REF(CCD,1); // 取CCD前值

if g_ccd <> UNINIT_VAL and g_ccd <> pre_ccd then
begin
        //打印异常现象
        DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL & ' CCD:' & NUMTOSTR(CCD,0)& ' pre_ccd:' & NUMTOSTR(pre_ccd,0) & ' g_ccd:' & NUMTOSTR(g_ccd,0) & ' WARNING: pre_ccd <> g_ccd', 0);
end
else begin
        DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL & ' CCD:' & NUMTOSTR(CCD,0)& ' pre_ccd:' & NUMTOSTR(pre_ccd,0) & ' g_ccd:' & NUMTOSTR(g_ccd,0), 0);
end

EXTGBDATASET(STKLABEL&'ccd', CCD); //保存当前CCD值



测试配置

测试配置

打印的日志

打印的日志
回复

使用道具 举报

38

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-28 13:08 | 显示全部楼层
你要获取跨周期里上一个数据用CCD1 := STKINDI('','MARGIN_AMP.DBZ',0,-1,-1);
这么写,最后一个参数-1表示偏移

不能用ref写,ref表示当前k的上一个k的跨周期引用
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-28 13:39 | 显示全部楼层
技术008 发表于 2025-2-28 13:08
你要获取跨周期里上一个数据用CCD1 := STKINDI('','MARGIN_AMP.DBZ',0,-1,-1);
这么写,最后一个参数-1表 ...

1.我这个例子只是测试,比较简单,实际的策略代码中,调用指标取值只是为计算真正的值的准备数据
2.ref在语言说明里就是指,上一根K线的该变量值啊,如果你说的跨周期引用就是这个意思,我要的就是当前K的上一个K的...引用

补充内容 (2025-2-28 13:48):
再次,STKINDI调用公式计算指标值是耗费资源的,既然是序列变量,为什么不能取上一根K的值,而避免重复计算呢?
回复

使用道具 举报

38

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-28 13:57 | 显示全部楼层
你试试看输出time时间呢
本地测试都是正常的
截图202502281357408681.png
截图202502281357477287.png
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-28 14:13 | 显示全部楼层
技术008 发表于 2025-2-28 13:57
你试试看输出time时间呢
本地测试都是正常的

MARGIN_AMP 指标内容:
A:=(C/REF(C,1)-1)*100;
B:=-(REF(C,1)/C-1)*100;

BZJ:=TACCOUNT(41);
T:=REF(C,1)<C;
TK:=IF(T,A,B);
BTK:=TK/BZJ;

DB:=BTK;
DBZ:SUM(DB,0);
KPOS:BARPOS;
回复

使用道具 举报

38

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-28 14:14 | 显示全部楼层
你不要用其他就用time去测试

因为历史走过去后数据量会发生变化可能导致依赖数据量的计算有一定出入
这个没有办法的
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-28 14:17 | 显示全部楼层
技术008 发表于 2025-2-28 13:57
你试试看输出time时间呢
本地测试都是正常的

1.你这个代码太简单了
2.不是能马上出现 异常(对不上)的情况
我代码全部列出了,测试配置也发你了. 你用我的代码复现下. 我感觉这是个金字塔软件的漏洞
回复

使用道具 举报

38

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-28 14:19 | 显示全部楼层
这个就是数量问题,你可以输出barpos的情况看
这个没办法严格控制,而且你要求的是历史所有数据量,这需要保持跨周期调用的差一点都不行
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

151

帖子

151

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-28 14:20 | 显示全部楼层
hanzi-999 发表于 2025-2-28 14:17
1.你这个代码太简单了
2.不是能马上出现 异常(对不上)的情况
我代码全部列出了,测试配置也发你了. 你用 ...

2.不是能马上出现 异常(对不上)的情况,要跑足够的K线数(达到配置里项的'策略计算K线量' 如860),然后就会复现这个REF(x,1)对不上
回复

使用道具 举报

38

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-28 14:21 | 显示全部楼层
那就是超过数量控制了,导致之前的就没参与进来

这个目前没有办法的,如果你对数量如此铭感目前没有办法
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-4-28 03:25 , Processed in 0.153017 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表