[交易系統] C#.NET 開發海外期貨部位策略管理系統

這是兩三個月前,某大戶所委託開發關於海外期貨的部位策略管理系統。先前有徵詢過該大戶的同意,得以分享該系統的功用與開發概要。

該大戶係以 MultiCharts 作為報價與策略設計的平台,然後再以自行開發輸出文字檔的 DLL 元件,並搭以自動下單系統,而構成全自動化的程式交易系統。

由於管理的海期商品多達上百種,且運作的帳戶亦多達數十個,資金操作已達一定的規模。有感於資金部位的風險管理有其必要,故把他關於資金部位的策略邏輯,並需要整合現在運作的自動下單,寫成一份需求委託文件,以及一些測試的案例與資料供開發上的參考。

我使用了 UML 元件圖 (Component Diagram),先大致表達出整個海期交易系統的架構 (architecture):

海期自動化交易系統架構圖

圖、海期自動化交易系統架構圖

原來的交易系統係以無窮迴圈的處理方式來持續輸出所監控商品的報價文字檔,使用相當簡單的程序以代表 Tick 的跳動;然後自動下單系統再去讀取所有商品文字檔 (仍以無窮迴圈方式),並判斷商品的部位數量有無變化情形,再決定是否傳送至券商的下單系統。

「海期部位策略管理系統」從功能區分大致上區分有三個模組:商品即時監控、專案帳戶資金管理、判斷帳戶所持有部位 (新增/輸出)的邏輯處理

圖、海期資金部位策略管理系統 by C#.NET

圖、海期資金部位策略管理系統 by C#.NET

閱讀全文 »

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

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

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

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

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

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

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

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

一、即時報價源:

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

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

閱讀全文 »

[備忘] 創建 Excel 動態圖表的步驟

何謂動態圖表 (Dynamic Chart)?

亦即所接收的數據是會持續成長的。例如每分鐘 (或每30秒, etc...)接收即時的台灣加權成交價/量 數據。

創建動態圖表的重點:
  1. 利用「名稱管理員 (Name Manager)」創建具名 (named)可擷取動態資料範圍 (range)的公式 (formula)。
  2. 新增圖表,指定類型與相關屬性,並指定資料來源 (Data Sources)。
一、利用名稱管理員創建具名的公式
  1. (Option) 下載並安裝更好用免費的 NameManager Add-in (原來 Excel 內建的難用)。
     o Name Manager: Range names made easy

    Excel 2010 安裝 3rd party Name Manager

  2. Excel (2010)選單,[公式] → [Name Manager] 啟動。
  3. 測試資料欄位:

    Excel 盤中接收台指期即時數據

    閱讀全文 »

{點子} Universal DDE Server 商品化?

為了方便建立自己的交易分析模型,相關於 Excel, Tradestation, Amibroker 等交易軟件透過 DDE 連結國內盤商的 DDE Server(同時也是看盤軟件),個人算是蠻熟悉的了,自己也寫了許多範例。 況且,我也算是對股票、期貨等金融商品的買賣規則與術語都有一定程度的了解,算是半個 "領域專家 (Domain Expert)" 了 (可不是投機專家< 🙁 )。 乾脆,就委請我們內部團隊開發一個小型的交易商品,就暫名為 "Uni-Data Transfer Server"?

(*** 這些想法目前僅限於個人的紙上紀錄,算是先作個點子註記備忘 ***)

定位與功能:

  • 這算是一種 "中繼 (intermediate)" 類型的應用伺服器。 以連接國內盤商所提供的報價資料,並可以 "餵給" 包括 Excel、交易分析軟體等可以處理交易資料的統計與圖形展現。
  • 可以連接國內主要盤商的報價資料。 初期以最普遍的 DDE 為主,慢慢地要能支援較特別的傳輸協定,例如 Office Quote 等 COM-based 的傳輸元件。
  • 前端連結的資料分析軟體,若為 DDE 傳輸,則幾乎所有交易分析軟件均支援;而為了能更讓資料傳輸更形穩定,打算採 "Plugin" 的方式,直接支援包括 Amibroker, Tradestation 等所自己提供的傳輸協定。
  • 提供 "容錯 (fault-tolerance)" 的功能,可以動態切換至備援的報價資料源。
  • 簡單的示意呈現就是:
    1. Yeswin → DDE 傳輸→ Uni-Data Server → DDE 傳輸 → Excel
    2. 台証OfficeQuote → COM 傳輸→ Uni-Data Server → Data Adapter(By C++) → Amibroker
  • 除了資料的傳遞處理外,也期能提供 "應用" 層面的擴展介面。 可以以 "Plugin" 的方式,讓用戶自行擴展,或由開發廠商以附加套件的方式另行販售。
    例如,可以提供即時分析期貨的買/賣價量的對比數據。單一功能,即可製作成附加套件。
  • 總之,目的就是提供給 "散戶" 以低廉的成本,將手中已有的報價資料源 (From 看盤軟件),透過該商品,轉遞至自行可以撰寫交易分析與統計的應用軟件上,讓其交易策略更能自行具擴展的彈性。
  • 自動下單? 這應該是需要的機制,而前提則是盤商需提供自動下單的呼叫介面。 考慮作成 "Plugin",提供如達成從 AmiBroker 自動下單至各盤商的交易伺服器。

販售與服務方式:

  • 採網路線上訂購。 刷卡或 ATM 轉帳,確認訂購即以 Email 寄送 License Key 與 下載網址。
  • 購買軟件含一年期免費更新。 一年後則付較低廉的升級費用即可持續更新。
  • 使用相關問題與售後服務則以 Email 作技術支援。

關於 Excel DDE Tick 資料變更事件的處理

透過看盤軟體來接收即時性的報價資料,最便利的工具莫過於 Excel 了。 諸多交易人幾乎是利用 Excel 透過 DDE 連結方式來取得報價資料並自行撰寫程式 (如 VBA) 來分析處理。而事實上, DDE 是一種老舊的傳輸規格 (Microsoft 已制定了 RTD 規格, Real Time Data, 用來取代並不穩定的 DDE 傳輸,但國內看盤軟體似乎並未支援),不僅 .NET Framework 沒有直接支援,要處理即時性的 DDE 接收,有些實做的地方還挺麻煩的。

舉個例,在 Excel 的工作表內,設定某一個 CELL 的公式 (formula)欄為:

CATDDE|'STOCK2330  '!CurPrice

代表的就是會接受來自看盤軟體 (本身即為 DDE Server)所傳送過來的資料,並且每次會即時更新跳動 (Tick)的資料。

稍微懂一些程式撰寫的交易人都知道,當某個 CELL 的資料發生變動時,只要寫好所對應的事件處理 (Event Handle)方法,就可以處理變動欄位的資料了。 Excel 預設所提供關於 CELL 資料變動處理的事件程序為 "WorkSheet_Change()",如下:

Private Sub Worksheet_Change(ByVal Target As  Range) 
         'do something
End Sub 

理想上很簡單,不是嗎? 問題是,如果 CELL 的欄位是屬於公式 (formula)型態的 (DDE 連結即為其中之一),那麼就無法利用上述的事件程序來處理。 因公式計算後所變動的資料,並不算在資料變動的事件內;屬於公式計算後所變動的資料,是需要利用 "Work_Calculate()" 程序,如下:

Private Sub Worksheet_Calculate() 
         'do something
End Sub 

老實說,我搞不懂 MS 幹嘛這樣分,我也不想搞懂,只要能達成我所想要的功能即可。 但真正的問題來了… 比較上述的程序,哪裡不一樣? _Change Event 有參數,反之 _Calculate Event 則沒有!

這可是相當相當的麻煩了! 因為透過第一個程序內的參數 (Range Object),可以很方便地得知是哪一個 CELL 的資料變動,但第二個程式則否。 所以若要知道在某一個工作表是哪一個 CELL 的資料變動,就必須寫 FOR LOOP 迴圈,一個一個來判斷是哪一個 CELL 欄位的資料變動。 我幾乎看到許多寫判斷 Tick 資料變動的程式,都是以該事件程序 (Worksheet_Calculate) 來處理。 當然,欄位不多還 OK,但是若是像我這樣,一個工作表是撈約 100 檔的權值成份股、約有 500 ~ 800 個 DDE 欄位的話,那肯定效能會大出問題,連動當然會影響到 Tick 資料的正確性了。 整整爬文了一整個早上,總算才找到真正正確處理 DDE CELL 型態的事件程序了。 不應該使用 "WorkSheet_Calculate()"、而是採用 "SetLinkOnData()" 程序才是。

參考 MSDN 對該程序 (SetLinkOnData Method) 的說明:
"Sets the name of a procedure that runs whenever a DDE link is updated."

閱讀全文 »

C# DDE 用戶端(Client) 的範本(含源碼下載與說明)

參考我原來所寫的一篇:「談談 C#.NET 連結 DDE Server 的設計觀」。 使用 NDde 這個開放源碼,來包裹(Wrap) Win32 APIs 連結 DDE 的通訊底層,使得 .NET-based 的應用程式也可以很便利地連結 DDE Server。

利用幾天的時間,我寫了一個算是比較完整的 C# DDE 用戶端(Client)程式,可以確實連結國內券商所提供的看盤軟體(本身即是 DDE Server)。目前測過包括 “永豐金 eLeader”, “元大 Yeswin”, “日盛 HTS”, “康合 全都賺” 等,均可以正常連結並依據連結項目(Item)持續顯示所跳動(Tick)的值(Value)。 這算是一個簡易的範本,旨在展示利用 .NET OOP 語言可以確實連結 Legacy DDE Server,並進而讓有心的程式交易人員,可以再行擴展,自行撰寫包括報表統計、技術線型分析 等應用。

CsDdeClient(Simple)_ScreenShot-02

我寫的這個簡單 DDE Client,基本功能如下:
 o 可以同時連結多個 DDE Server。
 o 可以同時顯示多個項目(Item)所持續跳動(Tick)的數值(Value)。
 o 可以正確顯示傳輸項目值為中文的編碼。
 o 可以任意地刪除 DDE 連線與項目 的相關資訊。

簡單的源碼說明

閱讀全文 »

軟體思維顧問

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

Personal