mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-07-31 10:57:43 +00:00
59 lines
2.2 KiB
Plaintext
59 lines
2.2 KiB
Plaintext
// Licensed under the Apache License, Version 2.0
|
|
// © mihakralj
|
|
//@version=6
|
|
indicator("TTM Trend", "TTM_TREND", overlay=true)
|
|
|
|
//@function Calculates TTM Trend using 6-period moving average with color-coded trend
|
|
//@param source Series to calculate TTM Trend from
|
|
//@param period Lookback period for moving average
|
|
//@returns Tuple [ttm_line, trend, strength] where trend is -1/0/1 and strength is percentage change
|
|
ttm_trend(series float source, simple int period = 6) =>
|
|
if period <= 0
|
|
runtime.error("Period must be greater than 0")
|
|
|
|
float alpha = 2.0 / (period + 1)
|
|
var float ema = source
|
|
var float ema_prev = source
|
|
|
|
ema := alpha * (source - ema) + ema
|
|
|
|
float trend = math.sign(ema - ema_prev)
|
|
float strength = math.abs(ema - ema_prev) / math.max(ema_prev, 1e-10) * 100
|
|
|
|
ema_prev := ema
|
|
|
|
[ema, trend, strength]
|
|
|
|
// ---------- Main loop ----------
|
|
|
|
// Inputs
|
|
i_period = input.int(6, "Period", minval=1)
|
|
i_source = input.source(hlc3, "Source")
|
|
i_show_strength = input.bool(true, "Show Trend Strength %")
|
|
|
|
// Calculation
|
|
[ttm_line, trend, strength] = ttm_trend(i_source, i_period)
|
|
|
|
// Colors
|
|
color up_color = color.new(color.green, 0)
|
|
color down_color = color.new(color.red, 0)
|
|
color neutral_color = color.new(color.gray, 50)
|
|
color line_color = trend > 0 ? up_color : trend < 0 ? down_color : neutral_color
|
|
|
|
// Plot
|
|
plot(ttm_line, "TTM Trend", color=line_color, linewidth=3, style=plot.style_line)
|
|
|
|
// Strength band (optional)
|
|
float strength_multiplier = 0.01
|
|
float upper_band = i_show_strength ? ttm_line + (ttm_line * strength * strength_multiplier) : na
|
|
float lower_band = i_show_strength ? ttm_line - (ttm_line * strength * strength_multiplier) : na
|
|
|
|
p1 = plot(upper_band, "Upper Strength", color=color.new(color.blue, 80), linewidth=1)
|
|
p2 = plot(lower_band, "Lower Strength", color=color.new(color.blue, 80), linewidth=1)
|
|
fill(p1, p2, color=color.new(color.blue, 90), title="Strength Band")
|
|
|
|
// Optional: Plot trend change signals
|
|
bool trend_change = trend != nz(trend[1], 0) and bar_index > 0
|
|
plotshape(trend_change and trend > 0, "Up", shape.triangleup, location.belowbar, color=up_color, size=size.tiny)
|
|
plotshape(trend_change and trend < 0, "Down", shape.triangledown, location.abovebar, color=down_color, size=size.tiny)
|