

這兩個指標其實XQ內建早就有的,在找尋量能與提前發現趨勢的過程中,無意間發現,這兩個指標放在一起還挺搭、挺好用的,就以此篇文章記錄一下。
為什麼光看 K 棒還不夠?
許多人剛踏入技術分析的世界,第一個學的都是移動平均線——均線黃金交叉買進、死亡交叉賣出。然而這套邏輯有個根本盲點:它只看「價格」,看不見「資金」。真實市場中,主力在佈局時往往不讓價格一口氣跳出來,而是悄悄地讓成交量不斷墊高。等到散戶追進去的時候,漲勢的燃料其實早就快燒完了。
所以,這個指標想解決的問題只有一個: 同時告訴你「量能方向」與「動能強弱」,讓兩個維度都對齊,再決定要不要出手。
兩個核心引擎
引擎一:OBV(能量潮,On Balance Volume)
OBV 的邏輯極其簡單,卻極其有效:
- 今天收盤漲→ 把今天的成交量加進累計值
- 今天收盤跌→ 把今天的成交量減去
- 今天平盤→ 維持不變
這樣算出來的 OBV 就像一條「資金累積的水位線」。當 OBV 走高,代表資金持續淨流入,即使股價還在橫盤整理,也代表有人在默默囤貨;反之 OBV 往下走,即使股價還在高點,也意味著水面下的賣壓正在增加。
本指標讓 OBV 分別與 5 日均線(短均) 和 20 日均線(長均) 比較,藉此區分「短線資金湧入」與「中期資金結構走多」的強度差異。
引擎二:MTM(動量,Momentum)
MTM 計算的是「現在的收盤價相對 N 天前的漲跌幅」,是市場「速度感」的直接體現。
- MTM > 0:現在比 N 天前貴,多頭慣性尚存
- MTM < 0:現在比 N 天前便宜,空頭慣性佔優
更重要的是,本指標讓 MTM 和它自己的移動平均線(MTM MA)比較:
- MTM 穿越 MA 往上(加速)→ 動能正在增強
- MTM 跌破 MA 往下(減速)→ 動能正在衰退
這個設計讓你能提前感知趨勢的「加速」與「煞車」,而不是等到高點跌下來才知道反轉了。
四象限訊號:量能 × 動能的組合判讀
把 OBV 與 MTM 兩個維度交叉比對,指標會輸出四種訊號:

這樣設計的好處在於分層過濾:+2 是所有條件全部對齊才觸發的「高確信」訊號;+1 則是「趨勢初期、長均尚未跟上」時的早鳥訊號。你可以根據自己的風格,選擇只信任 +2,或是把 +1 也納入觀察清單。
指標如何呈現在圖表上?
本指標設計成雙圖層輸出:
副圖(量能動能面板)
- OBV 本體走勢線
- OBV 5 日均線 & 20 日均線
- MTM 柱狀圖(正負一目了然)
- MTM 均線(用來判斷動能加速或減速)
主圖(疊在 K 棒上)
- 強力多頭 / 多頭訊號標記:浮現在 K 棒下方(表示支撐底部起飛)
- 強力空頭 / 空頭訊號標記:浮現在 K 棒上方(表示壓力頂部下壓)
這樣的版面配置讓你不需要在主圖和副圖之間反覆對照——主圖看訊號,副圖看背後的量能動能是否支撐,一眼就能完成交叉驗證。
參數設定建議

初次使用建議保留預設值,先觀察訊號的頻率和準確度,再根據個人交易的週期與品種進行微調。震盪盤中 MTM 期數可以稍微拉長以減少雜訊;強趨勢股則可以縮短以加快反應速度。
使用這個指標的正確心態
最後想說一件重要的事:這個指標是「情境判斷工具」,不是「自動買賣訊號」。
強力多頭(+2)訊號出現,不代表應該無條件買進;它代表的是「量能與動能同時支持多方,此刻是值得進一步審視的時機」。你仍然需要結合大盤環境、個股基本面、以及你自己的資金部位來做最終決策。
交易沒有聖杯,但有了一個好工具,至少能讓你在每一次下決定之前,多看見一個維度。
本指標以 XScript (XS) 語言撰寫,可直接載入 XQ 全球贏家平台使用。
OBV x MTM:
// ============================================================
// 腳本名稱:[OBV 雙均線 + MTM 四象限訊號指標]
// 邏輯說明:以 OBV 相對於 5MA / 20MA 的位置判斷量能強弱,
// 搭配 MTM 相對於其均線的方向判斷動能,輸出四組訊號。
// plot1~5 輸出至副圖;plot7~10 四組訊號標記坐在主圖 K 棒上。
// 訊號定義:
// +2 強力多頭:MTM>MTM均線 且 MTM>0 且 OBV>5MA 且 OBV>20MA
// +1 多頭 :MTM>MTM均線 且 OBV>5MA(不要求 20MA)
// -1 空頭 :MTM<MTM均線 且 OBV<5MA(不要求 20MA)
// -2 強力空頭:MTM<MTM均線 且 MTM<0 且 OBV<5MA 且 OBV<20MA
// 0 中性 :不符合以上任何條件
// 日期:2026/03/17
// ============================================================
// ------------------------------
// 1. 變數宣告區
// ------------------------------
input:
_mtm_length(10, "MTM 計算期數"),
_mtm_ma_length(10, "MTM 均線期數"),
_obv_fast_ma(5, "OBV 短均線期數"),
_obv_slow_ma(20, "OBV 長均線期數");
var:
_obv(0),
_obv_ma5(0),
_obv_ma20(0),
_mtm_val(0),
_mtm_ma(0),
_signal(0);
var:
_obv_above_fast(false),
_obv_above_slow(false),
_obv_below_fast(false),
_obv_below_slow(false),
_mtm_positive(false),
_mtm_negative(false),
_mtm_accel(false),
_mtm_decel(false);
// ------------------------------
// 2. 邏輯判斷區
// ------------------------------
// ── 計算 OBV ──────────────────────────────────
if currentbar = 1 then
_obv = 0
else begin
if close > close[1] then
_obv = _obv[1] + volume
else begin
if close < close[1] then
_obv = _obv[1] - volume
else
_obv = _obv[1];
end;
end;
_obv_ma5 = average(_obv, _obv_fast_ma);
_obv_ma20 = average(_obv, _obv_slow_ma);
// ── 計算 MTM ──────────────────────────────────
_mtm_val = momentum(close, _mtm_length);
if currentbar >= _mtm_ma_length then
_mtm_ma = average(_mtm_val, _mtm_ma_length)
else
_mtm_ma = _mtm_val;
// ── 拆解布林條件(防呆:不超過 3 層巢狀 if)──
_obv_above_fast = _obv > _obv_ma5;
_obv_above_slow = _obv > _obv_ma20;
_obv_below_fast = _obv < _obv_ma5;
_obv_below_slow = _obv < _obv_ma20;
_mtm_positive = _mtm_val > 0;
_mtm_negative = _mtm_val < 0;
_mtm_accel = _mtm_val > _mtm_ma;
_mtm_decel = _mtm_val < _mtm_ma;
// ── 四組訊號判定 ──────────────────────────────
condition1 = _mtm_accel and _mtm_positive and _obv_above_fast and _obv_above_slow; // 強力多頭
condition2 = _mtm_accel and _obv_above_fast; // 多頭
condition3 = _mtm_decel and _mtm_negative and _obv_below_fast and _obv_below_slow; // 強力空頭
condition4 = _mtm_decel and _obv_below_fast; // 空頭
_signal = 0;
if condition1 then
_signal = 2
else begin
if condition2 then
_signal = 1;
end;
if condition3 then
_signal = -2
else begin
if condition4 then
_signal = -1;
end;
// ------------------------------
// 3. 腳本輸出區
// ------------------------------
// ── 副圖:OBV 本體 + 雙均線 ──────────────────
setplotlabel(1, "obv");
plot1(_obv, "obv");
setplotlabel(2, "obv ma" + numtostr(_obv_fast_ma, 0));
plot2(_obv_ma5, "obv-sma");
setplotlabel(3, "obv ma" + numtostr(_obv_slow_ma, 0));
plot3(_obv_ma20, "obv-lma");
// ── 副圖:MTM 柱狀 + 訊號均線 ────────────────
setplotlabel(4, "mtm(" + numtostr(_mtm_length, 0) + ")");
plot4(_mtm_val, "mtm");
setplotlabel(5, "mtm ma(" + numtostr(_mtm_ma_length, 0) + ")");
plot5(_mtm_ma, "mtm-ma");
// ── 主圖:四組訊號標記(坐在 K 棒上)─────────
// 注意:plot6 空出不用,避免與副圖序號混淆
// plot7 強力多頭:標記於當根 low 下方(K 棒底部)
// plot8 多頭 :標記於當根 low 下方
// plot9 空頭 :標記於當根 high 上方(K 棒頂部)
// plot10 強力空頭:標記於當根 high 上方
// 強力多頭標記(主圖,K棒低點)
if condition1 then begin
setplotlabel(7, "強力多頭");
plot7(low, "強力多頭");
end else
noplot(7);
// 多頭標記(主圖,K棒低點;強力多頭時不重複顯示)
if condition2 and not condition1 then begin
setplotlabel(8, "多頭");
plot8(low, "多頭");
end else
noplot(8);
// 強力空頭標記(主圖,K棒高點)
if condition3 then begin
setplotlabel(9, "強力空頭");
plot9(high, "強力空頭");
end else
noplot(9);
// 空頭標記(主圖,K棒高點;強力空頭時不重複顯示)
if condition4 and not condition3 then begin
setplotlabel(10, "空頭");
plot10(high, "空頭");
end else
noplot(10);
OBV:
// -----------------------------------------------------------
// 腳本類別: 指標
// 腳本名稱: OBV 六全排列帶狀填色指標
// -----------------------------------------------------------
input:
_SMAlength(5, "短週期"), //InputKind:=Dict(["5期",5],["10期",10],["20期",20]), Quickedit:=True),
_MMAlength(20, "長週期"); //, InputKind:=Dict(["20期",20],["40期",40],["60期",60]), Quickedit:=True);
variable:
_OBV(0), // OBV 數值
_SMA(0), // 短期均線
_MMA(0), // 長期均線
_SMA_Label(""), // 短均線標籤
_MMA_Label(""); // 長均線標籤
// 效能優化
//SetTotalBar(_MMAlength + 5);
// ------------------------------
// 1. OBV 與均線核心計算
// ------------------------------
if CurrentBar = 1 then
_OBV = 0
else begin
if Close > Close[1] then
_OBV = _OBV[1] + Volume
else if Close < Close[1] then
_OBV = _OBV[1] - Volume
else
_OBV = _OBV[1];
end;
_SMA = Average(_OBV, _SMAlength);
_MMA = Average(_OBV, _MMAlength);
_SMA_Label = NumToStr(_SMAlength, 0) + "MA";
_MMA_Label = NumToStr(_MMAlength, 0) + "MA";
// 繪製基準三線
Plot1(_OBV, "OBV");
Plot2(_SMA, "短均線");
Plot3(_MMA, "長均線");
SetPlotLabel(2, _SMA_Label);
SetPlotLabel(3, _MMA_Label);
// ------------------------------
// 2. 定義 6 種排列組合狀態 (Permutations)
// ------------------------------
condition1 = _OBV > _SMA and _SMA > _MMA; // O > S > M (最強多頭)
condition2 = _OBV > _MMA and _MMA > _SMA; // O > M > S (多頭初現)
condition3 = _SMA > _OBV and _OBV > _MMA; // S > O > M (多頭拉回)
condition4 = _SMA > _MMA and _MMA > _OBV; // S > M > O (空頭初現)
condition5 = _MMA > _OBV and _OBV > _SMA; // M > O > S (空頭反彈)
condition6 = _MMA > _SMA and _SMA > _OBV; // M > S > O (最強空頭)
// ------------------------------
// 3. 買賣狀態柱狀圖 (輔助顯示)
// ------------------------------
if condition1 then Plot4(100, "最強多頭") else NoPlot(4);
if condition2 then Plot5(100, "多頭初現") else NoPlot(5);
if condition3 then Plot6(100, "多頭拉回") else NoPlot(6);
if condition4 then Plot7(100, "空頭初現") else NoPlot(7);
if condition5 then Plot8(100, "空頭反彈") else NoPlot(8);
if condition6 then Plot9(100, "最強空頭") else NoPlot(9);
// ------------------------------
// 4. 六組獨立區間填色 (PlotFill)
// 邏輯:填滿該狀態下最高值與最低值之間的區間
// ------------------------------
// PF1: O > S > M (填滿 OBV 到 MMA)
if condition1 then PlotFill(10, _OBV, _MMA, "最強多頭填色") else NoPlot(10);
// PF2: O > M > S (填滿 OBV 到 SMA)
if condition2 then PlotFill(11, _OBV, _SMA, "多頭初現填色") else NoPlot(11);
// PF3: S > O > M (填滿 SMA 到 MMA)
if condition3 then PlotFill(12, _SMA, _MMA, "多頭拉回填色") else NoPlot(12);
// PF4: S > M > O (填滿 SMA 到 OBV)
if condition4 then PlotFill(13, _SMA, _OBV, "空頭初現填色") else NoPlot(13);
// PF5: M > O > S (填滿 MMA 到 SMA)
if condition5 then PlotFill(14, _MMA, _SMA, "空頭反彈填色") else NoPlot(14);
// PF6: M > S > O (填滿 MMA 到 OBV)
if condition6 then PlotFill(15, _MMA, _OBV, "最強空頭填色") else NoPlot(15);
MTM:
// ============================================================
// 腳本名稱:MTM 動量指標
// 邏輯說明:計算動量值(MTM)與其均線(MA),並標示多頭/空頭狀態
// 日期:2026/03/18
// ============================================================
// ------------------------------
// 1. 變數宣告區
// ------------------------------
input:
_length(10, "週期數"); // 動量計算週期
// ------------------------------
// 2. 邏輯判斷區
// ------------------------------
setbarback(_length); // 預載足夠歷史資料供 average 計算使用
value1 = momentum(close, _length); // 計算動量值
if currentbar >= _length then
value2 = average(value1, _length)
else
value2 = value1;
condition1 = value1 > value2; // 多頭:MTM 在均線之上
condition2 = value1 < value2; // 空頭:MTM 在均線之下
// ------------------------------
// 3. 腳本輸出區
// ------------------------------
plot1(value1, "mtm");
plot2(value2, "ma");
plot3(0, "零軸");
// 條件式繪圖:條件不成立時呼叫 noplot 抑制繪製,確保兩者不同時出現
if condition1 then
plot4(value1, "多頭")
else
noplot(4);
if condition2 then
plot5(value1, "空頭")
else
noplot(5);






















