【單元4】PowerLanguage的基本構成元素

如果把寫交易程式比喻成”樂高積木”,上一篇「PowerLanguage的基本運作規則」我們介紹了這套積木的玩法,接下來這篇要讓讀者先瀏覽一遍有哪些不同樣式的積木可以拼,也就是來認識PowerLanguage的基本元素以及重要的語法保留字,這樣可以幫助我們很快地可以依著範例(積木成品示範圖),先能快速寫一些基本交易策略(學會拼完整一些簡單的積木成品),不僅增強信心,能先寫出一隻策略,接著績效回測、調整乃至於小規模上線自動交易,如此完整跑過一次,也有助於快速對程式交易建立一個概觀,之後再透過不斷地實作與觀摩,就能漸漸掌握PowerLanguage語法開發各種交易指標或策略。
 
 
>>讀完本文您可以學到什麼?
1. PowerLanguage的基本構成元素
2. 從拆解實例看程式碼結構

拆解程式碼看結構與元素

下面這段程式碼是MultiCharts內建的MACD多單進場訊號(「MACD LE」,可以從PowerLanguage Editor開啟舊檔找到):
 
 
在這短短幾行程式碼,呈現出的是一個程式所具備的基本元素:參數/變數、函式、各種運算、控制流程等等。眼尖的讀者可以發現,在PowerLanguage中各個元素會以不同顏色做為區隔。接下來我們就一一介紹這些組成元素。

標點符號

這個最基本簡單,先寫在前面:

標點符號

功用

;

分號:每一行程式碼的結束就是用分號。

:

冒號:用的機會很少,幾乎就是宣告變數或參數時派上用場。

()

小括號:在宣告參數或變數時小括號內為預設值及預設型態;在運算式時,小括號的用法也跟我們一般用法一致,例如:(close+high)/2

[]

中括號:變數或保留字後面加中括號為取前值的意思,例如High[1]為取前一根K棒高點。

{}

大括號:兩個大括號間的程式碼在執行腳本時會略過,可以用來做一些註記或是程式打草稿或修訂之用。

//

雙斜線:主要是用來短註記用,在執行腳本時會略過雙斜線後面的文字,放在程式碼的每一行之後(分號之後),可以簡短註記一些說明,以利後來或是他人理解程式碼的要點。

參數/變數

在程式運算過程,我們需要虛構一些數值或名稱,以利表達跟運算,就好比我們中學學的代數公式y=ax+b,也是同樣道理。我們在後面另有章節深入講解參數與變數,這邊先概略介紹。
  • 參數(Inputs):範例中的MACD訊號我們宣告了3個參數,括弧內的數值為該參數的預設值,讀者有沒有很眼熟,正是我們常常使用的MACD的3個大眾參數(12,26,9)。
  • 變數(Variables):變數用途很廣,也有各種不同類型的變數。變數宣告後可以任意引用,更多時候是為了更有效率寫程式或運算所創造出了的。
參數與變數最大的差別,參數經由宣告後,在程式腳本執行過程中參數值是不變的,而變數,還記得我們上一篇講的PowerLanguage的運行邏輯是每根K棒都執行一次程式腳本,變數則會隨每次腳本重新執行而重新運算而改變,或是也可透過程式碼在程式中任一地方指定新的值給變數。 

常用保留字(關鍵字)

學程式語言某個角度來講跟學外語很像,進入任何教程前就是要先把最最基本的常用字詞背起來,先將生字變”熟”字,再到句子再到文章段落,逐步把整套語言給學會。
 
保留字(或稱關鍵字)就是PowerLanguage內建基本字詞,這邊先列出最基本的常用保留字及其用法,後面有專章加強介紹。
 
  • K棒資訊相關保留字

保留字

功用

Open

開盤價。可簡寫成「O」

High

最高價。可簡寫成「H」

Low

最低價。可簡寫成「L」

Close

收盤價。可簡寫成「C」

Ticks

分線成交量

Volume

日線以上的成交量

 

  • 交易相關保留字

保留字

功用

Buy

多單進場

SellShort

空單進場

Sell

多單出場

BuytoCover

空單出場

Stop

停損單

Limit

限價單

Market

市價單

 

  • 介詞

保留字

功用

at

沒有作用,亦可省略。純粹是讓程式腳本更容易閱讀。

on

a / an

of

函式

PowerLanguage已經有內建大量可以直接套用的函式,這對我們寫交易策略或指標大有幫助,例如上例MACD策略,我們直接套用MACD相關的函式,不出幾行程式碼就可以些出來,而不用從頭自己寫MACD的運算程式。我們再以最常用的計算平均值的函式Average為例,解說函式用法:
 
Average(Price, Length);
 
其中括弧內為兩個計算該函數所需參數,Price可以是開高低等收價格值或是任何變數,Length就是要回頭算幾個Price的平均值。例如average(close,10)就是計算10MA。
 
當然我們也可以自己寫函式,例如把台指結算日的判斷寫成函式,以方便之後有需要的交易訊號程式腳本可以立即引用。在後面的章節我們有一篇常用的函式介紹,讓初學者先把幾個很常用的函式先學起來。

數學運算式

數學運算子很簡單,如同我們所學的基礎數學加減乘除,運算規則也一樣是先乘除、後加減,先括號內、後括號外。
 

運算子

說明

+

-

*

/

^

指數(次方)

關係運算子

運算子

說明

大於

小於

>=

大於或等於

<=

小於或等於

=

等於

<> 

不等於

cross over

向上穿越(黃金交叉),又可以寫成cross above

cross under

向下穿越(死亡交叉),又可以寫成 cross below

其中cross over 及cross under很常用到,我們把它歸類到此,特別要留意「cross」中文解釋為「穿越」,與「>」或「<」有所區別,以我們常用到的長短兩條均線為例,cross over 其實是要同時符合當根K棒短均值大於長均值,且前一根K棒短均值小於長均值之下,而「>」或「<」符合範圍則廣的多。在實務撰寫策略時,初學者常錯用,導致條件太嚴苛或太寬,影響整個策略輸出結果。

控制流程

所謂寫程式換一種講法就是下指令給電腦,下指令終極語法就是:如果符合條件就去做動作,有時候條件不只一個或是要求執行複數個動作,甚或是我們要告訴程式符合條件則執行A,反之執行B,諸如此類我們統稱為「控制流程」,也可以說是整個PowerLanguage最核心的語言,有了控制流程整個程式腳本才能具備功能,為我們所用。我們後面會有專章介紹各種控制流程的語法與實例,這邊各位初學者先認識兩個最基本的:
 
  • If…Then…(如果符合條件就去執行A單一動作)
 
範例:如果5MA向上交叉20MA,下根K棒就市價買進。
 
If average(close,5) cross over average(close,20) then buy next bar at market;
 
  • If…Then Begin…End(如果符合條件就去執行A、B、C…等複數個動作)
 
範例:如果5MA向上交叉20MA,下根K棒就做兩個動作,一個是市價買進,另一個動作是發出警示。這邊要特別留意那些地方有放分號(;)作為斷句,那些則沒有。
 
If average(close,5) cross over average(close,20) then begin
     Buy next bar at market;
     Alert;
End;

快速結論

這一篇我們把語法腳本拆解成數個基本元素,帶領各位讀者先有初步認識並建立寫交易程式概觀,本文中我們多數以平均數函式(Average)來做為示範解說,相信即便是新手讀者應該也對這各函式一回生二回熟了,最後本篇教學以一個作業當作小結,請讀者試著寫寫看「當乖離過大時逆勢進場」的語法。
 
作業:當乖離過大時逆勢進場。
提示:如何定義乖離,我們可以借用技術指標Bias觀念,假設收盤價與10日均線的距離超過100點就視為乖離過大。
 
如果讀者可以順利完成上述作業,表示你已經初步掌握PowerLanguage這個”樂高積木”玩法,可以運用基本的保留字以及函式來下達指令給程式,要求程式在符合條件時執行特定動作。也希望做完這個練習,能進一步加強信心,在接下來的教學裏,我們要教大家更深入認識PowerLanguage各項元素以及用正規的寫法來完成程式腳本。