【问题标题】:Rename a persistent object within a definition (python)重命名定义中的持久对象(python)
【发布时间】:2023-03-13 08:20:01
【问题描述】:

小问题:

def smooth(indicator, aggregation, tick):
    storage.ZZZ = []
    storage.ZZZZ = []

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

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

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

smooth(MA, IN, I)[-1]

应该创建:

storage.ZZZ_MA
storage.ZZZZ_MA

但是

smooth(MA2, IN, I)[-1]

应该创建:

storage.ZZZ_MA2
storage.ZZZZ_MA2

深入问题:

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

我必须这样做,因为当“聚合”蜡烛从当前倒数时,我得到“摇摆不定”的输出;如果您需要背景,可以在这里阅读更多相关信息:https://discuss.tradewave.net/t/aggregating-candles-some-thoughts

当平滑单个指标“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”平滑

我希望能够通过许多不同的“指标”数组输入来重用这个定义,并为每个实例使用附加到定义中使用的持久对象名称的指标数组的名称。例如:

storage.ZZZ_MA3
storage.ZZZ_MA4
etc.

在下面的实例中,info.interval 是我的 15 分钟(900 秒)的刻度大小,我的聚合是 1 小时(3600 秒)

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

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

在第二张图片中,我正在寻找两条“平滑”线,一条位于红色曲线中间,另一条曲线位于蓝色曲线中间。相反,我得到了两条相同的摆动线(紫色和橙色),它们分开了差异。我明白为什么,但我不知道如何解决。

1) 请告诉我怎么做

2) 请告诉我我想做的是“调用”,并指出我可以了解更多信息的一些标签/帖子。

感谢您的帮助!

唱片

【问题讨论】:

  • 我是新来的,我已经尽我所能按照这里的规则写了一个“广受欢迎的问题”:stackoverflow.com/help/on-topic 如果你要否决我的帖子,至少让我知道为什么。
  • 虽然我没有否决这个问题,但它是冗长的,据我所知,将两个完全不同的问题混为一谈。
  • 我唯一的问题是如何使用第一个变量名称的输入为定义中的持久变量创建自定义名称。如果您理解我的问题,您能否以更清晰的方式提出?
  • 我也愿意为我的困境提供任何替代解决方案......这只是我能想出解决问题的唯一方法。我包括了“冗长”的东西,这样你就可以了解我的情况以及我为什么需要这个解决方案。
  • 我理解你为什么认为你需要这个解决方案,但是使用字典更可取。动态创建变量总是存在风险(如果您使用的名称被动态创建代码覆盖会怎样?)。感谢您尝试提供尽可能多的背景信息。

标签: python arrays definition persistent


【解决方案1】:

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

虽然我喜欢这个解决方案,因为它可以满足我的一切需求。我想消除多余的“标签”输入。我有什么方法可以引用我的输入参数/参数“indicator”的 name 而不是它的 object 以便我可以返回到我原来的 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 行,平滑 AttributeError: 'numpy.float64' object has no attribute 'name'

这是我当前的 4 个参数定义,用于平滑 4 个不同的 TA-lib 移动平均线。这个相同的定义可以与许多其他聚合的 TA-lib 指标一起使用。它应该适用于任何聚合/刻度大小比,包括 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 合作

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 2012-10-05
      相关资源
      最近更新 更多