Thinkscript has a seemingly simple function to calculate an Adaptive EMA. However, it uses thinkscript's built-in CompoundValue function which is not available in Pine Script.
I'm having trouble recreating the CompoundValue function in Pine Script. It's supposedly recursive, but I see in another answer that it's really some sort of nested if statement.
The thinkscript code for AdaptiveEMA:
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));
I am trying to make this a function so I can have two AdaptiveEMAs on one chart and call them like this:
plot AEMAshort = adaptiveEMA(close, 25, 25);
plot AEMAlong = adaptiveEMA(close, 50, 50);
One of the things that's throwing me off with CompoundValue is the first parameter is the first parameter. From thinkscript reference:
Calculates a compound value according to following rule: if a bar number is greater than length then the visible data value is returned, otherwise the historical data value is returned. This function is used to initialize studies with recursion.
If the first parameter in CompoundValue in the AdapativeEMA script is 1, isn't barindex pretty much always greater than 1 except in the first minute of the day?
How can I go about breaking apart the CompoundValue function in Pine Script and using it here? Any help would be appreciated.
//@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)