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

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

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

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

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

Excel 實現選擇權報價

初步實現的功能包括有:

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

[備忘] 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 物件,標定一組儲存格作為參考表格,再以「相對座標」來取得所參考的儲存格。

閱讀全文 »

淺論 Excel VBA 的 MVC 框架

撰寫即時性的看盤資料分析,最簡單與方便的莫過於利用 Excel 了。工作表 (Worksheet)內的儲存格 (Cell)既可以當成如 DDE or RTD 的資料源,又能做計算邏輯與資料的呈現。而若牽涉到較複雜,如多個儲存格甚或多個工作表、多個工作簿 (Workbook)之間的資料處理,則可利用 Excel 內建的 VBE (Visual Basic Editor)程式開發編輯器來撰寫一般開發人員所認知的「巨集 (Macro)」程式。

VBE 編輯器會為每一個 Excel 檔案配置一個 VBA 專案 (VBAProject),每一個 VBAProject 可以有四種不同類型的資料夾 (Folder)-「Excel 物件」、「模組 (Module)」、「表單 (Form)」、「物件類別模組 (Class Module)」。其中「Excel 物件」資料夾是預設其內並預設了四個「This Workbook」、「工作表1」、「工作表2」、「工作表3」物件。
Excel VBA Project 組成

這裡帶出一個問題:VBA 程式碼該寫在這四種類型的哪一個資料夾 (或應該稱為哪一種類型的模組)?

或直接把其中最常見的問題更白話:不同工作表之間的資料篩選、處理與搬移等,VBA 程式碼的控制 (Control)與運算邏輯部分,該寫在「Excel 物件」還是「模組 (Module)」?

為了一次性解決 Excel VBA 程式碼結構議題,個人花了兩天的時間思考,先從這四種類型的物件 (可以把這四種資料夾想成四大物件類型)運用物件導向分析思維 (object-oriented analysis thinking)的「責任分派樣式 (responsibility assign pattern)」,先釐清這四大類物件的主要責任。

我這裡先利用 UML 類別圖 (class diagram),來表達出「VBAProject」與這四種類型的物件結構關係。
Excel VBA Project 的結構關係

閱讀全文 »

軟體思維顧問

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

Personal