MultiCharts 當沖程式碼:時間進出場與收盤前平倉寫法
一支可用的 MultiCharts 當沖程式碼由三段時間條件組成:允許進場的時段、不再開新倉的截止時間、收盤前幾分鐘的強制平倉。平倉時間要比收盤早至少一根 K 棒,SetExitOnClose 只當備援,回測後用交易明細和「在市場時間」確認出場真的有執行。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
目錄
MultiCharts 當沖程式碼怎麼寫才會在收盤前出場?
MultiCharts 當沖程式碼的核心是三段時間條件:只在指定時段內允許進場、到了截止時間不再開新倉、收盤前幾分鐘用 Time 條件強制平倉。SetExitOnClose 只能當備援,因為它會不會觸發取決於交易時段範本,夜盤尤其如此。回測後再用交易明細確認沒有任何一筆部位過夜。
當沖(當日沖銷)是當天開倉、當天收盤前平倉、不留過夜部位的交易方式。時間條件是用 K 棒的時間值決定程式在哪些時刻可以動作的判斷式。把一個交易時段想成一天的上班時間:早上先觀察一陣子再開始做事,下午某個時間後不接新工作,下班前十分鐘一定把手上的事收尾。寫成程式就是三個時間窗:
- 允許進場的時段。例如台指期日盤 09:00 到 12:30。避開開盤前十五分鐘的劇烈波動,也留給每筆交易足夠的時間發展。
- 不再開新倉的截止時間。例如 12:30 之後只處理出場。一筆 13:30 才進場的單子,十分鐘後就會被強制平倉,付了手續費和滑價卻沒有機會走出行情。
- 強制平倉時間。例如 13:40。這一段不看任何指標,只看時間和目前是否有部位:有部位就用市價單全部平倉。
台指期日盤是 08:45 到 13:45,夜盤是 15:00 到次日 05:00;交易所可能調整這些時間,寫程式前先看臺灣期貨交易所的契約規格頁,或用期貨交易時間查詢工具對照你所在的時區。日盤和夜盤在回測設定上的差別,台指期夜盤交易時間與結算有完整整理。如果你還在決定當沖程式要放在哪個平台執行,各平台自動下單方式的比較說明了 MultiCharts 和其他平台在自動交易上的差異。
PowerLanguage 的時間條件怎麼寫?日盤和夜盤要分開處理
PowerLanguage 用 Time 這個保留字取得 K 棒時間,格式是 HHMM 的整數,日盤的時間條件可以直接用大於、小於比較,但夜盤跨午夜,一條比較式會失效,必須拆成兩段用「或」連接。保留字是程式語言預先定義好、代表某個固定意義的名稱,Time 代表目前這根 K 棒的時間,Date 代表日期。
HHMM 格式的意思是 13:40 寫成 1340、09:00 寫成 900。MultiCharts 預設以收盤時刻標示 K 棒,所以 5 分鐘圖上標 13:40 的那根棒涵蓋 13:35 到 13:40;若你的圖表改過標示方式,先在圖上確認再寫條件。日盤的進場時段寫成「Time 大於等於 900 且 Time 小於 1230」就夠了,因為從 845 到 1345 數字一路遞增。
夜盤不同。從 15:00 開始數字遞增到 2359,過了午夜跳回 0000 再增加到 0500。如果寫「Time 大於等於 1500 且 Time 小於 450」,沒有任何一個時刻能同時滿足,程式一整晚不會進場。正確的寫法是把條件拆成「Time 大於等於 1500」或「Time 小於等於 450」兩段。平倉時間也一樣:夜盤收盤前的強制平倉條件落在午夜之後,寫成「Time 大於等於 455 且 Time 小於 500」這一類只在凌晨成立的區間。
午夜之後還有第二個差異:Date 可能已經換成下一個日曆日,但這些 K 棒仍屬於同一個夜盤交易日。這會影響「一天只進場一次」的判斷和日線的歸屬,第五節會處理。下表整理日盤與夜盤在程式碼上要分開處理的五個地方:
| 項目 | 日盤(08:45–13:45) | 夜盤(15:00–次日 05:00) |
|---|---|---|
| 時段是否跨午夜 | 否 | 是 |
| 進場時段的寫法 | 一段「大於等於且小於」 | 兩段用「或」連接 |
| 強制平倉的時間值 | 例如 1340,大於進場時間 | 例如 455,數字比進場時間小 |
| 「今天」以什麼為準 | Date 等於日曆日 | 以夜盤開盤為交易日起點,不能只看 Date |
| 收盤那根 K 棒 | 標示 13:45 的棒 | 標示 05:00 的棒,日期已是隔天 |
收盤前幾分鐘平倉怎麼寫?時間要看 K 棒長度
強制平倉的時間要比收盤早至少一根 K 棒再加上成交延遲,因為條件在 K 棒收盤時才成立,單子在下一根 K 棒才成交。用 5 分鐘 K 棒把平倉條件設在 13:40,實際成交會落在 13:40 之後那根棒的開盤;若設在 13:45,那是時段最後一根棒,下一根棒已經是下一個交易時段,部位就過夜了。
這和回測裡常見的前視偏差是同一件事的兩面:程式在一根棒收盤時才知道條件成立,所以最早只能在下一根棒成交。寫平倉時間時把這一根延遲算進去,步驟如下:
- 確認圖表的 K 棒長度。5 分鐘、15 分鐘、30 分鐘的延遲各不相同。
- 從收盤時刻往前扣一根 K 棒,得到最晚可用的條件時間。5 分鐘棒是 13:40,15 分鐘棒是 13:30,30 分鐘棒是 13:15。
- 再往前留一根作為緩衝。5 分鐘棒設 13:35,實際成交在 13:35 之後、13:40 之前,就算當天收盤前流動性變差也還有一根棒可以用。
- 條件只看時間和部位。「Time 大於等於設定值且目前部位不為零」就平倉,不加任何指標。
假設範例
日盤 5 分鐘圖,平倉條件設為 Time 大於等於 1340。標示 13:40 的棒在 13:40 收盤,條件成立,市價單在下一根棒(13:40 到 13:45)開盤成交,成交時間約 13:40 多一點,收盤前還有一根棒。若把同一條件搬到 15 分鐘圖,13:40 落在 13:30 到 13:45 這根棒裡,條件要到 13:45 收盤才成立,下一根棒已經是隔日 08:45,部位過夜。15 分鐘圖至少要設 1330。
AlphaPrime (Valynox) 的回測對每一個候選策略都採用下一根 K 棒成交並計入手續費與滑價,所以報表上的出場時間本身就含了這一根延遲,和 MultiCharts 上實際成交時刻對照時不必再另外加回。
SetExitOnClose 對夜盤有效嗎?
SetExitOnClose 只在交易時段範本標記為「收盤」的那根 K 棒出場,日盤和夜盤會不會各觸發一次完全取決於範本怎麼設;不想把當沖出場交給範本,就自己寫時間條件。SetExitOnClose 是 PowerLanguage 的一個指令,告訴 MultiCharts 在時段最後一根 K 棒結束時把所有部位平掉。
交易時段範本(Session Template)是 MultiCharts 裡定義每個商品一天有哪幾個交易時段、各從幾點到幾點的設定。SetExitOnClose 從這個範本讀取「收盤」在哪裡。三種常見範本給出三種結果:
- 只有日盤的範本(08:45–13:45)。收盤是 13:45,SetExitOnClose 在 13:45 那根棒出場。夜盤的資料根本不在圖上。
- 日盤與夜盤分成兩個時段的範本。有兩個收盤,13:45 和 05:00 各出場一次。這是當沖要的行為。
- 日夜盤合併成一個連續時段的範本。只有一個收盤,日盤 13:45 不會出場,部位從日盤帶進夜盤。
回測裡 SetExitOnClose 會在最後一根棒的收盤價成交;實盤時這筆市價單要在收盤前送出並且找到對手方,能不能照價成交取決於當時的流動性和券商。這兩個不確定來源都不在你的程式碼裡,而在範本和盤勢裡。下表對照兩種寫法:
| 項目 | SetExitOnClose | 自己寫的時間條件 |
|---|---|---|
| 出場時間來自哪裡 | 交易時段範本的收盤設定 | 程式碼裡的數字 |
| 只有日盤的範本 | 13:45 出場 | 照設定時間出場 |
| 日盤加夜盤的範本 | 兩個時段是否分開決定是否各出場一次 | 照設定時間出場 |
| 範本被改動時 | 行為跟著變,程式碼看不出來 | 行為不變 |
| 交易者控制什麼 | 只有開或關 | 時間、緩衝、日夜盤各自的值 |
實務上的做法是兩個都留:自己寫的時間條件在收盤前兩根棒平倉,是主出場;SetExitOnClose 留著當備援,萬一時間條件因為資料缺棒沒觸發,範本的收盤還能接住。回測時若兩者的出場筆數不一致,就表示範本的收盤和你以為的收盤不在同一根棒上。
怎麼限制一天只進場一次?
用 EntriesToday 或自己維護的日期變數判斷今天是否已經進過場,夜盤則要以交易日而不是日曆日當「今天」。EntriesToday 是 PowerLanguage 的函數,回傳某個日期已經執行過的進場次數;傳入 Date 就得到今天進場過幾次,大於零就不再進場。
日盤用 EntriesToday 就夠了,因為日盤的日曆日就是交易日。夜盤從 15:00 開到次日 05:00,過了午夜 Date 可能已經變成隔天,EntriesToday 以為是新的一天,一個夜盤可能出現兩次進場:一次在午夜前,一次在午夜後。解法是自己維護一個旗標,並以夜盤開盤時刻作為交易日的切換點:
- 宣告一個變數記錄「本交易日是否已進場」。
- 每根新 K 棒先判斷是否進入新交易日。日盤看 Date 是否改變;夜盤看 Time 是否剛跨過 1500。進入新交易日就把旗標歸零。
- 判斷是否在進場時段內。不在就跳過。
- 判斷旗標是否已設。已設就跳過,不看訊號。
- 訊號成立才進場,並把旗標設為已進場。
旗標的歸零寫在進場判斷之前,順序不能反,否則新交易日的第一根棒會先被舊旗標擋掉。另外確認 MultiCharts 對午夜後 K 棒的 Date 值怎麼顯示:在夜盤圖表上用一個簡單的畫線或列印把 Date 和 Time 印出來看一眼,比猜測可靠。
怎麼用回測確認出場真的有執行?
回測後看兩個地方:交易明細裡每筆出場時間都應在截止時間之前、進場日期等於出場日期,策略績效報表的「在市場時間」應該遠低於一半;若在市場時間接近九成,時間出場沒有生效,部位在跨時段持有。在市場時間是持有部位的時間占整段回測期間的百分比。
一支日盤當沖策略,每天最多持倉從 09:00 到 13:40,占日盤五小時的九成多,但夜盤十四小時完全空手,若圖表含夜盤資料,在市場時間的上限大約三成;只有日盤資料時上限會高一些,但只要有任何一筆過夜,數字就會明顯跳高。四個檢查步驟:
- 打開交易明細,按出場時間排序。最晚的一筆就是最接近收盤的出場。
- 確認每筆出場時間都在截止時間之前。5 分鐘棒設 13:40 平倉,出場時間不該晚於 13:45。
- 確認每筆進場日期等於出場日期。夜盤策略要改成確認在同一個交易日內。
- 讀報表的「在市場時間」和「每筆平均持有 K 棒數」。5 分鐘日盤當沖每筆持有不該超過約 57 根棒(09:00 到 13:40)。
反過來的例子最能說明這個數字的意義。下面這份回測是 AlphaPrime 在 NQ(E-mini Nasdaq-100 期貨)日線上跑的,期間 2019-01-02 到 2025-06-30,多空雙向、一口,每筆交易計入 20 美元手續費與 10 美元滑價。它測的不是當沖程式碼本身,而是一條替代規則:以標準差通道作為唯一的進出場條件,沒有停損、沒有目標、沒有任何濾網,也沒有時間出場。這是搜尋嘗試的 1,024 個候選中依報酬對回撤留下的那一個;事後挑出留下的那一個會美化結果,數字不代表這條規則賺到了那些錢,也不是讀者可以預期的結果。
來源:AlphaPrime 產品引擎(CPU),2026-10-31 執行。NQ 日線,2019-01-02 至 2025-06-30,多空都做,1 口,每筆手續費 $20、滑價 $10。
| 項目 | 結果 |
|---|---|
| 淨利(已平倉) | $116,360 |
| 最大回撤 | $110,535 |
| 交易筆數 | 35 |
| 勝率 | 54.29% |
| 獲利因子 | 1.487 |
| 平均每筆 | $3,324.57 |
| 在場時間 | 95.01% |
這裡要看的是在市場時間 95.01% 和 35 筆交易:六年半只有 35 筆,部位幾乎一直留在市場上,每一筆都跨了許多個交易時段。一支當沖程式碼如果回測出接近這樣的在市場時間,就是時間出場沒有生效的訊號,不管淨利看起來如何。

如果策略是在別的地方產生、再放進 MultiCharts,出場時間是最容易在搬移時走樣的地方。把策略匯入 MultiCharts 並對照回測一文逐步說明匯入後要核對哪些設定,PowerLanguage 策略對照檢查清單則列出時段、成交方式、手續費等要逐項對齊的項目。
下一步:打開你目前跑的那支 MultiCharts 當沖策略的回測報表,先讀「在市場時間」,再把交易明細按出場時間排序,看最晚的一筆是幾點。如果有任何一筆晚於你設定的平倉時間,回到第三節,把平倉條件往前移一根 K 棒再跑一次。
常見問答
MultiCharts 當沖收盤前幾分鐘平倉怎麼寫?
寫一段只看時間和部位的獨立條件:Time 大於等於設定值且目前有部位,就用市價單全部平倉,不加任何指標。設定值要比收盤早至少一根 K 棒再加一根緩衝,因為條件在 K 棒收盤才成立、下一根才成交。日盤 5 分鐘棒常用 13:35 或 13:40,15 分鐘棒要提早到 13:30 或更早。
日盤和夜盤的時間條件怎麼分開處理?
日盤時間從 845 遞增到 1345,一條「大於等於且小於」就能圈出時段。夜盤從 1500 到 2359 再跳回 0000 到 0500,同一條式子沒有任何時刻能成立,必須拆成「Time 大於等於 1500」或「Time 小於等於 450」兩段。夜盤的平倉時間落在凌晨,數字比進場時間小,也要另外寫。
一天只進場一次用 EntriesToday 就夠了嗎?
日盤夠用,因為日曆日就是交易日,EntriesToday 傳入 Date 大於零就不再進場。夜盤跨午夜後 Date 可能換成隔天,EntriesToday 會把同一個夜盤當成兩天,可能進場兩次。夜盤要自己維護一個旗標,以 15:00 開盤作為新交易日的起點歸零,而不是看 Date。
回測報表的在市場時間多少才算正常的當沖?
日盤當沖每天最多從開盤後持有到收盤前,圖表若含夜盤資料,在市場時間的上限大約三成;只有日盤資料時會高一些。只要有任何一筆過夜,數字就會明顯跳高。看到接近九成,表示時間出場沒有生效,先去交易明細按出場時間排序找出過夜的那幾筆。
SetExitOnClose 在實盤和回測的行為一樣嗎?
回測裡它在時段最後一根 K 棒的收盤價成交;實盤時這筆市價單要在收盤前送出並找到對手方,成交價取決於當時的流動性。兩種情況下它都只看交易時段範本的收盤,範本改了行為就跟著變。把它當備援,主出場用自己寫的時間條件。
參考文獻
- Taiwan Futures Exchange. Mini-TAIEX Futures. https://www.taifex.com.tw/enl/eng2/mTX
- CME Group. E-mini Nasdaq-100 Futures Contract Specs. https://www.cmegroup.com/markets/equities/nasdaq/e-mini-nasdaq-100.contractSpecs.html

