L05 AllenR 買賣點 — TradingView Pine Script 指標規格書
目的:將 L05 第五堂課規則轉為可執行的技術指標 目標平台:TradingView Pine Script v5 彙整日期:2026-04-21
0. 可編碼性分析(先做取捨)
✅ 可以完全編碼(純價量邏輯)
- 均線系統(200DMA、150DMA、55DMA、21DMA、8DMA)
- 乖離率(股價 vs 季線)
- 均線差離(三均線糾結)
- 成交量分析(極限大量、凹洞量、量價背離)
- VCP 收斂型態(近似偵測)
- 帶量突破 / 帶量三盤過 / 三盤破
- 新高 / 新低
- 多頭頂部識別(沒創高又被壓下)
- 空多轉折第一根長紅 K 近似偵測
⚠️ 部分可編碼(需要額外資料)
- VCP 完整型態識別(含 T 數、跌幅折半)→ 可用 pivot 近似但非 100%
- 凹洞量 + 小紅 K → 可編碼但「小紅 K」定義需主觀設閾值
- 空多轉折(需程式選股系統配合)
❌ 無法用 Pine 編碼(需基本面 / 消息面)
- 五大潛力條件(需財報 API)
- 五大動能條件(需 EPS、PEG)
- 利多 / 利空新聞(需新聞 API + NLP)
- 產業輪動判斷(需產業歸類 + 多股票比對)
- 法人籌碼(需三大法人資料)
本指標實作範圍:上述 ✅ + ⚠️ 部分。
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:射子彈)
定義:
- 當日成交量 <
dryVolMult × volAvg(極致低量) - 當日為小紅 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:射爆彈,勝率最高)
定義:
- 股價突破過去 N 根 K 的最高點
- 當日成交量 >
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:回測成功)
定義:
- 第 3 根 K 收盤價 > 前 2 根 K 最高價
- 第 3 根 K 成交量 > 前 2 根 K 最高成交量
- 前 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
定義:
- 過去 N 根 K 處於下跌趨勢(close < ma200 或 ma200 未翻揚)
- 當日為長紅 K(實體 > ATR × 1.5)
- 當日量能爆發(> volAvg × 1.5)
- 收盤一次站上 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|極限大量 + 隔日量縮不過高
定義:
- 前一日為極限大量(vol > volAvg × climaxVolMult)
- 當日量縮(vol < 前日量 × 0.7)
- 當日未創新高
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% + 三盤破
定義:
- 季線正乖離 > 50%
- 當日收盤 < 前 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|量縮價漲後接量增價跌(菱形頂)
定義:
- 前 N 根內出現量縮價漲(量 < volAvg、close 創高)
- 當日為量增價跌(量 > 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(最危險)
定義:
- 當日為黑 K(close < open)
- 實體 > ATR × 1.2
- 量 > 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|多頭頂部(沒創高又被壓下)
定義:
- 近 M 根內股價接近前高但未破(< 前高 × 0.98)
- 當日收盤被打到前 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️⃣ 已知限制 & 未來擴充
限制
- VCP 完整偵測:要精確抓出 T 數、每波跌幅折半、最後 T < 5%,Pine 的陣列操作略繁瑣。上面給的是簡化版。
- 凹洞量小紅 K 定義:用 ATR × 0.5 作為「小」的閾值,不同股票可能要調整。
- 基本面無法納入:五大潛力 / 五大動能要另外做 Sheet 或接財報 API。
- 產業輪動:Pine 單股票指標做不到,需多股票 scanner。
未來擴充
- 做一支 Pine Script Strategy 版本,跑歷史回測算勝率 / 賠率。
- 寫一支 TradingView Scanner Script 掃整個市場每日觸發訊號。
- 結合 TradingView webhook → 推到手機 / Discord 即時通知。
版本:v1(Pine Script 規格書,2026-04-21) 下一步:把骨架貼到 TradingView Pine Editor → 套到 FLY、奇鋐、上詮歷史線 → 驗證訊號是否符合 L05 案例。