自動交易語法介紹
選擇單元...
XS自動交易
單元目錄
單元目錄
「自動交易」顧名思義就是交由電腦來監控目前的策略來做到自動停利停損、進場、出場等策略,但是到底如何開始呢?先前小編有介紹關於自動交易中心的功能介紹,若是還沒看過的戰友們,記得先去稍微看過才開始看本篇的相關介紹,以下提供傳送門。本篇的重點會著重在於,「XS自動交易語法的撰寫」包含了以下幾點
在這邊我們看到進出場前皆有判斷Position和Filled的部位。我們來實際模擬以上code進出場過程中Position 與 Filled部位的變動。進場:一開始起始部位Position和Filled皆為0,但在Condition1條件成立後,Position部位會變為1,並送出委託單,而這時Filled部位還是0,需等到買進成交單打回來後,Filled部位才會變為1。
出場:起始部位Position和Filled皆有進場的部位因此為1,但在賣出條件Condition2成立時,Position部位會先變為0,並送出賣出委託單,直到送出的委託單成交後,Filled部位才會變為0。根據以上小編舉的Position和Filled大家看出差別了嗎?Position是預期達到的目標部位,所以當條件成立後Positon就會開始變動。而Filled則是實際成交後的部位。我們也可以把Position直接想成下的委託單,Filled則是實際的未實現庫存部位。
如果還是不懂,小編再舉一個例子:我知道明天蘋果有特價,一顆20元,因此我預計明天去菜市場買3顆20元的蘋果,這時Position就會變為3,Filled=0,明天我實際將3顆蘋果買回家後,這時Filled= 3, Position = 3,而買到的價是20元。
交易語法有哪些
我們先來看看全部的交易語法到底有哪些,在我們的Xshelp函數搜尋網內可以找到全部的交易語法,但是對於新手來說是不是有點多呢?小編這邊會介紹幾個常用的交易語法,強烈建議一定要先看懂這幾個函數。- Position:預期達到的目標部位,可以當作是策略下的委託單
- Filled:交易帳號的實際部位
- SetPosition:預計交易策略建立的部位
- Market:市價送單
- AddSpread:調整委託單下單檔位
Position和Filled有什麼差別
稍微看過以上幾個必學的函數,常常會有這個疑問,若是要控制部位為什麼,是不是單寫Position或Filled就好呢?這邊小編簡單用多單進場舉例,以下的程式碼代表意思:當條件1成立後市價買進1部位,當達到條件2則賣出當下收盤+2檔的價位1部位。condition1 = getfield("Close") >= 10; condition2 = getfield("Close") < 10; if Position = 0 and filled = 0 and condition1 then begin SetPosition(1, MARKET); { 以市價買進 } end; if Position = 1 and filled = 1 and condition2 then begin SetPosition(0, addspread(close,+2)); { 以收盤+2檔賣出 } end;
在這邊我們看到進出場前皆有判斷Position和Filled的部位。我們來實際模擬以上code進出場過程中Position 與 Filled部位的變動。進場:一開始起始部位Position和Filled皆為0,但在Condition1條件成立後,Position部位會變為1,並送出委託單,而這時Filled部位還是0,需等到買進成交單打回來後,Filled部位才會變為1。
出場:起始部位Position和Filled皆有進場的部位因此為1,但在賣出條件Condition2成立時,Position部位會先變為0,並送出賣出委託單,直到送出的委託單成交後,Filled部位才會變為0。根據以上小編舉的Position和Filled大家看出差別了嗎?Position是預期達到的目標部位,所以當條件成立後Positon就會開始變動。而Filled則是實際成交後的部位。我們也可以把Position直接想成下的委託單,Filled則是實際的未實現庫存部位。
如果還是不懂,小編再舉一個例子:我知道明天蘋果有特價,一顆20元,因此我預計明天去菜市場買3顆20元的蘋果,這時Position就會變為3,Filled=0,明天我實際將3顆蘋果買回家後,這時Filled= 3, Position = 3,而買到的價是20元。
如果只寫Filled可以嗎?
當然可以!!!但是會發生什麼事情呢?因為尚未有Position來控制目標部位,因此在尚未成交之前會重複的傳入相同部位的不同價格,也就是下了委託單後,若條件再次成立但是委託單尚未成交,會在同一個委託書上「改價」。若是希望在每次條件成立時,都可以下到最新價格時,就可以單使用Filled來判斷進出場就好。若是拿上面的買蘋果來舉例:我想要買蘋果3顆,但是還沒預計什麼時候去買價格也不知道,因此價格會根據市場價格一直變動,直到我們實際買進的那天。if Filled = 0 and Condition1 then SetPosition(1); if Filled = 1 and Condition2 then SetPosition(0);
如果只寫Position可以嗎?
若是單只寫Positon判斷進出場的話,當進場條件condition1符合就會下買進委託單了,但如果買進委託沒有成交,且出場條件condition2符合條件時就會把原先買進的那筆委託單刪單,所以當進出場條件容易觸發時,且買進委託尚未成交時會反覆出現買進委託,刪除委託的動作,所以不建議只用Position判斷進出場。if position = 0 and Condition1 then setposition(1); if position = 1 and Condition2 then setposition(0);
總結
看了那麼多Positon和Filled已經霧灑灑了,我到底要該用什麼來撰寫呢?若不希望進出場的委託單一直更動的話,小編建議Positon和Filled在進出場皆要判斷,也就是以下的例子,condition1 和 condition2 可以自行修改為進出場條件。condition1 = getfield("Close") >= 10; //進場條件 condition2 = getfield("Close") < 10; //出場條件 if Position = 0 and filled = 0 and condition1 then begin SetPosition(1, MARKET); { 以市價買進 } end; if Position = 1 and filled = 1 and condition2 then begin SetPosition(0, addspread(close,+2)); { 以收盤+2檔賣出 } end;若是希望每次條件成立都是下到最新的價格,可以只使用Filled來做部位進出場的判斷。
condition1 = getfield("Close") >= 10; //進場條件 condition2 = getfield("Close") < 10; //出場條件 if filled = 0 and condition1 then begin SetPosition(1, MARKET); { 以市價買進 } end; if filled = 1 and condition2 then begin SetPosition(0, addspread(close,+2)); { 以收盤+2檔賣出 }