重命名定义中的持久对象(python)

重命名定义中的持久对象(python),python,arrays,definition,persistent,Python,Arrays,Definition,Persistent,最小问题: 是我定义的相关部分,当我称之为我正在使用的定义时: MA_now_smooth = smooth(MA, IN, I)[-1] 其中MA是一个输入数组,IN和I是常数;下面将进一步定义该定义,但最终会将最后一个输入返回到storage.ZZZZ。我想要的是创建根据“指示符”输入命名的自定义存储对象,以便在为无数数组输入调用此定义时,持久变量不会重叠 即 应创造: storage.ZZZ_MA storage.ZZZZ_MA storage.ZZZ_MA2 storage.ZZZZ

最小问题:

是我定义的相关部分,当我称之为我正在使用的定义时:

MA_now_smooth = smooth(MA, IN, I)[-1]
其中MA是一个输入数组,IN和I是常数;下面将进一步定义该定义,但最终会将最后一个输入返回到storage.ZZZZ。我想要的是创建根据“指示符”输入命名的自定义存储对象,以便在为无数数组输入调用此定义时,持久变量不会重叠

应创造:

storage.ZZZ_MA
storage.ZZZZ_MA
storage.ZZZ_MA2
storage.ZZZZ_MA2
但是

应创造:

storage.ZZZ_MA
storage.ZZZZ_MA
storage.ZZZ_MA2
storage.ZZZZ_MA2

深入问题:

我正在tradewave.net上为TA库指标创建一个简单的移动平均平滑定义;TA lib是一个黑匣子函数库,为“移动平均”、“指数移动平均”、“随机”等提供“金融技术分析”数组输出。我的定义是这些TA lib函数的二次简单平滑

我必须这样做,因为当“聚合”蜡烛从当前倒数时,我得到的是“摆动”输出;如果您需要背景知识,可以在此处阅读更多相关内容:

当平滑单个指标“MA”时,我的定义代码可以很好地创建平滑值列表;TA lib数组:

import talib

def smooth(indicator, aggregation, tick):
    import math
    A = int(math.ceil(aggregation/tick))
    if info.tick == 0:
        storage.ZZZ = []
        storage.ZZZZ = []
    storage.ZZZ.append(indicator[-1])
    storage.ZZZ = storage.ZZZ[-A:]
    ZZZ = sum(storage.ZZZ) / len(storage.ZZZ)
    storage.ZZZZ.append(ZZZ)
    storage.ZZZZ = storage.ZZZZ[-250:]
    return storage.ZZZZ


def tick():

    I               = info.interval
    period          = 10
    IN              = 3600
    instrument      = pairs.btc_usd
    C               = data(interval=IN)[instrument].warmup_period('close')

    MA              = talib.MA(C, timeperiod=period, matype=0)  

    MA_now = MA[-1]
    MA_now_smooth = smooth(MA, IN, I)[-1]

    plot('MA', MA_now)
    plot('MA_smooth', MA_now_smooth)
然而,当我尝试平滑具有相同定义的多个指示器时,它失败了,因为定义中的持久变量对于MA和MA2都是相同的。这不起作用:

import talib

def smooth(indicator, aggregation, tick):
    import math
    A = int(math.ceil(aggregation/tick))
    if info.tick == 0:
        storage.ZZZ = []
        storage.ZZZZ = []
    storage.ZZZ.append(indicator[-1])
    storage.ZZZ = storage.ZZZ[-A:]
    ZZZ = sum(storage.ZZZ) / len(storage.ZZZ)
    storage.ZZZZ.append(ZZZ)
    storage.ZZZZ = storage.ZZZZ[-250:]
    return storage.ZZZZ

def tick():

    I               = info.interval
    period          = 10
    IN              = 3600
    instrument      = pairs.btc_usd
    C               = data(interval=IN)[instrument].warmup_period('close')

    MA              = talib.MA(C, timeperiod=period, matype=0)  
    MA2             = talib.MA(C, timeperiod=2*period, matype=0)  

    MA_now = MA[-1]
    MA2_now = MA2[-1]
    MA_now_smooth = smooth(MA, IN, I)[-1]
    MA2_now_smooth = smooth(MA2, IN, I)[-1]

    plot('MA', MA_now)
    plot('MA2', MA2_now)    
    plot('MA_smooth', MA_now_smooth)
    plot('MA2_smooth', MA2_now_smooth)    
我想做的是。。。不知道该怎么做:

我希望定义为每个新输入创建一个新的持久存储对象,并希望对象的名称检测“指示符”输入的名称,即:

storage.ZZZ_MA
storage.ZZZZ_MA
ZZZ_MA
对于“MA”平滑和

storage.ZZZ_MA2
storage.ZZZZ_MA2
ZZZ_MA2
对于“MA2”平滑

我希望能够将此定义与“indicator”的许多不同数组输入一起重用,并为每个实例使用附加在定义中使用的持久对象名称后面的indicator数组的名称。例如:

storage.ZZZ_MA3
storage.ZZZ_MA4
etc.
在下面的例子中,info.interval是我的刻度大小为15分钟(900秒),聚合时间为1小时(3600秒)

单输出“MA”和正确的平滑

由于“MA”和“MA2”的双重输出,我得到了不正确的平滑

在第二幅图像中,我寻找两条“平滑”线,一条位于Wiggled红色图的中间,另一条位于Wigglue蓝色图的中间。相反,我得到了两条相同的摇摆线(紫色和橙色),它们分割了差异。我知道为什么,但我不知道如何修复它

1) 请告诉我怎么做

2) 请告诉我我想做的是“打电话”,并给我指出一些标签/帖子,在那里我可以学到更多

谢谢你的帮助


LP

将存储设为dict,并使用字符串键,而不是尝试创建和访问动态变量?

我已经找到了一个临时解决方案

虽然我喜欢这个解决方案,因为它能做我需要的一切。我想消除冗余的“标签”输入。我有没有办法引用输入参数/参数“indicator”的名称而不是其对象,这样我就可以返回到原来的3个输入参数而不是4个

我试过这个:

def smooth(indicator, aggregation, tick):
    import math
    A = int(math.ceil(aggregation/tick))
    ZZZ = 'ZZZ_%s' % dict([(t.__name__, t) for t in indicator])
    ZZZZ = 'ZZZZ_%s' %  dict([(t.__name__, t) for t in indicator])
    if info.tick == 0:
        storage[ZZZ] = []
        storage[ZZZZ] = []
    storage[ZZZ].append(indicator[-1])
    storage[ZZZ] = storage[ZZZ][-A:]
    ZZZZZ = sum(storage[ZZZ]) / len(storage[ZZZ])
    storage[ZZZZ].append(ZZZZZ)
    storage[ZZZZ] = storage[ZZZZ][-250:]
    return storage[ZZZZ]
但我得到:

文件“”,第259行,在文件“”中,第31行,在勾选文件“”中,第6行,在平滑属性中错误:“numpy.float64”对象没有属性“名称”

这是我当前的4个参数定义,平滑了4个不同的TA库移动平均值。这个相同的定义可用于许多其他聚合TA库指标。它应适用于任何聚合/刻度大小比,包括1:1

import talib

def smooth(indicator, aggregation, tick, label):

    import math
    A = int(math.ceil(aggregation/tick))
    ZZZ = 'ZZZ_%s' % label
    ZZZZ = 'ZZZZ_%s' % label
    if info.tick == 0:
        storage[ZZZ] = []
        storage[ZZZZ] = []
    storage[ZZZ].append(indicator[-1])
    storage[ZZZ] = storage[ZZZ][-A:]
    ZZZZZ = sum(storage[ZZZ]) / len(storage[ZZZ])
    storage[ZZZZ].append(ZZZZZ)
    storage[ZZZZ] = storage[ZZZZ][-250:]
    return storage[ZZZZ]

def tick():

    I               = info.interval
    period          = 10
    IN              = 3600
    instrument      = pairs.btc_usd
    C               = data(interval=IN)[instrument].warmup_period('close')

    MA1             = talib.MA(C, timeperiod=period, matype=0)  
    MA2             = talib.MA(C, timeperiod=2*period, matype=0)  
    MA3             = talib.MA(C, timeperiod=3*period, matype=0)  
    MA4             = talib.MA(C, timeperiod=4*period, matype=0)      

    MA1_now = MA1[-1]
    MA2_now = MA2[-1]
    MA3_now = MA3[-1]
    MA4_now = MA4[-1]    
    MA1_now_smooth = smooth(MA1, IN, I, 'MA1')[-1]
    MA2_now_smooth = smooth(MA2, IN, I, 'MA2')[-1]
    MA3_now_smooth = smooth(MA3, IN, I, 'MA3')[-1]
    MA4_now_smooth = smooth(MA4, IN, I, 'MA4')[-1]    

    plot('MA1', MA1_now)
    plot('MA2', MA2_now)  
    plot('MA3', MA3_now)
    plot('MA4', MA4_now)              
    plot('MA1_smooth', MA1_now_smooth)
    plot('MA2_smooth', MA2_now_smooth)    
    plot('MA3_smooth', MA3_now_smooth)
    plot('MA4_smooth', MA4_now_smooth)       


h/t james for collaboration

我是新来的,我已经尽了最大努力按照这里的规则写了一个“广受欢迎的问题”:如果你要否决我的帖子,至少让我知道原因。虽然我没有否决这个问题,但这是一个冗长的问题,就我所见,这两个问题是完全不同的。我唯一的问题是如何在定义中为持久变量创建自定义名称,并从第一个变量名输入。如果你理解我的问题,你能以一种更清晰的方式提出它吗?我也愿意为我的困境提供任何替代方案。。。这只是我能想出的解决问题的唯一办法。我写了一些“冗长”的东西,这样你就可以理解我的情况以及我为什么需要这个解决方案。我理解你为什么认为你需要这个解决方案,但是使用dict更可取。动态创建变量总是有风险的(如果您使用的名称被动态创建代码覆盖,会发生什么情况?)。我感谢你尽可能多地提供背景。
import talib

def smooth(indicator, aggregation, tick, label):

    import math
    A = int(math.ceil(aggregation/tick))
    ZZZ = 'ZZZ_%s' % label
    ZZZZ = 'ZZZZ_%s' % label
    if info.tick == 0:
        storage[ZZZ] = []
        storage[ZZZZ] = []
    storage[ZZZ].append(indicator[-1])
    storage[ZZZ] = storage[ZZZ][-A:]
    ZZZZZ = sum(storage[ZZZ]) / len(storage[ZZZ])
    storage[ZZZZ].append(ZZZZZ)
    storage[ZZZZ] = storage[ZZZZ][-250:]
    return storage[ZZZZ]

def tick():

    I               = info.interval
    period          = 10
    IN              = 3600
    instrument      = pairs.btc_usd
    C               = data(interval=IN)[instrument].warmup_period('close')

    MA1             = talib.MA(C, timeperiod=period, matype=0)  
    MA2             = talib.MA(C, timeperiod=2*period, matype=0)  
    MA3             = talib.MA(C, timeperiod=3*period, matype=0)  
    MA4             = talib.MA(C, timeperiod=4*period, matype=0)      

    MA1_now = MA1[-1]
    MA2_now = MA2[-1]
    MA3_now = MA3[-1]
    MA4_now = MA4[-1]    
    MA1_now_smooth = smooth(MA1, IN, I, 'MA1')[-1]
    MA2_now_smooth = smooth(MA2, IN, I, 'MA2')[-1]
    MA3_now_smooth = smooth(MA3, IN, I, 'MA3')[-1]
    MA4_now_smooth = smooth(MA4, IN, I, 'MA4')[-1]    

    plot('MA1', MA1_now)
    plot('MA2', MA2_now)  
    plot('MA3', MA3_now)
    plot('MA4', MA4_now)              
    plot('MA1_smooth', MA1_now_smooth)
    plot('MA2_smooth', MA2_now_smooth)    
    plot('MA3_smooth', MA3_now_smooth)
    plot('MA4_smooth', MA4_now_smooth)