Author Archives: 發財橘子

KST確認指標

KST確認指標是把短中長期的變動率ROC給與不同權重,用來判斷趨勢,精准掌握轉折買賣點。
腳本如下:

variable:kst(0);

value1=average(rateofchange(close,12),10);
value2=average(rateofchange(close,20),10);
value3=average(rateofchange(close,30),8);
value4=average(rateofchange(close,40),15);

kst=value1+value2*2+value3*3+value4*4;

plot1(kst,"KST確認指標");

 

KST確認指標

從附圖可以看得出來,確認指標在接近50處反轉是大盤由多翻空的訊號,從-50回升則是由空翻多的多頭反攻號角。

ALF亞歷山大過濾指標

2016052702

這指標很簡單算,但卻出乎意料之外的好用
它的算法就是拿今天的收盤價去除以十天前的收盤價
大於一就代表這十天作多的都賺錢,小於一就代表這十天作多的都被套牢。

input: length(10); setinputname(1, "天期");

Value1 = close / close[length-1];
plot1(Value1, "亞歷山大過濾指標");

各位可以參考附圖
2016052703
然後我們就會發現,指數橫盤後如果這指標從一以下突破一,往往是大盤作多的訊號,反之是賣出訊號。
我試過很多的指標,這個指標我覺得有參考意義,所以我就把它加到我的大盤check list
類似這樣的指標,我把它放到check list的,還有
1.%B
2.DKX多空線
3.成交量擺動指標
4.KST確認指標
5.Q指標
6.威廉變異離散量
7.ZDZB築底指標
8.多空分數
9.Vortex indicator
10.Coppock indicator

尋找大盤短期多空方向的指標

2016052701
我看盤看了 25年,兩個最大的心得是
1.大家很習慣樂觀時更樂觀,悲觀時更悲觀,追漲又殺跌。
2.大家很愛比價,有人帶頭拉,同類的就有人追,有人帶頭殺,同類的就很難撐得住。
基於這兩個原理,我用XS寫了一個很簡單的指標,透過漲跌家數及漲跌停家數的變化,來尋找大盤的多空轉折點
我的腳本如下:

input:period1(5),period2(15);
value1=GetField("上漲家數");
value2=GetField("下跌家數");
value3=GetField("漲停家數");
value4=GetField("跌停家數");
value5=value1+value3*2-(value2+value4*2);
//(上漲家數+漲停家數*2)-(下跌家數+下跌家數*2)
value6=average(value5,period1);//短天期平均
value7=average(value5,period2);//長天期平均
plot1(value6,"短天期");
plot2(value7,"長天期");

因為漲跌停板的影響力特別大,所以我另外再多算兩倍
算出來的數字取移動平均後,我設了一個自訂指標,畫出來的圖就像附圖
各位可以看得出來
1.每次短天期平均從低檔回昇時,都是大盤止跌回升的起點,
2.短天期突破長天期時,短線會有高點
3.短天期自高檔拉回時,指數也作短期頭部
4.短天期跌破長天期時,短線仍有低點
這樣的指標,對於期指短線的多空方向,有一定的參考作用,以這兩天來看,短天期快突破長天期,如果今天能收小紅小黑以上,那短線應有反彈的機會。
至於短期及長期的參數要用幾天? 漲跌停要用幾倍去算? 各位可以自行調整到您覺得最優的參數。

尋找那些先前大漲過,最近在休息的股票

來尋找那些先前大漲過,最近在休息的股票
正所謂春江水暖鴨先知,一檔股票如果兩天可以漲一成,代表有人真金白銀地押在這檔股票上,而且還願意追高,這種情況往往是有人知道了公司不為人知的利多,率先佈局。
但代誌不見得像這些有消息的人想的那麼簡單,有時候盤不好,或者短線獲利及解套的賣壓湧現,造成股價上去又下來,春鴨反而被套牢。
但如果春鴨掌握的消息是正確的,後來隨著消息面的更廣為人知,就會有更多的買盤進場,如果這個利多很大,股價也可能走一大趟多頭行情。
為了挑出這樣的股票,小弟寫了以下這個選股的腳本:

condition1=false;
settotalbar(100);
if countif(close>close[2]*1.1,20)=1
then condition1=true;//過去二十天內有一次兩天漲超過10%
if close*1.05<highest(close,20)//現在股價比20天來的低點低至少5%
and trueall(close<=close[1],2)//這兩天股價都持平或收黑
and highest(close,20)=highest(close,60)//近二十天來的高點跟近六十天來的高點一樣高,代表不是一路下跌的走勢,上次的急拉不是跌深反彈
and condition1
then ret=1;

我把這個選股腳本拿去挑股票,然後再把挑到的股票用策略雷達裡的火箭拉回,階梯式向上等即時盤中腳本來洗價
如果洗出來就代表這檔先前有急拉過的股票,在休息後又蓄勢待發,這種股票我就會列入觀察名單
附圖是一個很典型的例子。
先前大漲現在休息

大盤多空對策訊號

ls3
十九年前,我第一次到證券商研究部當研究員時,部門有三位同仁輪流負責解盤,但大家用的分析工具不一樣,對盤勢的看法常常今天A君說多,明天B君卻翻空。我去分公司時,常被虧說你們研究部像月亮,初一十五不一樣。
後來我跟他們三位老兄分別聊了一下,學景氣燈號的作法,把他們用的分析工具,在EXCEL上作了一個表,每個工具都給一分,用來計算大盤的多空燈號。

後來這件事因為小弟EXCEL功力太差,每次作出來的結果都沒有太大的參考性,加上我又被叫去自營部工作,所以也就無疾而終了。

XS上線後,我一直想再試試重編大盤景氣燈號,研究了一陣子,今天來跟大家報告我的研究結果。

我一共用了以下的數據來當判斷分數的標準
1.外資買賣超
2.投信買賣超
3.自營商買賣超
4.融資餘額
5.融券餘額
6.上漲量
7.外盤量
8.RSI
9.MACD
10.KD
11.DMI
12.主力買賣超
13.AR
14.ACC
15.TRIX
16.SAR
17.MA

每個數據我都訂了一個多頭條件,例如RSI我就訂5日RSI比10日RSI高且低於80

如果符合條件就加一分,然後每天歸零,重新計算,最後再取十日移動平均。
在語法上,寫法大致如下:

input:P1(30);setinputname(1,"先前法人未接觸天數");
variable: XData(0),YData(0),ZData(0),Z(0);
if currenttime > 180000 or currenttime < 083000 then Z =0 else Z=1;

XData = GetField("外資買賣超")[Z];
YData = GetField("投信買賣超")[Z];
ZData = GetField("自營商買賣超")[Z];

value6=GetField("上漲量");
value7=GetField("外盤量");
variable:count(0);
if date<>date[1]
then count=0;
if xdata>0
then count=count+1;

if ydata>0
then count=count+1;

if zdata>0
then count=count+1;

if value4-value4[1]<20000
then count=count+1;

if value5-value5[1]>20000
then count=count+1;

if value6/volume>0.00001
then count=count+1;

if value7/volume>0.5
then count=count+1;

value8=rsi(close,5);
value9=rsi(close,10);
if value8>value9 and value8<90
then count=count+1;

variable: Dif_val(0), MACD_val(0), Osc_val(0);
MACD(Close, 12, 26, 9, Dif_val, MACD_val, Osc_val);
if osc_val>0
then count=count+1;

value10=mtm(10);
if value10>0
then count=count+1;

variable:rsv1(0),k1(0),d1(0);
stochastic(9,3,3,rsv1,k1,d1);
if k1>d1 and k1<80
then count=count+1;

variable:pdi_value(0),ndi_value(0),adx_value(0);
DirectionMovement(14,pdi_value,ndi_value,adx_value);
if pdi_value>ndi_value
then count=count+1;

value12=GetField("主力買賣超張數");
value13=average(value12,5);
if value13>0
then count=count+1;

value14=ar(26);
value15=linearregslope(value14,5);
if value15>0
then count=count+1;

value16=acc(10);
if value16>0
then count=count+1;

value17=trix(close,9);
value18=trix(close,15);
if value17>value18
then count=count+1;
value19=SAR(0.02, 0.02, 0.2);
if close>value19
then count=count+1;

if average(close,5)>average(close,12)
then count=count+1;

value11=average(count,10);
plot1(value11);

最後的分數要取幾天的移動平均,用10天,原因是我一直覺得兩週是多空的一個循環。

另外我會這麼寫的原因是有點認為市場參與者都有觀察市場的方法,我把大家常用的方法列出來計算分數,當分數愈高代表愈多人使用的工具會建議偏多,反之亦然。

所以當分數從五分以下往上走,代表會有愈來愈多人使用的工具開始由空翻多。

也因此,這樣的方法用在小型股就會不大適用,因為參與者不是一般大眾,其多空太容易受特定勢力的左右。

GetField

在XQ量化平台上線之前,市場早有很多套程式語法可供交易者使用,但敢於宣稱這是最適合台灣人使用的程式交易語法,其原因就在於, 我們可以提供台灣市場獨有的欄位,供交易者來使用。
交易者在制定台股交易策略時,往往除了開高低收成交量之外,也想要試著用台股獨特的交易資料,籌碼,財務報表等等欄位,例如法人的進出資料, 來作為交易策略的運算基礎,為了讓交易者可以如願以償,XScript提供了Getfield語法,來協助交易者完成這樣的工作,這篇文章就是來介紹這套語法及其應用。
在撰寫腳本時,當您需要使用這些台股特有的欄位時,只要在編輯器中打一個英文字母g,不管大小寫,編輯器都會跳出一個如下面附圖中的視窗, 只要您選取getfield(插入),系統就會跳出一個選取欄位的視窗,讓您直接挑選要使用的欄位。


您只要選取其中一個欄位按插入鍵,系統就自動把這個欄位帶到您的腳本中,因此,您就不需要去記那個欄位的英文名字是什麼。
例如我們如果要取得今日的外資買賣超,我們的寫法可以如下 :

value1=Getfield("外資買賣超"); 其單位是張數

如果我們要取得前一日的外資買賣超,其寫法跟我們要取得前一日的收盤價是一樣的,也就是用中括號裡寫個1就可以,所以其寫法如下 :

value1=Getfield("外資買賣超")[1];

我們非常習慣用value1=getfield(“欄位名稱”)的語法來取得特定欄位的回傳值,
這裡的value1,您也可以使用自己命名的變數名稱。

那麼到底支援多少台股欄位呢?
上面那張圖所顯示的,當您輸入G來跳出那個選取欄位的對話框時,目前Getfield支援的欄位是屬於資料欄位及商品資訊欄位,在警示類的腳本與選股類的股本中,能使用的欄位也不一樣,先跟大家介紹警示能用的欄位,下面幾類,按下連結後,可以看到所有的欄位,以及欄位的說明及使用範例

價格

量能

籌碼

基本

事件

市場統計

期權

以上是在警示腳本中可以用Getfield語法取得的所有欄位

接下來我介紹只有在選股本中才能用的欄位,如果你要寫的是警示腳本,在那個對話框中就不會有這些欄位可以選用

價格

籌碼

基本

財務

事件

所有跟財務報表有關的欄位,都是要在選股腳本中才用得到

這麼多的欄位,在使用上,XScript建議的語法如下:

Value1=getfield(“tradevalue”)[1]

或是

value1=getfield(“成交金額”)[1]

這兩種方式都可以取得昨日成交金額。

舉個例子,如果要找前一日主力買超創120天來新高,且近三日主力都買超,成交量過500張,且今天上漲超過3%的股票,就可以寫成腳本如下

value1=GetField("主力買賣超張數")[1];
if value1=highest(value1,120)
and trueall(value1>0,3)
and volume>500
and close>close[1]*1.03
then ret=1;

透過getfield這樣的語法,我們可以把台股特有的欄位拿來加入運算,不過要提醒大家,這些資料的更新頻率並不一樣, 所以運用這些欄位的腳本,在設進階警示時,其腳本的頻率必須設定對。

 

Getquote

在實際交易的經驗裡,我們常常透過日,週,月線,去尋找值得留意的交易機會,但進場點,往往還是看盤中的價量表現才作決定。
例如我們可能會去尋找五日RSI與十日RSI黃金交叉的股票,但為了怕是假訊號,我們經常會等到這當股票當天開盤帶量開高後才進場交易。
在未提供跨頻率的語法之前,我們無法同時處理日線上的RSI黃金交叉,又同時處理日內的1分鐘線或5分鐘線帶量開高。
Xscript為了解決這個問題,特別提供一組語法,讓交易者可以直接在盤中把最新的成交價量及委買委賣張數,傳回腳本中來作運算, 這些可以即時取得的交易資料,我們統稱為即時欄位。
從下面的台積電分時走勢圖中,我們可以看到,一檔股票目前交易所即時揭示的交易資料,大約有以下幾項 :

gq1

最新的成交時間,買進價,賣出價,成交價,單量。
最近的五檔買進委託價及對應的委託量
最近的五檔賣出委託價及對應的委託量
對於這些即時的資料,djscript幫它們分別取了不同的欄位名稱,讓交易者可以加以使用,以下就是這些即時欄位在腳本上被引用時的名稱對照表 :

q_dailyopen 開盤(日)
q_dailyhigh 最高(日)
q_dailylow 最低(日)
q_dailyvolume 總量(日)
q_Refprice 參考價
q_AvgPrice 均價
q_last 成交
q_Bid 買進
q_Ask 賣出
q_BidAskFlag 內外盤
q_TickVolume 單量
q_PreTotalVolume 昨量
q_PriceChangeRatio 當日漲幅%
q_InSize 當日內盤量
q_OutSize 當日外盤量
q_BestBid1 買進1
q_BestBid2 買進2
q_BestBid3 買進3
q_BestBid4 買進4
q_BestBid5 買進5
q_BestAsk1 賣出1
q_BestAsk2 賣出2
q_BestAsk3 賣出3
q_BestAsk4 賣出4
q_BestAsk5 賣出5
q_BestBidSize 委買
q_BestAskSize 委賣
q_BestBidSize1 委買1
q_BestBidSize2 委買2
q_BestBidSize3 委買3
q_BestBidSize4 委買4
q_BestBidSize5 委買5
q_SumBidSize 總委買
q_BestAskSize1 委賣1
q_BestAskSize2 委賣2
q_BestAskSize3 委賣3
q_BestAskSize4 委賣4
q_BestAskSize5 委賣5
q_SumAskSize 總委賣
q_DailyUplimit 今日漲停價
q_DailyDownlimit 今日跌停價

在djscript的語法中,取得這些欄位的方式很簡單,那就是運用給定變數這樣的方式,例如 :
Value1=q_dailyopen 就可以取得今天的開盤價,跟Getfield一樣,在撰寫腳本時,只要在編輯器上打 一個英文字母 “g”(大小寫皆可), 就會跳出如下圖左方的小視窗,只要點選”getquote插入”,即會跳出右邊的視窗讓您選擇要使用的即時行情欄位。

gq2

如此一來,就不必把這些欄位的名稱背起來,畢竟,還蠻不好背的。
例如我們如果要尋找今天外盤量佔總成交量比重高的股票,我們就可以寫撰寫如下圖的腳本 :

gq3
在這個例子裡,我們用value1這個內建的變數來代表q_BidAskFlag這個即時的內外盤標示,這個標示的值等於1代表是外盤成交,-1代表是內盤成交。
有了getquote這樣的語法,除了這種內外盤比的數據之外,包括內盤量,外盤量,最佳買進五檔的買進賣出委託量等盤中即時的交易所提供資訊, 都可以拿來作運算,找出盤中價量異常的股票。
getquote算是Xscript在地化特色的一個語法。

變數

什麼是變數?
我們用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,就可以直接連到說明的網頁。