Connect TradingView alerts to Skippy System via webhooks. Monitor dips, trailing stops, and risk signals across all watchlist tiers.
Webhook alerts require a Pro+ or higher subscription. Visit tradingview.com/pricing to upgrade if needed.
Build a watchlist with these stocks organized by dip-monitoring tier:
Tier 1 — 5% PWR, POWL Tier 2 — 8% VICR, SNDK Tier 3 — 10% BE, AGX Quantum IONQ, QBTS, RGTI
Copy the Pine Script indicators below into TradingView's Pine Editor and apply them to each chart. See the Pine Script section below.
Create alert rules in TradingView that POST to our webhook URL with the expected JSON payload. See Webhook Configuration below for details.
Configure TradingView alerts to send POST requests to this endpoint (proxied via Cloudflare):
Local network fallback: http://192.168.0.234:8443/webhook/tradingview
Use these placeholders in your TradingView alert message (set alert type to "Webhook URL" with JSON content-type):
{
"symbol": "{{ticker}}",
"price": "{{close}}",
"condition": "dip_alert",
"tier": "1",
"message": "{{ticker}} dropped {{plot_0}}% from close"
}
Fields:
symbol — Ticker symbol (use {{ticker}} placeholder)price — Current close price (use {{close}})condition — Alert type: dip_alert, trailing_stop, risk_alerttier — Watchlist tier: 1, 2, 3, or quantummessage — Human-readable alert descriptionCopy each script into TradingView's Pine Editor (Pine v5). Apply to charts for the corresponding watchlist tier.
Monitors price drops from reference close. Triggers tiered alerts at 5% / 8% / 10% thresholds. Apply to all watchlist stocks — the script auto-detects the correct tier.
// ═══════════════════════════════════════════════════════════
// Skippy Dip Monitor — TradingView Pine Script v5
// Monitors price drops from reference and alerts by tier
// ═══════════════════════════════════════════════════════════
//@version=5
indicator("Skippy Dip Monitor", overlay=true, max_lines_count=1)
// ── Tier Configuration ──
// Tier 1 (5%): PWR, POWL | Tier 2 (8%): VICR, SNDL | Tier 3 (10%): BE, AGX
// Quantum: IONQ, QBTS, RGTI (uses 8% threshold)
tier1_syms = array.from("PWR", "POWL")
tier2_syms = array.from("VICR", "SNDK")
tier3_syms = array.from("BE", "AGX")
quantum_syms = array.from("IONQ", "QBTS", "RGTI")
sym = syminfo.ticker
tier_num = array.includes(tier1_syms, sym) ? 1 :
array.includes(tier2_syms, sym) ? 2 :
array.includes(quantum_syms, sym) ? 2 :
array.includes(tier3_syms, sym) ? 3 : 0
threshold_pct = tier_num == 1 ? 5.0 :
tier_num == 2 ? 8.0 :
tier_num == 3 ? 10.0 : 5.0
// ── Reference Price ──
// Use previous day's close as reference; update each new day
var float ref_price = na
if timeframe.change("D")
ref_price := close[1]
if na(ref_price)
ref_price := close[1]
// ── Drop Calculation ──
drop_pct = (close - ref_price) / ref_price * 100
// ── Alert Conditions ──
crossed_threshold = drop_pct <= -threshold_pct and drop_pct[1] > -threshold_pct
recovered = drop_pct > -threshold_pct * 0.5 and drop_pct[1] <= -threshold_pct * 0.5
// ── Visual ──
plot(ref_price, "Reference", color=color.new(color.gray, 50), linewidth=1, style=plot.style_stepline)
bgcolor(drop_pct <= -threshold_pct ? color.new(color.red, 85) : na, title="Dip Zone")
bgcolor(drop_pct > -threshold_pct * 0.5 and drop_pct[1] <= -threshold_pct * 0.5 ? color.new(color.green, 85) : na, title="Recovery")
// ── Alert Messages ──
alert_msg_dip = '{"symbol":"' + sym + '","price":"' + str.tostring(close) + '","condition":"dip_alert","tier":"' + str.tostring(tier_num) + '","message":"' + sym + ' dropped ' + str.tostring(math.abs(drop_pct), "#.#") + '% from close"}'
alert_msg_recover = '{"symbol":"' + sym + '","price":"' + str.tostring(close) + '","condition":"dip_recover","tier":"' + str.tostring(tier_num) + '","message":"' + sym + ' recovering — down ' + str.tostring(math.abs(drop_pct), "#.#") + '%"}'
alertcondition(crossed_threshold, title="Dip Alert", message=alert_msg_dip)
alertcondition(recovered, title="Recovery Alert", message=alert_msg_recover)
// ── Label ──
label.new(bar_index, low, sym + " T" + str.tostring(tier_num) + " | " + str.tostring(math.abs(drop_pct), "#.#") + "%",
color=drop_pct <= -threshold_pct ? color.red : color.green,
textcolor=color.white, style=label.style_label_up, size=size.small)
Tracks the highest close since entry and alerts when the price drops a configurable percentage from that high. Useful for protecting gains.
// ═══════════════════════════════════════════════════════════
// Skippy Trailing Stop — TradingView Pine Script v5
// Tracks highest close since entry; alerts on drop from high
// ═══════════════════════════════════════════════════════════
//@version=5
indicator("Skippy Trailing Stop", overlay=true)
// ── Inputs ──
trail_pct = input.float(5.0, "Trailing Stop %", minval=1.0, maxval=30.0, step=0.5, tooltip="Alert when price drops this % from highest close")
// ── Track Highest Close ──
var float highest_close = na
var float entry_price = na
// Initialize on first bar or reset
if na(highest_close) or na(entry_price)
entry_price := close
highest_close := close
// Update highest close
if close > highest_close
highest_close := close
// Reset if price recovers above entry
if close > entry_price * 1.02 and close < highest_close * 0.95
highest_close := close
// ── Calculation ──
drop_from_high = (close - highest_close) / highest_close * 100
// ── Conditions ──
hit_trailing = drop_from_high <= -trail_pct and drop_from_high[1] > -trail_pct
recovered_trail = drop_from_high > -trail_pct * 0.5 and drop_from_high[1] <= -trail_pct * 0.5
// ── Visual ──
plot(highest_close, "Highest Close", color=color.new(color.teal, 30), linewidth=2)
plot(highest_close * (1 - trail_pct/100), "Trailing Stop Level", color=color.new(color.red, 30), linewidth=1, style=plot.style_stepline)
bgcolor(hit_trailing ? color.new(color.red, 80) : na, title="Trailing Stop Hit")
// ── Alert Messages ──
sym = syminfo.ticker
alert_trail = '{"symbol":"' + sym + '","price":"' + str.tostring(close) + '","condition":"trailing_stop","tier":"","message":"' + sym + ' dropped ' + str.tostring(math.abs(drop_from_high), "#.#") + '% from high of ' + str.tostring(highest_close, "#.##") + '"}'
alert_trail_recover = '{"symbol":"' + sym + '","price":"' + str.tostring(close) + '","condition":"trailing_recover","tier":"","message":"' + sym + ' recovering from trailing stop — down ' + str.tostring(math.abs(drop_from_high), "#.#") + '% from high"}'
alertcondition(hit_trailing, title="Trailing Stop Hit", message=alert_trail)
alertcondition(recovered_trail, title="Trailing Stop Recovery", message=alert_trail_recover)
// ── Info Label ──
label.new(bar_index, highest_close, "High " + str.tostring(highest_close, "#.##"),
color=color.teal, textcolor=color.white, style=label.style_label_down, size=size.small)
Multi-signal risk indicator: RSI overbought/oversold, MA crossovers (golden cross / death cross), and volume spike detection.
// ═══════════════════════════════════════════════════════════
// Skippy Risk Monitor — TradingView Pine Script v5
// RSI extremes, MA crossovers, volume spikes
// ═══════════════════════════════════════════════════════════
//@version=5
indicator("Skippy Risk Monitor", overlay=false)
// ── Inputs ──
rsi_len = input.int(14, "RSI Length")
rsi_ob = input.int(70, "RSI Overbought")
rsi_os = input.int(30, "RSI Oversold")
ma_fast = input.int(50, "Fast MA Period")
ma_slow = input.int(200, "Slow MA Period")
vol_mult = input.float(2.0, "Volume Spike Multiplier", tooltip="Alert when volume exceeds this × the 20-day average")
// ── RSI ──
rsi_val = ta.rsi(close, rsi_len)
rsi_overbought = rsi_val >= rsi_ob and rsi_val[1] < rsi_ob
rsi_oversold = rsi_val <= rsi_os and rsi_val[1] > rsi_os
// ── MA Crossover ──
sma_fast = ta.sma(close, ma_fast)
sma_slow = ta.sma(close, ma_slow)
golden_cross = ta.crossover(sma_fast, sma_slow)
death_cross = ta.crossunder(sma_fast, sma_slow)
// ── Volume Spike ──
vol_avg = ta.sma(volume, 20)
vol_spike = volume >= vol_avg * vol_mult and volume[1] < vol_avg[1] * vol_mult
// ── Plots ──
plot(rsi_val, "RSI", color=color.new(#00d4aa, 0), linewidth=2)
hline(rsi_ob, "Overbought", color=color.new(color.red, 50), linestyle=hline.style_dashed)
hline(rsi_os, "Oversold", color=color.new(color.green, 50), linestyle=hline.style_dashed)
hline(50, "Midline", color=color.new(color.gray, 70), linestyle=hline.style_dotted)
bgcolor(rsi_overbought ? color.new(color.red, 85) : na, title="Overbought")
bgcolor(rsi_oversold ? color.new(color.green, 85) : na, title="Oversold")
bgcolor(vol_spike ? color.new(color.yellow, 88) : na, title="Volume Spike")
// ── Alert Messages ──
sym = syminfo.ticker
sym_tier = array.includes(array.from("PWR","POWL"), sym) ? "1" :
array.includes(array.from("VICR","SNDK"), sym) ? "2" :
array.includes(array.from("IONQ","QBTS","RGTI"), sym) ? "quantum" :
array.includes(array.from("BE","AGX"), sym) ? "3" : ""
alert_ob = '{"symbol":"' + sym + '","price":"' + str.tostring(close) + '","condition":"risk_alert","tier":"' + sym_tier + '","message":"' + sym + ' RSI overbought at ' + str.tostring(rsi_val, "#.#") + '"}'
alert_os = '{"symbol":"' + sym + '","price":"' + str.tostring(close) + '","condition":"risk_alert","tier":"' + sym_tier + '","message":"' + sym + ' RSI oversold at ' + str.tostring(rsi_val, "#.#") + '"}'
alert_gc = '{"symbol":"' + sym + '","price":"' + str.tostring(close) + '","condition":"risk_alert","tier":"' + sym_tier + '","message":"' + sym + ' Golden Cross — ' + str.tostring(ma_fast) + ' crossed above ' + str.tostring(ma_slow) + '"}'
alert_dc = '{"symbol":"' + sym + '","price":"' + str.tostring(close) + '","condition":"risk_alert","tier":"' + sym_tier + '","message":"' + sym + ' Death Cross — ' + str.tostring(ma_fast) + ' crossed below ' + str.tostring(ma_slow) + '"}'
alert_vs = '{"symbol":"' + sym + '","price":"' + str.tostring(close) + '","condition":"risk_alert","tier":"' + sym_tier + '","message":"' + sym + ' Volume spike — ' + str.tostring(volume/1000000, "#.##") + 'M vs ' + str.tostring(vol_avg/1000000, "#.##") + 'M avg"}'
alertcondition(rsi_overbought, title="RSI Overbought", message=alert_ob)
alertcondition(rsi_oversold, title="RSI Oversold", message=alert_os)
alertcondition(golden_cross, title="Golden Cross", message=alert_gc)
alertcondition(death_cross, title="Death Cross", message=alert_dc)
alertcondition(vol_spike, title="Volume Spike", message=alert_vs)
Embedded TradingView widget showing all watchlist stocks with real-time pricing.
Recent alerts received by the webhook server. Auto-refreshes every 30 seconds.