變數

By | 2015-05-26

什麼是變數?
我們用input來指定一個參數的值,這個值被指定後就不會變,例如我們寫一個腳本如下 :

Input:days(10);
If (close –close[days])/close[days] > 0.1
Then ret=1;

我們用這個腳本來請電腦在股價跟十天前相比,漲幅超過一成時,通知我們,在這個腳本裡,days是一個參數, 我們指定它的值是10,電腦看到days時,會去查我們設的值是多少,當電腦發現我們把days設定為10時,接下來只要在看到 days的地方, 電腦都當它是10來作運算,所以參數的值在我們指定之後,在所有這個腳本的任何一何敘述式中,只要看到這個參數名稱,它的值都是不會變的。

但我們在寫腳本的時候,常常除了參數之外,也需要把算出來的數字,以一個名字來代表,以方便後續的撰寫,這個數字很可能會隨著回傳值的改變而改變。
例如我們我們可能常用range這個名詞來代表一根K棒的高低點落差,所以它的公式是range=high-low,這個range就是個變數, 當high是50,low是45時,range=50-45,這時候range的值是5,但當K棒的high的high變成51,low變成47時,這時候range=51-47, 這時候range的值就變成了4。

我們以前上數學課時,常常會用到y=x+1之類的式子,意思是y這個值會是多少,就看右邊的計算式而定,當x的值變了的時候, y就跟著變,這裡的y就是一個變數。

所以我們可以把變數看成是一個標示了名稱的盒子,放進去的內容隨時可以被換掉,但盒子的名稱沒有變。
變數的宣告

vr2

要完成一個變數在腳本上的作用,共有三步驟 :

1. 宣告

宣告的作用在於告訴電腦,這是一個變數,請把它當變數來看待。
它的語法是 :
Variable : 變數名稱(0);………0是一開始這變數的初始值,您也可以宣告它的初始值是5或者其他任何字。 變數除了可以是一個數值之外,它也可以是一個回傳是或非的布林值,所以您也可以宣告一個變數它的初始值是”是”
Variable:變數名稱(true);
由於我們常指定變數,因此,為了減少無謂的打字力氣,也可以在宣告時,用var替代variable。
例如我們可以用 var:range(0); 這代表我們告訴電腦,我宣告了一個變數,它的名字叫作range。
如果我們要宣告不只一個變數時,我們可以用以下的語法 :
Var:x1(0),x2(0),x3(0),x4(0);
用逗號來區別變數即可。

2. 指定

宣告完變數之後,我們要作的事情就是指定,就像把文件放到盒子裡的動作,我們必須指定變數的值是多少?
例如 :

Var:range(0);
Range=1;

又例如 :

Var:range(0);
Range=high-low;

3. 應用

接下來我們就可以把變數拿來作為腳本中很重要的一個元素,例如上面我們提到的最近三天震盪一天比一天大的陳述,就可以寫成 :

Var:range(0);
Range=high-low;
Range>range[1] and range[1]>range[2] and range[2]>rnage[3];

變數的資料格式
由於在腳本中,我們要處理的資料,其格式有如上圖的時間,文字,布林值及數字等四種,因此在變數的宣告時, 我們用不同的預設值,來告訴電腦我們宣告的變數格式。

1. 宣告數字變數

先前我們已經學到用 :
Variable:變數名稱(0);
這樣的方式來宣告這個變數的資料格式是數字,如果您不想花力氣作宣告,系統也提供了不需要事先宣告的變數供您使用, 這些變數的名稱是從value1到value99共99個不必宣告就能使用的變數
因此,你可以用AV20這個變數來代表收盤價的二十期移動平均,你可以這麼寫 :

VAR:AV20(0);
av20=average(close,20);

如果圖個方便,又不怕記不得變數代表的意思,也可以寫成 :

value1=average(close,20);

這樣您就不必經過宣告的動作也可以直接拿任何一個前面是value後面是阿拉伯字母1~99的變數來用就可以了。

2. 宣告字串變數

要宣告字串變數,可以把預設的字串直接用雙引號放在小括號中,
例如想宣告一個預設值為”我是一串文字”的字串 ,你可以這麼寫 :

Variable: x1 (“我是一串文字”);

電腦發現你宣告的變數預設值是一個字串,就知道這個變數是一個字串,所以如果這時候你寫出x1+1這樣的敘述式, 編譯的時候電腦會告訴你”+”左右兩邊的型態不同。

3. 宣告時間變數

要宣告時間變數時,由於XS中的時間跟日期,分別是六位數及八位數的數字,所以電腦一開始並無法從你的宣告中知道這個變數代表的是時間還是數字, 一開始會把它當數字,但當你拿這變數來用在時間函數上時,電腦會把它拿視為時間。所以如果您寫出以下的腳本 :

Var:x1(090000);
Var:x2(20131115);
Value1=x1+x2
If time>090000
Then print(value1);

這樣下去編譯時電腦是會過的,因為電腦把這兩個變數當成數字來處理。
但如果在使用的時候搭配的時間函數,電腦會把這數字按時間格式讀成特定的時間,例如091250就是早上九點十二分五十秒。
所以根據這樣的規則,我們可以把XS當成一個鬧鐘,例如我們希望電腦在九點半的時候提醒我,我們可以這麼寫:

VAR:X1(090000);
If timediff(time,x1,”m”)>30
Then ret=1;

Timediff是一個時間函數,可以用來計算兩個時間之間是差了多久,當電腦看到x1出現在timediff這個函數裡,它會把它視為是一個時間格式, 從的預設值就會被對應到其時間格式去。

4. 宣告布林值變數

要宣告布林值的變數,作法上只要預設值填上true或是false,電腦就知道你取的這個變數是個布林值的變數。宣告的格式如下 :

Variable:A1(True);

宣告A1這個變數是個布林值格式的變數,它的預設值為True

跟數值變數一樣,系統也提供了一組不必宣告就可以直接拿來用的變數名稱,由condition1一直到condition99。
condition1這樣的內建變數,在撰寫要符合多個條件時才觸發警示的腳本時,特別有用。

變數與參數的差異
作為一個初學者,我們常會不知道何時用input來宣告參數,何時用variable來宣告變數。
最直接的判斷方式,就是它的功用是什麼? 如果是用來指定一個絕對值,並且希望這個絕對值在您想要更動時, 不必進到腳本改動很多個地方(同一個值),那麼你需要的是用input來宣告參數。
但如果你需要的是用它來代表一串運算的結果,當運算結果改變時,這數值也會跟著改變,純粹是為了撰寫腳本時方便, 那麼你需要的是用variable來宣告變數。 例如以下的腳本 :

Input: X1(10); 設定X1這個參數的預設值是10
Input: X3(5); 設定X3這個參數的預設值是5
Var: X2(0); 設定一個變數X2,預設值是0
Var: X4(0); 設定一個變數X4,預設值是 0
X2=average(close,X1); 指定X2是以X1為天期的收盤價移動平均值
X4=average(close,X3); 指定X4是以X3為天期的收盤價移動平均值
If X4 cross over X2 then ret=1; 不同天期腳本出現黃金交叉時就觸發警示

以這個腳本來看,是當五日均線對十日均線出現黃金交叉時,電腦會觸發警示,如果我們想改成六日均線突破十二日均線時觸發警示, 那麼我們只要把X1的預設值改成12,把X3的預設值改成6就可以了。
從這個例子,我們應該就可以清楚的看到參數與變數的差別。