免費下載
訂閱模組
搜尋

自動交易語法介紹


選擇單元...
「自動交易」顧名思義就是交由電腦來監控目前的策略來做到自動停利停損、進場、出場等策略,但是到底如何開始呢?

先前小編有介紹關於自動交易中心的功能介紹,若是還沒看過的戰友們,記得先去稍微看過才開始看本篇的相關介紹,以下提供傳送門。

本篇的重點會著重在於,「XS自動交易語法的撰寫」包含了以下幾點

 

 

 

交易語法有哪些

我們先來看看全部的交易語法到底有哪些,在我們的Xshelp函數搜尋網內可以找到全部的交易語法,但是對於新手來說是不是有點多呢?小編這邊會介紹幾個常用的交易語法,強烈建議一定要先看懂這幾個函數。

  1. Position預期達到的目標部位,可以當作是策略下的委託單
  2. Filled交易帳號的實際部位
  3. SetPosition預計交易策略建立的部位
  4. Market市價送單
  5. 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檔賣出 }