From 77059e35b1b4c52a2caeb3d36f6d537da92be918 Mon Sep 17 00:00:00 2001 From: Tianyu Liu Date: Sat, 13 Sep 2025 17:43:27 +0200 Subject: [PATCH] add multi mas and adxatr --- adxatr.pine | 77 ++++++++++++++++++++++++++++++++++++ multi_mas.pine | 105 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 adxatr.pine create mode 100644 multi_mas.pine diff --git a/adxatr.pine b/adxatr.pine new file mode 100644 index 0000000..4e8f82c --- /dev/null +++ b/adxatr.pine @@ -0,0 +1,77 @@ +//@version=5 +indicator("ADX + ATR (on chart)", shorttitle="ADX·ATR", overlay=true) + +// inputs +adx_len = input.int(14, "ADX Length", minval=1) +atr_len = input.int(14, "ATR Length", minval=1) +adx_threshold = input.int(25, "ADX Threshold", minval=0) +show_adx = input.bool(true, "Show ADX") +show_di = input.bool(false, "Show +DI / -DI") +show_atr_on_price = input.bool(true, "Plot ATR on chart (scaled)") +atr_scale = input.float(1.0, "ATR Scale Factor", step=0.1) +map_range = input.int(20, "ADX map range (price units)", minval=1) + +adx_up_color = input.color(color.green, "ADX ≥ Threshold Color") +adx_dn_color = input.color(color.red, "ADX < Threshold Color") +atr_color = input.color(color.blue, "ATR Color") + +// ATR +atr = ta.atr(atr_len) + +// Manual DMI/ADX (Wilder smoothing) - compatible without ta.adx +up = high - high[1] +down = low[1] - low +plusDM = (up > down and up > 0) ? up : 0.0 +minusDM = (down > up and down > 0) ? down : 0.0 + +tr1 = high - low +tr2 = math.abs(high - close[1]) +tr3 = math.abs(low - close[1]) +tr = math.max(math.max(tr1, tr2), tr3) + +smTR = ta.rma(tr, adx_len) +smPlus = ta.rma(plusDM, adx_len) +smMinus = ta.rma(minusDM, adx_len) + +plus_di = smTR != 0.0 ? 100.0 * smPlus / smTR : 0.0 +minus_di = smTR != 0.0 ? 100.0 * smMinus / smTR : 0.0 + +dx = (plus_di + minus_di) != 0.0 ? 100.0 * math.abs(plus_di - minus_di) / (plus_di + minus_di) : 0.0 +adx = ta.rma(dx, adx_len) + +// mapping ADX (0..100) to a visible price range around close +adx_mapped = close - map_range + (adx / 100.0) * (2 * map_range) + +// plotting (must be global scope; use ternary to hide) +adx_color = adx >= adx_threshold ? adx_up_color : adx_dn_color + +// 只保留 ADX 背景(竖条) +bgcolor(show_adx and adx >= adx_threshold ? color.new(adx_up_color, 90) : na) + +// DI 显示选项:三角表示当前主导方向;交叉显示为上下标签 +show_di_markers = input.bool(true, "DI markers (+DI > -DI shows up triangle)") +show_di_cross = input.bool(true, "Show DI cross arrows") + +dominant_up = plus_di > minus_di +dominant_dn = plus_di < minus_di + +plotshape(show_di and show_di_markers ? dominant_up : na, title="+DI dominant", location=location.belowbar, style=shape.triangleup, size=size.tiny, color=color.new(color.green,0)) +plotshape(show_di and show_di_markers ? dominant_dn : na, title="-DI dominant", location=location.abovebar, style=shape.triangledown, size=size.tiny, color=color.new(color.red,0)) + +cross_up = ta.cross(plus_di, minus_di) and plus_di > minus_di +cross_dn = ta.cross(minus_di, plus_di) and minus_di > plus_di +plotshape(show_di and show_di_cross ? cross_up : na, title="DI cross up", location=location.belowbar, style=shape.labelup, text="+", color=color.new(color.green,0), size=size.tiny) +plotshape(show_di and show_di_cross ? cross_dn : na, title="DI cross down", location=location.abovebar, style=shape.labeldown, text="-", color=color.new(color.red,0), size=size.tiny) + +// DX 显示(可选):顶部小点,鼠标悬停可见数值 +show_dx = input.bool(false, "Show DX value (dot at top)") +plotchar(show_dx ? dx : na, title="DX (0-100)", char='•', location=location.top, color=color.new(color.orange,0), size=size.tiny) + +// ATR on price (scaled) -> show as band around price +band_scale = atr_scale +upper = close + atr * band_scale +lower = close - atr * band_scale + +p_upper = plot(show_atr_on_price ? upper : na, title="ATR Upper", color=color.new(atr_color, 0), linewidth=1) +p_lower = plot(show_atr_on_price ? lower : na, title="ATR Lower", color=color.new(atr_color, 0), linewidth=1) +fill(p_upper, p_lower, color=color.new(atr_color, 85)) \ No newline at end of file diff --git a/multi_mas.pine b/multi_mas.pine new file mode 100644 index 0000000..726d0cc --- /dev/null +++ b/multi_mas.pine @@ -0,0 +1,105 @@ +// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ + +//@version=5 +indicator(title='Multi Time Frame Moving Averages', shorttitle="MTF MAs", overlay=true) + +// ======= 🔹 P A R A M E T E R S 🔹 ======= + +src = input.source(close, title="Source") + +ma1_type = input.string(title="🟢 MA1 Type", defval="EMA", options=["SMA", "EMA", "WMA", "RMA", "HMA", "DEMA", "TEMA", "VWMA", "ALMA"]) +ma1_len = input.int(50, title="🟢 MA1 Length", minval=1) +res1 = input.timeframe(defval="", title="🟢 MA1 Time Frame") + +ma2_type = input.string(title="🔵 MA2 Type", defval="EMA", options=["SMA", "EMA", "WMA", "RMA", "HMA", "DEMA", "TEMA", "VWMA", "ALMA"]) +ma2_len = input.int(100, title="🔵 MA2 Length", minval=1) +res2 = input.timeframe(defval="", title="🔵 MA2 Time Frame") + +ma3_type = input.string(title="🟠 MA3 Type", defval="EMA", options=["SMA", "EMA", "WMA", "RMA", "HMA", "DEMA", "TEMA", "VWMA", "ALMA"]) +ma3_len = input.int(100, title="🟠 MA3 Length", minval=1) +res3 = input.timeframe(defval="", title="🟠 MA3 Time Frame") + +ma4_type = input.string(title="🟣 MA4 Type", defval="EMA", options=["SMA", "EMA", "WMA", "RMA", "HMA", "DEMA", "TEMA", "VWMA", "ALMA"]) +ma4_len = input.int(200, title="🟣 MA4 Length", minval=1) +res4 = input.timeframe(defval="", title="🟣 MA4 Time Frame") + +ma5_type = input.string(title="⚫ MA5 Type", defval="EMA", options=["SMA", "EMA", "WMA", "RMA", "HMA", "DEMA", "TEMA", "VWMA", "ALMA"]) +ma5_len = input.int(34, title="⚫ MA5 Length", minval=1) +res5 = input.timeframe(defval="", title="⚫ MA5 Time Frame") + + +// ======= 🔹 M O V I N G A V E R A G E S 🔹 ======= + +alma_fn(src_, len_, offset_, sigma_) => + // ALMA implementation (fallback) + m = offset_ * (len_ - 1) + s = len_ / sigma_ + norm = 0.0 + sum_ = 0.0 + for i = 0 to len_ - 1 + w = math.exp(-math.pow(i - m, 2) / (2 * s * s)) + norm += w + sum_ += src_[i] * w + sum_ / norm + +ma(type_, len_, src_) => + if type_ == "SMA" + ta.sma(src_, len_) + else if type_ == "EMA" + ta.ema(src_, len_) + else if type_ == "WMA" + ta.wma(src_, len_) + else if type_ == "RMA" + ta.rma(src_, len_) + else if type_ == "HMA" + ta.hma(src_, len_) + else if type_ == "DEMA" + e = ta.ema(src_, len_) + 2 * e - ta.ema(e, len_) + else if type_ == "TEMA" + e = ta.ema(src_, len_) + 3 * (e - ta.ema(e, len_)) + ta.ema(ta.ema(e, len_), len_) + else if type_ == "VWMA" + ta.vwma(src_, len_) + else // ALMA + alma_fn(src_, len_, 6.0, 0.85) + +// ======= 🔹 TIMEFRAME NORMALIZATION & REQUESTS 🔹 ======= + +tf1 = res1 == "" ? timeframe.period : res1 +tf2 = res2 == "" ? timeframe.period : res2 +tf3 = res3 == "" ? timeframe.period : res3 +tf4 = res4 == "" ? timeframe.period : res4 +tf5 = res5 == "" ? timeframe.period : res5 + +MA1 = request.security(syminfo.tickerid, tf1, ma(ma1_type, ma1_len, src), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off) +MA2 = request.security(syminfo.tickerid, tf2, ma(ma2_type, ma2_len, src), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off) +MA3 = request.security(syminfo.tickerid, tf3, ma(ma3_type, ma3_len, src), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off) +MA4 = request.security(syminfo.tickerid, tf4, ma(ma4_type, ma4_len, src), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off) +MA5 = request.security(syminfo.tickerid, tf5, ma(ma5_type, ma5_len, src), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off) + +// ======= 🔹 P L O T T I N G 🔹 ======= + +up1 = color.new(#58D68D, 0) +dn1 = color.new(#1D8348, 0) +up2 = color.new(#3498DB, 0) +dn2 = color.new(#21618C, 0) +up3 = color.new(#E74C3C, 0) +dn3 = color.new(#7B241C, 0) +up4 = color.new(#9B59B6, 0) +dn4 = color.new(#6C3483, 0) +up5 = color.new(#34495E, 0) +dn5 = color.new(#17202A, 0) + +plot_color1 = MA1 >= MA1[1] ? up1 : dn1 +plot_color2 = MA2 >= MA2[1] ? up2 : dn2 +plot_color3 = MA3 >= MA3[1] ? up3 : dn3 +plot_color4 = MA4 >= MA4[1] ? up4 : dn4 +plot_color5 = MA5 >= MA5[1] ? up5 : dn5 + +plot(MA1, color=plot_color1, linewidth=2, title="Moving Average 1") +plot(MA2, color=plot_color2, linewidth=2, title="Moving Average 2") +plot(MA3, color=plot_color3, linewidth=3, title="Moving Average 3") +plot(MA4, color=plot_color4, linewidth=2, title="Moving Average 4") +plot(MA5, color=plot_color5, linewidth=1, title="Moving Average 5") +