廣告常說:「男人過了四十歲,只剩一張嘴。」,連續二天的話當年後,當然不能只剩一張嘴話當年,本文要開始進入程式交易的主題,雖然前文描述是使用TradeStation為開發平台,但後來TS已轉為美國國內券商使用,在台灣MultiCharts(以下簡稱MC)已成為主流的平台,雖然在使用上還是有許多雷區要避開,但平心而論,這平台算是程式初學者很好上手的平台之一。
MC的程式類型主要分為三大類:
- 函式
是一組預定義的、可重複使用的程式碼。在程式中,函數用於執行特定的任務或操作,它可以接受參數(輸入)並返回一個值(輸出)。函數的主要目的是為了模組化程式,使得程式更易於維護和理解。 - 指標
是一種用於圖表上的視覺化工具,通常是以圖形或數值的形式表示的技術分析工具。指標通常基於歷史價格資料進行計算,用於説明交易者分析市場趨勢、波動性和交易信號。 - 訊號
是指基於特定條件和邏輯判斷而產生的交易指令。這些條件可以是價格穿越特定水準、指標的交叉、趨勢線的突破等。信號通常用於確定何時買入、賣出、開倉或平倉。
這樣的寫法最大的好處是提高程式的維護性及重用度,很多人貪圖方便,直接把計算邏輯或寫在指標上去觀察,等到要寫成訊號時,再把這段邏輯複製到訊號的程式碼中使用,這樣做雖然很直覺,但萬一修改指標的邏輯時,就必須記得更新訊號的程式,不然會造成二邊不一致的現象出現。
以下就以MC的PowerLanguage Editor手把手地來寫一個簡單的函式讓指標來使用。
計算邏輯如下:
「計算K棒是否連續N根創新高或連續N根創新低」。
首先在PowerLanguage新增一個函式,命名為:_ContinueBreakOut(筆者習慣在程式的命名以底線開頭,這樣的好處是在列表中很容易找到自行開發程式)。

點選左上角紅色框的地方,即可新增程式(函式、指標或訊號)
此函式判斷是否連續創高或創低,因此回傳的種類選擇布林值(TrueFalse)

輸入程式的名稱,選擇回傳TrueFalse
點選確認後,會出現空白的程式編輯區,我們可以在這個空白區域撰寫程式。

空白的程式編輯區
接下來要思考我們傳入那些參數來讓程式判斷:
- 連續N根
需要一個輸入參數來表示根數,命名為BarCount,簡單數字型態即可。 - 創新高或創新低
需要一個輸入參數來判斷要計算創新高或創新低,命名為Direction,簡單數字型態即可。
Inputs:BarCount(NumericSimple), Direction(NumericSimple);

傳入的參數名稱及型別
接下來,我們來思考程式的邏輯
- 由目前的K棒往前判斷,直到指定的K棒數為止,因此我們需要一個Counter的變數來進行迴圈判斷。
- 在判斷過程中,若判斷到一組不符合要求(未創新高或未創新低),則可以結束迴圈,以減少計算資源,因此再增加一個Result來存放回傳值。
Varibles:Counter(0), Result(True);

程式計算使用的變數
在這裹使用一個小技巧,我們把回傳結果先設為True(即假設為真),在判斷過程中,若有相鄰的兩根K棒不符合條件時,將此結果設為False(即未創高或低)後,中斷迴圈,然後回傳結果值,這種方式可以節省計算時間,不用完全判斷完所有的迴圈數。
Result = True;
If Direction = 0 Then
Begin
Result = False;
End
Else
Begin
For Counter = 0 To BarCount - 1
Begin
If (Direction > 0) And (High[Counter] <= High[Counter + 1]) Then
Begin
Result = False;
Break;
End
Else If (Direction < 0) And (Low[Counter] >= Low[Counter + 1]) Then
Begin
Result = False;
Break;
End;
End;
End;
_ContinueBreakOut = Result;

判斷是否連續創新高或創新低
程式最後以函式的名稱來回傳結果,當Result為True時,代表連續創新高或創新低。
讀者可以自行多加練習,增加自己可用的函式庫,方便日後指標及訊號的開發速度。