XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;visibility:hidden">

【單元6】認識變數(Variable)與參數(Input)


在單元4我們認識了PowerLanguage的構成要素、常用保留字以及運行邏輯等,其中變數(Variable)與參數(Inputs)部分我們要將在這個章節更深入介紹。變數幾乎是任何程式語言都會運用到,可以說是程式腳本最最最基本的要素之一,更複雜的運算與判斷都需要變數。參數則提供程式與使用者間更大的互動彈性,另外也牽涉到MultiCharts另一個重要功能-「參數最佳化」。

>>讀完本文您可以學到什麼?
1. 變數是什麼?如何運用?
2. 參數是什麼?如何運用?

變數(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;

上面的寫法以寫程式的角度來講算是"土法煉鋼",我們把參數與變數運用進來,讓兩行程式碼升等為正規的程式腳本,完整的程式碼如下: 

其中第一行以Inputs來宣告參數,這邊可用Input或Inputs。第二行以Vars來宣告變數,也可以用Variable或Variables,或是簡寫Var或Vars皆可。下面我們分別詳述使用方式。​

使用參數與變數主要有三項優點,一是增加程式腳本可讀性;二是增加彈性,可以實現更多複雜運算與判斷;三是提高程式執行效能,另外有了參數才可以使用參數最佳化功能。以下分別說明如何運用參數與變數。

變數(Variables)

我們先從認識變數開始。變數是用來儲存特定值(可以把變數想像成是一個容器),並在程式中需要時可以方便取用的工具。

  • 變數用法1:簡化運算與程式碼

一樣以上面範例說明,我們設了兩個變數MA1(0)及MA2(0),這兩個變數的功能就是儲存兩個計算移動平均線的值:

Vars:MA1(0),MA2(0);

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

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

變數名稱可以自行取名,好辨識為優,但PowerLanguage內建保留字就不允許再被用來當變數名稱,例如你不能取一個名為「High」的變數,在變數宣告時,括弧內也是我們指定的預設值,這個預設值同時決定了變數的資料型別 ( 數值、文字、布林值 ),絕大多我們會使用的變數都是數值型態,預設值直接設定為「0」即可。宣告多個變數間以逗號分隔。

  • 變數用法2:儲存特定條件下的特定值

寫到這裡再幫讀者複習一次PowerLanguage腳本運行邏輯,程式腳本是每根K棒執行一次,從第一根K棒開始執行,而在處理變數值,會從預設值開始,每根K棒會運算新的變數值並儲存,如果後面沒有任何相關運算(或是以語法阻斷程式運算),變數就會一直儲存之前的值(最後一次的運算值)

除了增加程式腳本可讀性,變數還有一個實用功效,就是用來儲存特定條件下的數值,舉例我們想紀錄當長短均線黃金交叉時該根K棒的高、低點,語法如下:

if Average(Close, 5) cross over Average(Close, 20) then  begin 
V
alue1=High;
Value2=Low;
End;

在這段語法中,當黃金交叉條件成立時,變數Value1會記錄該K棒最高價,Value2會記錄該K棒最低價(Value1、Value2為內建變數,不用宣告可直接使用),且在下一次黃金交叉前(條件符合才會再次運算),Value1、Value2都會一直儲存該值。讀者可能會問,在這個範例中交叉K棒的高、低點有何用途?用法很多,例如把交叉K棒視為關鍵K,黃金交叉後不立即進場,要等突破該K棒高點再進場,停損守該K棒低點,此時Value1、Value2就派上用場,在進場的掛價語法上,就是要指定此價格觸發進場。例如:

if ....(其他條件)  then buy next bar at value1 stop;  //突破交叉K高點多單進場
if ....(其他條件) then sell next bar at value2 stop;  //交叉K低點多單停損出場

  • 變數用法3:累加數值(計數)

想要達到「累計數值」效果,可以這樣寫:

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

依PowerLanguage運行規則,上述累加數值計算在從第一根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
…..以此類推

變數尚有許多用法與技巧,我們在後面的範例中會再跟讀者說明。

  • 文字變數與邏輯變數

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

Variable: Name("Intra-Day");    //文字變數
Variable: Overnight(False);      //邏輯變數

  • PowerLanguage內建變數

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

參數(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.文字型態:HighAlert(“”)
3.邏輯型態:NewHigh(False)

快速結論:

對於沒有寫程式基礎的人而言,變數或參數的使用需要比較多時間適應,特別是變數有許多操作技巧,透過多作範例觀摩與練習,即可漸漸上手。

延伸閱讀:【單元7】流程控制If…Then….

【警語】:

  1. 本文所舉之語法範例為教學之用,非提供交易策略,請讀者警慎運用。
  2. 自動交易如遇系統異常或斷線等問題,可能暴露更高的風險,交易人仍應檢查電腦系統或網路之狀態,特別要隨時注意部位變化,以降低相關風險。

點我,看更多程式交易教學https://www.pfcf.com.tw/eventweb/multicharts/

期貨線上開戶 期貨營業員專區
/統一期貨相關連結/
選擇權工具箱選擇權工具箱股票期貨工具箱
亞股指數工具箱程式交易工具箱期貨學起來
統一期貨FB統一期貨YouTube統一期貨LINE統一期貨IG