停損止盈#

在交易策略中,風險管理是最重要的一環。除了用 Sell / BuyToCover 手動設定出場條件,PowerLanguage 提供了 5 個內建的風險管理函數,讓策略自動在特定虧損或獲利金額時出場:

函數說明
SetStopLoss固定停損:持倉虧損達到指定金額時出場
SetProfitTarget固定止盈:持倉獲利達到指定金額時出場
SetBreakEven保本停損:獲利達到門檻後,將停損移至進場價格
SetDollarTrailing追蹤停損(固定金額):獲利從高點回落超過指定金額時出場
SetPercentTrailing追蹤停損(百分比):獲利從高點回落超過最高獲利的指定百分比時出場

這 5 個函數的共同特性:

  • 自動適用多空 :不需要分別寫多頭和空頭的邏輯,函數會自動根據持倉方向計算停損和止盈價格
  • 整個倉位 :預設套用到整個倉位(所有合約加總),不是每口合約。若要改為每口合約,需先呼叫 SetStopContract
  • Intrabar 觸發 :這 5 個函數在K棒收盤時評估,也會在K棒內持續監控,可在進場的同一根K棒內觸發出場

點數換算金額#

Amount 參數的單位是貨幣金額(新台幣、美元等)。如果要用點數設定停損,需要乘以 BigPointValue:

金額 = 點數 × BigPointValue

常見台灣期貨的 BigPointValue:

商品BigPointValue
台指期大台 (FITX)200 TWD / 點
台指期小台 (MTX)50 TWD / 點
E-mini S&P 500 (ES)50 USD / 點

範例: 小台指 1 口停損 50 點 = SetStopLoss(50 * BigPointValue) = SetStopLoss(2500)

在程式碼中直接使用 BigPointValue,而不是寫死數字,可以讓策略在不同商品上通用。

SetStopLoss#

SetStopLoss 設定固定停損:持倉虧損達到 Amount 時,送出停損單出場。

語法#

1
SetStopLoss(Amount);
語法元素說明
Amount整個倉位的最大允許虧損金額。多頭停損價 = EntryPrice - Amount / BigPointValue;空頭停損價 = EntryPrice + Amount / BigPointValue

範例#

小台指 1 口進場後,設定 50 點(2500 元)的固定停損:

1
2
3
4
5
6
Inputs: stopPoints(50);

If MarketPosition = 0 and Close crosses above Average(Close, 20) Then
  Buy("Long Entry") 1 Contract Next Bar Market;

SetStopLoss(stopPoints * BigPointValue);

SetStopLoss 放在腳本最外層即可,不需要包在 If 條件內。每根K棒執行時,函數會自動套用到當前持倉。

SetProfitTarget#

SetProfitTarget 設定固定止盈:持倉獲利達到 Amount 時,送出限價單出場。

語法#

1
SetProfitTarget(Amount);
語法元素說明
Amount整個倉位的止盈金額。多頭止盈價 = EntryPrice + Amount / BigPointValue;空頭止盈價 = EntryPrice - Amount / BigPointValue

範例#

小台指 1 口進場後,設定 100 點(5000 元)的止盈:

1
2
3
4
5
6
Inputs: targetPoints(100);

If MarketPosition = 0 and Close crosses above Average(Close, 20) Then
  Buy("Long Entry") 1 Contract Next Bar Market;

SetProfitTarget(targetPoints * BigPointValue);

SetBreakEven#

SetBreakEven 設定保本停損:持倉獲利達到 Profit 後,自動將停損移動至進場價格(損益兩平點),消除虧損風險。

語法#

1
SetBreakEven(Profit);
語法元素說明
Profit觸發保本停損的獲利門檻(整個倉位)。獲利達到 Profit 後,停損價自動移動至 EntryPrice

範例#

小台指 1 口進場後,當獲利達到 30 點(1500 元)時,停損移至進場價格:

1
2
3
4
5
6
Inputs: breakEvenPoints(30);

If MarketPosition = 0 and Close crosses above Average(Close, 20) Then
  Buy("Long Entry") 1 Contract Next Bar Market;

SetBreakEven(breakEvenPoints * BigPointValue);

SetBreakEven 通常和 SetStopLoss 搭配使用:初期用 SetStopLoss 控制最大虧損,一旦達到保本門檻,停損自動上移至進場價,確保不虧損出場。

SetBreakEven 不會將手續費和滑價計入損益計算,保本停損觸發後的出場並不代表實際損益為零。

SetDollarTrailing#

SetDollarTrailing 設定追蹤停損:以貨幣金額追蹤倉位的最高獲利,當獲利從高點回落超過 Amount 時出場,用於趨勢交易中鎖定浮動獲利。

語法#

1
SetDollarTrailing(Amount);
語法元素說明
Amount從持倉最高獲利允許的最大回落金額(整個倉位)。當前獲利低於(最高獲利 - Amount)時出場

追蹤停損的行為:

持倉方向追蹤基準出場條件
多頭持倉期間的最高獲利當前獲利 < 最高獲利 - Amount
空頭持倉期間的最高獲利當前獲利 < 最高獲利 - Amount

如果追蹤幅度要隨獲利等比例放大,可改用 SetPercentTrailing

範例#

小台指 1 口進場後,設定 80 點(4000 元)的追蹤停損:

1
2
3
4
5
6
Inputs: trailPoints(80);

If MarketPosition = 0 and Close crosses above Average(Close, 20) Then
  Buy("Long Entry") 1 Contract Next Bar Market;

SetDollarTrailing(trailPoints * BigPointValue);

追蹤停損的獲利變化範例(進場價 20,000,Amount = 4,000 TWD,BigPointValue = 50):

SetDollarTrailing 追蹤停損示意圖

K棒收盤價未實現獲利 (TWD)最高獲利 (TWD)出場門檻 (TWD)說明
進場20,00000-4,000初始狀態
+120,0502,5002,500-1,500獲利新高,門檻更新
+220,1206,0006,0002,000獲利新高,門檻更新
+320,0804,0006,0002,000獲利未創新高,門檻不動
+420,0351,7506,0002,000獲利 1,750 < 門檻 2,000,出場

未實現獲利計算:(收盤價 - 進場價) × BigPointValue,例如 +2 棒 = (20,120 - 20,000) × 50 = 6,000 TWD。

SetPercentTrailing#

SetPercentTrailing 設定百分比追蹤停損:獲利首次達到 Profit 門檻後,追蹤最高獲利;當獲利從高點回落超過最高獲利的 Percentage% 時出場。

SetDollarTrailing 的差別在於追蹤幅度是相對的 — 獲利越高,允許的回撤金額也越大。

語法#

1
SetPercentTrailing(Profit, Percentage);
語法元素說明
Profit激活追蹤停損的最低獲利門檻(整個倉位的貨幣金額)。獲利達到 Profit 前,追蹤停損不會生效
Percentage從最高獲利允許的最大回落百分比(0–100)。出場條件:當前獲利 < 最高獲利 × (1 - Percentage / 100)

範例#

小台指 1 口進場後,當獲利達到 2,000 TWD 後,設定最高獲利回落 50% 時出場:

1
2
3
4
5
6
Inputs: activateProfit(2000), trailPct(50);

If MarketPosition = 0 and Close crosses above Average(Close, 20) Then
  Buy("Long Entry") 1 Contract Next Bar Market;

SetPercentTrailing(activateProfit, trailPct);

承上相同情境(進場價 20,000,BigPointValue = 50),SetPercentTrailing(2000, 50) 的行為:

K棒收盤價未實現獲利 (TWD)最高獲利 (TWD)出場門檻(50%)說明
進場20,0000未激活(0 < 2,000)
+120,0502,5002,5001,250首次達到門檻,激活!2,500 × 50%
+220,1206,0006,0003,000獲利新高,門檻更新:6,000 × 50%
+320,0804,0006,0003,000未創新高,門檻不動
+420,0351,7506,0003,000獲利 1,750 < 門檻 3,000,出場

注意:在獲利達到 Profit 門檻之前,SetPercentTrailing 不會提供任何下檔保護。通常需要搭配 SetStopLoss 在初期控制虧損。

SetDollarTrailing vs. SetPercentTrailing#

SetDollarTrailingSetPercentTrailing
參數Amount(貨幣金額)Profit(激活門檻)+ Percentage(百分比)
追蹤幅度固定金額,不隨獲利變化隨最高獲利等比例放大,獲利越高允許回撤越大
進場即生效是,無需達到任何門檻否,需先達到 Profit 門檻

每口合約模式:SetStopContract#

Amount 預設是整個倉位的金額。若策略同時持有多口合約,且希望每口合約各自獨立停損,可在風險管理函數前呼叫 SetStopContract:

1
2
SetStopContract;          // 切換為每口合約模式
SetStopLoss(Amount);      // 此後 Amount 改為每口合約的金額

呼叫 SetStopPosition 可切換回整個倉位模式(預設值)。

範例: 2 口小台指,每口合約各自設定 50 點(2500 元)停損:

1
2
SetStopContract;
SetStopLoss(50 * BigPointValue);   // 每口合約 2500 TWD,總停損 5000 TWD

若不呼叫 SetStopContractSetStopLoss(2500) 是整個 2 口倉位的停損 2500 TWD(約每口 1250 TWD)。

組合使用範例#

以下範例結合 3 個風險管理函數,實作一個有完整風險控制的均線策略:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
Inputs:
  maLength(20),
  stopPoints(50),         // 初始固定停損: 50 點
  breakEvenPoints(30),    // 保本門檻: 獲利 30 點後停損移至進場價
  trailPoints(80);        // 追蹤停損: 獲利從高點回落 80 點出場

Variables: ma(0);

ma = Average(Close, maLength);

// 進場: 收盤站上均線
If MarketPosition = 0 and Close crosses above ma Then
  Buy("Long Entry") 1 Contract Next Bar Market;

// 出場: 收盤跌破均線
If MarketPosition = 1 and Close crosses below ma Then
  Sell("Exit Long") Next Bar Market;

// 風險管理(自動適用多空)
SetStopLoss(stopPoints * BigPointValue);
SetBreakEven(breakEvenPoints * BigPointValue);
SetDollarTrailing(trailPoints * BigPointValue);

出場邏輯說明:

  1. 固定停損 (SetStopLoss) :進場後立即生效,虧損達 50 點則出場
  2. 保本停損 (SetBreakEven) :獲利達 30 點後,停損移至進場價,固定停損失效
  3. 追蹤停損 (SetDollarTrailing) :持續追蹤最高獲利;當獲利從高點回落 80 點,追蹤停損觸發
  4. 均線出場 :收盤跌破均線則出場,無論停損是否達到

哪個出場條件先觸發,就先出場。

注意事項#

Intrabar 觸發#

這 5 個函數在K棒內持續監控(intrabar evaluation),不只是在K棒收盤時評估,因此可能在進場的同一根K棒內觸發出場。

同時觸發多個停損#

如果同一根K棒內,SetStopLossSetDollarTrailing 都達到出場條件,以先觸發的為準。

與手動出場指令並存#

Sell / BuyToCover 指令和這 5 個函數可以同時存在,互不衝突,哪個先觸發就先出場。

無法針對特定進場設定#

這 5 個函數套用到策略內所有開放的進場部位,無法針對特定進場名稱(EntryLabel)設定不同的停損參數。

停損只往有利方向移動#

SetDollarTrailing 的出場門檻只會隨最高獲利上升,不會因為獲利回落而下移。

僅限訊號腳本#

這 5 個函數只能在訊號(Signal)腳本中使用,無法在指標(Indicator)腳本中使用。

Reference#

https://www.multicharts.com/trading-software/index.php?title=SetStopLoss

https://www.multicharts.com/trading-software/index.php?title=SetProfitTarget

https://www.multicharts.com/trading-software/index.php?title=SetBreakEven

https://www.multicharts.com/trading-software/index.php?title=SetDollarTrailing

https://www.multicharts.com/trading-software/index.php?title=SetPercentTrailing

https://www.multicharts.com/trading-software/index.php?title=SetStopPosition