0

Thinkscript 有一个看似简单的函数来计算自适应 EMA。但是,它使用了 thinkscript 的内置 CompoundValue 函数,而 Pine Script 中没有。

我在 Pine Script 中重新创建 CompoundValue 函数时遇到问题。它应该是递归的,但我在另一个答案中看到它实际上是某种嵌套的 if 语句。

AdaptiveEMA 的 thinkscript 代码:

input price = close;
input length = 10;
input highLowLength = 10;

def multiplier1 = 2 / (length + 1);
def multiplier2 = AbsValue((close - Lowest(low, highLowLength)) - (Highest(high, highLowLength) - close)) / (Highest(high, highLowLength) - Lowest(low, highLowLength));
def alpha = multiplier1 * (1 + multiplier2);
def ma = CompoundValue(1, ma[1] + alpha * (price - ma[1]), Average(price, length));

plot AEMA = ma;
AEMA.SetDefaultColor(GetColor(1));

我试图使它成为一个函数,这样我就可以在一个图表上拥有两个 AdaptiveEMA,并像这样调用它们:

plot AEMAshort = adaptiveEMA(close, 25, 25);
plot AEMAlong = adaptiveEMA(close, 50, 50);

CompoundValue 让我失望的一件事是第一个参数是第一个参数。从thinkscript参考:

根据以下规则计算复合值:如果柱数大于长度,则返回可见数据值,否则返回历史数据值。此函数用于使用递归初始化研究。

如果 AdapativeEMA 脚本中 CompoundValue 中的第一个参数是 1,那么除了一天的第一分钟之外,barindex 是否几乎总是大于 1?

如何分解 Pine Script 中的 CompoundValue 函数并在此处使用它?任何帮助,将不胜感激。

4

1 回答 1

0
//@version=5
indicator("adaptive ema", overlay = true)

price1 = input.source(close, title = "price 1")
price2 = input.source(close, title = "price 2")

length1 = input.int(10, title = "length 1")
highLowLength1 = input.int(10, title = "highlow length 1")

length2 = input.int(20, title = "length 2")
highLowLength2 = input.int(20, title = "highlow length 2")

    
f_adaptiveEMA(_price, _length, _highLowLength) =>
    _multiplier1 = 2 / (_length + 1)
    _multiplier2 = math.abs((_price - ta.lowest(low, _highLowLength)) - (ta.highest(high, _highLowLength) - _price)) / (ta.highest(high, _highLowLength) - ta.lowest(low, _highLowLength))
    _alpha = _multiplier1 * (1 + _multiplier2)
    float _ma = na
    _ma := _price * _alpha + (1 - _alpha) * nz(_ma[1], _price)
    _ma
    
    
ma1 = f_adaptiveEMA(price1, length1, highLowLength1)
ma2 = f_adaptiveEMA(price2, length2, highLowLength2)    

plot(ma1, color = color.yellow)
plot(ma2, color = color.red)
于 2021-12-30T08:54:14.583 回答