計算區間漲跌幅的自訂函數
2016-03-10 17:11:39
5

 

 

在今天這一篇文章內要來跟大家說明一下函數的用途,什麼是函數,怎麼寫一個函數,以及如何在其他的腳本內運用自訂函數。

在設計XS的腳本時,可能會遇到一些在其他腳本內也會引用到的邏輯,例如我可能在好幾種選股法內都會想要檢查某個區間的漲跌幅,或者我可能在策略雷達內也想要依照某個區間的漲跌幅來做篩選。當腦袋裡面有這樣子常用的邏輯出現時,我們就可以試著把這段邏輯寫成一個XS的自訂函數,然後在不同的腳本內去引用這個函數,以後如果這個邏輯有需要調整的話,就只需要修改自訂函數的內容,不需要每個腳本都還要去調整。

撰寫自訂函數的方式跟撰寫腳本沒有很大的差別。首先從XScript編輯器內,點選檔案/新增,這時候要記得要選函數這個選項,然後輸入一個名稱,這個名稱必須是英文的。另外在此時也要決定這個函數做完之後要回傳什麼樣子的資料給使用函數的腳本。

以計算區間漲跌幅這個函數而言,我們希望算出來的數值就是漲跌幅,所以我們就選擇「數值」,表示這是一個數字。其他的選項還包含字串,或是邏輯值(True/False)。

0401_1

 

設定好了之後,按確認,接下來就跟寫其他腳本一樣可以開始寫函數了。

 
 input:price(numeric);
 input:startday(numeric);
 input:endday(numeric);

 value1=getbaroffset(startday);
 value2=getbaroffset(endday);

 value3=(price[value2]/price[value1])-1 ;
 rangechange=value3*100;

有幾個撰寫自訂函數腳本時,要稍加留意之處:

  1. 自訂函數的名稱一定要是英文的,
  2. 在訂定函數內有一個特殊的變數,他的名字就是這個函數的英文名稱。如果計算完成之後要把數值回傳的話,必須把數值傳給這個變數。注意看上面這個例子內的這一行裡面的rangechange就是這個函數的名字,所以這一行表示這個函數算完之後的回傳值就是value3 * 100:

    rangechange=value3*100;
    

  3. 自訂函數一樣可以使用input語法來設定參數。可是參數名稱後面括號後不能直接打預設值,而是要寫這個參數的資料格式:如果是數值的話,就寫Numeric,如果是字串的話,就寫String,如果是邏輯值的話,就寫TrueFalse。其他還有更複雜的傳遞格式,就容我們在其他文章內再為大家介紹。

有了這個函數,要寫區間漲跌幅的選股腳本就容易多了:

input:startday(20150702,"區間起始日");
input:endday(20151002,"區間結束日");
input:ratio(10,"最低漲幅");

value1=rangechange(close,startday,endday);
if value1>=ratio
then ret=1;
 
value2=GetField("最新股本");
value3=GetField("月營收年增率","M");
value4=GetField("股價淨值比","D");
outputfield(1,value1,1,"區間漲跌幅");
outputfield(2,value2,0,"股本(億)");
outputfield(3,value3,1,"月營收年增率");
outputfield(4,value4,1,"股價淨值比");

除了計算區間漲跌幅之外,在這個腳本內我們也使用了outputfield的方式,把我們想要觀察的欄位都印出來,方便一起檢視。

根據這個選股腳本,從今年一月三日到昨天,漲幅超過三成的股票如下:

20160310c-02

一共35檔股票,從這些檔位中可以發現:

1.股本除了中鴻144億之外,全部都在40億以下,30億以上的也只有鎧勝及揚智兩家。

2.接近三分之二的股票月營收年增率有兩位數成長

3.其中一半股價淨值比在二以下。

有了區間漲跌幅這個自訂函數,以及outputfield這個輸出特定資料欄位的語法,我們可以很快的挑出特定區間漲幅或跌幅超過一定比例的股票,並且以我們希望呈現的欄位,加以排序。這對我們在作功課時,有不少的幫助。