Real-time Alert Integration

TradingView Integration

Connect TradingView alerts to Skippy System via webhooks. Monitor dips, trailing stops, and risk signals across all watchlist tiers.

System Status
Connection Status
Webhook Server — Checking...
Alerts — Loading...
Getting Started
Setup Guide
  1. Create a TradingView Pro+ Account

    Webhook alerts require a Pro+ or higher subscription. Visit tradingview.com/pricing to upgrade if needed.

  2. Create a Watchlist Matching Our Tiers

    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

  3. Add Pine Script Indicators

    Copy the Pine Script indicators below into TradingView's Pine Editor and apply them to each chart. See the Pine Script section below.

  4. Configure Webhook Alerts

    Create alert rules in TradingView that POST to our webhook URL with the expected JSON payload. See Webhook Configuration below for details.


Integration
Webhook Configuration

Webhook URL

Configure TradingView alerts to send POST requests to this endpoint (proxied via Cloudflare):

https://skippy.iomtt.live/webhook/tradingview

Local network fallback: http://192.168.0.234:8443/webhook/tradingview

Expected JSON Payload

Use these placeholders in your TradingView alert message (set alert type to "Webhook URL" with JSON content-type):

JSON Payload Template
{
  "symbol": "{{ticker}}",
  "price": "{{close}}",
  "condition": "dip_alert",
  "tier": "1",
  "message": "{{ticker}} dropped {{plot_0}}% from close"
}

Fields:


Indicators
Pine Script Code

Copy each script into TradingView's Pine Editor (Pine v5). Apply to charts for the corresponding watchlist tier.

Skippy Dip Monitor

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.

Pine Script v5 — dip_monitor.pine
// ═══════════════════════════════════════════════════════════
// 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)

Skippy Trailing Stop

Tracks the highest close since entry and alerts when the price drops a configurable percentage from that high. Useful for protecting gains.

Pine Script v5 — trailing_stop.pine
// ═══════════════════════════════════════════════════════════
// 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)

Skippy Risk Monitor

Multi-signal risk indicator: RSI overbought/oversold, MA crossovers (golden cross / death cross), and volume spike detection.

Pine Script v5 — risk_monitor.pine
// ═══════════════════════════════════════════════════════════
// 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)

Watchlist
Live Charts

Embedded TradingView widget showing all watchlist stocks with real-time pricing.


Activity
Alert Log

Recent alerts received by the webhook server. Auto-refreshes every 30 seconds.

Loading alerts...