Author Archives: 發財橘子

變數

什麼是變數?
我們用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就可以了。
從這個例子,我們應該就可以清楚的看到參數與變數的差別。

參數

我們在寫交易語法時,會用到一些常數, 如果我們直接把常數寫死在腳本中時,一旦要調整時, 要到腳本中去修改,這樣有時候不太方便,例如我如果寫了一個腳本想要找出收盤比前一天上漲5%以上的股票,但現在發現市場情況有些改變,想要改成上漲4%就出訊號,如果我必須進到編輯器裡去改,這時候如果程式寫的很長,要找到對的地方來改會很麻煩,改錯了,腳本就出錯了,這時候就可以用宣告參數的語法來處理,,讓我們直接在操作介面上就可以修改這個值,這個。

參數的宣告,用的語法如下:

input: length(5)

這代表我們在腳本上宣告了一個叫length的參數,這個參數系統內建的初始值為5

例如,我們要找跳空上漲1%的股票,原本我們會寫成 :
If Open/High[1]> 1+1/100
then ret=1;

但很可能改天我們會希望跳空上漲2%才通知我們,這時候怎麼辦呢? 我們可以把跳空上漲的百分比設成一個可以快速調整的參數, 使用者需要調整百分比時,只要更改這個數字即可,不必再進到腳本去修改數據。
例如上面的例子,就可以改寫成 :

input:no1(1);
If Open/Close[1]> 1+no1/100
then ret=1;

腳本如果改成這樣,當你要把跳空下跌超過1%改成2%時,只要調整參數值就行了。

我們也可以只宣告參數的型態,不需要一開始就給預設值,例如 :

input: length(numersimple) 代表這個參數是個簡單的數值
在設定參數時,我們用Input這樣的語法,不過如果我們參數設多了,就可能不記得那個參數是對應那個函數或那個指標, 這時候我們可以透過setinputname的語法,為每一個參數加上一段說明文字,它的語法如下:
Setinputname (n,”說明文字”);
在setinputname之後用小括號來包括兩個部份,n的部份代表的是第幾個參數,它的順序是按input語法在腳本中的先後順序而定, 要設定第一個input參數的說明文字時就填1,要說明第二個input就填2,以此類推。
在n的後面用逗點隔開說明文字,文字前後用雙引號來標示。請看以下的例子
input1

input2

透過setinputname的方式來設定參數名稱,當參數多的時候,就可以很清楚的看到每一個參數的名稱及其對應的內建值了,這時候要修改參數時就不會搞混了。

如果大家不想要這麼麻煩,也可以在input指令的預設值後面直接用雙引號來註明參數的名稱

例如 : input:priod(20,”計算期間”);

宣告參數是我們在撰寫腳本時,很常用的語法,大家務必要好好學會使用它。

函數

當我們有了開高低收成交量這些回傳值可以使用,也知道如何叫出時間序列上的每一根K棒來為我們利用來作運算之後, 很自然的,我們就可以計算出一個商品的其他有意義的數值。
例如 我們要計算五日移動平均,我們可以用以下腳本來表示 :

(close+close[1]+close[2]+close[3]+close[4])/5

所以如果要寫一個腳本是當股價突破五日移動平均時,請電腦通知我們,我們可以寫出以下的腳本 :

If close[1]<(close[1]+close[2]+close[3]+close[4]+close[5])/5 and close>(close+close[1]+close[2]+close[3]+close[4])/5
Then ret=1;

但在使用回傳值去運算一些數值時,如果我們就這麼平鋪直述的把運算過程寫出來,那麼當運算過程很繁複, 而我們要運算的次數又不只一次時,我們就會寫的很辛苦,而且很容易出錯。

例如上面的例子是五日移動平均,所以我們還可以close,close[1]…….的一直加上去,但如果是100日移動平均線, 那該怎麼辦呢?如果我們每次計算移動平均時,都得從第一根加到第n根再除以n,要是n大一點,那我們就會打字打到手酸。

所以在xscript上,我們加入一種叫作函數 的語法,這種語法讓我們可以把經常要計算的方法,用一個函數來表示, 例如5日收盤價的移動平均數我們可以直接寫成 average(close,5)
這樣上面的例子我們就可以改寫成 :

If average (close,5) [1] > close[1] and close > average (close,5)
Then ret=1;

在函數中,也不是收盤價才能拿來做為移動平均計算的價格,只要是每一根bar都會有的數值, 都可以拿來計算移動平均,連在這些回傳值基礎上計算出來的數值,也可以拿來用 。
函數的語法格式通常會有一個函數名稱,然後會有一個小括號,小括號裡頭會有回傳值(如上例中的close),會有一個或多個參數值(如上例中的5), 所以當您寫average(close,5)時,電腦知道您要的是收盤價的五期的移動平均值,如果您寫的是average(volume,100), 電腦會知道您要的是100期的移動平均量。

XS有把一些大家常用的運算方式都預先寫成函數,讓大家可以直接拿來使用,例如合計的概念,XS有提供一個 Summation的函數,它的語法是summation(價格,長度), 例如我們如果要算十日成交量的總合,我們可以寫成summation(volume,10),如果我們要計算最近五根K 棒的最高價平均,我們可以寫成

summation(high,5)/5

一百日均量,我們也可以寫成 :

Vlaue1=summation(volume,100)/100

其次,XS也把大家常用的指標做成函數,例如我們常用RSI,XS就也它預設成函數,所以如果你需要的是六日RSI突破十二日RSI,你只要直接寫 :

RSI (close,6) cross over RSI (close,12)

這樣就可以了。
另外有一種函數是用在兩個數值的比較的,這種函數後面不必帶回傳值及長度,直接把函數名稱擺在兩個數值中間就代表這兩個數值的關係, 我們在決定交易策略的時候,常會用到兩個專有名詞,一個叫黃金交叉 ,一個叫死亡交叉 。

黃金交叉的意思是有兩條線,當A線的前一個點比B線的前一個點低,但A 線的最近一點比B線的最近一點高,我們就稱為黃金交叉, 而其相反的情況就是死亡交叉,由於這兩種情況使用者實在太常用了,因此XS乾脆把這兩個都寫成預設的函數, 這種函數就是我們常說的黃金交叉及死亡交叉,這兩個函數的名稱分別為crossover 及crossunder。
在語法上如果A crossover B,代表A[1]<B[1]and A>B,也就是前一根K棒時,A值比B值低,但最近這根K棒時,A值已經變的比B值高, 也就是黃金交叉的意思,同樣的,如果A crossunder B,代表A[1]>B[1] and A < B 。
有了這兩個函數,上面的例子我們就可以寫成

RSI(close,6) crossover RSI(close,12)

一行敘述式就可以解決掉了。

換句話說,黃金交叉crossover的定義就是:
CrossOver = lineA > lineB and lineA[1] <= lineB[1];

而死亡交叉的話,我們用crossunder來表示 :
CrossUnder = lineA < lineB and lineA[1] >= lineB[1];

有了這兩個函數之後,當我們要寫兩個數值出現黃金交叉時,我們只要寫 A Crossover B就是A對 B出現黃金交叉, 相反的,當 A Crossunder B代表的就是A對B出現死亡交叉。
Crossunder與 Crossover串聯起來的這個述敘是一個邏輯判斷式,電腦會去判斷它是true還是false。
例如我們想要電腦在個股突破五日均線時發出警示,我們可以寫一個腳本如下:

If close crossover average(close,5)
Then ret=1;

當電腦在跑這個腳本時,如果引進來計算的商品符合close crossover average(close,5),也就是close crossover average(close,5), 這個敘述為true時,系統就會啟動觸發通知。
XS所支援的函數頗多,在腳本編輯器上的選單”說明”項下,有一個”使用說明”的選項,按這個選項或直接按F1,就可以直接連到說明的網頁。

輸出語法

在撰寫語法的過程中,我們一行行的寫著敘述式,希望電腦照著我們的意思,拿著開高低收成交量這些數據去運算,運算總會有個結果, 我們會希望電腦根據這個結果,幫我們做點什麼,這裡說的什麼,就是電腦運算中所謂的輸出。
在XS的語法裡,輸出的方式,除了透過交易語法,進行自動化交易之外,還有幾種輸出的功能,分別如下表 ,茲分述如下

07_輸出語法_1
output

一,PlotN

Plot是在自設指標的時候用的,當我們寫了一個腳本之後,腳本的最後輸出基本上是分兩大部份, 一種是根據腳本把一個數值畫成一個自訂的指標,另一種則是在數值符合某種情況時,請電腦通知我們某商品已符合某條件這樣的警示訊息。 Plot就是用來請電腦幫我們把某數值繪成指標的語法。
OUTPUT1

例如 :
我們如果要把每天的收盤價繪製成一條線
我們可以寫plot1(close);
我們也可以在要繪圖的數值後面用逗號及引號來加註這數值
我們可以寫plot1(close,”收盤價”)
如果要畫兩條線,我們可以一條用 plot1,另一條則是plot2
例如以下的範例,如果我們想要畫兩條線,一條呈現K棒的總長度,另一條顯示K棒的實體長度,我們可以寫下以下的腳本 :

OUTPUT2

然後幫這個腳本取名為 ”K棒長度”
這樣子我們在XQ技術分析的頁面中,就可以透過選取自訂指標的方式,選取K棒長度這個腳本來繪圖,然後您就會看到如以下的圖形, 所以透過腳本的撰寫,你可以算出各式各樣的數值,然後透過PlotN這樣的語法,把這些數值一條一條畫在XQ技術分析的自訂指標中。OUTPUT3

二,RetVal

除了繪圖之外,其實最常用的是把腳本應用在警示上,讓電腦在運算後符合某種條件時,發出通知訊號,我們總是希望電腦在股票符合什麼條件的時候通知我們,這時候就用得上這個語法。
它的語法格式如下 :
Retval=1 或 retval=0
我們可以簡寫為 :
ret=1 或ret=0
Retval是return value的簡寫,XS的語法設定當Retvalue=1時電腦會觸動警示,所以如果你希望台積電股價突破150元時電腦可以通知您,就可以寫出以下的腳本 :
If close>150 then ret=1;
If …….then ret=1; 是很標準的警示觸發條件的撰寫格式。

三,Print
除了繪圖及警示之外,有時為了撰寫腳本時的除錯,校對資料 或是研究用,我們需要輸出特定的數值,這時候就需要print這個語法,它的語法格式如下:

OUTPUT4

例如我們想知道電腦今天有沒有把最新成交的數據送進來,我們就可以寫出以下的腳本 :

Print(CurrentDate,Open,High,Low) // 輸出 日期 開盤價 最高價 最低價

然後當我們拿這腳本去用台積電執行腳本時,在XS程式的PRINT檔案夾中,會有一個test_2330.TW………的文字檔, 當你打開這個檔案時,會出現像下面附圖之類的文字
OUTPUT5
電腦依據你要求的PRINT指令,把日期及開盤,最高,最低都印了出來。
Print這個功能,主要是可以拿來作研究用,舉個例子 :
如果我們想知道用RSI黃金交叉來作為台積電的買進訊號,隔天上漲的機率高不高? 我們可以寫一個腳本 :
OUTPUT6
然後在進階警示清單的介面上,用台積電這檔股票去跑最近300筆資料,系統會在 sysjust/XQ2005/XS/Print的目錄底下, 跑出一個文字檔,如果用excel去打開,可以看到如下圖的一個表 :

OUTPUT7

這個表就是根據我們要求的print格式所列出來的三個欄位,最右邊那一欄就是符合前一日rsi黃金交叉條件的當天收盤價減前一日收盤價的值, 從這個表我們可以看得出來,在出現rsi黃金交叉之後的隔天,台積電股價並沒有太高的上漲機率,所以我們大概可以了解, 如果在rsi出現黃金交叉時隔天進場買台積電,並不會賺到錢。
Print的功能主要就是可以自己訂定輸出的格式,這對作研究及想要改進腳本的人,是個很有用的功能,特別是現在在python上有非常多人工智慧的套件,我們可以透過print的功能,把透過XS語法計算出來的數據,拿到Python平台的 AI套件上去訓練模型。

四,RaiseRun TimeError

在撰寫腳本時,有時候當數據如果錯誤時,程式會出現錯誤,例如當除數是零的時候,這時候電腦就很容易卡在那邊, 或者有些腳本只適合日線,如果用在分鐘線,就可能要算很久且出來的結果也不能用,這時候這個Raiseruntimeerror就是一個很好用的輸出語法, 可以馬上通知電腦中斷執行,這樣就不會出現電腦當機之類的意外情況。其語法格式如下:

OUTPUT8

這個語法是在raiseruntimeerror這個字的後面加一個小括號,然後把想要輸出的文字用雙引號寫下來, 放在括號裡,當條件符合的時候,電腦會輸出雙引號通知使用者。
例如當我們要寫一個只適用在一分鐘線的腳本時,我們第一行可以像下面這樣寫 :

if barfreq <> "Min" or barinterval <> 1 then RaiseRunTimeError ("請設定頻率為1分鐘");

這麼一來,如果頻率不是設定為1分鐘線時,電腦一讀到這一行就會直接中止執行這個腳本,這樣就可以避免電腦執行一個不適於其他頻率的腳本。
例如我們用五分鐘線在台積電這個檔股票執行上面那一行敘述,電腦就會出現以下的訊息
OUTPUT9

常數

有了回傳值,運算子及標點符號,就可以組成陳述式。
例如: 如果我們想在商品跳空開高時電腦要通知我們,我們可以寫下以下的陳述式 :

Open>high[1]

但今天的開盤價要比前一開高點跳空多少你覺得才是你要的呢? 1%? 2%
這時候我們可以把一些數字加進來,我們可以寫成 :

Open/high[1]>=1/100

這一行的陳述式就變成不只跳空開高,而且最少要開高1%,在這邊,我們的腳本引用了兩個阿拉伯數字,一個是”1”,一個是”100”, 這兩個數字,不管open是多少,也不管high是多少,1就是1,100就是100,這樣的數字我們稱之為常數 。Djscript讀得懂的常數除了阿拉伯數字之外, 另外就是true 跟false 這兩個邏輯上常被拿來使用的字詞。
所以學到這邊,我們可以用回傳值、運算子、符號及常數來組成一個陳述式,例如可以寫一行陳述式如下 :

(High-low)/(high[1]-low[1])>1

這一個陳述式的意思是今天的震盪區間比前一天大。
Constant 為常數,使用者無法變動,但是可以使用,就像1,1就是1,永遠不會變。

標點符號

在學會使用回傳值及運算子之後,要完成一個敘述式,還必須要用到一些標點符號,這樣才能完整的完成一個電腦看得懂的敘述式。
完整的標點符號及其用途分別如下,有些我們目前還用不著,例如宣告參數及變數所用的冒號,但先了解一下電腦看得懂的標點符號及其用途是有必要的, 因為電腦是很死板的,它是死腦筋,該在腳本出現的每個標點符號,少一個不行,多一個也不行。

作為腳本註解的標點符號
這當中要特別說明的是 // 及{ } 這兩個拿來當註解用的符號,// 代表的是在這個符號後面那一行的文字全部會被電腦給忽略, 所以可以拿來當註解,{ } 大引號則是不管出現在那裡,有多少行,只要出現了,在兩個引號中間的所有內容,電腦都忽略。
所以如果只是在一行敘述式後面加上說明可以用 // ,但如果是一整段的敘述式要請電腦不要讀的話用{ } 大引號比較方便。

只要是 // 以後的同一行文字數字電腦都忽略,可用來當一行敘述式的註解
如果把 // 放在一行敘述式的最前面,就算後面照著語法寫,電腦還是會忽略 。
如果我們嫌 // 的後面的文字太長,一行寫不下,換行時,如果前面不再加個 // ,電腦會視為這是一行新的敘述式,會去讀它 , 這時編譯時也會發生錯誤。

但如果我們用 { } , 在大引號中間的所有文字電腦都視為註解,編譯時就不會理會這中間的內容了。

到這邊已經學會基本的程式交易語法內容了,我們不妨試著寫出幾個腳本
例如 以下的這個 :

volume > volume[1] and
volume[1] > volume[2] and
close < close[1] and
close[1] < close[2] and
close < open and
close[1] < open[1] and
close[2] < open[2]

這樣的寫法要表達的是 :
1. 前日量小於昨日,而昨日小於今日
2. 收盤價是今日小於昨日,且昨日小於前日
3. 今日收黑,昨日收黑且前日亦收黑
再例如以下的這個腳本 :

Close=open and close=high
And (high-low)>(high[1]-low[1]*2

這就是江湖人稱的蜻蜓十字 :
蜻蜓十字線
蜻蜓十字線

要符合這樣的K線型態有幾個要素 :
1.收盤價等於開盤價且是當天最高點 close=open and close=high
2.最近一根bar的下影線是前一根bar 高低點的兩倍以上 (high[0]-low[0])>(high[1]-low[1] *2

回傳值,運算子及標點符號,是組成腳本的最基本元素,學到這裡,算是最基礎的語法結構我們都學完了。

運算子

運算子的功用

在學會使用回傳值的概念之後,接下來,我們先來介紹腳本中,要串接回傳值,建立各種運算的關係時,所需要用到的元素, 這些元素,稱之為運算子(operator)。

我們必須靠這些運算子,把電腦幫我們準備好的回傳值,拿來作數學運算,比大小,作邏輯判斷, 如此一來,才能完成一個敘述。
例如open >high[1]這個陳述式,open與high[1]之間,就是透過>這個字來建立關係, 這些被拿來建立數值與數值之間關係的字,我們統稱之為運算字。

運算子的種類
Xscript所提供的運算子分成三大類,分別為數學運算子,關係運算子,邏輯運算子,茲分述如下:

數學運算子

這部份的運算子,大家都很熟悉,一共有四個,就是我們在小學數學課本裡學過的加減乘除, 這些基本的數學運算包括相加 “+”,相減 “-“,相乘 “*”, 相除”/”,以及等號”=”。
例如以下的敘述式 :

close/close[1]>1.02

這代表這個bar的收盤價比前一根的收盤價漲幅超過2%。

關係運算子

關係運算子是在呈現兩個數字之間的關係,Xscript中可以拿來運用的關係運算子, 都是大家很熟悉的大於(>),等於(=),小於(<),大於等於(>=),小於等於(<=),不等於(<>)共六種。
在這邊要特別說明的是,關係運算式的兩端各都只能是一個代表數值的文字或數值, 所以我們可以寫

close>close[1] and close[1]>close[2]

但我們不能寫

close>close[1]>close[2]

因為這樣的寫法在>這個關係運算式的兩端,有一端不是數值而是true,false的邏輯值了。

邏輯運算子

邏輯運算因子有三個 : and, or,Not
前兩個運算子是拿來串接兩個邏輯判斷式,其運作的邏輯如下:
true and true=true
true and false= false
false and true = false
false and false = false
true or true = true
true or false = true
false or true = true
false or false = false
至於not,則是拿來否定一個邏輯判斷式之用
not false=true
not true=false
有了這三種運算子,加上上一節介紹的回傳值,我們就可以很方便的描述股價間的各種關係了。

回傳值

開高低收成交量是交易語法的組成基本要素 開高低收是一段時間內,多空拔河角力下的記錄,成交量則是多空爭戰激烈程度的衡量標準。

開盤價
代表的是多空在哨音響起時的多空對峙形勢,跟先前收盤價的差距,代表的是多空這一回合爭戰時,一開始的氣勢差距。
最高價
代表的是多頭今天氣勢最強時,向空頭佔領過的領土最極限。
最低價
代表的是空頭今天氣勢最強時,向多頭佔領過的領土最極限。
收盤價
則是在在時間結束時,多空最後對峙的那個點。

在語法上,open、high、low及close, 代表的是每個頻率下的四個價位,也是我們與電腦溝通時,最常引用的數據。 透過open、high、low、close及成交量這五個數字及中括號的應用,我們可以引用到所有K棒上的開高低收值。

回傳值的意義

什麼是回傳值,就是當你寫下一個名詞,電腦會知道要拿什麼數值進來計算的,就是回傳值,當我們用電子計算機按 10 * 2時, 10跟2都是我們按下去通知電腦要拿這兩個數字來計算。 在腳本裡,我們通知電腦要拿什麼數字來計算時,不可能一個個數字按給電腦知道,當我們需要拿最高價來計算時, 就在腳本上寫high, 這樣的表達方式,是我們跟電腦約定好的, 它看到這樣的字眼,就會自動去把對應的數字拿來用。
例如當我們寫一個行敘述叫high – close時,電腦在這個腳本被拿來運算時,會去找這根bar的最高價是多少(例如是43), 這個bar的收盤價值是多少?(例如是40),那麼電腦就知道這一行陳述的意思是43-40>0,那麼電腦就知道這一行敘述是true
在Xs語法當中,像high這樣的回傳值,一共有下面幾個:

當您使用這些詞時,背後代表的是讓電腦去幫你把它背後所代表的的那個數字叫出來。
回傳值有那幾個?

回傳值回傳值大部份是數字,包括開高低收及成交量,未平倉(期貨適用),在日線的頻率下,我們也可以用Uplimit來讓系統傳回 當天的漲停價,用downlimit讓系統傳回當天的跌停價。

但有兩個回傳值的資料格式不是數值,一個是date(可簡寫成d)傳回的是日期格式,另一個是time(可簡寫成t),傳回的是時間的格式。

回傳值的簡寫
我們在應用這些回傳值的時候,除了寫上完整的名稱之外,也可以只寫簡寫就好。這些簡寫都是用一個英文字母來代替一個特定的回傳值,例如Open就可以直接寫成O,High可以直接寫成H,大小寫皆可,上面那個表中有所有回傳值可以簡寫的方式。

例如我們如果要寫今天收在最高點,正常我們會寫成

close=high

但我們也可以簡寫成

c=h

回傳值是大部份腳本的主要構成份子,也是最基本的元素。

XS語法的基本結構

舉凡所有語法,都是撰寫者寫出電腦看得懂的文件,這種文件,我們稱之為腳本。

1.11

敘述式
Xscript的語法基本架構上,跟其他的程式交易語法平台一樣,為了讓電腦看得懂,我們必須安排一種特殊的寫作方式。 這樣的寫作方式,是由一行一行的敘述式(statement)所組成。這些敘述式的最後,都會有一個分號”;”來宣告這一行的敘述式已經結束。

腳本
每個腳本,就是把一行行最後由分號來結束的敘述式(statement),按照執行的先後順序排在一起,當我們把一個腳本送給電腦時, 電腦會根據每一個敘述式在腳本中的順序,依序一行一行的執行腳本上的指令。每一行敘述式,都是由六種不同的文字所組合,這六種不同的文字,就像下圖中不同的分類

時序的觀念

為了讓user用原本就習慣的思考模式來撰寫腳本,Xscript必須貼近使用者的思維方式。而目前大部份
的市場參與者, 其思維方式,是建構在由開高低收成交量所呈現的一個時間序列上。

市場參與者,是透過一個時間序列,來去了解商品的過往價格走勢,並且作為預測未來多空方向的根據。
我們在作技術分析時,不會只看一根BAR,我們看的是數十根數百根BAR排在一起時所呈現的型態,趨勢,支撐,壓力等等。
所以我們必須讓電腦知道,我們現在要運算的,是第幾根K Bar 。
怎麼做呢?
我們用close[1]來代表前一根bar的收盤價,這個中括號裡的數字,代表的是前n根bar裡的值,所以, high[5]代表的就是今天算起前面第五根bar的最高價,也因此 ,close[0]代表的就是往前算第0根的收盤價,也就是今天的收盤價。
K11

各位可以參考上圖,我們可以用這樣的語法,讓電腦清楚的知道,我們所指的是那一根bar的那一個值。
於是,如果要讓電腦找出今天價量齊揚的股票時,我們可以這麼寫 :

close>close[1] //今天的收盤價比前一天的收盤價高
And volume>volume[1] //今天的成交量比前一天的成交量大

又例如,如果要讓電腦找到今天漲幅超過五%且成交量比前一天多超過一千張的股票,那我們可以這麼寫 :

close>close[1]*1.05
And volume-volume[1]>1000

上面的這兩行敘述,意思就是一個商品的收盤價大於前一天收盤超過5%而且成交量比前一天的成交量多一千張。
為了貼近使用者的想法,XS的語法基本上,就是建構在這樣的一個基礎之上,它用兩個準則,來作為使用者與電腦溝通的基本原則
1. 用Open ,high,low,close以及volume這五個英文詞,來代表最近一根K線上的開、高、低、收、成交量。
2. 用中括號及在括號內的阿拉伯數字來代表這是從最近一根K線往回算起的第幾根K線。
透過這兩個準則,使用者可以把K線圖上的每一個被記錄下來的值,都拿來用在自己撰寫的腳本上。
例如我們可以用high[1]代表前一天的最高價,所以如果open>high[1],代表今天的開盤價大於昨天的最高價,也就是今天跳空開高的意思。


例如 : 我們在尋找紅三兵股票時,必須遵循三個原則 :
1. 最近三天都上漲
2. 三天的K線實體部份都要是紅色的,也就是說三天的收盤價都高於開盤價
3. 實體紅棒的部份一天比一天長
那麼要讓電腦知道我們要找的是紅三兵的股票時,我們可以列出三個敘述

close[2] > close[3] and close[1] > close[2] and close > close[1]
close[2] > open[2] and close[1] > open[1] and close > open
close[2]-open[2] < close[1]-open[1] and close[1]-open[1] < close-open

又例如 : 我們如果要寫一紅包三黑,我們必須遵循以下幾個規則
1. 前三根K棒都是黑色的
2. 最後一根是長紅棒
3. 最後一根的收盤價比前三根的高點還高

我們可以把上面的這些規則改寫成以下電腦看得懂的敘述

close[3]< open[3] and close[2]< open[2] and close[1]< open[1]
close>open
close> high[3]

透過這樣的語法約定,我們可以把每一根K線上的每一個開高低收成交量的值都拿來用,如果我們要表達價漲量增,我們可以寫

close>close[1] and volume>volume[1]

我們使用這五個英文的詞語及中括號,告訴電腦我們希望它拿那些數字來作運算, 上面所用的open ,high, low, close,volume,都是我們這麼寫,電腦就會把數值傳回來作運算的指令 。
要完成一個可以幫我們請電腦協助完成工作的腳本,除了回傳值之外,可能出現在腳本內容裡的字詞,還包括了標點符號,常數,運算子,輸出及忽略字等幾種文字。
在後面的章節,我們依序了解這些不同的字詞在腳本中會怎麼被使用。

多空六大階段指標

我幾年前拜讀過一篇文章,作者把一檔股票的多空循環走勢分成六大階段,他用兩根不同天期的移動平均線與最新股價的相對位置來定義這六大階段。

1.Recovery復甦期。 收盤價大於50日均線但小於 200日均線且50 日均線小於200日均線
2.Accumalation籌碼收集期。 收盤價大於50及200日均線但50日均線尚未突破200日均線
3.Bullish 多頭走勢期。 收盤價大於50及200日均線且50日均線高於200日均線
4.Warning 高處不勝寒期。 收盤價跌破50日均線,但大於200日均線且50日均線仍高於200日均線
5.Distribution籌碼發散期。 收盤價跌破50日均線及200日均線,但50日均線仍在200日均線之上
6.Bearish 空頭走勢期。 收盤價跌破50日均線及200日均線,且50日均線也處於200日均線之下。

我以鴻海為例,把這六階段分別描繪在上圖。

我們可以看到,一個完美的多空循環,這六個階段是依序出現,我們可以透過這三條均線的位置,知道目前的股價是處於那個階段,也知道接下來當進到什麼階段時我們的交易策略應該怎麼調整。

一般來說,我們會在復甦期開始小量進場,籌碼收集期加碼,多頭確立時再加碼,然後高處不勝寒時獲利了結,然後依序再加碼作空。

於是我寫了一個指標的腳本

var:m50(0),m200(0);
m50=average(close,50);
m200=average(close,200);
if close > m50 and c< m200 and m50<m200
then value1=10
else value1=0;
if close > m50 and c> m200 and m50<m200
then value2=20
else value2=0;
if close > m50 and c> m200 and m50 > m200
then value3=30
else value3=0;
if close < m50 and c>m200 and m50>m200
then value4=-10
else value4=0;
if close < m50 and cm200
then value5=-20
else value5=0;
if close < m50 and c then value6=-30
else value6=0;
plot1(value1,"復甦期");
plot2(value2,"收集期");
plot3(value3,"多頭");
plot4(value4,"警示期");
plot5(value5,"發散期");
plot6(value6,"空頭");

我個人的觀察是,如果復甦期,收集期及多頭是按步就班地上演,且短線漲幅還不大時,就很值得留意了。

這個指標拿來應用在大型股及指數頗有參考價值。

tse6