金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 2886|回复: 26

为什么调用STKINDIEX获取子指标的值总是无效值?

[复制链接]

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
发表于 2025-2-24 17:54 | 显示全部楼层 |阅读模式
基于10分钟级别的逐K运行模式的'精细化历史评测',如下是我的代码和打印结果.  
RUNMODE : 0; //指定逐K模式

VARIABLE : contract_array[5] = ('RB00',  //螺纹1 //黑色+建材-----------
'HC00',  //热卷2
'I00',    //铁矿3
'J00',    //焦炭4
'JM00'  //焦煤5
);
VARIABLE: DX = 0; //内部数组
M := 32;
BS := 13;
IF BARPOS < M*BS THEN EXIT;
/////////////////////////////////////////////////////////
//                     调试输出相关
/////////////////////////////////////////////////////////  
DBG_PATH := 'D:\';  //调试输出文件路径
DBG_LOG_FILE := DBG_PATH + '\TestMain_debug.txt';  //调试输出文件名 普通调试相关
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 调试输出相关
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
////  #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);
/////////////////////////////////////////////////////////

IF NOT(ISLASTBAR) THEN BEGIN
    EXIT;
END   
recent_bars_n := M*BS;
//当前品种的指标值
CCD := STKINDIEX('','MARGIN_AMP.DBZ',0,-1,0,recent_bars_n);
debug_str := k_stamp&STKLABEL  & ' CCD:' & NUMTOSTR(CCD,0);
DEBUGFILE(DBG_LOG_FILE, debug_str, 0);

FOR i = 1 TO 5 DO //各合约
BEGIN
        DEBUGFILE(DBG_LOG_FILE, 'i:' & NUMTOSTR(i,0) & ' ' & contract_array[i],  0);
        //DEBUGFILE(DBG_LOG_FILE, contract_array[i], 0);
    custom_amp := STKINDIEX(contract_array[i], 'MARGIN_AMP.DBZ', 0, -1, 0, recent_bars_n);
    IF VALID(custom_amp)=0 THEN
    BEGIN
        DEBUGFILE(DBG_LOG_FILE, k_stamp& 'custom_amp无效',0);
            CONTINUE;
    END
    DEBUGFILE(DBG_LOG_FILE,  k_stamp& 'custom_amp有效',0);
END
         

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

3

主题

811

帖子

852

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-10
曾用名:
发表于 2025-2-24 22:27 | 显示全部楼层
补充RB、HC等品种的5分钟数据。
回复

使用道具 举报

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-24 23:29 | 显示全部楼层
我已经补充5分钟数据. 采用调用指标方式仍然得不到想要的结果. 附:我不光需要知道当前品种的指标值,而且需要获取其他品种的该指标值,所以必须要利用STKINDIEX调用指标

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

1

主题

1070

帖子

1080

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-24 23:38 | 显示全部楼层
IF NOT(ISLASTBAR) THEN BEGIN
    EXIT;
END   
这句话在逐k模式下使用会有问题,会导致后面的指标无法计算和积累数据,编译时软件应该这种情况有明确的提示,建议先好好看看软件的提示信息
回复

使用道具 举报

3

主题

811

帖子

852

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-10
曾用名:
发表于 2025-2-25 00:00 | 显示全部楼层
这是本地当时测试的结果。么有数据的情况下才是无效值。数据充足的情况下是下面的结果。(你所谓的cdd=-1,是因为你debugfile输出时,对数值进行了整理只保留的整数部分)
注:4楼问题。(建议你梳理下代码,在pel中,基本上用不到循环和数组,如果思想中需要用它,说明对pel的运行机制不了解)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-25 11:02 | 显示全部楼层
你好! 数据是补齐了的,我是基于10分钟级别回测. 第I种方法能获取CDC,但是第II种调用指标方法获取的数据是无效的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-25 11:04 | 显示全部楼层
stkindiex是固定使用多少数量,比如日线100就是总共只能拿100个日线
而不是每一个k都是100个日线
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-25 11:05 | 显示全部楼层
技术015 发表于 2025-2-24 23:38
IF NOT(ISLASTBAR) THEN BEGIN
    EXIT;
END   

谢谢! 但是,我试了将ISLASTBAR ...EXIT 语句放在后面也是一样的结果(也即获取到的CCD值是无效的)
回复

使用道具 举报

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-25 11:14 | 显示全部楼层
技术008 发表于 2025-2-25 11:04
stkindiex是固定使用多少数量,比如日线100就是总共只能拿100个日线
而不是每一个k都是100个日线

我设置 STKINDIEX的DATANUM参数的值为800,也是一样的结果. 也就是引用800根K线数据(其实引用800根具体做什么,我也不是很清楚这个STKINDEX的机制)

补充内容 (2025-2-25 11:19):
MBS := 800;
recent_bars_n := MBS;  
CCD := STKINDIEX('','MARGIN_AMP.DBZ',0,18,0,recent_bars_n);
回复

使用道具 举报

37

主题

1万

帖子

6万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2025-2-25 11:22 | 显示全部楼层
hanzi-999 发表于 2025-2-25 11:14
我设置 STKINDIEX的DATANUM参数的值为800,也是一样的结果. 也就是引用800根K线数据(其实引用800根具体做 ...

STKINDIEX的DATANUM,指的是被调用周期使用DATANUM的数据量。或者说STKINDIEX等同于把指定的指标单独运行一次后,把需要的结果取值过来。

注:回测中STKINDIEX和STKINDI没有区别。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 01:03 , Processed in 0.133989 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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