金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 1783|回复: 13

EMA函数在逐K线模式下不能直接在IF语句之内引用. 该如何解决这个问题?

[复制链接]

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
发表于 2025-2-25 17:05 | 显示全部楼层 |阅读模式
EMA函数在逐K线模式下不能直接在IF语句之内引用. 该如何解决这个问题?

本帖子中包含更多资源

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

x
回复

使用道具 举报

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-25 17:12 | 显示全部楼层
具体代码:
RUNMODE : 0; //指定逐K模式
VARIABLE : contract_array[5] = ('RB00',  //螺纹1 //黑色+建材-----------
'HC00',   //热卷2
'I00',    //铁矿3
'J00',    //焦炭4
'JM00'    //焦煤5
);
VARIABLE: DX = 0; //内部数组  
MBS := 800;
/////////////////////////////////////////////////////////
//                     调试输出相关
/////////////////////////////////////////////////////////  
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 调试输出相关
/////////////////////////////////////////////////////////   

IF ISLASTBAR AND BARPOS >= MBS THEN
BEGIN   
        CCD := STKINDI('','MARGIN_AMP.DBZ',0,18,0);
        //k_pos := STKINDI('','MARGIN_AMP.KPOS',0,18,0);
        //DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL& ' MARGIN_AMP.KPOS:' & NUMTOSTR(k_pos,0), 0);
       
        IF VALID(CCD)=0 THEN  DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL& ' CCD:' & NUMTOSTR(CCD,0) & '无效',0);
        ELSE DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL& ' CCD:' & NUMTOSTR(CCD,0) & '有效',0);
       
        FOR i = 1 TO 5 DO //各合约
        BEGIN
            custom_amp := STKINDI(contract_array[i], 'MARGIN_AMP.DBZ', 0, 18, 0);
            IF VALID(custom_amp)=0 THEN
            BEGIN
                DEBUGFILE(DBG_LOG_FILE, k_stamp& contract_array[i] & ' custom_amp:%.2f 无效',custom_amp);
                    CONTINUE;
            END
            DEBUGFILE(DBG_LOG_FILE, k_stamp& contract_array[i] & ' custom_amp:%.2f 有效',custom_amp);
            //DEBUGFILE(DBG_LOG_FILE, 'i:' & NUMTOSTR(i,0) & ' ' & contract_array[i],  0);
            DX := CCD - custom_atr;
            emax := EMA(DX, 20);
        END

END
         

本帖子中包含更多资源

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

x
回复

使用道具 举报

4630

主题

4718

帖子

4743

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-25 17:24 | 显示全部楼层
问题处理中,请稍等
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-25 17:33 | 显示全部楼层
temp:=ema(close,5);
if temp then temp


这样在前面定义好,然后if里面用
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-25 17:38 | 显示全部楼层
主要问题是我传入EMA函数的序列是在IF里面赋值的,所以您给的这个方法还是解决不了. 下面是代码:
...
IF ISLASTBAR AND BARPOS >= MBS THEN
BEGIN   
        CCD := STKINDI('','MARGIN_AMP.DBZ',0,18,0);
        //k_pos := STKINDI('','MARGIN_AMP.KPOS',0,18,0);
        //DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL& ' MARGIN_AMP.KPOS:' & NUMTOSTR(k_pos,0), 0);
       
        IF VALID(CCD)=0 THEN  DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL& ' CCD:' & NUMTOSTR(CCD,0) & '无效',0);
        ELSE DEBUGFILE(DBG_LOG_FILE, k_stamp&STKLABEL& ' CCD:' & NUMTOSTR(CCD,0) & '有效',0);
       
        FOR i = 1 TO 5 DO //各合约
        BEGIN
            custom_amp := STKINDI(contract_array[i], 'MARGIN_AMP.DBZ', 0, 18, 0);
            IF VALID(custom_amp)=0 THEN
            BEGIN
                DEBUGFILE(DBG_LOG_FILE, k_stamp& contract_array[i] & ' custom_amp:%.2f 无效',custom_amp);
                    CONTINUE;
            END
            DEBUGFILE(DBG_LOG_FILE, k_stamp& contract_array[i] & ' custom_amp:%.2f 有效',custom_amp);
            //DEBUGFILE(DBG_LOG_FILE, 'i:' & NUMTOSTR(i,0) & ' ' & contract_array[i],  0);
            DX := CCD - custom_atr;
            emax := EMA(DX, 20);
        END

END
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-25 17:38 | 显示全部楼层
拿着就没办法了
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-25 17:41 | 显示全部楼层
不是吧? 这个需求很普遍啊. 因为逐K方式你们要求是避免前面写EXIT,那我只能在IF里面写, 然后EMA这些调用是很普遍的,然后自定义序列的传入也是很普遍的啊
回复

使用道具 举报

1

主题

1070

帖子

1080

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-25 18:19 | 显示全部楼层
EMA 函数的计算公式 Y=[2*X+(N-1)*Y']/(N+1),这种情况你只能自己通过PEL公式来计算了。但是通过计算公式你就知道这个逐k线模式运行时,后面K线的值依赖前面K线的计算值,因此这种语句是不能放到IF中,因为IF的条件会在某个条件跳开这个计算。
你需要自行梳理你自己的代码逻辑,把需要函数的计算部分放到IF之前,否则没其他的方法
回复

使用道具 举报

49

主题

268

帖子

268

积分

等级: 免费版

注册:
2023-9-29
曾用名:
 楼主| 发表于 2025-2-25 18:25 | 显示全部楼层
谢谢! 能否把那个编译告警错误给取消掉.  因为这种限制不合理啊:逐K模式仍有调用EMA或MA的需求
回复

使用道具 举报

1

主题

1070

帖子

1080

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-2-25 20:19 | 显示全部楼层
之所以限制就是因为这么使用后EMA将无法返回正确结果。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 09:51 , Processed in 0.088287 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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