多時間框架分析#

實盤交易中,單一時間框架的資訊常常不夠用。例如想用日線判斷趨勢、用 5 分鐘線找進場點,或想同時觀察主圖商品和大盤指數的相關性。MultiCharts 允許在一張圖表上載入多組資料序列(Data Series),腳本可以同時讀取每一組資料進行判斷。

資料序列編號#

主圖商品稱為 Data1,是腳本預設讀取的資料來源。後續加入的資料依序稱為 Data2Data3,現行版本最多可達 Data50

  • 當腳本寫 CloseHighVolume 時,預設都是讀取 Data1
  • 要讀取其他資料,在價格函數後面加上 of dataN,例如 Close of data2High of data2

加入資料序列#

在 MultiCharts 圖表上按右鍵 → Format → Add Symbol(或 Insert → Symbol,依版本而定)→ 選擇商品和週期 → 設定為 Data2(或更高編號)。加入後,該資料會以副圖或疊加的方式顯示在圖表上。

讀取 Data2 資料#

1
2
3
4
5
6
7
8
// 讀取 Data2 的收盤價
Value1 = Close of data2;

// 讀取 Data2 前一根K棒的最高價
Value2 = High[1] of data2;

// 在 Data2 上計算 20 期均線
Value3 = Average(Close of data2, 20);

K棒同步機制#

當圖表包含不同週期的資料時(例如 Data1 是 5 分鐘、Data2 是日線),MultiCharts 會以 小週期 為主驅動腳本執行。Data2 在腳本中讀到什麼值,取決於 Realtime-History Matching(以下簡稱 RHM)設定。

打開方式:Format Indicator/Signal → Properties(Signal 則為 Backtesting)→ Advanced → Realtime-History Matching 勾選框。此選項預設為啟用

為什麼需要 RHM#

回測時所有 K棒都已收盤,腳本逐根按時間對齊跑,每一根 Data1 讀到的 Data2 都是「當下已收盤」的值。但實盤Data1Data2 的 tick 節奏不同步,若直接採用 Data2 當前(可能尚未收盤)的值,結果會與回測產生落差。RHM 就是用來控制實盤計算要不要模擬回測那種「時間對齊、只取已收盤 K棒」的行為,讓兩者結果一致。

RHM 啟用(預設)#

腳本以 Data1 的最新 K棒加上 Data2 的 currently completed bar(最近一根已收盤的 K棒)計算。

Data1 = 5 分鐘、Data2 = 日線為例:

  • 腳本每根 5 分鐘 K棒執行一次。
  • 在同一天的所有 5 分鐘 K棒內,Close of data2 讀到的都是前一天的日線收盤價,不會隨 tick 變動。
  • 直到今日日線 K棒收盤後,Close of data2 才會更新為今日日線收盤價。

這是最常見、也最容易推理的模式,避免了回測與實盤結果差異。

RHM 停用#

腳本以 Data1 的最新 K棒加上 Data2 的 current (completed or not) bar(可能尚未收盤)計算。

在同一情境下,Close of data2 會指向當前仍在形成的日線 K棒,其值會隨 Data1 每一筆新 tick 變動。這種模式反應較即時,但回測(只有已收盤歷史資料)與實盤結果可能會出現差異。

多時間框架範例#

用日線判斷趨勢、5 分鐘線進場:日線收盤價站上 20 日均線時,才在 5 分鐘線上做多。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Inputs: TrendLength(20);
Variables: DailyMA(0), Trend(false);

// Data2 為日線;RHM 預設啟用,Close of data2 即為最近一根已收盤日線
DailyMA = Average(Close of data2, TrendLength);
Trend = Close of data2 > DailyMA;

// 在 Data1(5分鐘) 上進場
If Trend and Close crosses over Average(Close, 20) Then
  Buy ("Long") next bar at market;

If MarketPosition = 1 and Close crosses under Average(Close, 20) Then
  Sell ("Exit") next bar at market;

相對強弱範例#

比較主圖商品和大盤指數的相對強弱:主圖漲幅超過指數時進場。

1
2
3
4
5
6
7
8
Inputs: Length(20);
Variables: StockRet(0), IndexRet(0);

StockRet = (Close - Close[Length]) / Close[Length];
IndexRet = (Close of data2 - Close[Length] of data2) / Close[Length] of data2;

If StockRet > IndexRet and MarketPosition = 0 Then
  Buy ("RS Long") next bar at market;

注意事項#

  • 資料對齊:不同商品的交易時段、節假日可能不同。Data2Data1 有K棒但自己沒有K棒時,價格函數會回傳上一根K棒的值。
  • 回測速度:加入越多資料序列,回測越慢。實務上建議 2–3 組就足夠大多數策略。
  • 下單限制:買賣指令預設作用在腳本套用的那一組資料上(通常是 Data1)。若要在 Data2 上下單,將策略直接套用到 Data2 上。
  • RHM 設定:RHM 預設啟用,建議維持啟用以減少回測與實盤落差。若策略明確需要即時反應大週期的未收盤資訊,再考慮停用。

Reference#

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

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

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