本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。
//@version=5
indicator("VWAP + EMA Retracement Indicator SwiftEdge", overlay=true)
// --- Brugerindstillinger for signalparametre ---
vwap_source = input.source(hlc3, title="VWAP Source", tooltip="Source data for VWAP calculation (e.g., hlc3, close).")
ema1_period = input.int(12, title="First EMA Period", minval=1, tooltip="Period for the first Exponential Moving Average.")
ema2_period = input.int(21, title="Second EMA Period", minval=1, tooltip="Period for the second Exponential Moving Average.")
retrace_window = input.int(5, title="Retracement Lookback Window", minval=1, maxval=20, tooltip="Number of past candles to check for retracement to EMA zone.")
atr_period = input.int(14, title="ATR Period", minval=1, tooltip="Period for Average True Range to calculate dynamic body size.")
body_size_mult = input.float(0.3, title="Minimum Body Size Multiplier", minval=0.0, step=0.1, tooltip="Multiplier of ATR to define minimum candle body size for signals.")
require_bullish_bearish = input.bool(true, title="Require Bullish/Bearish Candle", tooltip="If enabled, buy signals require a bullish candle and sell signals require a bearish candle.")
entire_candle = input.bool(true, title="Require Entire Candle Above/Below EMAs", tooltip="If enabled, the entire candle (low/high) must be above/below EMAs. If disabled, only close/open is checked.")
signal_cooldown = input.int(3, title="Signal Cooldown Period", minval=0, tooltip="Minimum number of candles between signals. Set to 0 to disable.")
// --- Brugerindstillinger for visuals ---
show_retrace_zone = input.bool(true, title="Show Retracement Zone", tooltip="If enabled, fills the zone between EMAs with a transparent color.")
use_gradient = input.bool(true, title="Use Gradient Colors", tooltip="If enabled, VWAP and EMA lines use dynamic gradient colors based on price position.")
show_confidence = input.bool(true, title="Show Signal Confidence", tooltip="If enabled, displays a confidence score for signals based on candle strength.")
color_scheme = input.string("Neon", title="Color Scheme", options=["Neon", "Light", "Dark"], tooltip="Choose the color scheme for visuals.")
// --- Farvevalg baseret på color_scheme ---
var color vwap_color = color.yellow
var color ema1_color = color.blue
var color ema2_color = color.red
var color zone_color = color.rgb(100, 100, 255, 80)
var color buy_color = color.green
var color sell_color = color.red
if color_scheme == "Neon"
vwap_color := color.rgb(255, 215, 0, 20) // Neon yellow
ema1_color := color.rgb(0, 255, 255, 20) // Neon cyan
ema2_color := color.rgb(255, 0, 255, 20) // Neon magenta
zone_color := color.rgb(100, 100, 255, 80) // Transparent blue
buy_color := color.rgb(0, 255, 150, 0) // Neon green
sell_color := color.rgb(255, 50, 100, 0) // Neon red
else if color_scheme == "Light"
vwap_color := color.yellow
ema1_color := color.blue
ema2_color := color.red
zone_color := color.rgb(200, 200, 255, 80) // Light transparent blue
buy_color := color.green
sell_color := color.red
else if color_scheme == "Dark"
vwap_color := color.rgb(200, 200, 100, 20) // Dim yellow
ema1_color := color.rgb(100, 100, 200, 20) // Dim blue
ema2_color := color.rgb(200, 100, 100, 20) // Dim red
zone_color := color.rgb(50, 50, 100, 80) // Dark transparent blue
buy_color := color.rgb(50, 200, 50, 0) // Dark green
sell_color := color.rgb(200, 50, 50, 0) // Dark red
// --- Indikatorer ---
vwap = ta.vwap(vwap_source)
ema1 = ta.ema(close, ema1_period)
ema2 = ta.ema(close, ema2_period)
atr = ta.atr(atr_period)
// --- Retracement zone ---
ema_high = math.max(ema1, ema2)
ema_low = math.min(ema1, ema2)
// --- Lysestage betingelser ---
bullish_candle = close > open
bearish_candle = close < open
min_body_size = atr * body_size_mult
large_body = math.abs(close - open) >= min_body_size
// --- Konfidensscore (0-100) baseret på kropsstørrelse og nærhed til VWAP ---
confidence_score = math.min(100, 50 + (math.abs(close - open) / atr) * 50 + (math.abs(close - vwap) / atr) * 25)
// --- Betingelser for køb (Long) ---
above_vwap = close > vwap
retrace_to_ema = false
for i = 1 to retrace_window
retrace_to_ema := retrace_to_ema or (close[i] <= ema_high[i] and close[i] >= ema_low[i])
above_ema = entire_candle ? low >= ema_high : (close > ema_high and open > ema_high)
long_condition = above_vwap and retrace_to_ema and above_ema and (not require_bullish_bearish or bullish_candle) and large_body
// --- Betingelser for salg (Short) ---
below_vwap = close < vwap
retrace_to_ema_short = false
for i = 1 to retrace_window
retrace_to_ema_short := retrace_to_ema_short or (close[i] >= ema_low[i] and close[i] <= ema_high[i])
below_ema = entire_candle ? high <= ema_low : (close < ema_low and open < ema_low)
short_condition = below_vwap and retrace_to_ema_short and below_ema and (not require_bullish_bearish or bearish_candle) and large_body
// --- Cooldown-mekanisme ---
var int last_signal_bar = 0
var bool allow_signal = true
if long_condition or short_condition
if bar_index >= last_signal_bar + signal_cooldown
allow_signal := true
last_signal_bar := bar_index
else
allow_signal := false
// --- Anvend cooldown på signaler ---
long_condition := long_condition and allow_signal
short_condition := short_condition and allow_signal
// --- Dynamiske gradientfarver ---
vwap_gradient = use_gradient ? (close > vwap ? color.new(vwap_color, 0) : color.new(vwap_color, 50)) : vwap_color
ema1_gradient = use_gradient ? (close > ema1 ? color.new(ema1_color, 0) : color.new(ema1_color, 50)) : ema1_color
ema2_gradient = use_gradient ? (close > ema2 ? color.new(ema2_color, 0) : color.new(ema2_color, 50)) : ema2_color
// --- Plot indikatorer ---
p1 = plot(ema1, color=ema1_gradient, title="First EMA", linewidth=2)
p2 = plot(ema2, color=ema2_gradient, title="Second EMA", linewidth=2)
plot(vwap, color=vwap_gradient, title="VWAP", linewidth=2)
// --- Plot retracement-zone ---
zone_display_color = show_retrace_zone ? zone_color : color.new(zone_color, 100)
fill(p1, p2, color=zone_display_color, title="Retracement Zone")
// --- Plot signaler med labels ---
if long_condition
label.new(bar_index, low, "Buy\nConf: " + str.tostring(math.round(confidence_score, 1)) + "%", color=buy_color, style=label.style_label_up, textcolor=color.white, size=size.small)
if short_condition
label.new(bar_index, high, "Sell\nConf: " + str.tostring(math.round(confidence_score, 1)) + "%", color=sell_color, style=label.style_label_down, textcolor=color.white, size=size.small)
// --- Fejlfinding: Plot retracement-zone ---
plotshape(retrace_to_ema, title="Retracement Zone (Long)", location=location.abovebar, color=color.blue, style=shape.circle, size=size.tiny)
plotshape(retrace_to_ema_short, title="Retracement Zone (Short)", location=location.belowbar, color=color.purple, style=shape.circle, size=size.tiny)