金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 12|回复: 7

VARIABLE函数问题

[复制链接]

10

主题

42

帖子

42

积分

Rank: 4

等级: 专业版

注册:
2025-12-17
曾用名:
发表于 2026-6-24 09:52 | 显示全部楼层 |阅读模式
VARIABLE: PIERCE_HI=0, PIERCE_LO=99999;

    { 穿透追踪——EXTGBDATASET 在 IF 内写入 }
    IF HIGH > PIERCE_HI THEN BEGIN
        PIERCE_HI := HIGH;
        EXTGBDATASET('PIERCE_HI', PIERCE_HI);
    END
    IF LOW < PIERCE_LO THEN BEGIN
        PIERCE_LO := LOW;
        EXTGBDATASET('PIERCE_LO', PIERCE_LO);
    END

    { 清理——EXTGBDATASET 在 IF 内写入,偶尔不生效 }
    IF REF(SICHA, 1) THEN BEGIN
        PIERCE_LO := 99999;
        EXTGBDATASET('PIERCE_LO', 99999);        // ← 可能偶尔被跳过
    END
    IF REF(JINCHA, 1) THEN BEGIN
        PIERCE_HI := 0;
        EXTGBDATASET('PIERCE_HI', 0);            // ← 可能偶尔被跳过
    END

请老师帮我看一下,我通过debug返回来看,引用的好像是一个旧的数值,是不是赋值每次都生效,而同一 IF 块里的 EXTGBDATASET 偶尔不执行,导致磁盘残留旧值? 还是代码这里写的不对?

回复

使用道具 举报

1

主题

144

帖子

144

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-27
曾用名:
发表于 2026-6-24 10:21 | 显示全部楼层
本帖最后由 资深技术07 于 2026-6-24 10:25 编辑

代码不对,不需要第一行代码
EXTGBDATASET('PIERCE_LO', 99999);  //就是赋值
EXTGBDATA('PIERCE_LO');    //就是取值

以前几行为例,取值和赋值过程,供您参考
//不需要,删除掉VARIABLE: PIERCE_HI=0, PIERCE_LO=99999;

    { 穿透追踪——EXTGBDATASET 在 IF 内写入 }
    IF HIGH > EXTGBDATA('PIERCE_LO') THEN BEGIN
        //不需要,删除掉PIERCE_HI := HIGH;
        EXTGBDATASET('PIERCE_HI', HIGH);
    END

回复

使用道具 举报

10

主题

42

帖子

42

积分

Rank: 4

等级: 专业版

注册:
2025-12-17
曾用名:
 楼主| 发表于 2026-6-24 10:23 | 显示全部楼层
用 EXTGBDATA 直接读盘,不需要本地 VARIABLE 做副本是吗?
那我改完之后,清理分支还是写在 IF 里面:

    IF REF(SICHA, 1) THEN BEGIN
        EXTGBDATASET('PIERCE_LO', 99999);
    END
    IF REF(JINCHA, 1) THEN BEGIN
        EXTGBDATASET('PIERCE_HI', 0);
    END

    这种写法可靠吗?会不会偶尔不执行?

    如果不可靠,应该怎么写?
回复

使用道具 举报

1

主题

144

帖子

144

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-27
曾用名:
发表于 2026-6-24 10:29 | 显示全部楼层
本帖最后由 资深技术07 于 2026-6-24 10:31 编辑

用 EXTGBDATA 直接读盘,不需要本地 VARIABLE 做副本。相当可靠,放心使用。需要注意重点梳理对全局变量的赋值条件,要形成闭环
EXTGBDATA的全局变量值是实时的,且只有一个最新值,没有历史值

对金死叉的判定,是想对历史上的全局变量值进行修改? 那是不是要再新建一个全局变量?
回复

使用道具 举报

10

主题

42

帖子

42

积分

Rank: 4

等级: 专业版

注册:
2025-12-17
曾用名:
 楼主| 发表于 2026-6-24 10:32 | 显示全部楼层
我的需求是:金叉之后、死叉之前这段时间内,穿透下轨有效;死叉之后作废。
   
你说的新建全局变量,是不是建议用一个单独的变量来标记 当前穿透是否有效的意思
    而不是把穿透价本身改成 99999 来作废?
回复

使用道具 举报

1

主题

144

帖子

144

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-27
曾用名:
发表于 2026-6-24 10:37 | 显示全部楼层
本帖最后由 资深技术07 于 2026-6-24 10:39 编辑

是的,因为只有最新值,没有历史值,只能在最新生成的那根K线上,做判断以及处理。所以只有赋值,取值的操作。
形成闭环的意思,我截图再解释下

本帖子中包含更多资源

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

x
回复

使用道具 举报

10

主题

42

帖子

42

积分

Rank: 4

等级: 专业版

注册:
2025-12-17
曾用名:
 楼主| 发表于 2026-6-24 11:43 | 显示全部楼层
还有个棘手的问题,
EXTGBDATA 读不存在的 key 默认返回 0。

    但我用 PIERCE_LO 记最低穿透价,最低价永远 > 0。
    策略第一次跑时 EXTGBDATA(LO_KEY)=0 → LOW < 0 永远不能触发第一次穿透。

    所以我需要在 BARPOS=1 时把 LO_KEY 初始化成 99999。

    但还有个场景:
    周一穿透了,磁盘记了 PIERCE_LO=7685、VALID=1。
    收盘关机,当天没开仓。
    周二重启 → BARPOS=1 把 PIERCE_LO 覆盖成 99999 → 穿透丢了。
    可 VALID 还在磁盘上是 1 → 会出现用 99999 开仓(穿透门槛失效)。

    我的想法是 BARPOS=1 判断是重启还是首次:

    IF BARPOS = 1 THEN BEGIN
        IF EXTGBDATA(LO_KEY) = 0 THEN EXTGBDATASET(LO_KEY, 99999);
        IF EXTGBDATA(VALID_KEY) = 0 THEN EXTGBDATASET(VALID_KEY, 0);
    END

    用 = 0 判断"从没被写过"(穿透价格不可能 = 0),重启不动磁盘。

    这个思路对吗?有没有更好的思路和办法呢能够解决这个问题呢?因为这个拿穿透价这里老出错, 总是会出各种各样的问题
回复

使用道具 举报

1

主题

144

帖子

144

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-27
曾用名:
发表于 2026-6-24 13:14 | 显示全部楼层
本帖最后由 资深技术07 于 2026-6-24 13:16 编辑

逻辑思路不对,因为开高低收的价格,永远都不可能为0的,所以,LOW永远也不可能<0哦

EXTGBDATA全局变量的值,默认初始化值就为0,这个不能更改。建议您将新一轮开始的状态值,都用0表示,就像前面给您截的图一样,形成闭环。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-24 19:39 , Processed in 0.223464 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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