Trend Wave Rider 剝頭皮策略:DMI+CCI 三重過濾、Python 實現與 116% 回測拆解|Quant Strategies Ep 10 筆記
第 10 課・共 18 課
目錄
Algo-trading with Saleh 的 Saleh 在片中用 Python(Jesse 框架)即場編寫一個名為 Trend Wave Rider 的剝頭皮策略,標題上的「116%」是他特定設定下的回測教學案例數字,並非實盤成績。策略構建過程本身很有示範價值:由單一指標開始,逐步加入過濾條件、調整倉位,再逐年檢驗——是一套完整的策略開發流程縮影。
學習重點
- 策略核心:動向指標 DMI 判斷趨勢方向(DI+ 與 DI− 誰在上方),平均趨向指數 ADX 過濾強度不足的時段,兩者兼備才算有效趨勢。
- 之後逐步加入兩重過濾:CCI 超買超賣(順勢回調入場)與 SMA 25/50 雙均線方向確認,每加一重就重跑回測對照夏普比率。
- 倉位管理:市價單入場,止蝕設於入場價加減 3.5 倍 ATR,每單風險為可用保證金的 5%;其後因回撤偏低,講者把倉位數量乘以 3 再乘以 5,並把槓桿上限設為 6 倍。
- 回測結果(BTC-USDT 永續、2024 年全年):未加倉位倍數前 30 分鐘圖表現最好;講者最終選用 15 分鐘圖,理由是持倉時間短、心理上較易承受。
- 分年檢驗(2021–2025 年首季)顯示策略在趨勢年表現好、橫行年平庸;講者據此另製付費版 V2,並明言「按近期市況優化」會增加過度擬合風險。
詳細筆記
核心邏輯:DMI 定方向、ADX 量強度
Saleh 先在 TradingView 上講解主指標——動向指數 Directional Movement Index。指標包含三條線:DI+(藍)、DI−(橙)與 ADX(紅)。規則很簡單:藍線在橙線之上,視為上升趨勢;反之則是下跌趨勢或至少是橫行市。
但單看兩線交叉並不足夠。Saleh 特意示範一段 DI− 雖在上方、ADX 卻極低的時段:ADX 只量度趨勢強度、不分方向,數值低代表市場根本沒有像樣的趨勢,此時的方向訊號不值得跟。因此策略要求「方向+強度」同時成立:DI+ 高於 DI− 且 ADX 高於閾值,才算有效升勢;DI− 高於 DI+ 且 ADX 達標,才算有效跌勢。圖表講解時他以 30 為閾值示例,寫入程式時則用了 50——這類講解與實作之間的出入,正是看片學策略時需要自己核對的細節。

截圖出自原片(Algo-trading with Saleh):DMI 三線——DI+(藍)、DI−(橙)與 ADX(紅),方向與強度要同時成立才算有效趨勢。
寫成 Jesse 的策略屬性(property)後,整個趨勢判斷只有數行(摘錄自原片教學):
@property
def trend(self):
di = ta.di(self.candles)
adx = ta.adx(self.candles)
if di.plus > di.minus and adx > 50:
return 1
elif di.plus < di.minus and adx > 50:
return -1
return 0
trend 回傳 1、-1 或 0,should_long 與 should_short 分別檢查它等於 1 或 -1 即可。這種「指標屬性回傳 -1/0/1、入場函數只做組合」的寫法,是 Jesse 策略的典型結構,方便日後疊加條件——後文加入 CCI 與均線時,正是沿用同一模式,每個過濾器各佔一個屬性,入場規則只負責用 and 串連,程式始終保持可讀。另外,Saleh 提到 VS Code 比 Jesse 儀表板內建編輯器好用,初學者亦可留意這個工作環境選擇。
倉位與出場:ATR 止蝕+固定風險百分比
入場用市價單(market order),講者明言是為了從簡。倉位大小用 Jesse 內建的 utils.risk_to_qty 計算:以可用保證金、每單風險百分比(他取 5%)、入場價與止蝕價反推數量;止蝕設於入場價減 3.5 倍 ATR(短倉相反,加 3.5 倍 ATR),止盈設於另一側、同樣以 3.5 倍 ATR 為距離(摘錄自原片教學):
def go_long(self):
entry = self.price # 市價單
stop = self.price - self.atr * 3.5
qty = utils.risk_to_qty(self.available_margin, 5,
entry, stop, fee_rate=self.fee_rate)
self.buy = qty, entry
由於用市價單開倉,不需要 should_cancel 函數處理未成交掛單;若改用限價單,便要靠它定期取消重掛。Saleh 亦順帶示範了「一個倉位拆多張單進場」的語法,但本策略從簡,只用一張市價單。止蝕與止盈單在 on_open_position 內才正式提交,數量等於當前倉位;短倉方向完全鏡像——止蝕改為加 3.5 倍 ATR、止盈改為減,self.buy 改為 self.sell。值得留意的是止蝕止盈同為 3.5 倍 ATR,即盈虧比約 1:1——策略要靠勝率與過濾質素取勝,而非「贏大輸小」。倉位計算中亦傳入了當前費率(fee rate),令風險百分比已粗略計及手續費,這個小動作在剝頭皮策略中其實相當重要。
第一輪回測:三個時間框架對照
首輪回測在 Binance 永續合約、BTC-USDT、2024 年全年進行,同時跑 15 分鐘、30 分鐘與 1 小時三個時間框架,用 Jesse 的 benchmark 頁並排比較。他開啟了 fast mode 加快運算,benchmark 頁會把各次回測的淨盈利、最大回撤、夏普比率與卡瑪比率(Calmar ratio)列成對照表,一眼看出差異。結果:1 小時圖夏普比率 0.9、淨盈利 21.8%,表面最好;30 分鐘圖夏普 0.6;15 分鐘圖則錄得負數。這裏示範了一個重要習慣——同一策略在多個時間框架上跑,而不是只挑一個。若只跑 1 小時圖,很容易誤以為策略已經完成。
過濾一:CCI 超買超賣
為改善成績,Saleh 加入第一重過濾:順勢指標 CCI(Commodity Channel Index)。用法與 RSI 類似,分界設於 ±100:CCI 低於 -100 視為超賣,高於 +100 視為超買。策略的方向是「順大勢、趁回調」——趨勢向上時,等 CCI 跌入超賣區才開長倉;趨勢向下時,等 CCI 衝上超買區才開短倉。程式上新增 oscillator 屬性:CCI 低於 -100 回傳 1、高於 +100 回傳 -1,然後在入場條件加上 and self.oscillator == 1。圖表上的黃線是 CCI 的移動平均,講者明言策略不會用到,只有藍線(CCI 本身)與 ±100 分界重要。重跑回測,結果略有改善——他用的判斷方法很直接:記住之前的夏普比率,改動後再跑,數字升就保留、跌就檢討。這種「一次只改一個變數、以同一組指標驗證」的節奏,是業餘策略開發者最值得學的習慣。
過濾二:SMA 25/50 雙均線
第二重過濾是兩條簡單移動平均線:快線 25 期、慢線 50 期。快線在慢線之上回傳 1(升勢),反之回傳 -1。Saleh 特別補一句:移動平均線雖然簡單,卻非常有效。加入 ma_trend 條件後,最終的入場規則變成三重確認(摘錄自原片教學):
def should_long(self) -> bool:
return (self.trend == 1 # DMI 方向 + ADX 強度
and self.oscillator == 1 # CCI < -100(超賣回調)
and self.ma_trend == 1) # SMA25 > SMA50

截圖出自原片(Algo-trading with Saleh):should_long 最終由三重條件組成——趨勢、CCI 回調、均線方向。
重跑後 15 分鐘圖轉虧為盈(+21.8%)、30 分鐘圖升至 +50.4%、夏普 1.5,但原本最好的 1 小時圖反而轉虧(-19.3%)。這個現象本身值得記住:過濾條件不是「越多越好」,同一改動在不同時間框架上的效果可以完全相反。
倉位倍數與槓桿:116% 的由來
三重過濾後,各時間框架的最大回撤都偏低(約 -14% 至 -20%)。Saleh 的做法是:既然回撤細,就把倉位數量直接乘大——先乘 3,見回撤仍未觸及他心目中的上限 -30%,再乘 5;同時在設定中把槓桿上限調高至 6 倍,預留倉位空間。他特別解釋:設定 6 倍不等於時刻用盡 6 倍,正如在交易所設定槓桿上限只是預留額度。標題的「116%」正是這種「倉位乘大五倍」後的回測讀數——它來自槓桿化的倉位調整,不是策略訊號本身產生了 116% 的邊際。若策略本身是虧損的,同一操作會把虧損同樣放大五倍,Saleh 自己亦點明了這一點。

截圖出自原片(Algo-trading with Saleh):2024 年回測對照——15 分鐘 +21.8%、30 分鐘 +50.4%(夏普 1.5)、1 小時轉虧 -19.3%。
時間框架方面,30 分鐘圖數字最亮麗,但 Saleh 最終選用 15 分鐘圖,理由是平均持倉時間顯著較短,「心理上較易承受」。這是策略選擇中少見的坦白:數字最好不等於最適合執行。
分年檢驗與付費版:講者自己談過度擬合
Saleh 之後把 2021、2022、2023、2024 及 2025 年首季分年回測。結果:2021 年大幅跑贏市場;2022 年在熊市中仍然向好;2023 年只與市場打和;2024 年不錯;2025 年首季輕微虧損——他補充指 2025 年初受關稅消息影響,他所知的大部分策略(包括人手交易)同期都表現欠佳。
他其後展示一個「按最新市況優化」的付費版本 V2:在 2024 年美國大選前後的橫行市中仍能獲利,2022 年的整固段亦表現較佳,整體數字明顯較好。但難得的是他同時講明代價——市況不斷變化,按最新市況調參數看似合理,卻會增加策略過度擬合、未來失效的風險。他的結論是兩個版本可同時運行:原版在趨勢市較好、V2 在橫行市較好,兩者相關性低。他進一步解釋組合邏輯:若兩個策略都只在升市賺錢、橫行市齊齊虧損,橫行一到便雙倍受傷;反之,一個擅長趨勢、一個擅長整固,虧損時段便可互相抵銷,整個組合才有機會在不同市況下都站得住——這就是「策略組合」而非「單一神策略」的思路。片末他亦重申,影片目的是示範如何寫策略,不是提供買賣訊號。(註:付費版策略與交易所註冊連結屬講者的商業推廣,本筆記不轉載。)

截圖出自原片(Algo-trading with Saleh):2024 年約 12 個月的淨值曲線(紫)對照 BTC-USDT(黃),共 67 宗已平倉交易。
🙏 覺得內容有用?本站所有內容免費提供,使用推薦碼開戶就是支持我們繼續營運的最大鼓勵:
ZA Bank 邀請碼 P20923
—— 你享 HKD 2,000 迎新獎賞,本站獲得營運支持。
立即開戶 →
(聯盟連結|投資涉及風險,受條款及細則約束,此資料僅可於香港境內分發)
MT5 可行性速評
| 項目 | 評估 |
|---|---|
| 邏輯可移植性 | 高。DMI/ADX 用 iADX(內含 DI+、DI− 緩衝)、CCI 用 iCCI、SMA 用 iMA,全部為 MT5 內建指標;市價單進場、固定 ATR 距離止蝕止盈,屬最標準的 EA 結構。 |
| 平台限制 | MT5 淨額帳戶下同方向只會有一個合併倉位,不影響本策略(每次只持一倉);但加密貨幣永續合約並非一般 MT5 券商的標的,移植到外匯或商品後,ATR 倍數與 ADX 閾值須重新驗證,不能照搬。 |
| 評級 | ✅ 純技術角度可完整移植,是練習 MQL5 的好題材;但「可移植」只代表程式能跑,策略本身在未見數據上的表現是另一回事。 |
| MQL5 寫法提示 | 見下 |
int adx_h = iADX(_Symbol, PERIOD_CURRENT, 14);
double diplus[], diminus[], adx[];
CopyBuffer(adx_h, PLUS_DI, 0, 1, diplus);
CopyBuffer(adx_h, MINUS_DI, 0, 1, diminus);
CopyBuffer(adx_h, MAIN_LINE, 0, 1, adx);
// 升勢條件:diplus[0] > diminus[0] && adx[0] > 50
// 再以 iCCI、iMA 檢查回調與均線方向,用 ATR×3.5 設 SL/TP
注意:即使移植成功,MT5 策略測試器跑出的回測同樣會過度擬合——ADX 閾值、ATR 倍數、均線周期全是可調參數,換平台不解決方法論問題,樣本外驗證與分年檢驗一項都不能少。
欣利克的看法
- 防坑檢查一:116% 的構成要拆開看。這個數字來自「倉位乘五倍+6 倍槓桿上限」的回測,而不是訊號本身的邊際。未乘倍數前,2024 年 30 分鐘圖約 +50%、15 分鐘圖約 +22%——才是策略訊號的「原材料」成績。任何把槓桿放大後的回測報酬當策略實力的講法,都要先除回倍數再比較。
- 防坑檢查二:剝頭皮對成本極度敏感。策略止蝕止盈同為 3.5 倍 ATR、盈虧比約 1:1,利潤完全依賴勝率;而 15 分鐘圖交易頻密,手續費、買賣差價與滑點的輕微變化,足以把 1:1 盈虧比的微弱優勢全數吞掉。原片以加密貨幣永續合約回測,費率假設與實際 Taker 費用的差距,讀者需自行核實。
- 防坑檢查三:參數擬合的痕跡。ADX 閾值(圖解用 30、程式用 50)、CCI 分界、均線 25/50、ATR 3.5 倍、倉位乘五倍——每一個都是看著回測結果調出來的。講者自己就示範了後果:加入均線過濾後,原本最好的 1 小時圖由 +21.8% 變成 -19.3%。同一改動在不同框架上效果相反,是過度擬合的經典警號。
- 觀點比較——值得肯定之處:Saleh 主動做分年檢驗(2021–2025)、承認 2023 年平庸與 2025 年首季虧損,更明言付費版「按近期市況優化」會增加過度擬合風險——這種坦白在策略教學頻道中並不常見。但影片附帶付費策略與交易所註冊推廣,存在利益關係,閱讀其績效宣稱時應把這點計算在內。
- 時效提醒:回測數據截至 2025 年首季,講者亦指出 2025 年初市況受關稅消息擾動、屬特殊時期;截至 2026 年中,市場結構與費率環境已有變化,片中任何數字都不代表當前條件。本文僅為學習記錄,不構成任何買賣建議。
名詞解釋
- 動向指標 DMI:由 DI+ 與 DI− 組成的趨勢方向指標,兩線誰在上方決定多空,是本策略的方向來源。
- 平均趨向指數 ADX:量度趨勢強度而不分方向;本策略要求 ADX 高於閾值才確認趨勢有效。
- 順勢指標 CCI:量度價格偏離均值程度的震盪指標,±100 為常用分界;本策略以其超賣/超買訊號捕捉順勢回調。
- 簡單移動平均線 SMA:過去 N 期收市價的算術平均;本策略用 25/50 快慢線作第三重方向確認。
- 平均真實波幅 ATR:量度每根 K 線平均波動範圍;本策略的止蝕與止盈均設於入場價加減 3.5 倍 ATR。
- 剝頭皮 Scalping:持倉時間極短、追逐微小價差的交易風格,對手續費與滑點極度敏感。
- 夏普比率 Sharpe Ratio:每單位波動所換取的超額回報;講者每加一重過濾便以此對照改動成效。
- 最大回撤 Drawdown:淨值由高位回落的最大幅度;講者以 -30% 為上限,決定倉位可乘大的空間。
- 過度擬合 Overfitting:策略過度遷就回測數據的噪音;講者承認付費版按近期市況優化即有此險。
- 槓桿 Leverage:以保證金放大購買力;片中倉位乘五倍後的 116% 回測報酬正是槓桿化結果。
- 回測 Backtesting:以歷史數據檢驗交易規則;本課示範了多時間框架與分年兩種對照方式。
常見問題 FAQ
Trend Wave Rider 的核心邏輯是甚麼?
一句話概括:「強趨勢中的回調入場」。先用 DMI 的 DI+/DI− 判斷趨勢方向,再用 ADX 確認趨勢有足夠強度,然後等 CCI 進入超買或超賣區(即順勢中的逆向回調)才入場,最後以 SMA 25/50 的排列作最終確認。四個條件同時成立才開倉,止蝕止盈各設於入場價加減 3.5 倍 ATR。
116% 的回測報酬可以當真嗎?
數字本身屬回測教學案例,但它的構成要拆開看:講者先把每單風險定為保證金的 5%,見回撤偏低後把倉位數量乘以五倍,並將槓桿上限設為 6 倍——116% 是槓桿放大後的讀數,不是訊號本身的邊際。未放大前,2024 年 30 分鐘圖約 +50%、15 分鐘圖約 +22%。此外回測涵蓋的參數全是看著結果調校出來的,未來能否重現並無保證。
為何講者不用表現最好的 30 分鐘圖,反而選 15 分鐘圖?
他的理由是持倉時間。15 分鐘圖的平均持倉時間顯著較短,對他而言心理上較易承受。這反映策略選擇不單是數字比較:一個數字稍遜但你能如實執行的版本,往往好過一個回測亮麗但持倉過久、令你半途干預的版本。不過要留意,兩者的差距本身也可能是參數擬合的產物。
學這條影片最大的收穫是策略本身嗎?
不是,是開發流程。影片完整示範了「單一指標起步 → 逐重加過濾 → 每次改動重跑多時間框架對照 → 調整倉位 → 分年檢驗 → 坦白交代弱點」的循環,連「加均線後 1 小時圖由盈轉虧」這類反直覺結果都照實展示。策略本身會過時,這套驗證紀律與對過度擬合的自覺,才是可以長期帶走的部分。
原影片
本文整理自以下影片,版權屬原創作者所有,建議配合原片觀看: