關於交易量函數的理解是否正確?

  •   265 
  • 最後發表   XQYi  2023 十二月 08
XQYi 發文於   2023/11/22

SetPosition()=>希望的庫存量(部位)

Position()=已下單的委託量

Filled()=已成交的量

量(多為+ ,空為-)

若希望庫存為-1 (卷賣)=> SetPosition(-1)

當收到SetPosition(-1)時,若條件符合,則下委託單=>Position (-1)

委託單若成交時=>Filled=-1

若要沖銷則買進,希望庫存為0 =>SetPosition(0)

須告知 Filled=-1 ,若條件符合時,下委託買進一張Position (1)

 

 

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/11/24

Hello xqyi,

 

您可以參考 setpositionpositionfilled 的說明。

position 和 filled 會回傳腳本運算時的部位和庫存 (單純回傳數值)。

setposition 可以設定 position 的數值,而在當次腳本運算完後系統會依據 position 和 filled 差別來判斷是否要下出委託。

成交的話庫存就會改變。

舉例來說,腳本開始計算的時候 position 和 filled 都為 2,運算完因為有執行到 setposition(-1, market),則position被修改為-1。

此時系統就會判斷要委託賣出3張市價單,讓庫存也變為-1。

XQYi 發文於   2023/11/24

1.您可以參考說明=>看得霧煞煞才會問。
尤其是在position上的口語化是甚麼意思? 
目前庫存量(position ?)、委託量(position ?)、已成交量(Filled)、希望庫存量(setposition),是分別對應的函數?

2.如前發文理解若有錯誤處請指正,以利了解理解
Filled=>實際成交量
setposition=>調整庫存量到指定數量 
Position=所謂Position,指的是「這個商品的目標部位」,也就是這個腳本預期持有的部位=>這一個若不是委託量,我就很難理解,可否請進一步用精準的白話、數學式、圖文來說明三者關係?

3.以下語法是否正確
或有更容易理解的語法來執行買賣的自動交易,來實現同一個策略內的現股買進或賣出、資卷的買進或賣出
//先買後賣
If condition1 and  value3 > 0 and getField("均價") > close then begin
setposition(1,close); 
if filled=1 and close >= filledAvgPrice *1.01 then setposition(0,close);
if filled=1 and close >= filledAvgPrice *1.005 then setposition(0,close);
end;

//無庫存先放空賣再依獲利優先順序買
If condition1 and position =0  and value3 < 0 and getField("均價") < close then
begin setposition(-1,close);
if filled=-1 and close <= filledAvgPrice *0.99 then setposition(0,close);
if filled=-1 and close <= filledAvgPrice *0.995 then setposition(0,close);
end;

//有庫存先賣再依獲利優先順序買
If condition1 and filled=1 and value3 < 0 and getField("均價") < close then
begin
setposition(0,close);
if close <= filledAvgPrice *0.99 then setposition(1,close);
if close <= filledAvgPrice *0.995 then setposition(1,close);
 end;

4. 以下語法,若將獲利順序寫成一行可否? 執行結果會有何差異,何者正確
if close <= filledAvgPrice *0.99 then setposition(1,close); 
if close <= filledAvgPrice *0.995 then setposition(1,close);

vs

if (close <=filledAvgPrice *0.99 or  filledAvgPrice *0.995) then setposition(1,close); 

XQ小幫手 發文於   2023/11/28

 Hello xqyi,

 

1 & 2.

position => 策略預期該有的庫存 (XQ文章中會稱為部位)。

filled => 策略目前的庫存 (可能和實際庫存不同)。

setposition => 設定 策略預期該有的庫存 的數字,更白話的說就是 "希望策略的庫存是幾張" (注意,並不是買幾張或是賣幾張)。

 

position 和 filled 會在運算完後才改變,系統接著會依據腳本運算結束後的 策略預期該有的庫存 (position) 和 策略目前的庫存 (filled) 來判斷是否要交易,要交易多少張。

同次腳本執行有運算到多個 setposition 時,只會執行第一個運算到的 setposition。

 

策略庫存在策略啟動後就會是獨立運算的,其他策略或手動交易對該策略的庫存不會有影響。

而策略啟動時初始庫存會是多少則視您策略的設定,可參考 自動交易策略參數總覽

 

3.

交易時請使用 filled 和 position 控管,可參考 自動交易語法介紹

 

小幫手不知道您想要的是什麼條件,建議您先用中文描述在搭配腳本讓小幫手釐清,但您的腳本小幫手看起來應該有問題。

舉例來說,您的進出場都包在 condition1 and  value3 > 0 and getField("均價") > close 的條件裡,所以如果 condition1 and  value3 > 0 and getField("均價") > close 不符合的話,腳本也不會出場。

另外像是小幫手已經在其他文章中解釋過了,如果沒有庫存的話 filledAvgPrice 會是0。

所以 有庫存先賣再依獲利優先順序買 是賣出後不會再買進的。

 

4.

沒什麼差別,因為 close <= filledAvgPrice *0.99 符合的時候 close <= filledAvgPrice *0.995 一定會符合。

舉例來說,假設 filledAvgPrice 為100的話。

成交價小於 99 元的時候,一定也會小於 99.5 元。

真要說的話,您只需要寫 if close <= filledAvgPrice *0.995 then setposition(1,close); 一行即可。

XQYi 發文於   2023/11/28

上文腳本內容的中文描述

幾個重點

A.      同一個腳本內要滿足不同的情境交易

B.      依不同的買賣訊號和實際庫存情況進場(先買或先賣)

C.      出場條件都是依獲利

情境有三

1.      買的訊號先發生時condition1 and  value3 > 0 and getField("均價") > close,

(無庫存或庫存融卷),則採先買進,獲利後再賣出,若是有情境三融卷股優先買回補。

2.      賣的訊號先發生時 condition1 and value3 < 0 and getField("均價") < close,

若有庫存,則先賣出,等獲利後再買進,若有融資股則融資股優先賣。

3.      賣的訊號先發生時condition1 and  and value3 < 0 and getField("均價") < close,

若無庫存,則先融卷放空賣出-1,等獲利後再回補買進,萬一回補不成功,下個有獲利的交易日先回補。

XQ小幫手 發文於   2023/12/01

Hello xqyi,

 

如同小幫手之前所說,策略啟動後庫存 (策略庫存) 是獨立的,視情況會和實際庫存不同。

除非您只有運行這個策略、策略設定為依庫存,且沒有手動交易,這樣兩者才會是相同的。

 

買訊: condition1 and  value3 > 0 and getField("均價") > close

賣訊: condition1 and value3 < 0 and getField("均價") < close

 

如果依照上面的訊號進場,那麼反方向訊號發生但停利還沒滿足 (或是虧損) 的時候,要怎麼處理?

策略起動前的庫存和策略運行中所產生的庫存是有不一樣的條件嗎?

建議您可以完整考慮整個交易情境後,就比較容易撰寫XS腳本。

 

舉例來說,如果要以停利為優先的話:

 

condition10 = condition1 and  value3 > 0 and getField("均價") > close;   //買進訊號

condition20 = condition1 and value3 < 0 and getField("均價") < close;    //賣出訊號

 

if condition10 and filled = 0 and position = 0 then setposition(1, market);    //買進訊號且庫存部位為0時則多方進場

if condition20 and filled = 0 and position = 0 then setposition(-1, market);   //賣出訊號且庫存部位為0時則空方進場

 

if filled = 1 and position = 1 and close >= filledavgprice * 1.05 then setposition(0, market);     //多方停利

if filled = -1 and position = -1 and close <= filledavgprice * 0.95 then setposition(0, market);   //空方停利

 

這樣腳本依照訊號進場後要達到停利才會平倉,接著才會依訊號再決定接下來要多方還空方進場。

 

若要以訊號為優先的話:

condition10 = condition1 and  value3 > 0 and getField("均價") > close;   //買進訊號

condition20 = condition1 and value3 < 0 and getField("均價") < close;    //賣出訊號

 

if condition10 and filled <= 0 and position <= 0 then setposition(1, market);    //買進訊號且庫存部位為0或空方時則平倉且多方進場

if condition20 and filled >= 0 and position >= 0 then setposition(-1, market);   //賣出訊號且庫存部位為0或多方時則平倉且空方進場

 

if filled = 1 and position = 1 and close >= filledavgprice * 1.05 then setposition(0, market);     //多方5%停利

if filled = -1 and position = -1 and close <= filledavgprice * 0.95 then setposition(0, market);   //空方5%停利

 

這樣腳本會依照訊號決定多方還是空方,若停利達到的話則會平倉。

XQYi 發文於   2023/12/02

辛苦了,但情境不符所提,我需要的是情境的整合不是獨立,更糊塗了!

想法是: 買訊和賣訊發生時是進場時機'、獲利後就平倉出場、若賣出訊號先出現,前日若無庫存下則先融卷賣出(不可以賣出今日買進的)

交易方式應該不難理解!  只是程式編寫執行後不如我以上需求,不曉得卡在何處

 

 

XQ小幫手 發文於   2023/12/08

Hello xqyi,

 

若您不了解自動交易中心是如何運作、該如何設定的話,很難達成您要的目標,小幫手也很難解釋。

如果是單純的訊號達成就進場,獲利才出場,這個在腳本中就可以達成。

問題出在於每個策略啟動後的部位庫存是獨立的,且若策略是當天啟動的話,沒辦法判斷昨日是否有庫存 (除非您自行設定參數)。

 

前日若無庫存下則先融卷賣出(不可以賣出今日買進的)

=> 姑且不論您的今日買進是在策略啟動前還是啟動後買進的,策略設定是否能夠追蹤該庫存,但對自動交易在判斷送單時會依據實際庫存 (實際帳戶庫存,非策略庫存) 作下單,所以是不會發生同時持有現股並融券賣出的情況。

若實際庫存為1,而策略計算後判斷要賣出1張 (不論策略是要空方進場還是多方平倉),此時都會將實際庫存的那1張給賣掉。

發表回覆
Close