免責聲明:請注意,本文內容僅分享個人改寫的常用的技術工具,一切內容僅供參考,完全不涉及任何投資買賣建議。
CDP 指標腳本介紹
指標概述
CDP(Central Daily Pivot)指標是一種基於前一日價格數據計算的樞紐點分析工具,常用於技術分析中識別潛在的支撐與阻力位。本腳本專為 XS 平台設計,計算前一日最高價(H[1])、最低價(L[1])與收盤價(C[1])來得出 CDP 值及其衍生指標(AH、NH、NL、AL),並繪製多條水平線以視覺化關鍵價位。同時,腳本整合當日均價、即時漲跌幅(%)、前日高低、開盤價、當日高低以及漲跌停價等資訊,提供全面的盤中參考。此指標適用於短期交易者或日內操作,幫助快速判斷價格區間與趨勢轉折點。腳本僅支援分鐘頻率(Min)或日頻率(D),若使用其他頻率將引發運行錯誤(raiseruntimeerror)。
輸入參數
- _plotLen (預設值: 1, 類型: 選單): 繪圖區間選擇。
- 選項1: "每日"(值=1) - 每根 K 棒都會重繪線條,適合追蹤全程動態。
- 選項2: "當日"(值=2) - 僅在當日最後一根 K 棒繪製線條,減少圖表雜訊。
 
計算邏輯
腳本在每換日時(date <> date[1])觸發計算,重置狀態並使用 GetField 函數取得日頻率數據:
- 前日數據擷取:
- _HH = 前一日最高價 (GetField("High", "D")[1])
- _LL = 前一日最低價 (GetField("Low", "D")[1])
- _CC = 前一日收盤價 (GetField("Close", "D")[1])
 
- CDP 及其衍生值 (僅當 _HH > _LL 時計算,避免異常):
- _CDP = (_HH + _LL + 2 * _CC) / 4 // 需求點(Central Daily Pivot)
- _AH = _CDP + (_HH - _LL) // 遠高值(Absolute High)
- _NH = 2 * _CDP - _LL // 近高值(Near High)
- _NL = 2 * _CDP - _HH // 近低值(Near Low)
- _AL = _CDP - (_HH - _LL) // 遠低值(Absolute Low)
 
- 其他動態值:
- _OpenPrice = 當日開盤價 (GetField("Open", "D"))
- _AvgPrice = 當日均價 (GetField("均價", "D"))
- _dayHigh / _dayLow = 當日最高/最低價 (GetField("High/Low", "D"))
- _ChangePercent = (Close - _RefPrice) / _RefPrice * 100 // 即時漲跌幅(%),_RefPrice 為當日參考價
- _prevDayHigh / _prevDayLow = 前一日最高/最低價
 
腳本優先使用 XS 內建函數(如 GetField),避免自訂計算式,並確保跨頻率數據正確(例如分鐘腳本取日頻數據)。
輸出與繪製
腳本使用 Plot 系列函數繪製指標與線條,僅在 CDP 值有效 (>0) 且符合 _plotLen 條件時執行:
- 序列指標:
- Plot1: 當日均價線("均價")
- Plot3: 即時漲跌幅("漲跌幅(%)")
 
- 水平線條 (使用 PlotLine,起點為換日時的 _x1_bar,終點為 CurrentBar):
- Plot4: 遠高線("遠高")
- Plot5: 近高線("近高")
- Plot6: CDP 線("CDP")
- Plot7: 近低線("近低")
- Plot8: 遠低線("遠低")
- Plot9: 前日高線("前日高")
- Plot10: 前日低線("前日低")
- Plot11: 前日收線("前日收")
- Plot12: 開盤價線("開盤")
- Plot13: 當日高線("日高")
- Plot14: 當日低線("日低")
- Plot15: 漲停價線("漲停",GetField("漲停價", "D"))
- Plot16: 跌停價線("跌停",GetField("跌停價", "D"))
 
根據 _plotLen,線條可連續繪製(add=1)或僅最後一根(add=0,清舊線)。
使用注意事項
- 腳本類型: 指標腳本(非交易或選股),plot 僅包含數值、名稱與 checkbox,無顏色/樣式自訂。
- 變數命名: 所有 input/var 以 "_" 開頭,避免衝突 XS 內建名稱。
- 頻率調整: 分鐘頻率時,使用 GetField 直接取日頻數據,避免中間變數誤用。
- 錯誤處理: 若前日高低價異常(_HH <= _LL)或參考價為0,相關計算將跳過。
- 繪圖效能: 模式1 適合小圖表,模式2 適合大範圍回測以減少計算負荷。
- 測試建議: 在日線或5分鐘圖上驗證,確保換日計算正確。腳本已自我檢查符合 XS 規範,包括不使用陣列、不依賴 newday 判斷換日。
此腳本提升圖表可讀性,適合搭配其他指標使用。
// ------------------------------
// 0. 腳本初始化與輸入參數
// ------------------------------
input: _plotLen(1, "繪圖區間", inputkind:= Dict(["每日", 1], ["當日", 2])); // 繪圖區間選擇:1=每日重繪,2=僅當日最後K棒繪製
// 檢查腳本執行的頻率是否為分鐘或日線
if barfreq <> "Min" and barfreq <> "D" then
raiseruntimeerror("僅支援分鐘與日頻率");
// ------------------------------
// 1. 變數宣告
// ------------------------------
Var: _HH(0); // 前一日最高價
Var: _LL(0); // 前一日最低價
Var: _CC(0); // 前一日收盤價
Var: _OpenPrice(0); // 當日開盤價
Var: _AvgPrice(0); // 當日均價 (使用GetField取得)
Var: _CDP(0); // CDP 值 (需求點)
Var: _AH(0); // AH 值 (最高值)
Var: _NH(0); // NH 值 (近高值)
Var: _NL(0); // NL 值 (近低值)
Var: _AL(0); // AL 值 (最低值)
Var: _bar_count(0); // K棒計數器 (用於繪圖)
Var: _x1_bar(0); // 線條起點 Bar 編號 (用於繪圖)
Var: _shouldPlot(0); // 布林變數,判斷是否應繪製線條 (用於繪圖)
Var: _addFlag(0); // 布林變數,控制 PlotLine 的 add 參數 (用於繪圖)
Var: _dayLow(0); // 當天最低價
Var: _dayHigh(0); // 當天最高價
Var: _prevDayLow(0); // 前一天最低價
Var: _prevDayHigh(0);// 前一天最高價
Var: _RefPrice(0); // 當日參考價 (用於計算漲跌幅)
Var: _ChangePercent(0); // 即時漲跌幅 (%)
// ------------------------------
// 2. 換日時計算 CDP 相關數值與開盤價並重置狀態
// ------------------------------
// 檢查是否換日 (當前K棒日期不等於前一根K棒日期)
if date <> date[1] then begin
_bar_count = 0; // 重置日內K棒計數
_x1_bar = CurrentBar; // 記錄新交易日起點 Bar 編號,供 PlotLine 使用
// 使用 GetField 取得前一日的日頻率資料
_HH = GetField("High", "D")[1]; // 前一日最高價
_LL = GetField("Low", "D")[1]; // 前一日最低價
_CC = GetField("Close", "D")[1]; // 前一日收盤價
_OpenPrice = GetField("Open", "D"); // 當日開盤價
_AvgPrice = GetField("均價", "D"); // 當日均價
_prevDayLow = GetField("Low", "D")[1]; // 前一天最低價
_prevDayHigh = GetField("High", "D")[1]; // 前一天最高價
_RefPrice = GetField("參考價", "D"); // 當日參考價
// 計算 CDP 及其相關數值 (樞紐點分析)
// 避免 _HH <= _LL 導致計算異常
if _HH > _LL then begin
_CDP = (_HH + _LL + 2 * _CC) / 4; // CDP = (H[1] + L[1] + 2*C[1])/4
_AH = _CDP + (_HH - _LL); // 遠高 = CDP + (H[1] - L[1])
_NH = 2 * _CDP - _LL; // 近高 = 2*CDP - L[1]
_NL = 2 * _CDP - _HH; // 近低 = 2*CDP - H[1]
_AL = _CDP - (_HH - _LL); // 遠低 = CDP - (H[1] - L[1])
end;
end;
// ------------------------------
// 3. 計算即時漲跌幅與當天高低價
// ------------------------------
// 取得當天高低價 (日頻率)
_dayLow = GetField("Low", "D"); // 當天最低價
_dayHigh = GetField("High", "D"); // 當天最高價
// 計算即時漲跌幅
_ChangePercent = 0; // 預設漲跌幅為 0
// 避免參考價為0導致計算錯誤
if _RefPrice <> 0 then
_ChangePercent = (Close - _RefPrice) / _RefPrice * 100; // (現價 - 參考價) / 參考價 * 100%
// ------------------------------
// 4. 判斷繪圖條件 (根據輸入參數決定繪圖模式)
// ------------------------------
_shouldPlot = 0; // 初始化繪圖條件為不繪製
_addFlag = 0; // 初始化 PlotLine 的 add 參數 (0: 清除舊線, 1: 連續繪製)
// 確保已進入新的一天 (_x1_bar 不為 0)
if _x1_bar <> 0 then begin
// 模式1:每日重繪 (每根K棒都畫)
if _plotLen = 1 then begin
_shouldPlot = 1; // 設定為需要繪製
_addFlag = 1; // 設定為連續繪製
end;
// 模式2:僅當日最後K棒繪製
if _plotLen = 2 and islastbar then begin
_shouldPlot = 1; // 設定為需要繪製
_addFlag = 0; // 設定為清除舊線 (只畫最後一根)
end;
end;
// ------------------------------
// 5. 繪製線條與指標
// ------------------------------
// 確保 CDP 值已計算完成 (CDP > 0 表示換日計算已執行且有效)
if _CDP > 0 then begin
Plot1(GetField("均價"), "均價"); // 繪製均價線 (Plot1)
Plot3(_ChangePercent, "漲跌幅(%)"); // 繪製即時漲跌幅 (Plot3)
// 根據 shouldPlot 判斷是否繪製水平線
if _shouldPlot = 1 then begin
// --- 繪製 CDP 相關線條 ---
PlotLine(4, _x1_bar, _AH, CurrentBar, _AH, "遠高", add:=_addFlag); // 繪製遠高線 (Plot4)
PlotLine(5, _x1_bar, _NH, CurrentBar, _NH, "近高", add:=_addFlag); // 繪製近高線 (Plot5)
PlotLine(6, _x1_bar, _CDP, CurrentBar, _CDP, "CDP", add:=_addFlag); // 繪製 CDP 線 (Plot6)
PlotLine(7, _x1_bar, _NL, CurrentBar, _NL, "近低", add:=_addFlag); // 繪製近低線 (Plot7)
PlotLine(8, _x1_bar, _AL, CurrentBar, _AL, "遠低", add:=_addFlag); // 繪製遠低線 (Plot8)
// --- 繪製前日與當日關鍵價位線條 ---
PlotLine(9, _x1_bar, _prevDayHigh, CurrentBar, _prevDayHigh, "前日高", add:=_addFlag); // 繪製前日高線 (Plot9)
PlotLine(10, _x1_bar, _prevDayLow, CurrentBar, _prevDayLow, "前日低", add:=_addFlag); // 繪製前日低線 (Plot10)
PlotLine(11, _x1_bar, _CC, CurrentBar, _CC, "前日收", add:=_addFlag); // 繪製前日收線 (Plot11)
PlotLine(12, _x1_bar, _OpenPrice, CurrentBar, _OpenPrice, "開盤", add:=_addFlag); // 繪製開盤價線 (Plot12)
// --- 繪製當日高低價與漲跌停價線條 ---
PlotLine(13, _x1_bar, _dayHigh, CurrentBar, _dayHigh, "日高", add:=_addFlag); // 繪製當日最高價 (Plot13)
PlotLine(14, _x1_bar, _dayLow, CurrentBar, _dayLow, "日低", add:=_addFlag); // 繪製當日最低價 (Plot14)
PlotLine(15, _x1_bar, GetField("漲停價", "D"), CurrentBar, GetField("漲停價", "D"), "漲停", add:=_addFlag); // 繪製漲停價線 (Plot15)
PlotLine(16, _x1_bar, GetField("跌停價", "D"), CurrentBar, GetField("跌停價", "D"), "跌停", add:=_addFlag); // 繪製跌停價線 (Plot16)
end;
end;












