重命名定义中的持久对象(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)