「自動洗價」說明
單元目錄
設定方式
策略雷達和自動交易中心裡的策略能夠設定自動洗價。以下會分別說明兩邊的設定方式。 策略雷達可以看到原本的洗價設定右方多了一格自動洗價可以勾選,且接著可以設定自動洗價運作的時段。在點選藍色的字串後,會跳出設定洗價時段以及自動間隔的視窗,提供的間隔最短為 1 秒,最長則是到 60 秒。其中洗價時段有內建幾個選項可以快速點選台灣市場常用的時段,亦可以選擇自訂時段來調整。自動間隔則是設定距離上次洗價幾秒後要強制洗價運算一次。 自動交易自動交易在洗價設定中也可以作調整。在勾選自動洗價後,就會跳出設定自動洗價運作的時段以及自動洗價間隔的部分。每次洗價間隔的部分一樣是最短為 1 秒,最長到 60 秒。如何運作
在新增的自動洗價的選項後,策略會有 4 種運作方式,以下會分別作說明。 逐筆洗價和自動洗價皆不勾選在這種情況下,策略的運作方式會和原本的非逐筆洗價相同。只有在執行商品 K 棒結束後的第一次洗價,策略才會去運算已結束的那根 K 棒。 只勾選逐筆洗價在這種情況下,策略的運作方式會和原本的逐筆洗價相同。策略會在每次商品洗價時運算,每次運算間隔最短會相隔 0.125 秒。 只勾選自動洗價在這種情況下,策略會在設定的間隔秒數後自動洗價運算。不會受到商品本身是否發生成交 Tick,或是 K 棒是否結束而影響。為了確保每根 K 棒運算結果正常,換 Bar 後的第一次自動洗價會重洗已結束 K 棒,此次洗價不會觸發警示或交易。 逐筆洗價和自動洗價皆勾選這模式是結合「逐筆洗價」和「自動洗價」的功能。在這種情況底下,策略除了在執行商品有新成交 Tick 進來的時候運算 (逐筆洗價規則),若在自動洗價設定的間隔秒數間都沒有 Tick 進來時,策略也會自動洗價並運算。 需要注意的事項:- 此項功能只有針對及時運作的策略,並不包含回測的部分。不會影響到策略在啟動時的資料讀取筆數或自動交易所設定的策略部位計算起點,只有在策略啟動運算完畢後的即時區間才會運作。在自動洗價運作的狀況下,不會產生新的 K 棒,只有實際的交易才會產生 K 棒。若商品持續沒有交易,那麼自動洗價運算的 K 棒將會是該商品最後一次產生交易的 K 棒。
- 自動洗價功能可以自訂洗價區間,目前系統並沒有限制自訂區間的起始和結束時間。但伺服器會判斷執行商品是否已經收盤,已經收盤的商品是不會執行自動洗價的。
- 自動洗價的交易指令要在限定的時段中才能夠執行送單的動作,目前支援的區間為:
1. 股票:08:35 ~ 13:40
2. 日盤指數期貨:08:35 ~ 13:55
3. 夜盤指數期貨:14:50 ~ 05:10
4. 日盤股票期貨:08:35 ~ 13:55
5. 夜盤股票期貨:17:15 ~ 05:10
會有以上限制的原因是為了避免在券商不收單的時段送出委託而導致錯誤。若自動洗價時在限定時段以外執行了交易指令,執行紀錄會顯示目前為非收單時段,交易指令將不會執行。 - 證券開盤前的時段不能夠下市價單,以及期貨在盤前的兩分鐘內無法刪改委託單。故在撰寫腳本時可以用時間判斷洗價時段,避開在盤前下出市價單導致策略中斷的情況。期貨雖然可以在盤前下出市價單,但策略雷達和自動交易中心的期貨商品都是送出範圍市價單,故也需要避開。
新增/調整欄位和函數
為了應對這個功能,XS 語法也新增與調整了現有的 XS 欄位,讓使用者可以更靈活判斷目前策略的設定和市場的狀態。 函數GetInfo("IsRealTime")
此函數在腳本運算是因為自動洗價的時候也會回傳 1,不會因為自動洗價運算的資料非最新的資料而回傳 0。
GetInfo("IsTimerMode")
此函數會回傳腳本這次運算的原因,若為自動洗價的話則為 1,其他狀況則為 0。
此函數只支援交易腳本和警示腳本,使用在其他腳本的話會回傳 0。
欄位以下報價欄位可以用來取得在盤前、收盤前以及盤中盤中價格穩定措施時的試搓資訊。 試搓成交價
q_SimulatedTradePrice
此欄位會回傳試搓的成交價格。
試搓成交量q_SimulatedTradeVolume
此欄位會回傳試搓的成交數量。
試搓成交時間q_SimulatedTradeTime
此欄位會回傳試搓的成交時間,格式為HHMMSS。
試搓成交日期q_SimulatedTradeDate
此欄位會回傳試搓的成交日期,格式為YYYYMMDD。
以下報價欄位會回傳市場的狀態。 市場狀態q_MarketState
此欄位會回傳目前的市場狀態,可以判斷目前是否屬於盤前搓合階段。
0 = 正常洗價
2 = 暫停交易
3 = 延緩收盤
4 = 開盤前試搓
5 = 開盤前試搓/不允許刪改單 (期交所)
6 = 收盤前試搓
7 = 暫緩開盤
8 = 暫停交易後開始試搓(證交所/期交所)
9 = 暫停交易後開始試搓/不允許刪改單 (期交所)
穩定價格狀態q_CircuitBreakState
此欄位會回傳目前市場是否處於盤中價格穩定措施。
0 = 無
1 = 暫緩搓合且趨跌
2 = 暫緩搓合且趨漲
使用範例
以下提供幾個適合使用自動洗價來處理的範例。 開盤前依據試搓的價格決定是否下單if q_MarketState = 4 and Position = 0 and q_SimulatedTradePrice > close then setposition(1, close);
在開盤試搓階段藉由自動洗價觸發的運算判斷當下的試搓價格是否大於昨日的收盤價,如果是的話下出 1 張委託價為昨日收盤價的買進限價單。
收盤前試搓時平倉if q_MarketState = 6 and Position > 0 and Filled > 0 then setposition(1, GetField("跌停價", "D"));
在收盤試搓階段藉由自動洗價觸發的運算判斷策略是否有多方庫存,如果有庫存的話則下出委託價為跌停價的賣出限價單。
讓商品就算沒有成交也可以下單交易condition1 = GetSymbolField("2330.TW", "Close") cross over Average(GetSymbolField("2330.TW", "Close"), 10); if condition1 and position = 0 and filled = 0 and symbol = "FICDF*1.TF" then setposition(1, market);
一般來說股票期貨的洗價數量小於對應的股票,而這會導致想要依照股票價格來判斷是否交易期貨商品的觸發時間相對較晚,甚至可能無法觸發。
使用自動洗價的話就可以避免此種狀況發生。
讓不同商品可以在同時洗價交易input: _spread(50, "價差"); value1 = getsymbolField("FITXN*1.TF", "Close"); value2 = getsymbolField("FITXN*2.TF", "Close"); value3 = value2 - value1; if value3 < -_spread and position = 0 and filled = 0 then begin if symbol = "FITXN*1.TF" then setposition(-1, market); if symbol = "FITXN*2.TF" then setposition(1, market); end else if value3 > 0 and position <> 0 and filled <> 0 then begin if symbol = "FITXN*1.TF" then setposition(0, market); if symbol = "FITXN*2.TF" then setposition(0, market); end;
此為一個簡單的逆價差交易範例,在遠月近月價差小於設定參數時買進遠月期貨並放空近月期貨。
大部分的情況下兩個不同的商品同時洗價的可能性很低,尤其其中一個商品還是遠月藉由自動洗價的設定就可以讓兩個商品在同一時間運算交易。
在處於盤中價格穩定措施由市價單改為限價單condition1 = close cross over Average(close, 10); if condition1 and position = 0 and filled = 0 then begin if q_CircuitBreakState = 0 then setposition(1, market) else setposition(1, getfield("漲停價", "D")); end;
在洗價時使用 q_CircuitBreakState 來判斷當下是否處於價格穩定措施,並依次判斷是要送出市價單還是限價單。