在 TradingView 實際跑一次
讓停損被打到時正好虧損權益的 1%
拖動 Risk % 看部位大小變化:當 ATR 擴大時它會縮小。那就是整件事的重點——固定的金額風險,不是固定的合約數。
//@version=5
strategy("Lesson 13 - Risk-based sizing", overlay=true,
initial_capital=10000,
default_qty_type=strategy.fixed,
default_qty_value=1,
slippage=2)
riskPct = input.float(1.0, "Risk % per trade", minval=0.1, step=0.1)
atrLen = input.int(14, "ATR length", minval=1)
atrMult = input.float(2.0, "ATR stop multiplier", minval=0.5, step=0.1)
atrVal = ta.atr(atrLen)
// Clamp so a tiny ATR can't blow up the division.
stopDist = math.max(atrVal * atrMult, syminfo.mintick * 10)
riskMoney = strategy.equity * riskPct / 100
contracts = riskMoney / (stopDist * syminfo.pointvalue)
fast = ta.ema(close, 9)
slow = ta.ema(close, 21)
strategy.entry("Long", strategy.long, qty=contracts, when=ta.crossover(fast, slow))
strategy.exit("Long TP/SL", "Long",
stop = strategy.position_avg_price - stopDist,
limit = strategy.position_avg_price + stopDist * 2)
strategy.close("Long", when=ta.crossunder(fast, slow))
plot(fast, "Fast EMA", color=color.blue, linewidth=2)
plot(slow, "Slow EMA", color=color.orange, linewidth=2)
plot(strategy.position_avg_price, "Entry", color=color.gray, style=plot.style_linebr)
如何執行
- 1. 在 TradingView 打開任一圖表,點選下方的 Pine Editor。
- 2. 把編輯器裡的內容全選,用這段程式覆蓋過去,然後按 Save。
- 3. 點選 Add to chart。如果是策略, 再打開 Strategy Tester 分頁。
sizing 問題
在一個 CFD 帳戶上,「我要交易幾口合約」這個問題是你策略裡槓桿最高的決策。在一個 10 倍槓桿商品上用 1% 帳戶風險、2% 停損,代表你可以持有一個等於你權益 50% 的部位——那沒問題。同樣的風險在一個 50 倍商品上配 1% 停損,代表 200% 權益——而一個 tick 對你不利就把帳戶打掉。
Pine 裡的風險導向 sizing
riskPct = input.float(1.0, "Risk %", minval=0.1)
stopDist = ta.atr(14) * 1.5
riskMoney = strategy.equity * riskPct / 100
contracts = riskMoney / (stopDist * syminfo.pointvalue)
strategy.entry("Long", strategy.long, qty=contracts)
strategy.exit("X", "Long", stop=close - stopDist, limit=close + stopDist * 2)
對 CFD 來說,syminfo.pointvalue 是每一口合約每一點變動的價值。搭配以價格計的停損距離,這會給你一個「如果停損被打到,正好虧損 riskPct % 權益」的合約數。
為什麼這比固定合約數好
如果你把規模設成「永遠 1 口」,你的風險會隨波動放大。在平靜市場你交易不足;在劇烈市場一個 tick 就能爆帳戶。風險導向 sizing 讓你的金額風險維持固定——當波動擴大時你的部位縮小,而那正好是你想要的時候。
邊界情況
如果 stopDist 太小(syminfo.mintick 的四捨五入),你會拿到除法爆掉或奇怪的分數。用 max(stopDist, syminfo.mintick * 10) 夾住。
測試 sizing
當 sizing 是動態的時候,策略測試器回報的損益是準確的——那是 Pine 回測引擎少數把複雜性處理得很好的地方。它沒建模的是:停損期間的價差擴大、重新報價、消息面的滑價。保守一點,每邊至少扣 1 個 tick。
你不該做的事
不要讓 Pine 用 default_qty_type=strategy.cash 配一個硬編數字——它會在平靜市場過度放大、在劇烈市場過度縮小,正好跟你要的相反。