EasyLanguage 與 PowerLanguage 的差異:搬移策略時會變什麼
大部分策略程式碼在 EasyLanguage 與 PowerLanguage 上都能編譯。差異出在少數平台專屬關鍵字、各平台在 K 棒內成交委託的方式,以及交易時段、時區與轉倉方式等圖表設定。先把這些設定調成一致,再逐筆比對交易明細。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
目錄
EasyLanguage 與 PowerLanguage 有哪些相同與不同?
策略的大部分內容可以原封不動地在 EasyLanguage 與 PowerLanguage 之間搬移:變數、輸入參數、條件、委託語句、序列參照與常用內建函數,在兩邊都能編譯。會變的是一薄層平台專屬關鍵字、各平台在 K 棒內成交委託的方式,以及寫在程式碼之外的圖表設定,例如交易時段、時區與轉倉方式。
EasyLanguage 是 TradeStation 平台的程式語言。PowerLanguage 是 MultiCharts 的程式語言,設計上就是要能接受 EasyLanguage 程式碼。序列參照是讀取過去數值的方式,例如一根 K 棒前的收盤價;兩種語言的寫法相同。買進、放空、出場,以及市價單、停損單與限價單的委託語句,在兩個平台上讀起來也一樣。
可以把它想成同一家工廠出的兩輛車,儀表板不同。引擎和踏板都一樣,所以兩輛都能馬上開。你要檢查的是少數標示不同的開關,以及出車庫前自己選好的設定。對策略來說,「車庫裡的設定」就是圖表設定:交易時段範本、時區、K 棒內解析度、成交規則與合約轉倉。程式碼相同但圖表設定不同的兩個平台,交易的是不同的歷史,這正是大家比較回測時多數意外的來源。
AlphaPrime(Valynox)可把同一個生成的策略同時匯出為 EasyLanguage 與 PowerLanguage,這些都列在平台匯出頁面的平台之中。本文其餘部分就是讓兩個版本交易同一批 K 棒的檢查清單。
哪些關鍵字與函數的行為不同?
只有一小部分項目只存在於其中一個平台,或行為不同,所以搬移的起點是在程式碼中搜尋這些項目,而不是整份重寫。下表依你該採取的做法分組。
| 程式碼項目 | EasyLanguage | PowerLanguage | 該怎麼做 |
|---|---|---|---|
| 委託語句(市價、停損、限價;下一根 K 棒、本根收盤) | 相同 | 相同 | 不需更改 |
| 序列參照與資料流(一根 K 棒前、第二個資料序列) | 相同 | 相同 | 不需更改 |
| 輸入參數、變數、陣列、編號條件 | 相同 | 相同 | 不需更改 |
| 輸出與警示輸出 | 語句相同;輸出到平台自己的記錄視窗 | 語句相同;輸出到 PowerLanguage Editor 的輸出視窗 | 檢查寫入磁碟時使用的檔案路徑 |
| 檔案與 DLL 呼叫、物件導向程式碼 | 物件導向的 EasyLanguage 類別與命名空間僅限 TradeStation | 無法編譯物件導向的 EasyLanguage | 改用一般函數或移除 |
| 資料來源、商品、帳戶與投資組合函數 | 平台專屬的一組 | 平台專屬的一組,包含 Portfolio Trader 關鍵字 | 逐一檢查;換成另一個平台的對應項目 |
| K 棒內委託產生 | 程式碼最上方的屬性 | 同樣的屬性,另加圖表中訊號層級的設定 | 兩個平台設成相同的值 |
實用的做法是搜尋,而不是從頭讀到尾。打開程式碼,搜尋下方幾列的類別:任何向平台查詢商品、資料來源、帳戶或投資組合的內容;任何開啟檔案或呼叫 DLL 的內容;任何使用類別或命名空間的內容。編譯器標出的問題都會落在這幾列。一個只用移動平均、通道以及停損與限價出場的單純指標策略,通常完全不用修改就能編譯。
這裡編譯器是你的好幫手。在改動任何東西之前,先在目標平台上編譯程式碼。錯誤清單會明確告訴你哪幾行需要處理,而且比你手寫的任何清單都短。
委託成交與 K 棒內設定有何不同?
同一條委託語句在兩個平台上可能以不同的價格或時間成交,因為每個平台都有自己的 K 棒內解析度設定、對同一根 K 棒進場與下一根 K 棒進場的預設值,以及對落在 K 棒範圍內的停損與限價的規則。在比較任何結果之前,必須先讓這些設定等效。
K 棒內解析度是指回測在判斷停損或限價單會在哪裡成交時,往 K 棒內部看得多細。沒有 K 棒內解析度時,平台只看得到每根 K 棒的開盤、最高、最低與收盤價。若停損價位落在這個範圍內,就假設在停損價位成交,而 K 棒內事件發生的先後順序是未知的:平台無法分辨價格是先碰到你的停損還是先碰到你的停利。有了細的 K 棒內解析度,平台會載入更小的 K 棒(例如 30 分鐘圖底下的一分鐘 K 棒),並沿著 K 棒內的價格路徑走。TradeStation 稱這個功能為 Look-Inside-Bar Back-Testing;MultiCharts 稱之為 Bar Magnifier。兩邊都有這個功能,但預設狀態與所選解析度要在各平台分別設定。
假設性範例
某策略持有一口指數期貨多單,停損在 20,000,停利在 20,060。一根 30 分鐘 K 棒以 20,030 開盤,上漲到 20,065,下跌到 19,990,並以 20,010 收盤。沒有 K 棒內解析度時,一個平台可能記錄為先碰到停利,另一個則記錄為先碰到停損,因為兩個價位都在同一根 K 棒內。在 30 分鐘 K 棒內載入一分鐘 K 棒後,兩個平台都看到價格在第 7 分鐘到達 20,065、在第 22 分鐘到達 19,990,並都記錄為在停利價獲利的一筆交易。兩種判讀之間的差異是一筆交易 60 點(20,060 減 20,000),來自設定而不是程式碼。
第二項設定是 K 棒內委託產生。K 棒內委託產生是一項讓策略程式碼在每個跳動點執行、而不是只在每根 K 棒收盤時執行一次的設定,因此委託可以在當根 K 棒內成交。預設情況下,兩個平台都在 K 棒收盤時評估一次程式碼,為下一根 K 棒下的市價單在下一根 K 棒的開盤成交。兩個平台在程式碼最上方都支援相同的屬性,但 PowerLanguage 平台在圖表中還有訊號層級的設定,可能改變行為。如果一個平台在 K 棒內執行程式碼,另一個在 K 棒收盤執行,幾乎每筆交易的進場時間都會不同。
第三項是 K 棒開盤就越過價位時,停損或限價單如何成交。檢查各平台如何處理在開盤時被跳空穿過的停損單,以及只被觸及、未被穿越成交的限價單。閱讀各平台文件了解其確切規則,並把兩邊都設成較保守的選項。AlphaPrime 的回測在評估每個候選策略時納入手續費、滑價與下一根 K 棒執行,也就是上面所述的「K 棒收盤後於下一根 K 棒成交」模型,所以從它匯出的策略,在兩個平台都採用下一根 K 棒進場時最容易比較。
比較前,哪些資料與交易時段設定必須一致?
交易時段範本、時區、K 棒建立規則、連續月的轉倉方式與最大回看 K 棒數,都是在圖表中設定,而不是在程式碼裡,而且每一項都會改變存在哪些 K 棒,所以下表列出它們不同時會出什麼問題。
| 設定 | 它改變什麼 | 不同時會怎樣 |
|---|---|---|
| 交易時段範本 | 一天中哪些時段會被轉成 K 棒 | 一個平台有夜間 K 棒,另一個沒有;每日最高價、最低價與開盤價不同 |
| 時區 | 每根 K 棒上標記的時間 | 時段篩選條件在不同的市場時點觸發;30 或 60 分鐘 K 棒可能從不同的偏移開始 |
| K 棒建立規則 | 時間 K 棒從哪裡開始(交易時段開盤或整點)以及成交量如何計算 | K 棒邊界位移,因此每個指標值也跟著位移 |
| 連續月轉倉 | 每根 K 棒取自哪個合約月份,以及價格是否做了回溯調整 | 價格跳空出現在不同日期;停損與通道在轉倉前後位於不同價位 |
| 最大回看 K 棒數 | 平台在第一筆交易可發生之前保留多少根 K 棒 | 交易從不同日期開始,因此最初幾筆交易對不上 |
交易時段範本是平台把一天的交易轉成 K 棒時所用的開盤與收盤時間清單。交易時段範本是變動最大的設定。全時段範本涵蓋日間與夜間或隔夜交易;僅日盤範本只涵蓋現貨市場時段。同一個策略在全時段圖表上,看到的開盤價是夜盤開始時的價格,而在僅日盤圖表上看到的是日盤的開盤價。因此,任何用到當日開盤價、當日最高價或開盤區間的規則,即使程式碼相同,在兩張圖表上也會產生不同的訊號。交易所會不定期更改交易時段,所以請從交易所的合約頁面取得最新時段;期貨交易時間工具會依交易所與交易時段,以你自己的時區顯示。
時區排第二。每個平台都有自己的時區設定,選項包括交易所時間、當地時間或 GMT。如果一張圖表用交易所時間,另一張用你的當地時間,像「只交易第一個小時」這樣的篩選條件,選到的會是市場交易日中不同的一小時。轉倉排第三:每個平台建立連續月時,都有自己的轉倉日期規則與回溯調整選擇,所以兩邊要用相同的規則建立;或者,在平台允許匯入 K 棒資料時,匯出一個 K 棒檔案並在兩邊載入。回測資料品質文章對跳空、時區與轉倉有更深入的說明。
最大回看 K 棒數是平台預留的 K 棒數量,讓程式碼中的每個指標在可進行交易的第一根 K 棒之前,都有足夠的歷史資料。每個平台都有自己的預設值,以及自動偵測該數字的方式。如果一張圖表預留 50 根 K 棒,另一張預留 200 根,第二個平台就會較晚開始交易,兩份交易明細從第一天起就錯開了。
應該依什麼順序搬移策略?
請遵循固定順序:先資料,再設定,再程式碼,最後才比較。先做比較會浪費好幾個小時去找其實來自交易時段範本或成交設定的差異。
- 讓兩個平台放上相同的 K 棒。在平台允許匯入 K 棒資料時,把一個平台的 K 棒存成文字檔,在另一個平台載入該檔案;不允許時,兩邊使用同一個資料供應商,並檢查某個測試日的第一根與最後一根 K 棒,在相同時間戳記上具有相同的開盤、最高、最低、收盤與成交量。共用的 K 棒檔案一步就能把轉倉、資料來源差異與 K 棒建立規則從比較中排除。
- 設定交易時段範本與時區。兩張圖表使用相同的交易時段,並以相同的時區顯示。檢查每張圖表某一天的第一根與最後一根 K 棒;它們應該有相同的時間戳記。
- 設定 K 棒內解析度與成交規則。讓兩個平台的 K 棒內解析度切換到相同的狀態與解析度,並把 K 棒內委託產生設成相同的值。接著設定相同的最大回看 K 棒數。
- 設定手續費與滑價。在兩個平台輸入相同的每口手續費與相同的單邊滑價。沒有這一步,交易明細可能完全吻合,權益曲線卻仍對不上。回測中的交易成本一文說明如何選擇這些數值。
- 編譯並修正被標出的關鍵字。在目標平台編譯程式碼。依上方關鍵字一節的表格逐項處理錯誤清單。編譯器沒標出的東西一律不要動。
- 對齊交易明細並比較。從兩個平台匯出交易明細,依進場時間配對交易,做法見下一節。
如果在第六步交易有差異,要回到第三步,而不是第五步。幾乎每筆交易的進場時間都不同,指向 K 棒內委託產生。停損出場的出場價格不同,指向 K 棒內解析度。從某個特定日期開始出現的差異,指向轉倉或最大回看 K 棒數。程式碼是最後才懷疑的對象,因為編譯器已經抓出兩種語言的不同之處。
如何在相同的 K 棒上測試兩個平台?
在兩個平台載入相同的 K 棒,以相同的成本與成交設定執行策略,依進場時間對齊兩份交易明細,並以相符的交易筆數與以跳動點衡量的價格差異來判斷是否一致,而不是只看最後的權益數字。AlphaPrime 的績效報表會列出策略的每一筆交易,這就是配對時的其中一份清單,可以依進場時間對齊各平台的交易明細。
最後的權益數字會隱藏你需要知道的事。兩個平台可能得到相近的期末價值,卻有一半的交易不同;也可能因為轉倉日附近的一筆交易,權益出現很大的落差,而其他所有交易都吻合。逐筆比較能告訴你是哪一種情況。步驟如下:
- 匯出兩份交易明細,包含進場時間、方向、進場價、出場時間與出場價。
- 兩份都依進場時間排序,並在試算表中並排放置。
- 把第一個平台的每筆交易,與第二個平台中進場時間與方向相同的交易配對。沒有對應者的交易就是未配對交易。
- 對每一組配對,寫下進場價差與出場價差,以跳動點表示。跳動點是合約最小的價格變動單位,所以這樣能讓每個合約處於同一個尺度。
- 計算價格相同的配對數、相差一個跳動點的配對數,以及相差兩個以上跳動點的配對數,並列出未配對交易與其日期。
假設性範例
某策略在同一份 K 棒檔案上,於每個平台各產生 40 筆交易。依進場時間配對後,有 39 組對得上,另有一筆交易只存在於其中一個平台。這 39 組中,34 組的進場與出場價相同,3 組的出場價相差一個跳動點,2 組的出場價相差兩個跳動點。這 5 個有價差的案例全都是停損出場。那筆未配對的交易落在合約轉倉日。結論很清楚:程式碼的行為相同,停損成交上的 K 棒內解析度仍略有差異,而轉倉設定在某一天不同。兩者都是圖表設定,也都有已知的修正方式。
好的結果是什麼樣子?幾乎每筆交易都配對得上,大多數配對的價格相同,少數的價格差異可以用某個指名的設定解釋。壞的結果是什麼樣子?大量未配對的交易,或差異平均分布在所有出場類型,這代表兩個平台並非在相同的時點評估程式碼。這時請回到 K 棒內委託產生與交易時段範本。PowerLanguage 比對檢查清單涵蓋了把策略搬到 PowerLanguage 平台時所用的同一種對齊方法。
在看結果之前先決定你的容忍度。當兩個平台使用不同的 K 棒內資料時,部分停損成交相差一個跳動點是正常的;但存在哪些交易不同就不正常。先把容忍度寫下來,再進行比較,這樣結果才不會改變你的標準。
如果你使用 AlphaPrime,這代表:一個策略的 EasyLanguage 版本與 PowerLanguage 版本,是由同一組生成的規則與已採用下一根 K 棒執行、手續費與滑價的回測寫成的,所以兩個平台對不上時,原因幾乎都是圖表或成交設定,而上面的檢查清單就是找出是哪一項的方法。
常見問題
PowerLanguage 和 EasyLanguage 一樣嗎?
PowerLanguage 設計上就是要能接受 TradeStation 的語言 EasyLanguage 的程式碼,所以兩者幾乎共用所有語法。變數、輸入參數、條件、委託語句、序列參照與常用內建函數的寫法都相同。差異在於少數平台專屬關鍵字、只有 TradeStation 能編譯的物件導向 EasyLanguage 類別,以及向平台查詢商品、資料來源、帳戶或投資組合的函數。
可以把 EasyLanguage 程式碼直接複製到 PowerLanguage 嗎?
大多數以指標為基礎的策略可以:把程式碼貼到 PowerLanguage Editor 並編譯。編譯器會標出任何使用 TradeStation 專屬關鍵字或物件導向程式碼的行,只有這些行需要修改。比較大的工作不在程式碼,而在於對齊圖表設定,例如交易時段範本、K 棒內解析度與轉倉方式。
為什麼同一個策略在 EasyLanguage 與 PowerLanguage 的回測結果不同?
常見原因是圖表設定,而不是程式碼。不同的交易時段範本會產生不同的 K 棒;不同的 K 棒內解析度會讓停損在不同的價格成交;不同的 K 棒內委託產生設定會改變委託下單的時間;不同的轉倉規則會把價格跳空移到其他日期。在兩個平台載入相同的 K 棒,讓這些設定一致,再逐筆比較交易明細。
什麼是 K 棒內委託產生?
K 棒內委託產生是一項讓平台在每個跳動點執行策略程式碼、而不是只在每根 K 棒收盤時執行一次的設定,因此委託可以在當根 K 棒內下單與成交。EasyLanguage 與 PowerLanguage 在程式碼最上方都支援相同的屬性,PowerLanguage 平台在圖表中還有訊號層級的設定。請在兩個平台設成相同的值,否則幾乎每筆交易的進場時間都會不同。

