You are on page 1of 10

 逐筆交易策略系統設計

本節設計系統,可讀入逐筆交易資料,並使用券商提供的 API 元件執行策略。

在本例中,以台証 API Quote 元件取得逐筆交易資料,在策略觸發時,使用台証下單 API 執行

交易。系統見面如圖 1 所示。此系統中, 由上到下執行,包括「登入即時報價服務帳號」、「取得

即時報價」、「登錄下單帳號」、「開 策略執行產生下單訊號」、「取得委託回報」、「取得成

交回報」,所有步驟一氣呵成。

圖1
表 1 所示程式碼為 API 下單程式碼。

表1

行號 程式碼

1 Private Sub Command11_Click()

2 Dim Data As Variant: Dim varData() As Variant: Dim tmp As Long

3 '==下單資料寫於此區域再丟給 API(以期貨單為例)=====

4 ReDim varData(0 To 27)

5 varData(ORDER_ARGS_ROCID) = m_RocId

6 varData(ORDER_ARGS_PASSWORD) = m_PassWord

7 varData(ORDER_ARGS_BRANCHID) = m_Branch

8 varData(ORDER_ARGS_CUSTID) = m_Account

9 varData(ORDER_ARGS_AGENTID) = m_AgentId

10 varData(ORDER_ARGS_SOURCE) = "IC" '來源別, IC 指艾揚,勿改!無其他用途!

11 varData(ORDER_ARGS_ID) = "TXF"

12 varData(ORDER_ARGS_BS) = Order_BS

13 varData(ORDER_ARGS_ODTYPE) = "R"
14 varData(ORDER_ARGS_PRICE_FLAG) = "0"

15 tmp = 4300

16 varData(ORDER_ARGS_ODPRICE) = tmp * 1000 '委託價需乘 1000, 末三位是小數位數

17 varData(ORDER_ARGS_ODQTY) = Order_Quan

18 varData(ORDER_ARGS_ODKEY) = "123456789" '此 key 用以程式方便追蹤委託

19 varData(ORDER_ARGS_OPENCLOSE) = "C" '"O":Open 新倉,"C":Close 平倉,"9":Auto 自動單

20 varData(ORDER_ARGS_MTH) = "200901"

21 varData(ORDER_ARGS_DAYTRADE) = "N" '"Y"當沖單,"N"非當沖,且為預設值

22 Data = varData

23 tmp = ICEGLOBALTRADEAPI1.PlaceFutOrder(Data)

24 Debug.Print "PlaceFutOrder:" & Str(tmp)

25 End Sub

程式碼說明

不同券商提供的 API 元件有不同的規格,因此在此不作詳細說明。

若投資人有興趣自行設計下單系統,可由券商處取得技術文件;除了技術文件外,服務好的券商

甚至還提供不同程式開發環境(包括 Excel、VB、VC 等等)的範例系統,交易人只需要了解程式碼,


了解下單關鍵程式行,例如價格、下單量、下單方式。

以上述程式碼而言,

第(5)行程式碼用以設定身分證字號,第(6)行程式碼用以設定登入密碼,第(7)行程式碼用以設定分

公司代號,第(8)行程式碼用以設定帳號,第(11)行程式碼用以設定買賣別,第(12)行程式碼用以設

定交易商品,第(13)行程式碼用以設定買賣方式,第(14)行程式碼用以設定市價或限價買賣,第

(16)行程式碼用以設定委託價,第(17)行程式碼用以設定交易量。

表 2 所示為取得即時資料後,觸發 Tick 交易策略的語法。

表2

行號 程式碼

1 Private Sub iPushX1_SetData2(varChannel As Variant, varData As Variant)

2 '收到 iPush server 傳送來的資料, 使用 binary array 型態接收資料

3 Dim out As String: Dim sval As String: Dim ival As Long: Dim i As Integer: Dim rtn As Integer

4 rtn = XQuote1.SetData(varChannel, varData)


5 If (rtn >= 0) Then

6 out = ""

7 sval = XQuote1.GetStrValue(1)

8 If TickBeginFlag = 0 Then

9 TickData(1, 1) = sval

10 TickData(2, 1) = sval

11 Else

12 TickData(2, 1) = sval

13 End If

14 out = out + "投資標的 => " + sval + ";"

15 ival = XQuote1.GetIntValue(0)

16 If TickBeginFlag = 0 Then

17 TickData(1, 2) = ival

18 TickData(2, 2) = ival

19 Else

20 TickData(2, 2) = ival

21 End If

22 out = out + "時點 => " + Str(ival) + ";"


23 ival = XQuote1.GetIntValue(16)

24 If TickBeginFlag = 0 Then

25 TickData(1, 3) = ival / 1000

26 TickData(2, 3) = ival / 1000

27 Else

28 TickData(2, 3) = ival / 1000

29 End If

30 out = out + "成交價 => " + Str(ival / 1000) + ";"

31 ival = XQuote1.GetIntValue(18)

32 If TickBeginFlag = 0 Then

33 TickData(1, 4) = ival

34 TickData(2, 4) = ival

35 Else

36 TickData(2, 4) = ival

37 End If

38 out = out + "成交量 => " + Str(ival) + ";"

39 ival = XQuote1.GetIntValue(19)

40 If TickBeginFlag = 0 Then
41 TickData(1, 5) = ival

42 TickData(2, 5) = ival

43 Else

44 TickData(2, 5) = ival

45 End If

46 out = out + "累積量 => " + Str(ival) + ";"

47 TickBeginFlag = 1

48 '==交易策略置於此============================================

49 If Check1.Value = 1 Then '設定啟動交易策略

50 '若量增 2 口(含)以上價漲 3 點(含)以上,則買進 1 口

51 If Val(TickData(2, 5)) <> Val(TickData(1, 5)) Then '確認為新的 Tick 資料

52 If Val(TickData(2, 4))>=Val(TickData(1, 4))+2 And Val(TickData(2, 3))>=Val(TickData(1, 3))+3 Then

53 Order_Product = "TXF"

54 Order_BS = "B"

55 Order_Price = Val(TickData(2, 3))

56 Order_Quan = 1

57 Text4.Text = Text4.Text + "Buy TXF 1 口 限價" + TickData(2, 3) + Chr(13) + Chr(10)

58 End If
59 If Check2.Value = 1 Then '設定自動交易

60 '將 API 下單程式碼置於此

61 End If

62 End If

63 '若量增 2 口(含)以上價跌 3(含)點以上,則賣出 1 口

64 If Val(TickData(2, 5)) <> Val(TickData(1, 5)) Then '確認為新的 Tick 資料

65 If Val(TickData(2, 4))>=Val(TickData(1, 4))+2 And Val(TickData(2, 3))<=Val(TickData(1, 3))-3 Then

66 Order_Product = "TXF"

67 Order_BS = "S"

68 Order_Price = Val(TickData(2, 3))

69 Order_Quan = 1

70 Text4.Text = Text4.Text + "Sell TXF 1 口 限價" + TickData(2, 3) + Chr(13) + Chr(10)

71 End If

72 If Check2.Value = 1 Then '設定自動交易

73 '將 API 下單程式碼置於此

74 End If

75 End If

76 End If
77 For i = 1 To 5

78 TickData(1, 5) = TickData(2, 5)

79 Next i

80 End If

81 Text1.Text = Text1.Text + out + Chr(13) + Chr(10)

82 Text1.SelStart = Len(Text1.Text)

83 End Sub

程式碼說明

第(7)行程式由 xQuote 元件中取得「投資標的資料」;第(12)行程式由將取得之「投資標的資料」存入陣列 TickData(2,1)

位置中;第(14)行程式將「投資標的資料」連結到 out 字串中。

第(15)行程式由 xQuote 元件中取得「時點資料」;第(20)行程式由將取得之「時點資料」存入陣列 TickData(2,1)位置中;

第(22)行程式將「時點資料」連結到 out 字串中。

第(23)行程式由 xQuote 元件中取得「成交價資料」;第(28)行程式由將取得之「成交價資料」存入陣列 TickData(2,1)位

置中;第(30)行程式將「成交價資料」連結到 out 字串中。

第(31)行程式由 xQuote 元件中取得「成交量資料」;第(36)行程式由將取得之「成交量資料」存入陣列 TickData(2,1)位

置中;第(38)行程式將「成交量資料」連結到 out 字串中。


第(39)行程式由 xQuote 元件中取得「累積量資料」;第(44)行程式由將取得之「累積量資料」存入陣列 TickData(2,1)位

置中;第(45)行程式將「累積量資料」連結到 out 字串中。

第(47)行重設 TickBeginFlag 旗標變數。此變數為全域變數,用以確認是否為第一次執行 TickData 讀取功能。若是

(TickBeginFlag = 0),才一次讀取兩列資料到 TickData 陣列中。

第(49)行判斷是否啟動交易策略,若是(Check1.Value =1),且確認為新的 Tick 資料(由於可能會連續讀取同一筆資料,因

此必須比較前後兩筆資料的累積成交量是否不同,因此需於第(51)行中,判斷 Val(TickData(2, 5)) <> Val(TickData(1, 5)條

件),才執行逐筆交易策略,在此設定策略為「若量增 2 口(含)以上價漲 3 點(含)以上,則買進 1 口」,對應規則語法在

第(52)行的判斷規則(Val(TickData(2, 4))>=Val(TickData(1, 4))+2 And Val(TickData(2, 3))>=Val(TickData(1, 3))+3)中,若規則

符合則於第(53)行設定交易商品(Order_Product)為”TXF”,於第(54)行設定交易買賣方向(Order_BS)為”B”,於第(55)行設

定交易價格(Order_Price)為成交價(Val(TickData(2, 3))),於第(56)行設定交易量(Order_Quan)為 1,並於第(57)行將交易訊

息("Buy TXF 1 口 限價" + TickData(2, 3))連接到 Text4 物件的文字中。第(59)~(61)行間程式碼用以設定當投資人選取自動

交易(Check2.Value = 1)時,可將 API 下單程式碼置於第(60)行。

第(64)至(75)行程式碼與第(51)至(62)行程式碼類似,不再贅述。

第(77)至(79)行程式碼將 TickData 第二列資料存至第一列資料中。

You might also like