在這一篇文章內,我們會用更詳細的篇幅來說明自動交易策略的所有參數,以及系統執行一個自動交易策略的流程,包含
自動交易策略
一個自動交易策略包含以下主要的參數:- 1.要執行的自動交易腳本
- 2.執行的商品,可以指定一個或是多個商品
- 3.策略執行的頻率
- 4.是否要啟動策略部位計算功能
- 5.策略的資料讀取筆數
- 6.是否要逐筆洗價
- 7.是否要啟動交易帳號
- 8.連結的交易帳號
- 9.策略初始部位的設定
- 10.交易安控設定
- 11.進出場的價格設定
- 根據執行商品範圍,以及交易帳號選項,決定要執行哪些商品,
- 依照策略的資料讀取筆數,策略部位的計算起點,以及策略的頻率,來決定要讀取的歷史資料的範圍,
- (選項)歷史資料讀取完畢之後,依照策略部位計算起點的設定,執行腳本來計算策略的歷史部位,
- (選項)依照交易帳號內的所指定的初始部位設定,調整策略的初始部位,
- 等待商品的即時資料,當即時資料更新時,執行腳本,如果有指定交易帳號的話,則依照交易帳號的設定決定如何送出委託
執行商品範圍
自動交易策略提供以下設定商品範圍的方式:- 選擇一個或是多個商品
- 選擇一個分類清單(例如我的某一組自選股)
- 選擇一個XS選股法,執行前會先執行這個選股法,符合選股法的商品就會執行這個腳本
- 選擇交易帳號的庫存
- 選擇從外部檔案匯入欲執行的商品
資料讀取筆數設定
如同策略雷達的設定方式,使用者可以指定策略的資料讀取筆數。策略啟動時,會依照資料讀取筆數讀取商品的歷史資料。例如:資料讀取筆數設定是10的話,則會先讀取今日之前的10根K棒(不包含今日),K棒的頻率依照策略的設定。讀取完成之後,系統會從第一根歷史K棒開始執行,每一根K棒執行一次,總共執行10根K棒,如下圖: 請注意:資料讀取區間內,如果腳本呼叫了任何交易指令,系統都不會予以執行,執行紀錄內會看到錯誤的提示。由於這一個區間不會執行交易指令,所以如果腳本希望判斷這種情形的話,可以透過GetInfo函數,傳入”TradeMode”參數:
if GetInfo(“TradeMode”) = 0 then begin {目前是在資料讀取區間, 不會進行交易} end;
策略部位計算功能
策略部位計算起點預設是關閉的(不指定)。策略在跑完資料讀取區間的K棒之後(期間不會執行任何交易指令),商品的部位都會是0,接下來收到當日即時資料時就會開始執行交易指令,送出對應的委託。 使用者設計的是一個"波段操作的策略",而波段的週期可能超過1日:使用者可能會希望依照歷史資料來判斷目前這個時間點是處在已經進場的階段,或是尚未進場的階段。如果有這樣子需求的話,那麼就可以開啟計算策略部位的功能。開啟時可以指定策略部位計算的起始日期,例如:從2020年1月1日開始計算,或是指定策略部位從當日前N天開始計算。一旦啟用策略部位計算功能後,策略讀取歷史資料的範圍變成:- 資料讀取筆數(多少筆K棒)
- 策略部位計算範圍(多少天的K棒)
- 如果執行頻率是1分K的話,每一根K棒執行一次
- 如果是1分鐘以上的頻率的話(例如5分鐘,30分鐘,日線等),則每一根K棒會執行多次,每一次以這根K棒內的每分鐘資料來模擬K棒在歷史時間內的變化。舉例而言,如果要跑09:00的5分K棒時,系統總共會執行5次:
- 第一次:09:00這一分鐘的資料組成K棒來執行
- 第二次:09:00 + 09:01這兩分鐘的資料組成K棒來執行
- 第三次:09:00 + 09:01 + 09:02這三分鐘的資料組成K棒來執行
- 第四次:09:00 + 09:01 + 09:02 + 09:03這四分鐘資料組成K棒來執行
- 第五次:09:00 + 09:01 + 09:02 + 09:03 + 09:04這五分鐘資料組成K棒來執行
- 假設策略執行頻率是1分鐘,然後在09:00這一次洗價時呼叫了SetPosition(5, 100.0)
- 此時系統會模擬產生一筆買進5張,委託價=100.0元的委託,然後依照09:00之後的K棒資料來判斷這一筆委託單何時可以成交
- 假設09:01的K棒的價格:Open = 101, High = 102, Low = 101, Close = 101, V = 10因"買進委託的價格 < K棒的Low",所以系統會認定這一筆買進委託不會成交
- 假設09:02的K棒的價格:Open = 101, High = 101, Low = 100, Close = 100, V = 2此時系統判斷"買進委託的價格 >= K棒的Low"所以此時會產生一筆成交,成交價格為100,成交的數量是2 (雖然買進委託的委託量是5,可是因為這一筆K棒的總成交量只有2,所以此次只會成交2張)
- 假設09:03的K棒的價格:Open = 99, High = 100, Low = 99, Close = 99, V = 10此時系統判斷"買進委託的價格 >= K棒的Open"所以此時會產生一筆成交,成交價格為99,成交的數量是3 (買進委託剩餘的委託量 = 3),這一筆買進委託此時會完全成交
- 假設買進價格 = P, 委託量 = V,在收到下一根K棒時,依照以下邏輯判斷成交方式:
- 如果 P 是市價:產生一筆成交,成交價 = K棒的開盤價,成交量是Min(委託量,K棒的成交量)
- 如果 P >= K棒的開盤價:產生一筆成交,成交價 = K棒的開盤價,成交量是Min(委託量,K棒的成交量)
- 如果 P >= K棒的最低價:產生一筆成交,成交價 = P,成交量是Min(委託量,K棒的成交量)
- 如果還有剩餘的委託量:則等待下一根K棒再繼續判斷剩餘的數量是否成交
- 假設賣出價格 = P, 委託量 = V,在收到下一根K棒時,依照以下邏輯判斷成交方式:
- 如果 P 是市價:產生一筆成交,成交價 = K棒的開盤價,成交量是Min(委託量,K棒的成交量)
- 如果 P <= K棒的開盤價:產生一筆成交,成交價 = K棒的開盤價,成交量是Min(委託量,K棒的成交量)
- 如果 P <= K棒的最高價:產生一筆成交,成交價 = P,成交量是Min(委託量,K棒的成交量)
- 如果還有剩餘的委託量:則等待下一根K棒再繼續判斷剩餘的數量是否成交
開盤後才啟動的情形
如果自動交易策略是在開盤之後才被啟動,那麼歷史資料的執行流程如下:- 先執行資料讀取筆數區間,此時不會執行交易指令
- 如果啟動策略部位計算功能
- 執行策略部位計算區間,此時會執行交易指令(使用上述撮合方式模擬成交)
- 執行開盤到目前為止的K棒,此時一樣會執行交易指令
- 請注意:如果策略勾選逐筆洗價,此時系統會用當日的Tick資料來模擬逐筆洗價的行為,每一秒鐘執行一次洗價
- 如果不啟動策略部位計算功能
- 執行開盤到目前為止的K棒,不會執行交易指令
交易帳號
每一個交易策略可以指定這個策略執行時要對應的交易帳號,目前共提供三種設定的方式分別是:- 不設定交易帳號
- 設定證券交易帳號
- 設定期貨交易帳號
不設定交易帳號
若策略不設定交易帳號,還是可以正常執行。在策略跑完資料讀取區間,以及策略部位計算區間之後,當策略收到即時行情洗價時,如果腳本呼叫了任何交易指令的話,則系統會以當時的即時行情來判斷這個交易指令是否會成交。以下我們用範例來說明判斷成交的邏輯。假設策略目前的部位是0,然後在09:01:00秒時呼叫了SetPosition(10, 100.0),代表策略會送出一筆買進10張的委託,委託價格是100.0。此時系統會檢視這個商品五檔委託簿的委賣資料(依照當時交易所揭示的行情),如果有任何委賣價格 <= 100.0,則依照當時的委賣數量依序成交(從最低的委賣價開始成交)。範例#1: 產生一筆成交,價格=100.0,成交量=4,還有6張尚未成交委買量 | 買進 | 賣出 | 委賣量 |
5 | 99.5 | 100.0 | 4 |
4 | 99.0 | 100.5 | 10 |
3 | 98.5 | 101.0 | 15 |
2 | 98.0 | 101.5 | 20 |
10 | 97.5 | 102.0 | 21 |
委買量 | 買進 | 賣出 | 委賣量 |
6 | 99.0 | 99.5 | 7 |
5 | 98.5 | 100.0 | 4 |
4 | 98.0 | 100.5 | 10 |
3 | 97.5 | 101.0 | 15 |
2 | 97.0 | 101.5 | 20 |
委買量 | 買進 | 賣出 | 委賣量 |
6 | 100.0 | 100.5 | 4 |
5 | 99.5 | 101.0 | 10 |
4 | 99.0 | 101.5 | 15 |
3 | 98.5 | 102.0 | 20 |
2 | 98.0 | 102.5 | 21 |
時間 | 成交價 | 單量 | 成交狀態 |
09:01:10 | 101.0 | 8 | 不成交 |
09:01:20 | 100.0 | 2 | 產生一筆成交成交價=100.0, 成交量=2(剩餘8張) |
09:01:30 | 99.5 | 3 | 產生一筆成交成交價=99.5, 成交量=3(剩餘5張) |
09:01:40 | 99.5 | 10 | 產生一筆成交成交價=99.5, 成交量=5(全部成交,剩餘0張) |
設定交易帳號
如果使用者希望執行交易指令時會送出真實的委託單,可以在策略設定內選擇想要交易的帳號。首先請先確定策略想要交易的帳號已經先透過XQ的交易帳號設定完成帳號登入的動作,而且也完成了相關的憑證設定。接著就可以從策略設定畫面內選擇這個帳號,完成連結的動作。自動交易所支援的券商範圍有以下的限制:- 目前僅支援證券帳號、期貨帳號。複委託帳號以及群組帳號尚未支援
- 目前僅支援可以透過XQ全球贏家手機版交易的券商,以確保自動交易執行時可以透過手機做完整的監控以及管理
設定證券交易帳號
商品限制如果策略指定證券交易帳號的話,則在啟動策略時系統會檢查策略的執行商品,如果其中有非證券類型的商品的話,則這些商品會被略過不予執行。 選擇:現股交易/信用交易選擇現股交易:系統會依照這個帳號的現股庫存數量,以及買賣方向來決定委託單的內容。買進時會送出現股買進,賣出時會送出現股賣出或是現股先賣(當沖)。選擇信用交易:系統會依照這個帳號的融資/融券庫存數量,以及買賣方向來決定委託單的內容。買進時可能會送出買進融券(回補)或是買進融資委託,賣出時可能會送出賣出融券或是賣出融資的委託。 選擇:ROD/IOC(決定委託單的委託條件)決定委託單送出的類型是ROD或是IOC。由於IOC委託會有不成交則被自動取消的限制,所以當系統發現IOC委託被取消時,會自動修正策略的Position數值。舉例:目前Position = 0,接下來執行了SetPosition(1),策略選擇要用IOC來下單。當策略執行到SetPosition(1),系統會送出一筆買進1張的IOC委託單,同時下一次洗價時Position會被改成1。如果這一筆IOC委託成交:下一次洗價時Filled會變成1。如果這一筆IOC委託沒有成交:由於交易所會自動取消這一筆委託單,所以系統在收到取消通知之後,會自動把Position改成0。會自動調整Position是因為目前已經沒有有效的委託單,所以這個策略的Filled永遠不會變成1,也就會造成Position跟Filled永遠不會同步的情形。請注意:目前系統尚未支援FOK的委託條件。 單邊的交易成本(%)系統會依照交易成本的設定來調整執行時所顯示的損益數值。使用者可以依照所選擇券商的交易費用填入對應的交易成本數值。舉例來說,假設證券手續費折數為 3 折,手續費率為 0.1425 %;交易稅率為 0.3 %,則單邊交易費用約為 0.19 %=((0.1425%*0.3*2)+0.3%)/2 交易回報等待時間此項設定為當系統送出委託時,等待券商的委託回報時間有多長。若在設定的時間內都沒有收到券商端回覆的委託成功/失敗的回報,系統將會中斷此商品的自動交易運作。舉例來說,如果將交易回報等待時間設為30秒,且系統在 12:30:00 時產生一筆買進委託送至券商的話,若自動交易中心在 12:30:30 以前都沒有收到券商回報此筆委託成功或是失敗的話,系統將會強制終止該商品的自動交易運作。 選擇:只可做多/只可做空/不限制這一個選項是用來確保策略執行實單交易時帳號的實際庫存數量符合多空的設定。假設策略選擇只可做多的話,那麼當策略執行時要送出賣出委託時,策略會檢視當時帳號的實際庫存數量,如果實際庫存數量小於欲賣出的數量時,則這一個交易指令不會送出(使用者可以從執行紀錄內看到錯誤的紀錄)。同理,如果策略選擇只可做空的話,那麼當策略執行時要送出買進委託時,策略會檢視當時帳號的實際庫存數量,如果實際庫存的做空數量小於欲買進的數量時,則這一個交易指令不會送出。交易帳號庫存部位整合
策略指定交易帳號之後,可以把交易帳號的庫存跟策略的部位做進一步的整合。目前系統提供了以下三種設定方式:選擇:依腳本計算
在這種模式底下,策略的部位可能是依照歷史資料計算而來的(如果啟動策略部位計算功能的話),或是從0開始(如果不啟動策略部位計算功能的話),與交易帳號的實際庫存沒有任何關係。選擇:依庫存
如果選擇「依庫存」策略在執行完歷史資料區間之後,系統會依照當時帳號的庫存,自動調整策略的部位,以及策略的未平倉成本。在這種模式底下,使用者通常不會啟動策略部位計算功能,而是讓系統依照庫存的數值來設定部位。如果使用者希望利用自動交易策略來進行庫存的調整動作的話,則可以使用這種模式。勾選:庫存異動時自動加入執行
如果使用者想要手動下單,然後在買進之後,讓自動交易可以自動執行停損/停利的出場動作,那麼可以透過「庫存異動時自動加入執行」的這個選項來完成。詳細說明請參考「手動進場後,透過自動交易執行停損停利」此章節介紹選擇:自訂數值
如果選擇「自訂數值」,在策略設定時,系統會先填入目前帳號庫存的數值以及未平倉成本。此時使用者可以做進一步的調整,包含調整庫存的數量,以及成本價格。當策略開始執行時,系統就會依此數值設定策略的部位,之後執行過程內如果成交的話,系統也會依照成交資料,自動調整部位數值以及未平倉成本。如果使用者只是運用策略來交易這個帳號內商品的部分庫存的話,則可以使用這樣子的設定方式。請注意:為了讓使用者確認部位的數值,每次執行策略時,系統都會再次顯示目前的部位設定畫面,使用者當下還可以進行修改,確認之後才會執行策略。交易安控
自動交易策略提供了以下的安控設定,使用者可以依照需求選擇需要開啟的項目:單一商品:每日進場金額上限
這個選項只有在指定了證券交易帳號時才可以啟用。主要用途是確保策略不會進行過多的買賣動作。啟用了這個安控之後,每次策略要執行交易指令之前,會依照目前這個交易指令所需傳送的委託數量/價格,估算所需的交易金額額度,如果這個商品先前累計額度加上這一筆交易金額超過指定額度的話,則不會執行這一筆交易指令。委託成交時,系統會依照實際成交價格重新計算已經使用的額度,3.06.03/7.06.03 版本修改為"只計算買進部位"賣出平倉則不併入額度。 策略重新執行時,委託額度會從零開始重算。如果策略持續執行,每個交易日結束後委託額度也會歸零重新計算。 請注意:上述計算方式與券商計算額度的方式可能會有差異。單一商品:最大部位限制
啟用這個選項之後,如果交易指令的目標部位的絕對值如果超過這個限制的話,則這個交易指令不會執行。舉例來說,如果單一商品最大部位設定為1,SetPosition(1)可以執行,SetPosition(-1)可以執行,SetPosition(2)不會執行,SetPosition(-2)也不會執行。使用這個選項來確保單一商品的最大部位可以符合預期。單一商品:每日最多進場次數
所謂進場次數,指的是"策略的成交部位進入多方,或是空方的次數"。舉例來說,策略一開始部位是0,呼叫了SetPosition(1)之後,如果成交的話,進入多方,進場次數為1。之後策略呼叫了SetPosition(2),或是SetPosition(3),甚至是在SetPosition(3)之後又呼叫了SetPosition(2),只要策略的成交部位繼續維持在多方,進場次數都不會改變。如果策略接下來呼叫了SetPosition(0),在這一筆賣出指令完全成交之後,多方的狀態已經結束,之後的SetPosition(1)就會算成另外一次進場了。這個安控的設計目的也是用來避免過多的交易,例如不斷的買進/賣出。如果進場次數已經到達上限,之後的交易指令就不會執行。請注意:策略部位異動時如果沒有成交的話,並不會改變進場次數。策略整體:每日進場金額上限
與單一商品每日交易金額上限一樣,這個選項只有在指定證券交易帳號時才可以啟用。策略整體的額度,就是這個策略內每個商品額度的加總。如果要執行某個交易指令之前發現這個交易指令所需額度加上目前已經使用的額度超過這個上限的話,則不會執行這個交易指令。請注意:系統會累計這個策略當日每次執行時的交易金額,每個交易日結束,或是關閉XQ之後,都會重新歸零統計。*3.6.3/7.6.3版本修改為"只計算買進部位"賣出平倉則不併入額度。策略整體:最大部位限制
策略整體部位的計算方式是:每個執行商品的部位的絕對值的加總。如果某個商品要更改目標部位時發現新的部位加上策略內其他商品目前部位的加總超過最大部位限制的話,則這個交易指令不會執行。策略整體:最多持有商品限制
策略整體持有商品的計算方式:"統計策略內部位不是零的商品個數"。如果某個商品的交易指令會違背這個限制的話,則這個交易指令不會執行。可以利用這個限制來"控制可以進場的商品個數"。例如執行10個商品,每個商品都進行最多1張的交易時,可以把這個限制設定成3,來保證至多同時只會持有三個商品。交易異常處理
策略執行下單時可能會遇到各種不可預期的情形,例如交易網路延遲,券商交易主機服務阻塞等,為了確保策略執行的買賣邏輯,當遇到以下情形時,這個商品的執行會自動停止:- 送出委託單之後逾時沒有收到回應
- 送出委託單之後券商交易主機回傳錯誤
- 使用者透過其他管道手動調整策略所送出的委託單(例如刪單或是改量)
網路斷線處理
策略執行期間如果遇到報價網路斷線的情形時,使用者可以透過策略設定來決定處理的方式。選擇「停止執行」:當報價網路發生中斷時,策略就會停止執行。選擇「繼續執行」:當報價網路發生中斷時,系統會嘗試重新連線,同時回補斷線期間的成交資料。當回補完成之後,系統會從斷線前的K棒繼續執行,期間回補的K棒也會執行,可是如果執行這些回補的K棒時有呼叫任何交易指令的話,這些指令會被忽略,不予以執行。特殊交易情境處理方式
交易時段的檢查
系統要傳送委託之前,會檢查目前時間是否已經超過交易所可以接收委託的時間,如果超過的話,這一筆委託不會傳送。例如:系統在收到台積電13:30:00的收盤價時會執行洗價的動作,此時如果呼叫了交易指令而需要傳委託的話,因為已經超過證券收盤時間,這一筆委託將不會傳送。收盤後自動調整部位
在盤中執行時如果呼叫了SetPosition之後會送出委託,同時也會更改Position的數值。如果過了收盤之後還沒有收到成交的話,由於目前所有傳送的委託都只在當日有效,所以系統在收盤後會自動調整Position的數值,以便隔日執行時Position的數值跟Filled的數值是一致的。舉例來說:- 一開始部位=0
- 09:10時呼叫SetPosition(5),呼叫後Position = 5,Filled = 0
- 09:20時收到成交2張,此時Position = 5, Filled = 2
- 到了13:30過後,都沒有收到成交,系統會把Position改成2(跟Filled一樣)
- 隔日09:00繼續執行前,Position = 2, Filled = 2
期貨商品換月處理
策略執行商品如果是"期貨連續月份商品"(例如 FITX*1.TF)的話,實際交易時系統會以最近月份的期貨商品來執行委託。策略執的商品如果是"期貨指定月份商品"(例如 FITX10.TF)的話,則在這個商品到期時策略會自動停止此商品。請繼續閱讀下列文章,更進一步了解如何操作XS自動交易中心。