← 回文件首頁

Pine Script 範例庫

直接複製貼上的 TradingView Pine Script + TVSBot 配置。先到 TV 把 Pine 貼進去 → 設 Alert → 把 Message body 換成下方 JSON(記得改 webhook_secret 跟 strategy 名稱;交易所用下方選單選)→ Webhook URL 從 dashboard 主頁複製。

⚠️ 教育用範例,不保證獲利。

範例、教學用途,非投資建議;過去績效不代表未來。

  • 目前範例的 JSON 在任何交易所都不帶停利停損(tp_pct/sl_pct)與 trailing。停利停損請在 Pine 裡判斷後送 close 訊號出場。
  • 每個範本都有適用 / 不適用市場類型,看清楚再用
  • 務必先 Dry-run 跑一兩週看訊號品質再切實單
  • 建議設「每日下單上限」防止異常市況連續觸發
  • TVSBot 不會自動翻倉:收到反向訊號時,TVSBot 只是照那一筆訊號再下一張單,不會先把原本的倉平掉。合約範本每筆訊號的數量都依當下可用 USDT 餘額重新計算,所以反向訊號通常不會剛好平乾淨:可能留下一點原方向的倉位,或反向多開一小筆。要乾淨出場或反手,請先送 close、下一根 K 再進場;停損停利也一樣要用 alert_message 明確送出 close —— {{strategy.order.action}} 只會輸出 buy/sell,永遠不會輸出 close。見頁面最後的範例。

RSI 均值回歸

新手現貨

經典的「超賣買進 / 超買賣出」邏輯。RSI 從 30 以下回升、穿越 30 時 → buy;從 70 以上回落、跌破 70 時 → sell。震盪盤效果好,趨勢盤會連續挨刀。

✓ 適合
震盪盤、區間整理時段的現貨
✗ 不適合
單邊趨勢盤(會逆勢做多 / 做空被擠爆)
⚠️ 風險:趨勢市場連續觸發逆勢訊號可能虧損嚴重。建議搭配每日下單上限。
① Pine Script 源碼(貼到 TradingView Pine Editor)
//@version=6
strategy("TVSBot RSI Mean Reversion", overlay=true)

// 參數
rsiLength = input.int(14, "RSI 週期")
oversold = input.int(30, "超賣閾值")
overbought = input.int(70, "超買閾值")

// 計算 RSI
rsi = ta.rsi(close, rsiLength)

// 條件
longCondition = ta.crossover(rsi, oversold)
shortCondition = ta.crossunder(rsi, overbought)

// 進出場:TradingView 會在多空間反手,但 TVSBot 只照每筆 buy/sell 訊號各下一張單、不會自動翻倉(現貨的 sell 就是賣出)
if longCondition
    strategy.entry("Long", strategy.long)
if shortCondition
    strategy.entry("Short", strategy.short)

// 視覺輔助
plot(rsi, "RSI", color=color.blue)
hline(oversold, "Oversold", color=color.green)
hline(overbought, "Overbought", color=color.red)
② TVSBot webhook payload(貼到 TV Alert 的 Message 欄)
{
  "secret": "<你的 webhook_secret>",
  "strategy": "rsi-mean-reversion",
  "side": "{{strategy.order.action}}",
  "symbol": "BTCUSDT",
  "exchange": "binance",
  "market_type": "spot",
  "qty_type": "percent",
  "qty": 10
}

現貨不會在交易所掛停利停損(tp_pct / sl_pct 在現貨會被忽略),所以這份 JSON 沒有帶。出場完全靠 Pine 送出的 sell。

現貨的 percent 是「可用 USDT 餘額」的百分比,買和賣都一樣,不是「持倉的百分比」。買進後可用 USDT 變少,下一筆 sell 算出來的數量也會變少,可能留下沒賣掉的幣;持幣不夠時賣單會被交易所拒絕。想讓買賣金額一致,改用 "qty_type": "usdt"。

ⓘ 記得改 secret(你的 webhook_secret,從策略頁「TV 模板」按鈕拿),並把 strategy 換成你在 TVSBot 建的策略名稱(要一字不差)。上面選的交易所決定 exchange 和 symbol 的格式。

EMA 黃金/死亡交叉

新手永續合約

短期 EMA 上穿長期 EMA = 黃金交叉 → buy(做多);下穿 = 死亡交叉 → sell(用來減倉/平多,數量不一定剛好平乾淨;空手時才會開空)。趨勢追蹤經典款,缺點是震盪盤會被「假突破」連續打臉。建議用較長週期(如 4h / 1d)+ 止損。

✓ 適合
趨勢明確的中長線(4h - 日線級別)
✗ 不適合
震盪盤、短線 1m-15m(會被反覆鋸齒洗倉)
⚠️ 風險:趨勢反轉時延遲明顯。要防止單邊回吐獲利,請在 Pine 裡判斷停利停損後送 close 出場(見頁面最後的範例;這份 JSON 帶不帶 tp_pct / sl_pct,看下方 JSON 的說明)。
① Pine Script 源碼(貼到 TradingView Pine Editor)
//@version=6
strategy("TVSBot EMA Cross", overlay=true)

fastLen = input.int(12, "短期 EMA")
slowLen = input.int(26, "長期 EMA")

fastEMA = ta.ema(close, fastLen)
slowEMA = ta.ema(close, slowLen)

longCondition = ta.crossover(fastEMA, slowEMA)
shortCondition = ta.crossunder(fastEMA, slowEMA)

if longCondition
    strategy.entry("Long", strategy.long)
if shortCondition
    strategy.entry("Short", strategy.short)

plot(fastEMA, "Fast EMA", color=color.orange)
plot(slowEMA, "Slow EMA", color=color.blue)
② TVSBot webhook payload(貼到 TV Alert 的 Message 欄)
{
  "secret": "<你的 webhook_secret>",
  "strategy": "ema-crossover",
  "side": "{{strategy.order.action}}",
  "symbol": "BTCUSDT",
  "exchange": "binance",
  "market_type": "futures",
  "margin_pct": 10,
  "leverage": 3
}

目前範例庫不提供停利停損與 trailing(任何交易所的 JSON 都不帶):close 平倉後,交易所端先前掛的停利停損單不會自動撤掉,所以先不開放。停利停損請在 Pine 裡判斷後送 close 訊號出場(見頁面最後的範例)。

ⓘ 記得改 secret(你的 webhook_secret,從策略頁「TV 模板」按鈕拿),並把 strategy 換成你在 TVSBot 建的策略名稱(要一字不差)。上面選的交易所決定 exchange 和 symbol 的格式。

布林帶觸碰回彈

中等現貨

價格觸碰布林帶下軌且 RSI 仍 < 50 視為超賣 → buy;觸碰上軌且 RSI > 50 → sell。比純 RSI 更嚴格(要兩個條件同時成立)。

✓ 適合
高波動但仍在 trading range 內的資產(如 BTC / ETH 主流幣震盪期)
✗ 不適合
強趨勢 + 帶突破(會在帶外持續運行)
⚠️ 風險:突破行情下會在錯誤方向連續觸發。現貨沒有交易所端停損,請在 Pine 裡加出場條件,並設每日下單上限。
① Pine Script 源碼(貼到 TradingView Pine Editor)
//@version=6
strategy("TVSBot Bollinger Bounce", overlay=true)

bbLen = input.int(20, "BB 週期")
bbStd = input.float(2.0, "BB 標準差")
rsiLen = input.int(14, "RSI 週期")

basis = ta.sma(close, bbLen)
dev = bbStd * ta.stdev(close, bbLen)
upper = basis + dev
lower = basis - dev

rsi = ta.rsi(close, rsiLen)

longCondition = close <= lower and rsi < 50
shortCondition = close >= upper and rsi > 50

if longCondition
    strategy.entry("Long", strategy.long)
if shortCondition
    strategy.entry("Short", strategy.short)

plot(basis, "BB Mid")
plot(upper, "BB Upper", color=color.red)
plot(lower, "BB Lower", color=color.green)
② TVSBot webhook payload(貼到 TV Alert 的 Message 欄)
{
  "secret": "<你的 webhook_secret>",
  "strategy": "bollinger-bounce",
  "side": "{{strategy.order.action}}",
  "symbol": "BTCUSDT",
  "exchange": "binance",
  "market_type": "spot",
  "qty_type": "percent",
  "qty": 8
}

現貨不會在交易所掛停利停損(tp_pct / sl_pct 在現貨會被忽略),所以這份 JSON 沒有帶。出場完全靠 Pine 送出的 sell。

現貨的 percent 是「可用 USDT 餘額」的百分比,買和賣都一樣,不是「持倉的百分比」。買進後可用 USDT 變少,下一筆 sell 算出來的數量也會變少,可能留下沒賣掉的幣;持幣不夠時賣單會被交易所拒絕。想讓買賣金額一致,改用 "qty_type": "usdt"。

ⓘ 記得改 secret(你的 webhook_secret,從策略頁「TV 模板」按鈕拿),並把 strategy 換成你在 TVSBot 建的策略名稱(要一字不差)。上面選的交易所決定 exchange 和 symbol 的格式。

SuperTrend 趨勢跟蹤

中等永續合約

SuperTrend 翻多 → buy;翻空 → sell。比 EMA cross 反應更快,止損也內建(基於 ATR)。趨勢盤的主力選手。

✓ 適合
高波動有明確方向的市場(突破 / 趨勢)
✗ 不適合
區間整理、橫盤(容易被甩出)
⚠️ 風險:ATR 倍數設太小會頻繁翻轉造成 over-trading。新手建議 multiplier=3 起跳。
① Pine Script 源碼(貼到 TradingView Pine Editor)
//@version=6
strategy("TVSBot SuperTrend", overlay=true)

atrPeriod = input.int(10, "ATR 週期")
factor = input.float(3.0, "SuperTrend 倍數")

[supertrend, direction] = ta.supertrend(factor, atrPeriod)

longCondition = ta.change(direction) < 0  // 從空翻多
shortCondition = ta.change(direction) > 0  // 從多翻空

if longCondition
    strategy.entry("Long", strategy.long)
if shortCondition
    strategy.entry("Short", strategy.short)

plot(direction < 0 ? supertrend : na, "Up", color=color.green, linewidth=2)
plot(direction > 0 ? supertrend : na, "Down", color=color.red, linewidth=2)
② TVSBot webhook payload(貼到 TV Alert 的 Message 欄)
{
  "secret": "<你的 webhook_secret>",
  "strategy": "supertrend",
  "side": "{{strategy.order.action}}",
  "symbol": "BTCUSDT",
  "exchange": "binance",
  "market_type": "futures",
  "margin_pct": 15,
  "leverage": 5
}

目前範例庫不提供停利停損與 trailing(任何交易所的 JSON 都不帶):close 平倉後,交易所端先前掛的停利停損單不會自動撤掉,所以先不開放。停利停損請在 Pine 裡判斷後送 close 訊號出場(見頁面最後的範例)。

ⓘ 記得改 secret(你的 webhook_secret,從策略頁「TV 模板」按鈕拿),並把 strategy 換成你在 TVSBot 建的策略名稱(要一字不差)。上面選的交易所決定 exchange 和 symbol 的格式。

成交量突破

進階永續合約

收盤價突破 N 根 K 的最高點 + 成交量 > 平均成交量 1.5 倍 → buy;跌破最低點 + 量爆 → sell。捕捉大行情的進場時機。

✓ 適合
突破型 trader、想抓主行情啟動點
✗ 不適合
假突破多的市場、低流動性山寨幣
⚠️ 風險:假突破會嚴重打臉。建議搭配 reverse_mode 一鍵翻轉觀察兩面表現。
① Pine Script 源碼(貼到 TradingView Pine Editor)
//@version=6
strategy("TVSBot Volume Breakout", overlay=true)

lookback = input.int(20, "突破回看 K 數")
volMult = input.float(1.5, "成交量倍數")

highestHigh = ta.highest(high, lookback)[1]
lowestLow = ta.lowest(low, lookback)[1]
avgVol = ta.sma(volume, lookback)

longCondition = ta.crossover(close, highestHigh) and volume > avgVol * volMult
shortCondition = ta.crossunder(close, lowestLow) and volume > avgVol * volMult

if longCondition
    strategy.entry("Long", strategy.long)
if shortCondition
    strategy.entry("Short", strategy.short)

plot(highestHigh, "Lookback High", color=color.red)
plot(lowestLow, "Lookback Low", color=color.green)
② TVSBot webhook payload(貼到 TV Alert 的 Message 欄)
{
  "secret": "<你的 webhook_secret>",
  "strategy": "volume-breakout",
  "side": "{{strategy.order.action}}",
  "symbol": "BTCUSDT",
  "exchange": "binance",
  "market_type": "futures",
  "margin_pct": 8,
  "leverage": 3
}

目前範例庫不提供停利停損與 trailing(任何交易所的 JSON 都不帶):close 平倉後,交易所端先前掛的停利停損單不會自動撤掉,所以先不開放。停利停損請在 Pine 裡判斷後送 close 訊號出場(見頁面最後的範例)。

ⓘ 記得改 secret(你的 webhook_secret,從策略頁「TV 模板」按鈕拿),並把 strategy 換成你在 TVSBot 建的策略名稱(要一字不差)。上面選的交易所決定 exchange 和 symbol 的格式。

DCA 階梯式進場(被動定投)

新手現貨

每跌 N% 自動加倉。不做空、不停損 — 純 averaging down 平攤成本。適合長期看好但短線怕抓底失敗的用戶。**用 margin / leverage 跑這個會 100% 爆倉,請只用現貨。**

✓ 適合
長線看多、不擔心短期波動的優質資產(BTC / ETH / 大盤 ETF)
✗ 不適合
山寨幣(可能跌成 0)、合約(會爆倉)
⚠️ 風險:需要充足資金準備持續加倉。一定要設 max_daily_orders 避免極端行情無限買入。調高「最多加倉次數」時,strategy(...) 那一行的 pyramiding 也要一起調到一樣大,否則 TradingView 只會買到 pyramiding 允許的次數。
① Pine Script 源碼(貼到 TradingView Pine Editor)
//@version=6
// pyramiding 要 ≥「最多加倉次數」,否則 TradingView 只會買到 pyramiding 允許的次數
strategy("TVSBot DCA Step", overlay=true, pyramiding=10)

stepPct = input.float(5.0, "每跌 N% 加倉一次")
maxBuys = input.int(10, "最多加倉次數")

var float lastBuyPrice = na
var int buyCount = 0

// 第一次進場:直接 buy
if na(lastBuyPrice) and buyCount < maxBuys
    strategy.entry("DCA-1", strategy.long)
    lastBuyPrice := close
    buyCount += 1

// 後續 N% 跌幅就再加一次
priceDropPct = (lastBuyPrice - close) / lastBuyPrice * 100
if not na(lastBuyPrice) and priceDropPct >= stepPct and buyCount < maxBuys
    strategy.entry("DCA-" + str.tostring(buyCount + 1), strategy.long)
    lastBuyPrice := close
    buyCount += 1

plot(lastBuyPrice, "Last Buy", color=color.orange, style=plot.style_circles)
② TVSBot webhook payload(貼到 TV Alert 的 Message 欄)
{
  "secret": "<你的 webhook_secret>",
  "strategy": "dca-grid",
  "side": "{{strategy.order.action}}",
  "symbol": "BTCUSDT",
  "exchange": "binance",
  "market_type": "spot",
  "qty_type": "usdt",
  "qty": 100
}

現貨不會在交易所掛停利停損(tp_pct / sl_pct 在現貨會被忽略),所以這份 JSON 沒有帶。出場完全靠 Pine 送出的 sell。

ⓘ 記得改 secret(你的 webhook_secret,從策略頁「TV 模板」按鈕拿),並把 strategy 換成你在 TVSBot 建的策略名稱(要一字不差)。上面選的交易所決定 exchange 和 symbol 的格式。

EMA 交叉 + 停損停利(正確平倉範例)

中等永續合約

示範「怎麼從 Pine 正確送出平倉」。進場用 alert_message 帶 buy/sell,停損停利用 strategy.exit 帶 close —— 平台收到 close 會抓交易所的實際持倉量平乾淨。這是上面所有範本都沒示範、但你一加風控就會需要的寫法。

✓ 適合
任何需要在 Pine 端做停損停利的合約策略
✗ 不適合
現貨(現貨沒有「持倉」概念,close 不適用)
⚠️ 風險:Pine 端的停損停利只有在 TradingView 正常運作、alert 有觸發時才會送出。斷線時這樣不會有保護,建議同時到交易所手動設一張停損;但這張停損在 Pine 送出 close 平倉後仍會留在交易所,平倉後請記得自己撤掉,以免它誤觸發在之後的新倉位上。交易所端停損(payload 的 tp_pct/sl_pct)目前不開放,細節看下方 JSON 的說明。
① Pine Script 源碼(貼到 TradingView Pine Editor)
//@version=6
strategy("TVSBot 停損停利(正確平倉寫法)", overlay=true)

fastLen = input.int(9, "快線 EMA")
slowLen = input.int(21, "慢線 EMA")
tpPct = input.float(3.0, "停利 %", step=0.1)
slPct = input.float(2.0, "停損 %", step=0.1)

fast = ta.ema(close, fastLen)
slow = ta.ema(close, slowLen)

longCondition = ta.crossover(fast, slow)
shortCondition = ta.crossunder(fast, slow)

// 進場:alert_message 只帶「動作字串」
// secret 等敏感資訊留在 TradingView 的 alert 訊息欄,不要寫進 Pine
// —— Pine 腳本一旦分享出去,裡面的 secret 就外洩了
if longCondition
    strategy.entry("Long", strategy.long, alert_message="buy")
if shortCondition
    strategy.entry("Short", strategy.short, alert_message="sell")

// 出場:平倉一律送 "close"
// 平台收到 close 會去交易所抓「實際持倉量」平乾淨,
// 你不需要(也不該)在這裡自己算數量 —— 算錯會平不乾淨或反手開倉
if strategy.position_size > 0
    strategy.exit("Long Exit", from_entry="Long",
         limit = strategy.position_avg_price * (1 + tpPct / 100),
         stop  = strategy.position_avg_price * (1 - slPct / 100),
         alert_message = "close")

if strategy.position_size < 0
    strategy.exit("Short Exit", from_entry="Short",
         limit = strategy.position_avg_price * (1 - tpPct / 100),
         stop  = strategy.position_avg_price * (1 + slPct / 100),
         alert_message = "close")

plot(fast, "EMA 快", color=color.aqua)
plot(slow, "EMA 慢", color=color.orange)
② TVSBot webhook payload(貼到 TV Alert 的 Message 欄)
{
  "secret": "<你的 webhook_secret>",
  "strategy": "ema-tp-sl",
  "action": "{{strategy.order.alert_message}}",
  "symbol": "BTCUSDT",
  "exchange": "binance",
  "market_type": "futures",
  "margin_pct": 10,
  "leverage": 3
}

目前範例庫不提供停利停損與 trailing(任何交易所的 JSON 都不帶):close 平倉後,交易所端先前掛的停利停損單不會自動撤掉,所以先不開放。停利停損請在 Pine 裡判斷後送 close 訊號出場(見頁面最後的範例)。

ⓘ 記得改 secret(你的 webhook_secret,從策略頁「TV 模板」按鈕拿),並把 strategy 換成你在 TVSBot 建的策略名稱(要一字不差)。上面選的交易所決定 exchange 和 symbol 的格式。

準備好把策略接到自動下單?

把 Pine 貼到 TradingView、Alert 設好,TVSBot 來處理執行。

開始註冊 →