2016年10月8日

變數(Variables)與參數(Inputs)宣告

在我們這篇「2行程式碼完成均線交叉策略」中,很直觀簡略地用兩行表達均線交叉訊號的程式碼如下:

If average(close,5) cross over average(close,20) then buy next bar at market;
If average(close,5) cross below average(close,20) then sellshort next bar at market;

進一步,我們把參數與變數運用進來,把兩行程式碼升等為正規的程式腳本,完成完整的程式碼如下: 


使用參數與變數主要有三項優點,一是增加彈性;二是增加程式腳本可讀性;三是提高程式執行效能。以下分別說明如何運用參數與變數。

變數(Variables)

變數是用來儲存特定值,並在程式中需要時可以方便取用的工具。一樣以上面範例說明,我們設了兩個變數MA1(0)及MA2(0),這兩個變數的功能就是儲存兩個計算移動平均線的值:

MA1=Average(Close, Len1);
MA2=Average(Close, Len2);

所以在後面要寫交易邏輯時,只要呼叫MA1及MA2就可以取代原本攏長的函式,如此使程式腳本更顯簡潔易讀,也提高程式執行時的效能。

除了增加程式腳本可讀性,變數也常運用來達成各種操控程式效果的功能,例如想要達到累計數值效果,可以這樣寫:

Vars:N(0);
N=N+1;

講這個範例前,再複習一次,PowerLanguage的腳本是每根K棒執行一次,而在處理變數值,會從預設值開始,隨後每根完成K棒所存的變數值,會做為下一根K棒的變數的初始值,再重新運算,當然如果後面沒有任何相關運算,N就會一直儲存之前的值(最後一次的運算值)。所以上述累加數值計算在從第一根K棒開始其值的變化就會是:
第1根K棒時:N=0+1=1(此時N以預設值0代入)
第2根K棒時:N=1+1=2(此時N以前值1代入)
第3根K棒時:N=2+1=3
第4根K棒時:N=3+1=3
…..以此類推

再舉一個變數進階運用的例子,我們的簡單均線交叉策略再變形,新的進場訊號為,當均線交叉我們並不立即進場,而是以黃金交叉那根K棒高點當作多單進場價,以死亡交叉那根K棒低點當作空單進場價,此時程式該怎麼寫?

Inputs:Len1(5),Len2(20);
Vars:MA1(0),MA2(0),th(0),HH(0),LL(0);

MA1=average(close,Len1);
MA2=average(close,Len2);

if MA1 cross over MA2 then begin
th=1; 
HH=high;
end;

if marketposition<>1 and th=1 then buy next bar at HH Stop;

if MA1 cross under MA2 then begin
th=-1;
LL=Low;
end;

if marketposition<>-1 and  th=-1 then sellshort next bar at LL Stop;

要讀懂這個程式碼先掌握幾個要點。第一先了解以下兩個語法表達的差異:

1.MA1 Cross over MA2:是一個動作,只有交叉那根K棒符合條件。
2.MA1 > MA2:黃金交叉後每一根K棒都會符合,直到死亡交叉。

程式碼中th這個變數的用法俗稱「開關」,運用廣泛,範例中的「開關」就是作多與作空模式的切換,如上,Cross over/under僅有當根K符合條件,如果希望交叉後的K棒仍具備進場條件,就可以用開關的方式來表達,這個技巧就是直到新的條件或計算變動前,開關都會維持原狀態「開」或是「關」。

再者,我們以HH及LL去存入符合條件的當根K的高或低,只要後續沒有再有新的均線交叉,HH及LL值就會一直保存住我們要的關鍵K高低點,這樣我們就可以在後面一直盯住這個價當作進場點,亦即之後每一根K棒都丟next bar委託單,直到符合條件成交或是多空條件變動為止。

跟參數的預設值一樣,宣告變數並指定預設值,同時也就定義出該變數的型態,變數一樣有數值、邏輯及文字三總變數型態。

此外,為方便程式撰寫,PowerLanguage也提供內建變數,可以不用宣告,直接使用:
1.數值類型變數:Value0、Value1、Value2、Value3….Value99,共100個數值類型變數。
2.邏輯類型變數:Condition0、Condition1、Condition2、Condition3….Condition99,共100個邏輯類型變數。

例如:
Value1=Average(Close, Len1);
Value2=Average(Close, Len2);

參數(Inputs)

使用參數取代一般常數,如此我們可以在程式腳本之外透過更改參數值的方式來調整(在MultiCharts中的屬性設定),大幅提高使用彈性,同時唯有宣告成為參數,該數值才能執行參數最佳化。

此外,不同於變數,參數一旦指定後在整個腳本運算中上就不會再改變。

一樣使用上面均線範例來方便讀者理解。範例中我們設了兩個參數Len1(5)及Len2(20),括弧中數值為預設值,分別是5及20。於是在計算5MA值及20MA值程式碼由:

Average(Close, 5)
Average(Close,20)
變成
Average(Close, Len1)

Average(Close, Len2)

由參數取代固定數值後,我們就可以在MultiCharts裏直接透過指標或訊號的屬性設定去更改參數,例如我們可以把短均線改成10MA,長均線改成30MA,無須再回到PowerLanguage Editor中去改程式碼。



指定參數的預設值同時也定義出該參數的型態,共有三總參數型態:

1.數值型態:Len(5)
2.邏輯型態:NewHigh(False)
3.文字型態:HighAlert(“”)



快速結論:
對於沒有寫程式基礎的人而言,變數或參數的使用需要比較多時間適應,這篇教學文恐怕也難以完整傳達,唯有透過多作範例觀摩與練習,才可漸漸上手。