用 Claude 寫 Pine
不會 code 也能自動化交易
90% 的散戶有自己一套盯盤習慣,但講不清楚—腦袋裡知道「什麼時候會進場」, 但要把它寫成 if-then 規則就卡住。Claude 解這個問題:你用人話描述、它輸出 Pine Script v5。
本文目標:看完你能用 claude.ai 免費版,把任何你想得到的策略邏輯 變成可以在 TradingView 跑回測、可以丟給 TVSBot 自動下單的 Pine。
為什麼用 Claude,不用 ChatGPT / Copilot?
三個工具我都試過寫 Pine,差別很實際:
- Copilot:適合補 code、不適合從零生成。你已經寫了一半的 Pine 它能補得很好,但你「沒寫任何 code」叫它從策略描述生成,常常會給你一個指標而不是 strategy。
- ChatGPT:可以生 Pine,但 Pine v4 vs v5 語法差異常常混淆。要明講「Pine Script v5」+ 在輸出時加
//@version=5,否則出來的 code 在 TV 編譯器會直接報錯。 - Claude:對結構化 code + 長文上下文最穩。你可以一次把策略邏輯、風控規則、TVSBot JSON 規格、回測注意事項全部貼進去,它能消化整個 context 一致地輸出 Pine。實測 claude.ai 免費版(Sonnet 4.5)寫 5 個策略 prompt 都能一次過。
三步流程概覽
先把整套自動化流程的 mental model 建好:
- 策略口述 → Claude prompt:你用 5 段結構講清楚(後面教)。
- Claude → Pine Script v5:得到含
strategy()與alertcondition()的完整 code。 - Pine → TradingView 圖表回測:貼進 Pine Editor、Add to chart、看 Strategy Tester 標籤的 Net Profit、Max Drawdown、Win Rate。
- Alert + TVSBot webhook:圖表右上時鐘 → Add Alert → 條件選你的策略 → Notifications 勾 Webhook → 貼 dashboard 給的 URL → 訊息體貼 Claude 寫的 JSON。
全程不需要你自己寫一行 Pine。
提示詞模板:5 段結構
好的 Pine prompt 一定包含這 5 段。少一段,Claude 就要猜, 猜錯你就要花 3-4 輪對話重來:
【1. 我是誰、我在交易什麼】
我是 BTC 永續合約交易者,主要看 1 小時線,
資金 USD 10,000,交易所是 Binance USDT-M Futures。
【2. 進場條件】
當 K 棒收盤價突破過去 20 根 K 棒的最高 high
(不含當前 K 棒)且當下 RSI(14) > 50 時,
我會進多單。
【3. 出場條件】
當 K 棒收盤跌破過去 10 根 K 棒的最低 low 時,
我會出場。或者價格從進場以來最高點回落 ATR(14) × 2 也出場。
【4. 風控規則】
停損:進場 K 棒的 low - ATR(14) × 0.5。
每筆交易最大風險 = 帳戶 1%。
任何時刻最多持 1 個方向,不加碼(pyramiding=0)。
【5. 輸出規格】
請輸出完整 Pine Script v5 strategy()。
含 alertcondition() 兩條(進場、出場)。
alert message 必須是單行 valid JSON,格式如下:
{"action":"buy","symbol":"{{ticker}}","qty_type":"margin_usdt","qty_value":"500","strategy_id":"breakout-v1"}
平倉用 action:"close"。把這 5 段直接貼給 Claude,它 95% 的機率會一次給你能直接用的 Pine。
na 處理不同、study() 取代 indicator())。5 個常用策略 — 直接抄 prompt
策略 1:Donchian Breakout(突破)
人話:K 棒收盤突破 20 根新高就買、跌破 10 根新低就出場。停損在進場 K 棒 low 下方 0.5 倍 ATR。
Pine Script v5 strategy()。
進場:close 突破過去 20 根 K 棒的 ta.highest(high, 20)[1](不含當前)。
出場:close 跌破過去 10 根 K 棒的 ta.lowest(low, 10)[1]。
停損:進場 K 棒的 low - 0.5 × ta.atr(14)。
每次下單用 100% equity (default_qty_value=100, default_qty_type=strategy.percent_of_equity)。
加 alertcondition() 兩條:
- 進場:{"action":"buy","symbol":"{{ticker}}","qty_type":"margin_usdt","qty_value":"500"}
- 出場:{"action":"close","symbol":"{{ticker}}"}
pyramiding=0、process_orders_on_close=true。為什麼這策略適合練手:邏輯極簡(兩條規則)、回測結果穩定、不需要過濾雜訊。 BTC 1H 跑近 1 年勝率通常 35-45% 但 R:R 1:3 以上,淨利為正。
策略 2:EMA Cross(均線交叉)
人話:EMA20 由下穿上 EMA60 就買、反過來就空。停損用 EMA60 本身。
Pine v5 strategy()。
進場多單:ta.crossover(ta.ema(close, 20), ta.ema(close, 60))。
進場空單:ta.crossunder(ta.ema(close, 20), ta.ema(close, 60))。
停損:多單在 ema60 下方 0.3%、空單反向。
停利:1:2 風險報酬比(risk × 2 = target)。
pyramiding=0。close_entries_on_opposite=true(反向訊號自動翻倉)。
alertcondition() 多空進出場各一條。
qty_type:"margin_usdt",qty_value:"500"。注意:EMA20/60 適合 1H 以上週期。5 分線雜訊太多會被洗到懷疑人生。
策略 3:RSI Mean Revert(過買過賣回歸)
人話:RSI(14) 低於 30 反彈到 30 上就買、回到 50 出場。空單反向。加大趨勢過濾:只在 EMA200 上方做多、下方做空。
Pine v5 strategy()。
RSI period 14。
條件變數:
rsiLong = ta.crossover(ta.rsi(close, 14), 30) and close > ta.ema(close, 200)
rsiShort = ta.crossunder(ta.rsi(close, 14), 70) and close < ta.ema(close, 200)
進場多:rsiLong
進場空:rsiShort
出場多:ta.rsi(close, 14) >= 50 or close < ta.ema(close, 200)
出場空:ta.rsi(close, 14) <= 50 or close > ta.ema(close, 200)
停損:固定 -1.5%(不用 ATR,因為這策略是震盪市用)。
alertcondition() 4 條。case study:沒加 EMA200 過濾的版本回測 BTC 1H 過去 1 年勝率 47%、淨利 -3%。加了之後勝率 51%、淨利 +8.2%。 一條過濾線值得整支策略。
策略 4:Bollinger 帶 + MACD 動量
人話:K 棒實體收破 Bollinger 上軌 + MACD 線在 0 軸之上 → 進多。下軌反向 → 空。 雙重確認、過濾大部分雜訊。
Pine v5 strategy()。
BB(20, 2.0) 上下軌。
MACD(12, 26, 9)。
進場多:close > ta.bb(close,20,2.0)[0] (upper) AND MACD line > MACD signal AND MACD line > 0
進場空:close < ta.bb(close,20,2.0)[2] (lower) AND MACD line < MACD signal AND MACD line < 0
(注意 Pine v5 [ta.bb] 回傳 [middle, upper, lower] tuple,要用解構)
停損:ta.atr(14) × 1.5
停利:ATR trailing stop using ta.atr(14) × 3
alertcondition() 進出場各一條。策略 5:時段過濾(疊在現有策略上)
人話:策略只想在亞洲時段 08:00-16:00 UTC+8 跑(= UTC 0:00-08:00),歐美波動太大避開。
在我現有的 EMA Cross 策略上加時段過濾:
- 用 hour(time, 'UTC') 取得當前 UTC 小時
- 變數 inSession = hour >= 0 and hour < 8
- 進場條件多加一條 and inSession
- 持倉中不受時段限制,停損停利照原本邏輯
- 不要改動原有的 strategy() 宣告與 alertcondition()時段過濾是高勝率策略常見招式。叫 Claude 一次包進去比你自己查時區查半天快。
風控表達 — 4 句話決定能不能上線
Claude 寫策略寫得「能上真錢」,這 4 個風控指令一定要寫在 prompt:
| 規則 | 寫法 |
|---|---|
| 停損 | 每筆交易停損 = 進場價 ± ATR(14) × 1.5 |
| 部位大小 | 每筆交易最大風險 = 帳戶 1% |
| 最大持倉 | pyramiding=0,不加碼,反向訊號自動翻倉 |
| Alert 內容 | {action, symbol, qty_type:"margin_usdt", qty_value, strategy_id} |
把盯盤習慣翻成 Claude 聽得懂的話
這是新手最大卡點:你知道你會在某個時刻進場,但講不清楚。下面 5 組對照可以參考:
| 人話 | Claude prompt |
|---|---|
| 「K 棒長一根很大的紅 K」 | 當根 K 棒 (close - open) > ta.atr(14) × 1.0 且 close < open |
| 「均線多頭排列」 | EMA(20) > EMA(50) > EMA(200) 同時成立 |
| 「站上頸線」 | close 突破過去 N 根 K 棒最高 high(N 預設 20) |
| 「拉回到關鍵支撐」 | low 觸及前 30 根低點 ±0.5%;定義「支撐」具體一點(前低 / swing low / 某 EMA) |
| 「量價齊揚」 | close > close[1] 且 volume > ta.sma(volume, 20) |
實戰 case study:把「我看新聞跟單」變策略
一個朋友的真實案例。他平常會看新聞、看大 K 拉到突破近期高點就跟。我問他:「具體什麼條件?」 他答不出來。所以我跟他一起做了下面這段拆解:
- 「大 K」量化:K 棒實體(close - open)大於過去 14 根的 ATR × 1.5。
- 「突破近期高點」量化:K 棒 high > 過去 50 根 high 的最大值(不含當前)。
- 「跟單」量化:下一根 K 開盤進場,不追。
- 「適時停損」加上:進場 K 棒 low 下方 1 倍 ATR。沒有停利,靠 trailing stop(ATR × 3)。
這段描述貼給 Claude,它輸出的策略 BTC 1H 過去 6 個月回測:
Net Profit: +$4,820 (48.2% on $10K)
Total Trades: 31
Win Rate: 38.7% (12W / 19L)
Avg Win: +$543
Avg Loss: -$132
R:R: 4.1
Max Drawdown: -$1,210 (-12.1%)
Sharpe: 1.82Win rate 不高但 R:R 夠大,淨利為正。比他原本「看新聞跟單」憑感覺進場好得多 — 至少有明確的 entry/exit 規則,賠錢時知道為什麼。
常見坑 — Claude 寫 Pine 翻車 top 5
1. Pine v4 / v5 語法混淆
沒明講 v5 → Claude 偶爾寫 study()(v4 用法)或漏掉 //@version=5 第一行。 一定要在 prompt 開頭寫「請用 Pine Script v5」。
2. Alert message 多行 → TradingView 拒收
Claude 偶爾把 alert message 寫成多行字串,貼進 TV 會報 Invalid syntax。 明講「alert message 必須是單行有效 JSON 字串」。
3. ta. prefix 漏寫
Pine v5 強制要 ta. 前綴。Claude 偶爾會寫 ema() 而非 ta.ema()。 編譯器報 Could not find function or function reference 'ema'。 解:在 prompt 結尾加一句「所有內建函數請用 ta.* 完整前綴」。
4. strategy() vs indicator() 搞錯
你要自動下單就要 strategy(),不能 indicator()。indicator() 沒有 strategy.entry / strategy.close 函數。 Claude 寫指標版會給你 plot(),看起來像有策略其實沒下單邏輯。
5. 重繪(repaint)— 最隱蔽的坑
如果進場條件用了當前未收盤 K 棒的值,TV 在 K 棒收盤前後會閃爍。 回測看到「進場價就是高點」就是重繪。 解:所有條件用 [1] 索引前一根(已收盤)K 棒。 或在 strategy() 加 process_orders_on_close=true。
// ❌ 重繪:用當前未收盤 high
entrySignal = high > ta.highest(high, 20)
// ✅ 正確:用前一根 K 的條件
entrySignal = high[1] > ta.highest(high[1], 20)接到 TVSBot — 3 步走完
- 確認 Pine 裡 alert message 用 TVSBot JSON 格式(action, symbol, qty_type, qty_value, strategy_id 五欄)。 上面 prompt 模板都已含。
- TV 設 Alert:圖表右上時鐘 → Add Alert → Condition 選你的 Pine 策略 → Frequency 選「Once per bar close」 (重要:不要選 every tick,會狂打)。
- 貼 TVSBot webhook URL:Notifications 分頁 → 勾 Webhook URL → 貼 dashboard 給的 URL → Message body 貼 JSON → Create。
進階:把整本策略書翻譯成 Claude prompt
有些朋友手上有國外交易書(《海龜法則》、《市場奇才》)想實作。可以這樣跟 Claude 對話:
我手上有《海龜法則》海龜系統 2(System 2)的描述:
- 進場:突破過去 55 天最高 high(多)/ 最低 low(空)
- 出場:突破過去 20 天反向(多單看 20 天最低)
- 停損:2N 法則(N = 20 日 ATR),單一風險限 2%
- 加碼:每 0.5N 加 1 單位、最多 4 單位
- 部位上限:單市場 4、相關市場合計 6、總方向 12
請幫我把 System 2 寫成 Pine v5 strategy()。
標的設定為 BTC/USDT 1D。pyramiding 設 4。
N 用 ta.atr(20) 計算。每筆風險 2%,用 strategy.percent_of_equity 對應。
保留所有原系統規則的 inline 註解,方便我之後微調。Claude 能直接把書本邏輯翻成 code,附完整註解。比你自己讀完書再學 Pine 快數十倍。
常見 Q&A
Q:免費版額度夠嗎?
A:實測每天額度寫 3-5 個策略沒問題。如果你密集 iterate(一天改 20 次同支策略), 會需要付 Pro USD 20/月。
Q:Claude 寫的策略賠錢怎麼辦?
A:先看 Strategy Tester 的回測結果。如果勝率 < 30% 且 R:R < 1:2,邏輯本身有問題, 別改 code 直接砍掉重練。如果勝率 > 40% 但淨利為負,是手續費吃掉,加進場條件過濾、 減少交易次數。
Q:我可以把策略 prompt 給別人用嗎?
A:可以。其實 TVSBot 市集就鼓勵這個 — 你寫好策略發布,訂閱者跟單你抽 70% 分潤。 看市集。
Q:Claude vs TradingView 內建 AI(Pine Genie)?
A:Pine Genie 是 TV 內建工具,免費但有額度。Claude 更靈活(你能整段策略 + 風控一次給), 但需要切換 tab。實務上:簡單修改用 Pine Genie,複雜策略生成用 Claude。