聊聊 C# 實作 Excel 選擇權報價交易系統

前兩個月有位委託人希能協助在 Excel 實現台指期選擇權契約報價暨自動交易決策系統。他說原來已有透過一位獨立開發者利用 Excel VBA 撰寫,但無論如何都無法符合他的需求,甚至連正常執行顯示報價都有問題。

直覺聽來,我是不可能考慮使用 Excel VBA 來實作選擇權報價的,它需要動態處理即時資訊的更新太多也太過頻繁,且實現邏輯可能比想像得還複雜,要能動態處理運算並處理選擇權契約月份與履約價格,這非得使用 OOP 語言來實現會容易許多相對也比較有擴展的彈性。

原來是不打算接受這個委託的,因為要克服相關技術的難點預期應該不少。不過後來想想,反正早有計畫要利用 C#.NET 實現包括報價資料源的連接、當沖策略的設計、自動下單等功能,並直接以 Excel 當使用者介面 (GUI),可以直接利用其簡便的圖形報表呈現所需的結果。

由於幾乎是從無到有,且個人對即時性 (real-time)系統的設計實現並不熟悉,包括從研讀大量相關文件到寫碼實作,整整花了約有一個月 part-time 時間,總算能實現在 Excel 畫面上呈現選擇權履約價的報價表。

Excel 實現選擇權報價

初步實現的功能包括有:

  • 自動判斷每個月星期三的結算日,由此可決定起始的契約月份。
  • 可動態選擇選擇權契約月份。
  • 可任意排序選擇權項目。
  • 可自動判斷與更新台指期近月份報價暨昨日收盤價。
  • 閱讀全文 »

[金融投機] 多個交易策略部位控管思考

目的:藉由多個交易策略,分散投機的風險;而對同一金融商品,亦有加碼的效用;且經由諸多論述證明,多種交易策略的發展,長期的投資獲利,會來得比單一交易方式好上很多。

先把問題簡化一下...,想像交易人有兩個帳戶:A帳戶發展 30分K 策略;B帳戶發展5分K策略。

  1. 如果在 8120點 30分K有訊號做多,所以A帳戶這裡新增一筆多單。
  2. 如果順利,盤勢現在來到 8280點,短線上判斷會拉回,所以準備做短單空,B帳戶會新增一筆空單。
  3. 請注意,此時的部位為兩口,雖然一筆為多單,一筆為空單,但位於不同帳號。
  4. 當拉回至 8250點,判斷已達滿足點,空單回補,B帳戶沒有單。
  5. A帳號多單一直存在。

但帳戶只有一個的時候,上述情境當短線下了空單後,就會沖銷掉原來的多單,而變得在當下沒有部位。這樣的情形可能會影響到投機者的交易心理,他可能發展了長、短單的兩個交易策略,而當長單「站穩」立足點後,即會成為母單。有了母單的部位,心裡會覺得比較踏實,無論短單如何進出,只要趨勢沒有改變下,獲利的部位就一直存在著。

閱讀全文 »

[備忘] Excel VBA-創建 Dynamic Named Range

Dynamic Named Range, 動態具名範圍,可說是 Excel 對於動態資料範圍的掌控,最便利的一種技巧。所謂的動態資料範圍,也就是資料會因外部事件的觸發而導致資料的擴展 (expand)或縮減 (contract)。而隨著動態資料的變動與運算處理,有相當的需求會反映在即時性的圖表中,透過圖形的呈現,來觀察資料的變化情形。

由此推論,即時性的圖表需要能掌控動態資料的變動;而動態資料變動最佳的掌控方式,則是透過「Dynamic Named Range」,也就是創建一個具名的變數,以參考(refer)所對應的資料範圍。

絕大部分均是透過工具對話框式的設定,可參考先前撰寫的這一篇:[備忘] 創建 Excel 動態圖表的步驟。但這樣彈性度仍嫌不足,最好就是能在 VBA 中創建並可以應該參考該動態具名範圍。

參考下圖,這是關於期指與加權的分時紀錄。欄位表頭 (header)紀錄係從 C1~N1,而資料則是會隨著時間,例如設定每五分鐘,會動態寫入一列分時資料。
加權&期指分時資料紀錄

利用 VBA 實現創建對應上述儲存格範圍的 dynamic named range 可參考如下的程序:

' Make a dynamic named range.
Sub MakeNamedRange()
    '如果不存在該名稱,會發生錯誤,然後再去新增該名稱
    On Error GoTo Err1:
    With ThisWorkbook.Names("分時紀錄表")
    End With
Exit Sub
 
Err1:
    If Err.Number = 1004 Then
        '建立包含所有分時資料欄位的 dynamic ramed range.
        ThisWorkbook.Names.Add _
            name:="分時紀錄表", _
            RefersTo:="=OFFSET(分時資訊!$C$1,0,0,COUNTA(分時資訊!$C:$C),COUNTA(分時資訊!$C1:$N1))", _
            Visible:=True
    End If
    Resume Next
End Sub

其中「分時資訊」為工作表 (worksheet)名稱。

閱讀全文 »

開放「Excel 即時報價暨分析圖表」小型程式交易委製開發專案

*** 現因個人已轉至 Multicharts 交易系統,小型程式交易委製已停止 ***

※ 參考委託案例
 o 聊聊 C# 實作 Excel 選擇權報價交易系統
 o [交易系統] C#.NET 開發海外期貨部位策略管理系統

由於常接收到諸多欲作程式化交易的讀者來電或來信詢問,原來不便接受個人化的委製開發,不過經與所屬顧問團隊負責人討論之後,同意可將視其為小型化的專案 (project),以服務有實際需求的個人用戶。

開發週期係以「週」為開發單位,並視所需完成的功能來報價計費。最短一週、一般這類小型化專案不致超過一個月。(當然仍需視系統的複雜度來決定,若為企業層級的系統,則另行專案處理。)

接收即時性的報價源與圖表分析的處理,會以 Excel 作為主要的界面,畢竟這仍是最普及、且易於與各券商的報價系統連結的應用系統。

其實利用 Excel 非作為程式化交易 (即自動化的下單),而是善用 Excel 的特長:統計分析,然後再作為決策判斷的交易系統。

所以要打造 Excel 成為個人化的即時性決策系統,會需要完成三大部分:即時報價源、分時資料紀錄、圖表分析

一、即時報價源:

一般 Excel 會透過 DDE or RTD 連結券商所提供的免費報價系統,僅需透過連結字串與 Excel 儲存格的對應,即可以取得即時性的報價資料,參考如下圖。
報價資料即時接收

少數用戶可能會透過更穩定的專線或特定的傳輸協定,來連結券商的報價系統。此時就必須參考券商所提供的傳輸協定,來撰寫連結資料的 Data Adapter。

閱讀全文 »

[備忘] Excel VBA-如何判斷 ChartObject 是否存在

當利用 VBA 新增一 ChartObject,如下:

Dim chobj As ChartObject
Set chobj = Worksheets("Sheet1").ChartObjects.Add(50, 40, 400, 200)
chobj.name = "chart1"

則該 Excel 工作表關閉後,該 ChartObject 仍然存在。可以想像工作表關閉後,在工作表內所包含的工作表 (Worksheet)、圖表等物件生命仍存在 (除非物件被 Destroy),它只是被永續冬眠 (hibernate)至檔案資料庫內,待開啟檔案後,這些物件會再次的活化 (Activation)。

問題:如果手動刪除掉該 ChartObject,該如何在 VBA 程式內判斷已不存在,而需要自動再新增同名的 ChartObject?

解決方案:程序內需要宣告「On Error」陳述,然後利用任一陳述式(statement,如 If or With) ,可直接參考 (reference)到該 ChartObject。若不存在,則該陳述會發生錯誤,然後再判斷該錯誤代碼,在錯誤區塊 (block)內新增同名的 ChartObject。

說明:

閱讀全文 »

Excel VBA-關於儲存格變動性的設計議題

問題:當工作表內有多組被參照的儲存格需撰寫 VBA 程式作處理運算,但不希望因被參照儲存格的位置 (座標)變動後,而頻繁修改程式碼。

描述:參考下圖,當有一組表格內的儲存格,例如「加權指數」,有包括「成交價」、「最高價」、「最低價」、「成交量」... 等屬性 (property)。若撰寫 VBA 程式時,係以「絕對座標」參考值 (例如「成交價」座標現為 "B4")來處理,則當上述任一屬性座標更動時 (或新增屬性而移動原來屬性位置),程式碼必須修正調整。這也說明了若以單一儲存格的「絕對座標」作為撰寫程式的參考值,不會是好的寫作方式。
Excel 儲存格

解決方案:利用 Excel Range 物件,標定一組儲存格作為參考表格,再以「相對座標」來取得所參考的儲存格。

閱讀全文 »

軟體思維顧問

專職軟體輔導與教育訓練的獨立顧問。輔導企業資訊單位如何有效組織系統開發與維護;輔導開發人員達成有效的專業分工。傳授如何把軟體作軟 (Keeping Software Soft)的技能,得以提昇系統的彈性/延展,並進而創造系統的再利用價值。

Personal