SetPosition()=>希望的庫存量(部位)
Position()=已下單的委託量
Filled()=已成交的量
量(多為+ ,空為-)
若希望庫存為-1 (卷賣)=> SetPosition(-1)
當收到SetPosition(-1)時,若條件符合,則下委託單=>Position (-1)
委託單若成交時=>Filled=-1
若要沖銷則買進,希望庫存為0 =>SetPosition(0)
須告知 Filled=-1 ,若條件符合時,下委託買進一張Position (1)
        
        SetPosition()=>希望的庫存量(部位)
Position()=已下單的委託量
Filled()=已成交的量
量(多為+ ,空為-)
若希望庫存為-1 (卷賣)=> SetPosition(-1)
當收到SetPosition(-1)時,若條件符合,則下委託單=>Position (-1)
委託單若成交時=>Filled=-1
若要沖銷則買進,希望庫存為0 =>SetPosition(0)
須告知 Filled=-1 ,若條件符合時,下委託買進一張Position (1)
Hello xqyi,
您可以參考 setposition、position 和 filled 的說明。
position 和 filled 會回傳腳本運算時的部位和庫存 (單純回傳數值)。
setposition 可以設定 position 的數值,而在當次腳本運算完後系統會依據 position 和 filled 差別來判斷是否要下出委託。
成交的話庫存就會改變。
舉例來說,腳本開始計算的時候 position 和 filled 都為 2,運算完因為有執行到 setposition(-1, market),則position被修改為-1。
此時系統就會判斷要委託賣出3張市價單,讓庫存也變為-1。
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); 
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); 一行即可。
上文腳本內容的中文描述
幾個重點
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,等獲利後再回補買進,萬一回補不成功,下個有獲利的交易日先回補。
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%停利
這樣腳本會依照訊號決定多方還是空方,若停利達到的話則會平倉。
辛苦了,但情境不符所提,我需要的是情境的整合不是獨立,更糊塗了!
想法是: 買訊和賣訊發生時是進場時機'、獲利後就平倉出場、若賣出訊號先出現,前日若無庫存下則先融卷賣出(不可以賣出今日買進的)
交易方式應該不難理解! 只是程式編寫執行後不如我以上需求,不曉得卡在何處
Hello xqyi,
若您不了解自動交易中心是如何運作、該如何設定的話,很難達成您要的目標,小幫手也很難解釋。
如果是單純的訊號達成就進場,獲利才出場,這個在腳本中就可以達成。
問題出在於每個策略啟動後的部位庫存是獨立的,且若策略是當天啟動的話,沒辦法判斷昨日是否有庫存 (除非您自行設定參數)。
前日若無庫存下則先融卷賣出(不可以賣出今日買進的)
=> 姑且不論您的今日買進是在策略啟動前還是啟動後買進的,策略設定是否能夠追蹤該庫存,但對自動交易在判斷送單時會依據實際庫存 (實際帳戶庫存,非策略庫存) 作下單,所以是不會發生同時持有現股並融券賣出的情況。
若實際庫存為1,而策略計算後判斷要賣出1張 (不論策略是要空方進場還是多方平倉),此時都會將實際庫存的那1張給賣掉。
7 評論