📚 AllenR 課程05_第五堂課L05_TradingView指標規格

L05 AllenR 買賣點 — TradingView Pine Script 指標規格書

目的:將 L05 第五堂課規則轉為可執行的技術指標 目標平台:TradingView Pine Script v5 彙整日期:2026-04-21


0. 可編碼性分析(先做取捨)

✅ 可以完全編碼(純價量邏輯)

⚠️ 部分可編碼(需要額外資料)

❌ 無法用 Pine 編碼(需基本面 / 消息面)

本指標實作範圍:上述 ✅ + ⚠️ 部分。


1. 輸入參數(inputs)

//@version=5
indicator("L05 AllenR 買賣點系統", overlay=true, max_labels_count=500, max_lines_count=500)

// ═════════════════ 均線參數 ═════════════════
len200 = input.int(200, "200DMA 長度", group="均線")
len150 = input.int(150, "150DMA 長度", group="均線")
len55  = input.int(55,  "季線 55DMA",  group="均線")
len21  = input.int(21,  "月線 21DMA",  group="均線")
len8   = input.int(8,   "週線 8DMA",   group="均線")

// ═════════════════ 成交量參數 ═════════════════
volAvgLen       = input.int(20,   "量均線長度",     group="成交量")
climaxVolMult   = input.float(2.0,"極限大量倍數",   group="成交量", step=0.1)
dryVolMult      = input.float(0.5,"凹洞量倍數",     group="成交量", step=0.05)
breakoutVolMult = input.float(1.5,"突破量倍數",     group="成交量", step=0.1)

// ═════════════════ 乖離 / 差離 ═════════════════
deviationWarn   = input.float(50.0, "乖離警戒 %", group="風險")
deviationDanger = input.float(80.0, "乖離泡沫 %", group="風險")
mmConvergePct   = input.float(2.0,  "均線糾結容忍 %", group="型態", step=0.1)

// ═════════════════ VCP 參數 ═════════════════
pivotLookback   = input.int(10,   "Pivot 偵測窗口", group="VCP")
vcpContractMin  = input.int(2,    "最少收縮次數 (T)", group="VCP")
vcpLastTMax     = input.float(5.0,"最後一 T 最大跌幅 %", group="VCP")

// ═════════════════ 停損參數 ═════════════════
stopMax         = input.float(10.0, "停損上限 %",   group="停損")
trailMax        = input.float(20.0, "移動停損上限 %", group="停損")

// ═════════════════ 顯示控制 ═════════════════
showEntry = input.bool(true, "顯示進場訊號", group="顯示")
showExit  = input.bool(true, "顯示出場訊號", group="顯示")
showMA    = input.bool(true, "顯示均線",     group="顯示")

2. 基礎計算(common calculations)

// 均線
ma200 = ta.sma(close, len200)
ma150 = ta.sma(close, len150)
ma55  = ta.sma(close, len55)
ma21  = ta.sma(close, len21)
ma8   = ta.sma(close, len8)

// 200DMA 翻揚向上(過去 10 根有抬升)
ma200Rising = ma200 > ma200[10]
ma150Rising = ma150 > ma150[10]

// 量均線
volAvg = ta.sma(volume, volAvgLen)

// 季線乖離率 %
deviation55 = (close - ma55) / ma55 * 100

// 均線差離(最大值 - 最小值 vs 股價)%
maMax = math.max(ma8, math.max(ma21, ma55))
maMin = math.min(ma8, math.min(ma21, ma55))
maSpread = (maMax - maMin) / close * 100

🟢 進場規則(Entry Indicators)

E-01|200DMA 前置條件(鐵律過濾器)

定義:股價 > 翻揚向上的 200DMA

cond_above200 = close > ma200 and ma200Rising

用途:作為所有其他進場訊號的必要條件,不過關的訊號全部忽略。


E-02|150DMA 輔助條件

定義:股價 > 150DMA(96% 大漲股都符合)

cond_above150 = close > ma150

E-03|凹洞量 + 小紅 K(買點 1:射子彈)

定義

  1. 當日成交量 < dryVolMult × volAvg(極致低量)
  2. 當日為小紅 K(收盤 > 開盤,且實體 < 當日 ATR × 0.5)
atr14 = ta.atr(14)
isSmallBody = math.abs(close - open) < atr14 * 0.5
isRedK      = close > open
pivotVolumeDry = volume < volAvg * dryVolMult

sig_pivotVolume = cond_above200 and pivotVolumeDry and isSmallBody and isRedK

停損建議stopPrice = low(凹洞量當日最低)


E-04|帶量突破(買點 2:射爆彈,勝率最高)

定義

  1. 股價突破過去 N 根 K 的最高點
  2. 當日成交量 > breakoutVolMult × volAvg
breakoutLookback = input.int(20, "突破回看期", group="型態")
recentHigh = ta.highest(high[1], breakoutLookback)

sig_breakout = cond_above200 and close > recentHigh and volume > volAvg * breakoutVolMult

停損建議stopPrice = low 或突破前一根 K 的 low(取較近者),≤ 10%。


E-05|帶量三盤過(買點 3:回測成功)

定義

  1. 第 3 根 K 收盤價 > 前 2 根 K 最高價
  2. 第 3 根 K 成交量 > 前 2 根 K 最高成交量
  3. 前 1~2 根為量縮回測(量 < 前期均量)
prev2High = math.max(high[1], high[2])
prev2Vol  = math.max(volume[1], volume[2])
isPullback = volume[1] < volAvg and volume[2] < volAvg

sig_threeBarUp = cond_above200 and close > prev2High and volume > prev2Vol and isPullback

停損建議:頸線 / 前低。


E-06|三均線糾結(均線真空買點)

定義:8、21、55 MA 差距 < mmConvergePct %

sig_maConverge = cond_above200 and maSpread < mmConvergePct

用法:糾結後若出現 E-04 突破 → 勝率極高。


E-07|雙聯創新高

定義:連續 N 天內兩次創高

newHighLookback = input.int(60, "新高回看期", group="型態")
isNewHigh  = high == ta.highest(high, newHighLookback)
isNewHighPrev = ta.barssince(isNewHigh[1]) <= 10  // 10 根內曾有新高

sig_doubleHigh = cond_above200 and isNewHigh and isNewHighPrev

E-08|空多轉折第一根長紅 K

定義

  1. 過去 N 根 K 處於下跌趨勢(close < ma200 或 ma200 未翻揚)
  2. 當日為長紅 K(實體 > ATR × 1.5)
  3. 當日量能爆發(> volAvg × 1.5)
  4. 收盤一次站上 200DMA
wasBelowMA200 = close[1] < ma200[1] or close[5] < ma200[5]
isLongRedK    = close > open and (close - open) > atr14 * 1.5
bigVolume     = volume > volAvg * 1.5
justAboveMA   = close > ma200 and close[1] < ma200[1]

sig_trendReversal = wasBelowMA200 and isLongRedK and bigVolume and justAboveMA

E-09|負乖離反轉

定義:季線負乖離 > 50% 後,當日股價未再創新低

wasDeviation50 = ta.lowest(deviation55, 20) < -deviationWarn
notNewLow      = low > ta.lowest(low[1], 5)

sig_negDevReversal = wasDeviation50 and notNewLow and close > open

E-10|VCP 近似偵測(簡化版)

完整 VCP 偵測需要 pivot 判斷 + 跌幅遞減 + 最後 T < 5%,Pine 實作較複雜。簡化版如下:

// 偵測 pivot highs & lows
ph = ta.pivothigh(high, pivotLookback, pivotLookback)
pl = ta.pivotlow(low, pivotLookback, pivotLookback)

var float[] pivotHighs = array.new_float()
var float[] pivotLows  = array.new_float()

if not na(ph)
    array.push(pivotHighs, ph)
    if array.size(pivotHighs) > 5
        array.shift(pivotHighs)

if not na(pl)
    array.push(pivotLows, pl)
    if array.size(pivotLows) > 5
        array.shift(pivotLows)

// VCP 條件:
// 1. 最近 2 個高點接近(差 < 3%)→ 水平上緣
// 2. 最近 2 個低點遞增 → 上升下緣
// 3. 最近一次收縮幅度 < 前一次的一半
checkVCP() =>
    if array.size(pivotHighs) >= 2 and array.size(pivotLows) >= 2
        h1 = array.get(pivotHighs, array.size(pivotHighs)-1)
        h2 = array.get(pivotHighs, array.size(pivotHighs)-2)
        l1 = array.get(pivotLows,  array.size(pivotLows)-1)
        l2 = array.get(pivotLows,  array.size(pivotLows)-2)

        horizontalUpper = math.abs(h1 - h2) / h2 < 0.03
        risingLower     = l1 > l2
        drop1 = (h1 - l1) / h1 * 100
        drop2 = (h2 - l2) / h2 * 100
        contractionHalved = drop1 < drop2 * 0.6
        lastTSmall        = drop1 < vcpLastTMax

        horizontalUpper and risingLower and contractionHalved and lastTSmall
    else
        false

isVCP = checkVCP()
sig_vcp = cond_above200 and isVCP

🔴 出場規則(Exit Indicators)

X-01|極限大量 + 隔日量縮不過高

定義

  1. 前一日為極限大量(vol > volAvg × climaxVolMult)
  2. 當日量縮(vol < 前日量 × 0.7)
  3. 當日未創新高
climaxYday    = volume[1] > volAvg[1] * climaxVolMult
shrinkToday   = volume < volume[1] * 0.7
noNewHigh     = high < high[1]

sig_climaxReversal = climaxYday and shrinkToday and noNewHigh

動作:減 25~50%。


X-02|乖離 > 50% + 三盤破

定義

  1. 季線正乖離 > 50%
  2. 當日收盤 < 前 2 日最低(三盤破)
prev2Low  = math.min(low[1], low[2])
threeBarDown = close < prev2Low

sig_dev50Break = deviation55 > deviationWarn and threeBarDown

動作:減 25%(不看量)。


X-03|乖離 > 80% + 三盤破

sig_dev80Break = deviation55 > deviationDanger and threeBarDown

動作:減 50%(不看量)。


X-04|量縮價漲後接量增價跌(菱形頂)

定義

  1. 前 N 根內出現量縮價漲(量 < volAvg、close 創高)
  2. 當日為量增價跌(量 > volAvg × 1.2、close < close[1])
volShrinkRise_lookback = 5
volShrinkRise = false
for i = 1 to volShrinkRise_lookback
    if volume[i] < volAvg[i] and close[i] > close[i+1] and high[i] == ta.highest(high, 10)[i]
        volShrinkRise := true

volExpandDrop = volume > volAvg * 1.2 and close < close[1] and close < open

sig_diamondTop = volShrinkRise and volExpandDrop

動作:減 75% 或清倉。


X-05|大量黑 K(最危險)

定義

  1. 當日為黑 K(close < open)
  2. 實體 > ATR × 1.2
  3. 量 > volAvg × 1.5
isBlackK     = close < open
bigBlackBody = (open - close) > atr14 * 1.2
heavyVol     = volume > volAvg * 1.5

sig_bigBlackK = isBlackK and bigBlackBody and heavyVol

動作直接清倉(預掛賣單)。


X-06|多頭頂部(沒創高又被壓下)

定義

  1. 近 M 根內股價接近前高但未破(< 前高 × 0.98)
  2. 當日收盤被打到前 2 根低點以下
topLookback = 10
recentTop    = ta.highest(high, topLookback)
failedToBreakHigh = high < recentTop * 0.98 and high < recentTop
pressedDown       = close < prev2Low

sig_doubleTop = failedToBreakHigh and pressedDown

動作:第二根 K 直接全出。


X-07|跌破頸線(VCP 回測進場的停損)

定義:股價跌破 VCP 的最近一個 pivot low(需持倉期間追蹤頸線)

var float neckline = na
if sig_breakout or sig_threeBarUp
    neckline := pl  // 以最近一個 pivot low 為頸線

sig_breakNeckline = not na(neckline) and close < neckline

動作:立即全出。


X-08|跌破 200DMA

定義:股價跌破 200DMA

sig_break200 = ta.crossunder(close, ma200)

動作:清倉(趨勢已轉)。


X-09|三盤破(純量價訊號)

定義:連續 3 根 K 收盤遞減,且第 3 根破前 2 根最低

sig_threeBarDown = close < close[1] and close[1] < close[2] and close < prev2Low

動作:參考減碼(視乖離環境決定幅度)。


2️⃣ 組合訊號(Composite Signals)

進場綜合分數(0~10 分)

entryScore = 0
entryScore := entryScore + (cond_above200      ? 2 : 0)  // 必要條件
entryScore := entryScore + (sig_pivotVolume     ? 1 : 0)
entryScore := entryScore + (sig_breakout        ? 3 : 0)  // 勝率最高
entryScore := entryScore + (sig_threeBarUp      ? 2 : 0)
entryScore := entryScore + (sig_maConverge      ? 1 : 0)
entryScore := entryScore + (sig_vcp             ? 2 : 0)
entryScore := entryScore + (sig_trendReversal   ? 2 : 0)
entryScore := entryScore + (sig_doubleHigh      ? 1 : 0)

// 總分閾值
strongBuy  = entryScore >= 7
buy        = entryScore >= 4

出場強度分級

// 直接清倉訊號(最高優先)
mustExit = sig_bigBlackK or sig_breakNeckline or sig_break200

// 減 75% 訊號
reduce75 = sig_diamondTop

// 減 50% 訊號
reduce50 = sig_dev80Break or sig_climaxReversal

// 減 25% 訊號
reduce25 = sig_dev50Break

3️⃣ 繪圖與警報(plot & alerts)

// ═════════ 均線繪製 ═════════
plot(showMA ? ma200 : na, "200DMA", color=color.new(color.orange, 0), linewidth=2)
plot(showMA ? ma150 : na, "150DMA", color=color.new(color.yellow, 0))
plot(showMA ? ma55  : na, "55DMA",  color=color.new(color.blue, 0))
plot(showMA ? ma21  : na, "21DMA",  color=color.new(color.aqua, 0))
plot(showMA ? ma8   : na, "8DMA",   color=color.new(color.white, 0))

// ═════════ 進場訊號 ═════════
plotshape(showEntry and sig_breakout,      "帶量突破", shape.triangleup,   location.belowbar, color.lime,    size=size.small)
plotshape(showEntry and sig_threeBarUp,    "帶量三盤過", shape.triangleup, location.belowbar, color.green,   size=size.tiny)
plotshape(showEntry and sig_pivotVolume,   "凹洞量",   shape.circle,       location.belowbar, color.teal,    size=size.tiny)
plotshape(showEntry and sig_vcp,           "VCP",      shape.diamond,      location.belowbar, color.yellow,  size=size.small)
plotshape(showEntry and sig_trendReversal, "空多轉折", shape.flag,         location.belowbar, color.orange,  size=size.normal)

// ═════════ 出場訊號 ═════════
plotshape(showExit and mustExit,          "清倉",     shape.xcross,       location.abovebar, color.red,     size=size.normal)
plotshape(showExit and reduce75,          "減 75%",   shape.triangledown, location.abovebar, color.orange,  size=size.small)
plotshape(showExit and reduce50,          "減 50%",   shape.triangledown, location.abovebar, color.yellow,  size=size.small)
plotshape(showExit and reduce25,          "減 25%",   shape.triangledown, location.abovebar, color.fuchsia, size=size.tiny)

// ═════════ 背景色警示 ═════════
bgcolor(deviation55 > deviationDanger ? color.new(color.red, 85) : na, title="乖離 80% 警示")
bgcolor(deviation55 > deviationWarn and deviation55 <= deviationDanger ? color.new(color.orange, 90) : na, title="乖離 50% 警示")

// ═════════ 警報 ═════════
alertcondition(sig_breakout,      "帶量突破買進", "⚡ 帶量突破:{{ticker}} @ {{close}}")
alertcondition(sig_trendReversal, "空多轉折",   "🔄 空多轉折第一根長紅 K:{{ticker}} @ {{close}}")
alertcondition(mustExit,          "立即清倉",   "🚨 清倉訊號:{{ticker}} @ {{close}}")
alertcondition(reduce75,          "減碼 75%",   "⚠️ 菱形頂:{{ticker}} @ {{close}}")
alertcondition(sig_bigBlackK,     "大量黑 K",   "🚨 大量黑 K:{{ticker}} @ {{close}}")

4️⃣ 完整骨架程式(可直接貼上 Pine Editor)

以下為最小可跑版本,你可再依需求增補上面未納入的邏輯。

//@version=5
indicator("L05 AllenR 買賣點系統", overlay=true, max_labels_count=500)

// ═══ Inputs ═══
len200 = input.int(200, "200DMA")
len55  = input.int(55,  "55DMA")
len21  = input.int(21,  "21DMA")
len8   = input.int(8,   "8DMA")
volLen = input.int(20,  "量均長")
climaxMult   = input.float(2.0, "極限大量倍數", step=0.1)
dryMult      = input.float(0.5, "凹洞量倍數",   step=0.05)
breakVolMult = input.float(1.5, "突破量倍數",   step=0.1)
devWarn      = input.float(50.0,"乖離警戒 %")
devDanger    = input.float(80.0,"乖離泡沫 %")

// ═══ Calc ═══
ma200 = ta.sma(close, len200)
ma55  = ta.sma(close, len55)
ma21  = ta.sma(close, len21)
ma8   = ta.sma(close, len8)
ma200Rising = ma200 > ma200[10]
volAvg = ta.sma(volume, volLen)
atr14  = ta.atr(14)
dev55  = (close - ma55) / ma55 * 100

prev2High = math.max(high[1], high[2])
prev2Low  = math.min(low[1],  low[2])
prev2Vol  = math.max(volume[1], volume[2])

above200 = close > ma200 and ma200Rising

// ═══ Entry Signals ═══
sig_pivotVol  = above200 and volume < volAvg*dryMult and close > open and math.abs(close-open) < atr14*0.5
sig_breakout  = above200 and close > ta.highest(high[1], 20) and volume > volAvg*breakVolMult
sig_threeUp   = above200 and close > prev2High and volume > prev2Vol and volume[1] < volAvg
sig_trendRev  = close[5] < ma200[5] and close > ma200 and close[1] < ma200[1] and (close-open) > atr14*1.5 and volume > volAvg*1.5

// ═══ Exit Signals ═══
threeDown     = close < prev2Low
sig_climax    = volume[1] > volAvg[1]*climaxMult and volume < volume[1]*0.7 and high < high[1]
sig_dev50     = dev55 > devWarn   and threeDown
sig_dev80     = dev55 > devDanger and threeDown
sig_blackK    = close < open and (open-close) > atr14*1.2 and volume > volAvg*1.5
sig_break200  = ta.crossunder(close, ma200)

mustExit   = sig_blackK or sig_break200
reduce50   = sig_dev80 or sig_climax
reduce25   = sig_dev50

// ═══ Plot ═══
plot(ma200, "200DMA", color.orange, 2)
plot(ma55,  "55DMA",  color.blue)
plot(ma21,  "21DMA",  color.aqua)
plot(ma8,   "8DMA",   color.white)

plotshape(sig_breakout,  "突破", shape.triangleup,   location.belowbar, color.lime,   size=size.small)
plotshape(sig_threeUp,   "三盤過", shape.triangleup, location.belowbar, color.green,  size=size.tiny)
plotshape(sig_pivotVol,  "凹洞量", shape.circle,     location.belowbar, color.teal,   size=size.tiny)
plotshape(sig_trendRev,  "空多轉折", shape.flag,     location.belowbar, color.orange, size=size.normal)

plotshape(mustExit, "清倉",  shape.xcross,       location.abovebar, color.red,    size=size.normal)
plotshape(reduce50, "減50%", shape.triangledown, location.abovebar, color.yellow, size=size.small)
plotshape(reduce25, "減25%", shape.triangledown, location.abovebar, color.fuchsia,size=size.tiny)

bgcolor(dev55 > devDanger ? color.new(color.red, 85) : na)
bgcolor(dev55 > devWarn and dev55 <= devDanger ? color.new(color.orange, 90) : na)

alertcondition(sig_breakout, "帶量突破", "⚡ 突破 {{ticker}} @ {{close}}")
alertcondition(mustExit,     "清倉訊號", "🚨 清倉 {{ticker}} @ {{close}}")
alertcondition(sig_dev80,    "乖離80泡沫", "⚠️ 乖離 {{ticker}}")

5️⃣ 實作優先順序建議

如果不想一次寫完整個指標,建議優先順序:

Phase 實作範圍 為什麼先做
Phase 1 200DMA + 季線乖離背景色 + 三盤破 最基礎過濾器,一眼看出股票在不在買進區
Phase 2 帶量突破 + 帶量三盤過 + 凹洞量 三大 VCP 進場點
Phase 3 極限大量 + 大量黑 K + 菱形頂 三大出場警報
Phase 4 空多轉折 + 均線糾結 + 雙聯創高 加分型進場
Phase 5 VCP pivot 偵測 + 多頭頂部 + 頸線追蹤 最複雜型態,最後再做

6️⃣ 已知限制 & 未來擴充

限制

  1. VCP 完整偵測:要精確抓出 T 數、每波跌幅折半、最後 T < 5%,Pine 的陣列操作略繁瑣。上面給的是簡化版。
  2. 凹洞量小紅 K 定義:用 ATR × 0.5 作為「小」的閾值,不同股票可能要調整。
  3. 基本面無法納入:五大潛力 / 五大動能要另外做 Sheet 或接財報 API。
  4. 產業輪動:Pine 單股票指標做不到,需多股票 scanner。

未來擴充


版本:v1(Pine Script 規格書,2026-04-21) 下一步:把骨架貼到 TradingView Pine Editor → 套到 FLY、奇鋐、上詮歷史線 → 驗證訊號是否符合 L05 案例。


相關連結