close

今天這一篇先跟大家解釋一下XScript的基本架構,如果有用過tradestation 或是HTS的朋友,應該會很熟悉,沒有用過的朋友,也不用擔心,只要很快看過一遍,應該也可以寫出一些屬於自己的投資語法。

遠使連結: XQ全球贏家 XScript語法的基礎介紹 不知道為何電腦看圖片都變成叉燒包了,附上原始連結,本篇僅供自己學術研究使用

XScript的架構

現下的語法平台,使用者必須花上一些時間去引進商品即時數據及進行各項設定,XScript的好處是,讓使用者專注在交易的邏輯安排,其他的關於即時行情 及交易帳號的設定,都是原本XQ 及XT上就有的功能。所以,我們不必花時間去學習那些引進即時行情及設定下單API等等的繁瑣細節,我們直接focus在如何讓電腦遵照我們的意思,為我 們找出各種交易的機會。而要讓電腦這麼做,我們必須透過一種語言跟電腦溝通,這種語言,就叫作XScript,用XScript這樣的語法寫成的一行一行 陳述式,就稱之為腳本

  

在進一步學習如何撰寫腳本之前,我們先來看一下寫好的腳本會在XQ中被怎麼運用。

  

首先,交易者先透過警示規則編輯器去選取,修改或新增警示規則(腳本),然後再到警示中心去,新增一個警示。

每一個警示都有幾個部份,一個是警示規則(腳本),一是適用的商品,一是決定洗價時所使用的商品頻率,完成這樣的設定之後,當每天我們啟動進階警示時,我們撰寫的腳本就會根據最新的行情,判斷有那些進階警示符合條件,必須通知我們。

  
接下來,我們把重心放在快速的學習腳本的撰寫

一個腳本的撰寫,大致有幾個元素

  

回傳值

1.決定要引用那些回傳值。什麼是回傳值,就是當你寫下一個名詞,電腦會知道要拿什麼數值進來計算的,就是回傳值,當我們用電子計算機按10 * 2時,10跟2都是我們按下去通知電腦我們要拿這兩個數字來計算,在腳本裡,我們通知電腦要拿什麼數字來計算時,我們不可能一個個數字按給電腦知道,當我 們需要拿最高價來計算時,我們就在腳本上寫high,我們要用到前一天的最高價,我們就用high[1],這樣的表達方式,是我們跟電腦約定好的,它看到 這樣的字眼,就會自動去把對應的數字拿來用,例如當我們寫一個行敘述叫high–high[1]>0時,電腦在這個腳本被拿來運算時,會去找這根 bar的值是多少(例如是50),前一根bar的值是多少?(例如是48),那麼電腦就知道這一行陳述的意思是50-48>0,那麼電腦就知道這一 行敘述是true

在XScript當中,像high這樣的回傳值,一共有下面幾個:

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

  

這些回傳值要怎麼被XScript所引用,就如同tradestation一樣,共有以下幾個原則:

 

1.建構在一個bar chart的基礎上。

一個bar chart是由一根根的bar所組成,每個bar上面有四個點:開盤(open),最高(high),最低(low),收盤(close),再加上成交量 (volume),即構成語法上要引用的數值基礎,例如我們要找當天收最高的股票,我們可以用close=high來表示。

2.以[n]的方式來代表前n個值。

為了引用之前的bar,我們使用這樣的語法,例如close[1]就代表前一天的收盤價,所以如果要找今天跳空開高的股票可以用open>close[1]來表示。

3.一個bar chart可以代表的是日線,週線,月線,也可以是一小時線,十分鐘線,五分鐘線,甚至一分鐘線,視交易者的偏好。

我們在建構一個交易策略時,最常被用到的,往往是一個商品一段時間的相關成交數據,這些數據包括特定時間內的開盤,最高價,最低價,收盤價,成交價等等, 在腳本中,我們透過open,high,low,close來自XQ中傳回特定商品的這些數值,然用加以運算,判斷,從而建構出我們的決策腳本。

例如我們透過close>close[1] and close[1]>close[2] andclose[2]>close[3] 來建構一個商品最近三根bar的收盤一根比一根高的敘述

在這個腳本中,close, close[1],close[2]等,對XQ系統而言,代表的是一個特定商品的最新收盤價,前一期收盤價及前兩期收盤價,當腳本寫上這樣的敘述時,系統 讀到這部份時會到系統中把符合敘述的數值傳回腳本中來運算,所以我們稱之為回傳值。

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

運算子

當我們把這些回傳值叫出來之後,接下來當然就是拿來建立一種關係,當這樣的關係成立時,我們希望電腦通知我們,讓我們可以執行交易。例如上面提到的 high>high[1]這個陳述式,high與high之間,就是透過”>”這個字來建立關係,這些被拿來建立數值與數值之間關係的字,我 們稱之為運算字。

Djscript所提供的運算子分成三大類,數學運算子,關係運算子,邏輯運算子,分述如下:

數學運算子

這部份的運算子大家都很熟悉,就是我們在小學數學課本裡學過的加減乘除,

關係運算子

關係運算子是在呈現兩個數字之間的關係,djscript中可以拿來運用的關係是大家很熟悉的大於(>),等於(=),小於(=),小於等於共六種

邏輯運算子 

邏輯運算因子我們先介紹兩個, " and" 跟" or"

這兩個運算子是拿來辨為陳述式的是非的,其運作的邏輯如下:

trueand true=true

trueand false= false

falseand true = false

falseand false = false

trueor true = true

trueor false = true

falseor true = true

falseor false = false 

標點符號 

除了上述的文字及數字之外,我們在建構腳本時,也必需用到一些標點符號,這些符號及其用途分別如下:

;分號

用來表達一個陳述式的結束。例如: x1=high-close;

:冒號

用來宣告變數及參數,例如: var:x1(0), input:days(5)

[ ]引號

用來指定前n根bar的回傳值。例如:close[3]代表前面第三根bar的收盤價

//雙斜線

用來加註解,在雙斜線後面的所有文字電腦均不予理會

,逗號

1.用來分開同時被宣告的參數及變數們。例如:

Var:x1(0),x2(0),x3(0),x4(0);

2.用來分隔函數的參數,例如RSI(close,5)代表收盤價的5日RSI

{ }大引號

用於在陳述的過程中加上註解

“ “双引號

用來定義文字字串

常數

有了回傳值,運算子及標點符號,就可以組成陳述式

例如: 如果我們想在商品跳空開高時電腦要通知我們,我們可以寫下以下的陳述式:

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

這一個陳述式的意思是今天的震盪區間比前一天大。

這時候問題來啦,如果我們經常要用到每天的震盪區間,我們總不能每次都high-low的寫個不停,例如我們如果要寫這三天的震盪區間一天比一天大,如果 寫成 (High-low)/(high[1]-low[1])>1 and (high[1]-low[1])/ (high[2]-low[])>1and (high[2]-low[2])/ (high[3]-low[3]),這樣的腳本會讓人看的很辛苦,這時候我們使用了一個語法,來讓大家不辛苦,這個語法的元素就叫作變數。

變數

  

變數是啥呢? 變數就像一個標示了名稱的盒子,盒子裡放了什麼,盒子就是什麼,放進去的內容隨時可以被換掉,但盒子的名稱沒有變。


在XScript中,我們可以取一個叫range的變數,然後說它就是high-low,這樣以後high-low的地方我們全部可以用range來替代,要完成一個變數在腳本上的作用,共有三步驟

1.    宣告

宣告的作用在於告訴電腦,這是一個變數,請把它當變數來看待。

它的語法是

Variable:變數名稱(0);………0是一開始這變數的初始值,您也可以宣告它的初始值是5或者其他任何字。變數除了可以是一個數值之外,它也可以是一個回傳是或非的布林值,所以您也可以宣告一個變數它的初始值是”是”

Variable:變數名稱(true);

由於我們常指定變數,因此,為了減少無謂的打字力氣,也可以在宣告時,用var替代variable

例如我們可以用 var:range(0); 這代表我們告訴電腦,我宣告了一個變數,它的名字叫作range。

如果我們要宣告不只一個變數時,我們可以用以下的語法

Var:x1(0),x2(0),x3(0),x4(0);

用逗號來區別變數即可。

此外,為了讓user易於使用,djscript 提供了value1e1到value99共99個不用宣告就可以使用的變數,以及condition1到condition99共99個布林值的變數。

2.    指定

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

例如

Var:range(0);

Range=1;

又例如

Var:range(0);

Range=high-low;

3.    應用

接下來我們就可以把變數拿來作為腳本中很重要的一個元素

例如上面我們提到的最近三天震盪一天比一天大的陳述,就可以寫成

Var:range(0);

Range=high-low;

Range>range[1] andrange[1]>range[2] and range[2]>rnage[3];

當我們要進行更複雜的運算時,我們經常無法透過一條簡單的敘述就完成一個腳本,例如我們要運用移動平均線的概念時,以我們目前學會的語法,我們如果要建構一個股價突破五日移動平均線時就發出警示訊號的腳本,我們的寫法大約如下

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

then ret=1;

這樣的敘述是不是又臭又長,如果我們想把移動平均線再拿來運算,例如我們想算出兩條移動平均線的差額時,這樣的寫法會變得很難寫

但如果我們給定一個名字,讓它代表五日平均值,再給另一個名字,代表三日平均值,這樣就比較好寫了

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

value2=(close+close[1]+close[2])/3;

value3=value2-value1;

ifvalue3 > value3[1]

thenret=1;

在這邊,value1, value2,value3的值都是隨著收盤價的波動而改變,我們稱之為變數

傳遞警示訊號

當我們學到回傳值,標點符號,常數,變數,運算子等腳本的組合元素之後,我們差不多可以開始完成一個個讓電腦讀懂我們意思的腳本。

但讓電腦讀懂我們寫的腳本的目的是啥?不就是希望電腦在我們覺得有必要的時候,可以通知我們嗎? 就好像到價警示,我們讓電腦在台積電到達100元時通知我們,就好像到量警示,我們讓電腦在友達成交量超過10萬張時通知我們,我們應該也要可以讓電腦在 我們覺得必要的時候,可以通知我們。

例如我們希望電腦可以在台積電如果開盤跳空下跌超過1%時,通知我們,於是我們寫了一個腳本

Condition1=open/high[1]>1/100;

但接下來呢?

我們該怎麼讓電腦在condition1=true的時候通知我們?

Djscript的作法是,提供user一個固定的語法,這個語法就是

If  陳述式

Then ret=1;

當腳本需要電腦在什麼情況下通知user,就在腳本上寫出如上述語法的陳述式,這就是通知電腦,如果這個陳述式是true時,電腦就會發送警示通知給user。

例如我們如果希望電腦在我們指定的股票開盤跳空下跌超過1%時通知我們,我們可以這麼寫

If open/high[1]>1/100

Then ret=1;

這樣一來,我們把這個腳本讓電腦編繹且指定給商品給電腦之後,一旦符合條件,電腦就會自動通知我們。

參數 

在上述的例子中,如果我們今天要求的是跳空下跌1%,很可能改天我們會希望跳空下跌的是2%才通知我們,這時候怎麼辦呢? 我們只好回去改腳本。但如果腳本不是像上述的例子只有兩行,而是有三百行時,我們要怎麼找啊?

XScript用了一個方法,叫作設定參數,把這個跳空下跌的百分比變成一個可以快速調整的參數,使用者需要調整百分比時,只要更改這個數字即可,不必再進到腳本去修改數據。

參數的用法根變數有點像,要宣告參數的語法如下:

Input:參數名稱(0);

例如上面的例子,就可以改寫成

Input:percent(1); 這是設定一個叫percent的參數,它的預設值為1

If open/high[1]>percent/100

Then ret=1;

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

input:length(5);

ifclose cross above average(close,length)

then ret=1;

如果我們這麼寫,當我們想把5日改成10日時,我們只要在參數值這地方把5改成10就行了。

函數 

到這邊我們已經會用回傳值,運算子,標點符號,參數,常數,變數來組成一條條的陳述式,也學會如何啟動警示,理論上,我們應該可以把我們的很多想法,落實 為一個又一個的腳本,然後讓電腦協助我們守望著每一個賺錢的機會,但在實際撰寫腳本的時候,我們會發現,有些運算的過程,我們常常會用到,如果每次要用 時,都得寫的落落長,會很辛苦。例如,如果我們經常用到的移動平均線,如果我們要算五日移動平均線時,根據上面的說明,我們應該會這麼寫

Var:MA5(0);

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

但如果要算年線怎麼辦? 難道要一直加兩百多次嗎?

這時候我們就會發現,djscrip還沒有辦法滿足我們的需求,我們的想法,還是無法完全順順利利的變成電腦可以理解的腳本。

XScript像tradestation一樣,透過函數這樣的功能,來讓user可以把自己的想法儘量的落實到腳本中。

  

函數其實是透過一個簡單的陳述,讓電腦從函數的名稱,參數中,就知道要去進行什麼樣的計算

例如在XScript中,移動平均的函數是average

上述的例子可以改寫成

Input:length(5);

Var:ma5(0);

Ma5=average(close,5);

括號裡面的是參數,第一個參數close代表要拿來作運算的是收盤價,第二個參數5代表要拿來作運算的是天期是5天。

當我們在腳本中寫上ma5=average(close,5)時,電腦就知道要去算出收盤價的五天平均,然後把它放到ma5去。

 

Getfield

台股特有欄位的應用

在XScript問市之前,市場早有很多套程式語法可供交易者使用,但我們敢於宣稱XScript是最適合台灣人使用的程式交易語法,其原因就在於,我們可以提供台灣市場獨有的欄位,供交易者來使用。

交易者在制定台股交易策略時,往往除了開高低收成交量之外,也想要試著用台股獨特的交易資料,例如融資券及法人的進出資料,來作為交易策略的運算基礎,為了讓交易者可以如願以償,XScript提供了一套語法,來協助交易者完成這樣的工作, 

1.     法人買賣超

Ftotalbuy

外資買張

Ftotalsell

外資賣張

Fdifference

外資買賣超

Fsharesheld

外資持股

Fsharesheldratio

外資持股比例

Stotalbuy

投信買張

Stotalsell

投信賣張

Ssharesheld

投信持股

Ssharesheldratio

投信持股比例

Sdifference

投信買賣超

Dtotalbuy

自營商買張

Dtotalsell

自營商賣張

Dsharesheld

自營商持股

Dsharesheldratio

自營商持股比例

Ddifference

自營商買賣超

InvestorTotalBuy

法人買張

investorDifference

法人買賣超張數

inverstorsharesheld

法人持股

 

2.     信用交易

pomusingratio

融資使用率

pomnew

融資增減張數

shortsalenew

融券增減張數

Pomremain

融資餘額張數

shortsaleremain

融券餘額張數

daytradeshares

當日沖銷張數

SBLBorrowing

借券張數

SBLreturn

還券張數

SBLbalance

借券餘額張數

 

3.     主力進出

Leadertotalbuy

主力買張

Leadertotalsell

主力賣張

LeaderDifference

主力買賣超張數

Leadersharesheld

主力持股

retailtotalbuy

散戶買張

retailtotalsell

散戶賣張

retaildifference

散戶買賣超張數

operatortotalbuy

實戶買張

operatortotalSell

實戶賣張

operatordifference

實戶買賣超張數

controllertotalbuy

控盤者買張

controllertotalsell

控盤者賣張

controllerdifference

控盤者買賣超張數

 

4.     交易數據

TradeValue

成交金額

TradeVolumeAtBid

內盤量

TradeVolumeAtAsk

外盤量

 

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

Value1=getfield(“tradevalue”)[1]

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

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

請看以下這個範例

value1=Getfield("成交金額")[1];      

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

value13=Getfield("投信買賣超")[1];       

value18=Getfield("自營商買賣超")[1];       

variable: ForcePush(0);

input: ForceType(0);

Switch ( ForceType )

Begin

Case 0: ForcePush =value6;

Case 1: ForcePush =value13;

Case 2: ForcePush =value18;

End;

//==================以上取回日線資料=======================

input: Atleast(1000); //最少買超張數

//條件1

condition1 = ( close[1]-open[1]  > 0.75 *high[1]-low[1] )  and //紅棒

              (high[1] -low[1]) > 2 *(high[2]-low[2])  ;      //且大 則回傳True給 condition1

//條件2

if q_dailyhigh > highest(high[1],3)    and        //用逐筆 加上 q_dailyhigh 測試創新高

  volume > volume[1]                              //今量大於昨量

  then condition2 =true;

//條件3

condition3 = ForcePush >Atleast ;     //買超張數大於設定最少張數

if condition1 and condition2 and condition3 then ret=1;

 

Getquote

即時欄位的運用

在實際交易的經驗裡,我們常常透過日,週,月線,去尋找值得留意的交易機會,但是不是真的交易,我們往往還是看盤中的價量表現才作決定。例如我們可能會去 尋找五日RSI與十日RSI黃金交叉的股票,但為了怕是假訊號,我們經常會等到這當股票當天開盤帶量開高後才進場交易,根據我們先前的語法,我們無法同時 處理日線上的RSI黃金交叉,又同時處理日內的1分鐘線或5分鐘線帶量開高,XScript為了解決這個問題,特別有一組語法,讓交易者可以直接在盤中把 最新的成交價量及委買委賣張數,傳回腳本中來作運算,這些可以即時取得的交易資料,我們統稱為即時欄位,這一章,我們就來討論即時欄位在XScript中 如何被應用

從下面的台積電分時走勢圖中,我們可以看到,一檔股票目前交易所即時揭示的交易資料,大約有以下幾項:

  
1.     最新的成交時間,買進價,賣出價,成交價,單量。

2.     最近的五檔買進委託價及對應的委託量

3.     最近的五檔賣出委託價及對應的委託量

對於這些即時的資料,XScript幫它們分別取了不同的欄位名稱,讓交易者可以加以使用,以下就是這些即時欄位在腳本上被引用時的名稱對照表

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

今日跌停價

在XScript的語法中,取得這些欄位的方式很簡單,那就是運用給定變數這樣的方式,例如

Value1=q_dailyopen  就可以取得今天的開盤價

所以上述的例子現在就可以寫成以下的腳本

Value1=q_dailyopen;

Value2=q_dailyvolume;

Value3=q_pretotalvolume;

If rsi(close,5) cross above  rsi(close,10)

And value1/close[1]>1.015

And value2-value3>500

Then ret=1;

到這裡,我們已經把XScript中最基本的部份都學完了,接下來的一陣子,我會用各種例子,跟大家討論怎麼在實戰中,應用XQ這個新的功能。

過去我們都曾經夢想,有一套簡單易學的語法,讓我們把交易的邏輯寫下來,然後電腦每天根據這樣的邏輯,協助我們挑到股票,找到好的時點,執行交易,然後協助我們找到好的出場點。

這樣的夢想,在XScript裡將一步步的被實現,但,首先,我們一起來把XScript學的更好吧。

arrow
arrow
    全站熱搜

    戰術柯基 發表在 痞客邦 留言(0) 人氣()