You are on page 1of 8

 日內 K 線交易策略系統設計

本節設計一可以在日內交易的客製下單系統,此系統可以在開盤期間內以 VBA 程式碼計算日內

K 線(10 分鐘、5 分鐘,甚至 1 分鐘 K 線),並以日內 K 線驅動在 Excel 格位中的交易策略,即時提出

交易建議。

此系統必須在開盤期間讀取即時交易資料,取得即時資料的方法可以是:(1)從即時報盤的網站

連結到 Excel 格位中;(2)使用可以作 Excel DDE 連結的券商報價軟體;或者(3)向資訊廠商購買可以

取得逐筆交易資料的加 服務。由於方法(1)的即時資訊品質太差(穩定性、即時性與正確性不足),

方法(3)需要花錢,因此以下以方法(2)作說明。以下的操作使用台証證券的「超級大三元」看盤軟體

取得 Excel DDE 的服務。

台証證券的「超級大三元」的 Excel DDE 服務操作流程如下:

1. 以券商看盤軟體取得即時價量資料。進入「超級大三元」使用功能表「客戶服務 DDE Excel」

的操作,帶出如圖 1 的「DDE Excel」視窗,在其中選取(可多重選取)「投資標的物」與「資訊

項目」選取「傳送至 Excel 新增」按鍵後,即可將選取的即時資料匯出到 Excel 中,如圖 2 所示,

此作法可取得大約每秒一次報價頻率的即時資料,此頻率對於作「逐筆交易」(Tick Data Trade)

類型的交易者可能仍有不足。
圖1

圖2

2. 以即時價量資料透過 VBA 編碼計算日內 K 線。首先在日內 K 線操作的工作表中設計兩操作按鍵,

分別名為「 動 DDE 自動交易系統」與「關閉 DDE 自動交易系統」的巨集程序趨動按鍵,如圖 3

所示。VBA 程式碼與解說,如表 1 所示。


圖3

表1

行號 Psy 程式碼

1 Dim i, j As Single

2 Dim Min_Bar(1000, 6) As Variant 'Time, O,H,L.C,V

3 Dim O As Single

4 Dim H As Single

5 Dim L As Single

6 Dim C As Single
7 Dim V As Single

8 Dim NP As Single

9 Sub 關閉 DDE 自動交易系統()

10 On Error Resume Next

11 Application.OnTime Now + TimeValue("00:00:02"), "ThisWorkBook.ExeSelf", , False

12 End Sub

13 Sub 動 DDE 自動交易系統()

14 Dim k As Single

15 j=2

16 Application.OnTime TimeValue("08:45:00"), "ExeSelf"

17 End Sub

18 Private Sub ExeSelf()

19 On Error Resume Next

20 i=i+1

21 If i = 60 Then

22 Sheets(2).Cells(j, 1) = Time

23 Sheets(2).Cells(j, 2) = O

24 Sheets(2).Cells(j, 3) = H
25 Sheets(2).Cells(j, 4) = L

26 Sheets(2).Cells(j, 5) = C

27 Sheets(2).Cells(j, 6) = V

28 j=j+1

29 i = 0: V = 0: H = O: L = O: C = O

30 O = Sheets(1).Cells(2, 2)

31 V = V + Sheets(1).Cells(2, 4)

32 Else

33 C = Sheets(1).Cells(2, 2)

34 If C > H Then H = C

35 If C < L Then L = C

36 V = V + Sheets(1).Cells(2, 4)

37 End If

38 Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkBook.ExeSelf"

39 End Sub

程式碼說明
行(1)~(8)程式碼用以設定所有巨集均可引用的全域變數。

行(9)~(12)程式碼為「關閉 DDE 自動交易系統」按鍵驅動的程式碼。其中第(11)行,使用 OnTime

指令在按鍵驅動後 2 秒後(Now + TimeValue("00:00:02")),關閉 ExeSelf 程序巨集。

行(13)~(17)程式碼為「 動 DDE 自動交易系統」按鍵驅動的程式碼。第(15)行設定變數 j 為 2,變數

j 用以設定在工作表 2(名為 MinBar 的工作表)輸出資料的列序。第(16)行,使用 OnTime 指令設定在

早上 8 點 45 分時("08:45:00"),執行 ExeSelf 程序巨集。

行(18)~(40)程式碼為 ExeSelf 程序巨集程式碼。第(20)行的變數 i 用以作分鐘內的秒數計數。若已經

累計至 60 秒,則透過第(21)行的判斷結構,若秒數累計已經累計至第 60 秒,則執行寫出分鐘 K 線

時間、開、高、低、收、量到第二個工作表第 A(1)至 F(6)欄中(行(22)~(27))。第(28)行將變數 j 增加

1,以備下次執行時設定到下一工作列中。第(29)行重設變數 i 與 V(成交量值)、H(最高價)、L(最低

價)、C(收盤價)等為 0。第(30)行,設定讀入的成交價為下一分鐘的開盤價。第(31)行開始累計下一

分鐘的成交量。透過第(21)行的判斷結構,若秒數累計未累計至第 60 秒,則在第(33)行以成交價為

最新收盤價;在第(34)行,若收盤價(C)大於最高價(H),則以收盤價取代最高價(H=C);在第(35)行,

若收盤價(C)小於最低價(L),則以收盤價取代最低價(L=C);在第(36)行,將每秒成交量(Sheets(1).

Cells(2, 4))累積至成交量(V)變數中。

在第(36)行,使用 OnTime 指令在按鍵驅動後 1 秒後(Now + TimeValue("00:00:01")),執行 ExeSelf 程

序巨集。
3. 試算 K 線是否觸發策略。此部分係在完成前述步驟 2,每分鐘 K 線可以第二個工作表中逐一出現

後,在 Excel 格位中實現經回測調整過後的執行策略,在此以 6 分鐘與 12 分鐘 K 線交叉的策略說

明(短均線與長均線參數分別隱藏在 G2、H2 格位中)。在 G 欄中可以算出短均線 (以 G21 格位為

例,內建公式為「 =IF(A21<>"",AVERAGE(E21:OFFSET(E21,-G$2+1,0)),0) 」 ) ;在 H 欄中可以算

出長均線 ( 以 H21 格 位 為 例 , 內 建 公 式 為 「 =IF(A21<>"",AVERAGE(E21:OFFSET (E21,-

H$2+1,0)),0)) 」 ; 在 I 欄 中 作 交 叉 判 斷 ( 以 I21 為 例 , 內 建 公 式 為

「=IF(AND(G20<H20,G21>H21),1,IF(AND(G20>H20,G21<H21),-1,0))」);在 J 欄中作交易建議斷

(以 J21 格位為例,內建公式為「 =IF(I21=1,"作多一口期貨",IF(I21=-1,"作空一口期貨"," "))」。在

系統中,取得投資建議後可以手動或使用 API 限價或市價交易。

此範例告訴我們,即使券商的免費 DDE,也可以設計成盤中策略觸發系統,但此系統仍有改善

空間,以下是幾點提醒:

1. 因為即時繪製 K 線圖,因此 Excel 會有延遲,關掉畫圖就會好些,反正圖只是畫好看的與策略趨

動無關。但即使關掉 K 線圖繪製,因為 Excel 執行其他動作也需要時間(特別是策略很繁複的時

候延遲更嚴重),程式中用累積秒數方式決定是否結算分鐘 K 線,時間累積到盤中就會有明顯誤

差了。

2. 此外,1 分鐘 K 線畫出來後,會先在 H 欄算短均、再於 I 欄算長均,之後於 J 欄作判斷,K 欄驅

動策略執行,但因為執行序是先算 H 再算 I,因此 J 與 K 的判斷會有瞬間出錯(但立即回復正確),

如果手動下單還不至於出錯(要下單時就改正了),但若在 Excel 中驅動 API 就要小心了,會產生


錯訊。

3. 使用 Excel DDE,取樣頻率設為 1 秒,但目前期貨逐筆交易的發生頻率可能小到以微秒計,因此

許多筆資料會被漏掉,不但開高收低價可能無法精確取樣到,量的統計更不會精準。因此,也限

制了實用價值。假若,投資人可以取得絕對精確的即時資料,當然這些問題就可解決,進一步改

善系統也才有意義。

You might also like