[備忘] 創建 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 連線與項目 的相關資訊。

簡單的源碼說明

繼續閱讀 »

談談 C#.NET 連結 DDE Server 的設計觀

DDE (Dynamic Data Exchange)?,這似乎已經是微軟過時的一種通訊傳遞的技術了。 但是只要是跑券商提供的看盤交易應用軟體,諸如 永豐 e-leader, 元大 yeswin, 日盛 hts 等,都必然有提供 DDE 連結的功能。 探究原因,Excel 肯定是佔最大的因素了,因為一般交易者可以很容易地透過 Excel,抓取看盤軟體正在跳動(Tick)的即時金融商品資訊,在不需要太懂程式設計語法的情況下,也能利用 Excel 強大的統計功能,或者利用簡單的 VBScript 語法,撰寫指標或統計數據等。

先前我就曾經利用 Excel 撰寫過即時的「漲/跌/平 家統計數據」了,詳見:「利用 Excel 實現權值成分的漲跌平家走勢圖」。 不過,目前我正在研究其中關於大盤即時 "量" 的變化,也就是觀察 Top-100 的期貨成份股,在每一分鐘內,統計所有即時跳動(Tick)的成交買價量與賣價量。 所以幾乎每一秒,只要一有跳動,就必須觸發(trigger)統計運算的邏輯,把 100 支以上的權值成份股整個迴圈跑過一次。 不知道是否因為我對 VBScript 不習慣,還是寫法有問題,在 Excel 內的處理效能上還是來得不佳,喔,甚至還曾幾次出現過當掉的現象,而這在即時看盤中,當然是很忌諱的 ; 另外,我也可能想要開發個能同時連多個報價來源 DDE Server 的 "中介(intermediate)" Server,除了可以方便調整想要擷取的資料來源外,還能兼容有 "容錯(fault-tolerance)" 的功能。 反正啊,能具有高度的客製化(customization),以及無限想像的延展性(scalability),更是我想要的,而這些當然就要寫程式自行來去開發擴展囉。

DDE 是個老舊的傳輸技術,從微軟官方的角度,係制訂了 DDEML (Dynamic Data Exchange Management Library) 的規格,並提供給 Developer 最高階的連接方式就是 Windows 32-bit 的 APIs(Application Programming Interfaces),在實際 Windows-32 的作業系統下,是被實作在 "User32.DLL"。 所以,最適合用來開發 DDE-based 的程式語言,當屬可以直接連接 Win-32 APIs 的,諸如 VB6, C++ 等,開發上對於 DDE 的實際連結,會來得容易許多。

anyway, 我還是喜歡利用 .NET C# 來寫程式,最主要只有一個原因,我對它比較熟悉!

而我在一般關於「程式交易討論區」看到有些網友發言,說 .NET 並不支援 DDE! 這句話初看到挺覺得奇怪的,其實正確地來講,應該是說 .NET Framework 並沒有提供 DDEML 的 Wrapper 成為 .NET 元件,所以若要從 .NET 應用程式連結 DDE Server 的話,就必須自行實作呼叫底層(相對於 .NET)的 Win-32 APIs。 一個簡單的流程如下:

  C#/VB .NET Client → .NET DDEML Object(自行撰寫,因為官方沒有提供) → Win-32 DDEML APIs

西方的一個老諺語: "Don’t Reinvent the Wheel (不要重覆再造輪子)。" 那個 .NET DDEML Wrapper 物件,是否要自行撰寫,有待商榷! 若要自行撰寫,那就確定了,是要從造一個新的輪子開始,而且還要很熟悉 DDE 相關的通訊細節才行! 建議啦,這類的 "輪子建設" 工作,先查詢一下 Google,這可是 Google 最大的功用! 發現到,其實真的已經有許多其他行家已經造好可以在 .NET 環境開發的 "DDE 連結 輪子" 了。 包括 美國、中國大陸、甚至日本等都有人在造。 而其中這個: NDde ,看來應該是最為完整的開源 (open-source)專案了。 還包括文件、範例,甚至原始碼等,是可以充分在 .NET 2.0 環境下執行的,下載回來解壓縮放置某一個目錄後 (ex. "\Program Files\Ndde"),把你的 .NET 專案 Add Reference 該目錄內有個 "NDde.DLL" 檔案即可。 這使得寫 C# DDE Client 變得相當簡單,我個人已測過連結 e-leader DDE 來源,完全沒有問題!

要透過 C#/VB .NET 撰寫連結 DDE Server 的 Client 端程式,只要參考 NDde 目錄內的 /Samples 範例檔即可。 另外底下是我自己先暫時寫的一個小小控制程式,主要是測試是否可以確實連結 DDE Server 並取得 Topic/Item 的回傳資料。

繼續閱讀 »

利用 Excel 實現「權值成分的漲跌平家走勢圖」

先前在我的一篇文章提過:關於「江波圖之漲跌家數走勢圖」,在目前我所使用的 Yeswin and HTS 均沒有提供走勢圖。 後來有賴生魚片的協助,永豐金的 eLeader 有提供這項功能,所以上個月也就過去永豐金辦理期權帳戶的申請 (真的相當感謝生魚片,包括優惠的手續費,以及諸多技術上的諮詢,下次要請他吃豬或雞或鵝排)。

在 e-Leader 上打開 [1124] 的視窗編號,就可以列出江波圖之「漲跌平家數走勢圖」,如下圖。

漲跌平家數走勢圖

對於「漲跌平家數走勢圖」,我一直有個想法,就是只統計含權值的漲跌平家數資訊。 當然,一般即時看盤軟體是不會提供的,所以只能只能自己寫了。 原先我是想要利用 AutoIt, or VB, or C#.NET 等其中之一的程式機制,來撰寫 DDE 連線程式,當然還需要有提供畫出走勢圖的功能。 後來想想,花了諸多時間研究 DDE 等規格文件,還要查看實作的 How-to 議題,而這我實在是不會太擅長,所耗費的時間與回饋不怎麼划算。 所以呢,突然才驚覺, Excel 不是都可以提供上述我所要的功能嗎?

只要將 e-Leader 某一個提供報價資訊的視窗,按個滑鼠右鍵,選擇 DDE 功能,就能直接複製到 Excel 的工作表去;然後呢,再寫個統計計算邏輯的 VBA 程式,把統計後的結果每隔一分鐘(都可以設定)就動態新增到另一個工作表;然後動態去觸發圖形(Chart)元件,讓它動態顯示所需要的統計資訊。 如何動態新增列數與動態展示圖形,這一點在實作部分比較棘手一點,我可是查閱了 Google 太多篇文章,才知道要怎麼作的。 而關於如何動態地展現圖形,這個國外 Excel 專業網站: "Peltier Technical Services",裡頭許多關於動態展現圖形實作的文章,相當有幫助。

實作出來後初步的圖形展現如下圖,我是只有抓百大權值成分的上市公司,權重 0.2% 以上的。

Excel_百大權值漲家跌家走勢圖
Excel 百大權值漲家跌家走勢圖(2008/10/07)

又有個想法,如權重最重(約 9%)的台積電,與只有 0.2% 權重的公司,它們漲跌時的影響度,可是完全不能相比擬。 所以我是覺得應該加上含權重這個因子比較理想。 我把權重因子放大 10 倍再加進原來的漲跌平家資訊,參考如下圖:

繼續閱讀 »

Page 1 of 180123456789101112...203040...Last »