Hi, any kind people can help combine two of this same TMA centered bands together as one indicator pinescript? Your kind help much appreciated. The code is converted to pinescript by author Brylator and the original MT4 code is by mladen. Huge thanks to both for this wonderful indicator.
Code: Select all
//@version=5
//author: mladen
//rebound arrows and TMA angle caution: Ale
//rewritten from MQL5 to Pine: Brylator
indicator("TMA Centered Bands Indicator", "TMA v0.42", overlay = true, max_lines_count = 500, max_labels_count = 500)
//INPUTS
var GRP1 = "Parameters"
HalfLength = input.int(12, "Centered TMA half period", group = GRP1)
string PriceType = input.string("Weighted", "Price to use", options = ["Close", "Open", "High", "Low", "Median", "Typical", "Weighted", "Average"], group = GRP1)
AtrPeriod = input.int(100, "Average true range period", group = GRP1)
AtrMultiplier = input.float(2, "Average true range multiplier", group = GRP1)
TMAangle = input.int(4, "Centered TMA angle caution", group = GRP1)
//VARIABLES
float tmac = na
float tmau = na
float tmad = na
var float pastTmac = na //from the previous candle
var float pastTmau = na
var float pastTmad = na
float tmau_temp = na //before looping
float tmac_temp = na
float tmad_temp = na
float point = syminfo.pointvalue //NEEDS MORE TESTS
bool last = false //checks if a loop is needed
var string alertSignal = "EMPTY" //needed for alarms to avoid repetition
//COLORS
var GRP2 = "Colors"
var color colorBuffer = na
color colorDOWN = input.color(color.new(color.red, 0), "Bear", inline = "5", group = GRP2)
color colorUP = input.color(color.new(color.green, 0), "Bull", inline = "5", group = GRP2)
color colorBands = input.color(color.new(#b2b5be, 0), "Bands", inline = "5", group = GRP2)
bool cautionInput = input.bool(true, "Caution label", inline = "6", group = GRP2)
//ALERTS
var GRP3 = "Alerts (Needs to create alert manually after every change)"
bool crossUpInput = input.bool(false, "Crossing up", inline = "7", group = GRP3)
bool crossDownInput = input.bool(false, "Crossing down", inline = "7", group = GRP3)
bool comingBackInput = input.bool(false, "Coming back", inline = "7", group = GRP3)
bool onArrowDownInput = input.bool(false, "On arrow down", inline = "8", group = GRP3)
bool onArrowUpInput = input.bool(false, "On arrow up", inline = "8", group = GRP3)
//CLEAR LINES
a_allLines = line.all
if array.size(a_allLines) > 0
for p = 0 to array.size(a_allLines) - 1
line.delete(array.get(a_allLines, p))
//GET PRICE
Price(x) =>
float price = switch PriceType
"Close" => close[x]
"Open" => open[x]
"High" => high[x]
"Low" => low[x]
"Median" => (high[x] + low[x]) / 2
"Typical" => (high[x] + low[x] + close[x]) / 3
"Weighted" => (high[x] + low[x] + close[x] + close[x]) / 4
"Average" => (high[x] + low[x] + close[x] + open[x])/ 4
price
//MAIN
for i = HalfLength to 0
//ATR
atr = 0.0
for j = 0 to AtrPeriod - 1
atr += math.max(high[i + j + 10], close[i + j + 11]) - math.min(low[i + j + 10], close[i + j + 11])
atr /= AtrPeriod
//BANDS
sum = (HalfLength + 1) * Price(i)
sumw = (HalfLength + 1)
k = HalfLength
for j = 1 to HalfLength
sum += k * Price(i + j)
sumw += k
if (j <= i)
sum += k * Price(i - j)
sumw += k
k -= 1
tmac := sum/sumw
tmau := tmac+AtrMultiplier*atr
tmad := tmac-AtrMultiplier*atr
//ALERTS
if i == 0 //Only on a real candle
if (high > tmau and alertSignal != "UP") //crossing up band
if crossUpInput == true //checks if activated
alert("Crossing up Band") //calling alert
alertSignal := "UP" //to avoid repeating
else if (low < tmad and alertSignal != "DOWN") //crossing down band
if crossDownInput == true
alert("Crossing down Band")
alertSignal := "DOWN"
else if (alertSignal == "DOWN" and high >= tmad and alertSignal != "EMPTY") //back from the down band
if comingBackInput == true
alert("Coming back")
alertSignal := "EMPTY"
else if (alertSignal == "UP" and low <= tmau and alertSignal != "EMPTY") //back from the up band
if comingBackInput == true
alert("Coming back")
alertSignal := "EMPTY"
//CHANGE TREND COLOR
if pastTmac != 0.0
if tmac > pastTmac
colorBuffer := colorUP
if tmac < pastTmac
colorBuffer := colorDOWN
//SIGNALS
reboundD = 0.0
reboundU = 0.0
caution = 0.0
if pastTmac != 0.0
if (high[i + 1] > pastTmau and close[i + 1] > open[i + 1] and close[i] < open[i])
reboundD := high[i] + AtrMultiplier * atr / 2
if (tmac - pastTmac > TMAangle * point)
caution := reboundD + 10 * point
if (low[i + 1] < pastTmad and close[i + 1] < open[i + 1] and close[i] > open[i])
reboundU := low[i] - AtrMultiplier * atr / 2
if (pastTmac - tmac > TMAangle * point)
caution := reboundU - 10 * point
//LAST REAL
if barstate.islast and i == HalfLength
last := true
tmau_temp := tmau
tmac_temp := tmac
tmad_temp := tmad
//DRAW HANDICAPPED BANDS
if barstate.islast and i < HalfLength
line.new(bar_index - (i + 1), pastTmau, bar_index - (i), tmau, width = 2, style = line.style_dotted, color = colorBands)
line.new(bar_index - (i + 1), pastTmac, bar_index - (i), tmac, width = 2, style = line.style_dotted, color = colorBuffer)
line.new(bar_index - (i + 1), pastTmad, bar_index - (i), tmad, width = 2, style = line.style_dotted, color = colorBands)
//DRAW SIGNALS
if reboundD != 0
//label.new(bar_index - (i), reboundD, color = colorDOWN, style = label.style_triangledown, size = size.tiny, textcolor = na)
label.new(bar_index - (i), reboundD, '▼', color = na, textcolor = colorDOWN, textalign= text.align_center)
if i == 0 and onArrowDownInput == true //alert
alert("Down arrow")
if caution != 0 and cautionInput == true
label.new(bar_index - (i), reboundD, color = colorUP, style = label.style_xcross, size = size.tiny, textcolor = na)
if reboundU != 0
//label.new(bar_index - (i), reboundU, color = colorUP, style = label.style_triangleup, size = size.tiny, textcolor = na)
label.new(bar_index - (i), reboundU, '▲', color = na, textcolor = colorUP, textalign = text.align_center)
if i == 0 and onArrowUpInput == true //alert
alert("UP arrow")
if caution != 0 and cautionInput == true
label.new(bar_index - (i), reboundU, color = colorDOWN, style = label.style_xcross, size = size.tiny, textcolor = na)
//SAVE HISTORY
pastTmac := tmac
pastTmau := tmau
pastTmad := tmad
//LOOP IS ONLY FOR HANDICAPPED
if barstate.islast != true
break
//DRAW REAL BANDS
plot(last ? tmau_temp : tmau, title = "TMA Up", color = colorBands, linewidth=1, style = plot.style_line, offset = -HalfLength)
plot(last ? tmac_temp : tmac, title = "TMA Mid", color = colorBuffer, linewidth=1, style = plot.style_line, offset = -HalfLength)
plot(last ? tmad_temp : tmad, title = "TMA Down", color = colorBands, linewidth=1, style = plot.style_line, offset = -HalfLength)