金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 2265|回复: 9

关于全局变量的幽灵BUG

[复制链接]

13

主题

64

帖子

74

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
发表于 2021-12-26 11:37 | 显示全部楼层 |阅读模式
def init(context):
    clearextdata()
    context.heyue = ['SQCU00','SQAL00','SQRB00','SQRU00']
    for i in context.heyue:
          setextdata(i + 'buy_holdprice', 0)
          setextdata(i + 'sell_holdprice', 0)
          setextdata(i + 'buy_holding', 0)
          setextdata(i + 'sell_holding', 0)
          setextdata(i + 'buyopen_today', 0)
          setextdata(i + 'sellopen_today', 0)
          setextdata(i + 'buyclose_today', 0)
          setextdata(i + 'sellclose_today', 0)

在getextdata()的时候,死活不正常,昨晚调到3点钟,今天一大早又爬起来,终于把原因找出来了。
一、setextdata(i + 'buy_holdprice', 10)
那么print(getextdata(i + 'buyprice') )= ?
答案是0.也就是说,如果str并未经setextdata(str,)命名和赋值,getextdata(str)金字塔都不会报错,而是直接输出为0 。
不报错的话,输出为NONE也好啊。如果手误写错了变量名,很难查原因。

二、果然幽灵出现了,对于下面的语句
setextdata(i + 'sellclose_today', 10)  #无论我写入什么值,
print(getextdata(i + 'sellclose_today'))   #恒等于0,到底是set出了问题,还是get出了问题?
联想到上一条(金字塔get 任意未经命名的全局变量,都输出0,而不报错),因此怀疑是setextdata()出了问题,但死活查不到
原因,无奈只好换个全局变量名写入试试,比如
setextdata(i + 'sellclosetoday', 10)  #把下划线去掉了
print(getextdata(i + 'sellclosetoday') )  # 输出为10,它终于正常了

结论:setextdata(i + 'sellclose_today', 10),这个 setextdata操作始终是失败的,(不用去管I,所有品种本句的写入操作都是失败的)
直到把'sellclose_today'改为任意其它字符串,它就可以正常写入。请老师们复现了场景试试。

回复

使用道具 举报

3

主题

2万

帖子

2万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2021-12-26 13:37 | 显示全部楼层
本地测试输出的没问题啊,另外第一个这个没有办法,全局变量在pel中也有,而pel中没有None这个概念所以默认是0值

截图202112261334568265.png
截图202112261337044349.png
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

13

主题

64

帖子

74

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
 楼主| 发表于 2021-12-27 09:23 | 显示全部楼层
谢谢老师认真进行场景复现,最终的原因找到了。是因为全局变量字段不允许超过20个占位符(我不知道这是不是统一规定),这里setextdata(i + 'sellclose_today', 0)中'sellclose_today'有15位,而品种代码一般有6位,例如'SQAL00',这样i + 'sellclose_today'加起来就有21位了,去掉下划线正好就是20位,就好了。

来源于,setextdata(i + 'sell_holdprice', 0)这句只在ZQSRX00,SQBUX00这两个品种写入出错,其它品种没事,也是因为'sell_holdprice'有14位,‘ZQSRX00’有7位,加起来21位。

关于调用未经定义的全局变量,直接给出返回值0,对金字塔可能有其自身原因,但我觉得还是不够严谨,采用报错的方式也行啊。
回复

使用道具 举报

3

主题

2万

帖子

2万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2021-12-27 09:26 | 显示全部楼层
这个函数也是从pel移植过来所以采用一样的逻辑,如果你觉得不好,完全可以自己去记录变量比如写文件方式
python毕竟提供很多方法了,甚至自己和数据库交互也不难
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

13

主题

64

帖子

74

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
 楼主| 发表于 2021-12-27 09:35 | 显示全部楼层
我哪知道那么多啊,我是个菜鸟,所以扎扎实实一个坑一个坑踩过来
另外,请教一下老师,我一般会在
def init(context):
    clearextdata()
方法里,把全局变量清除掉。问:
clearextdata()这个函数的作用域是什么?是只对本脚本的全局变量清除,还是PYTHON域,还是整个金字塔?
回复

使用道具 举报

3

主题

2万

帖子

2万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2021-12-27 09:49 | 显示全部楼层
全局变量是在工具-数据管理-全局变量
这个是整个金字塔共享,不区分你是策略还是pyt还是pel的
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

13

主题

64

帖子

74

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
 楼主| 发表于 2021-12-27 09:58 | 显示全部楼层
那我能不能定点清除某些全局变量,而不是clear all, 避免策略之间相互影响?
回复

使用道具 举报

3

主题

2万

帖子

2万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2021-12-27 10:04 | 显示全部楼层
没有清除,你手动给一些全局变量赋值0就行了
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

13

主题

64

帖子

74

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
 楼主| 发表于 2021-12-27 10:27 | 显示全部楼层
好的。那么我想确认一下,由于全局变量库是共享的,因此不同策略在定义同类全局变量名称时,其实应该加上本策略的标识,这样在多策略运行时,才能避免互相影响,是这样吗?
回复

使用道具 举报

3

主题

2万

帖子

2万

积分

Rank: 8Rank: 8

等级: 超级版主

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 18:03 , Processed in 0.226136 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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