談談 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 倍再加進原來的漲跌平家資訊,參考如下圖:

閱讀全文 »

[筆記] 關於 AutoIt 實現 DDE 功能

由於諸多即時看盤軟體本身亦即為 DDE Server,可以讓支援 DDE 協定,例如 Excel 就可以成為 元大 Yeswin(支援 DDE)的 Client,可以即時擷取大盤等相關數據。 擷取 DDE 的格式為: DDEServer|Topic!Item 。 該 DDE 字串會由證券商所提供的看盤軟體相關的 Help 文件可查詢到。 例如,欲觀察 元大Yeswin 的大盤資訊—上市上漲家數, 則在 Excel 的某一欄位(Cell) 填入 YES|DQ!&TWTK2.Name

但是若每此看盤都需要打開 Excel,實在甚為不便,所擷取的數據不一定非得要透過 Excel 來處理,也有可能交給 Wealth-Lab 來分析。 所以可以利用其它亦有支援 DDE 實作的語言機制,如 VB6 是最簡單的了,來實現一個 DDE 中介的常駐程式,可以將擷取得來的數據再轉給其它的應用程式(如 Wealth-Lab)來處理; 甚至,也可以實作一個可以連結多個資料來源的 DDE Server,以確保資料的容錯性。

由於撰寫 VB6 還要準備開發環境,實在甚為不便,所以轉而尋求透過簡單但強大的自動化巨集處理的應用工具,AutoIt
AutoIt 的程式語法為 VB Script-based, 它內建支援了諸多關於如 GUI 與 字串處理等函數(Function)。 但截至目前版本(v3.2.12.1, 2008/06/12))為止, 尚未提供連結 DDE(Dynamic Data Exchange) 的函數。

但是,AutoIt 其實可以透過 VBScript 語法,直接呼叫外部 Windows 的 API 與 DLL 程式。 而其中,微軟為其 DDE 所提供的應用程式介面,稱之為 DDEML (Dynamic Data Exchange Management Library),以簡化連結 DDE 的實作。

再則,AutoIt Forum 才人備出,已有國外網友撰寫了 DDE 的函數群,其實這些函數就是一種 包裹(Wrapper) 的應用,以避免 AutoIt 的 Script 開發者,還需要涉及到實際呼叫 DDEML (包括指定路徑與DLL檔名) 的連結細節。

從上述討論串可以下載該網友所提供的 DDE 函數庫以及範例,將函數庫可以解縮至 AutoIt 的 /Include 子目錄內。但是,所提供的範例並沒有說明清楚,甚至執行還會出錯。 不過,關於 DDEML 的主體部分,則確定是完成沒有問題。

關於如何實現 DDE Client 連結 DDE Server(元大Yeswin),不得已還是必須具備 DDE 的相關知識方可,但 DDE 應該算是一個蠻早期,也比較落後的一種連結技術,可以參考的文件似乎不太多了。 最重要的文件參考來源: MSDN DDEML Overview,可以說是必要研讀的線上文件。

目前是暫時寫了一段小程式,以測試是否可以透過 AutoIt 連結 元大Yeswin 的 DDE Server。測試性的程式碼如下:


#include <DDEML.au3>
#include <DDEMLClient.au3>

Global $hConvSrv = 0

_DdeInitialize("", BitOR($APPCMD_CLIENTONLY, $CBF_SKIP_ALLNOTIFICATIONS))

ExecDDECmd()

Func ExecDDECmd()
    Local $hszService = 0
    Local $hszTopic = 0
    If 0 = $hConvSrv Then
        $hszService = _DdeCreateStringHandle("YES")
        $hszTopic = _DdeCreateStringHandle("DQ")
        $hConvSrv = _DdeConnect($hszService, $hszTopic)
    EndIf
    If 0 = $hConvSrv Then
        MsgBox(0, "DDE Client", "無法連結 DDE 伺服器")
	Else
		$sz = "&TWTK2.Price"
		$str_handle = _DdeCreateStringHandle($sz)
		$Data = _DdeClientTransaction($XTYP_REQUEST, $hConvSrv, 0, 10000, $str_handle, $CF_TEXT)
		$res = _DdeGetDataAsString($Data)
		MsgBox(0, "String Handle is: ", $res)
		_DdeDisconnect($hConvSrv)
	EndIf

    If 0 <> $hszService Then _DdeFreeStringHandle($hszService)
    If 0 <> $hszTopic Then _DdeFreeStringHandle($hszTopic)
EndFunc

連結 DDE Server 相當地簡單,但是要下字串(Item)取得相對應的數據,不知道是否是因為晚上 Yeswin 沒有提供即時數據的關係,有些 Item 可以取得數據,而有些又不行...。 還有比較重要的一個問題是,我對 DDE 在建立 conversation 後,Client 與 Server 的交易處理(transaction management)問題,我還是陌生不熟悉,這仍有待再研讀 MSDN 上的文件。

待上述問題解決後,我應該會再把更完成的原始程式碼公布出來,最起碼要展現一下我目前最想要的,可以即時顯示「漲家跌家趨勢圖」。 🙂

利用 AutoIt 工具擷取 「元大 Yeswin」控制項的問題記錄

目的: 擷取「元大 Yeswin」的 “[1210]漲跌家數” 的即時數據,轉到如 Excel 或 Wealth-Lab 以顯示「漲跌家數走勢圖」。

工具:使用 AutoIt v3,可以撰寫巨集(macro scripts),除了可以自動登入並啟動 Yeswin 並打開特定的視窗外 (如啟動技術分析/成交明細視窗),還可以透過內建的函數(function)讀取視窗控制項內的資料。

問題:
AutoIt 這個強大又免費的工具是由「聚財網—飆股理財&程式交易聯誼會」論壇的版主,也是程式交易的名人 凌波微步 大大先生所推廣,並應用於 “從免費看盤軟體(yeswin or HTS)擷取即時數據至 Wealth-Lab”,以及 “自動化程式交易下單”。

參考他其中一篇文章:「用Autoit 擷取Yeswin簡易版奇狐的即時成交明細」,從其中可以知道要擷取即時數據到外部系統,可以說是相當容易的一件事。

從其中程式碼可以發現,「Yeswin 的即時成交明細」視窗,是利用 “SysListView” 控制項實作的,而在 AutoIt 內建的函數,即有提供諸多該控制項的處理,最重要的當然就是要擷取其內的數據。利用 AutoIt 內含的 “Window Info” 工具即可察看相關資訊,以方便供程式撰寫,參考下圖。

autoit-v3-screentshot-01
點擊圖可察看原圖

但是,當我想擷取 “[1210]漲跌家數” 的控制項數據,從該工具的資訊顯示,該控制項的類別為 “WindowsForms.Window”? 參考下圖。

autoit-v3-screentshot-02
點擊圖可察看原圖

這我就很納悶了,我對 Windows-based 的 GUI 控制項實在陌生,查閱 MSDN 的「System.Windows.Forms 命名空間」 也是不知所以然。 實驗了好幾次,都無法利用 AutoIt 來擷取該控制項的相關數據。

不知道是否有熟悉 Windows GUI 結構的網友們可以協助提供建議呢?

關於「江波圖之漲跌家數走勢圖」

透過「第一次操作選擇權 (新版)」一書內容的說明,讓我體認到「江波圖」對於即時盤勢分析解讀的重要性。 江波圖 應該是包含了兩大部分, 一為「委買/賣成交張數走勢圖」,另一則為「漲跌家數的統計」。 前者很普及,幾乎任一個即時看盤的交易軟體均有提供,但是後者呢,在我現在所使用包括 日盛 “HTS”、 元大 “Yeswin” 等看盤軟體,卻是只有提供即時最新的「漲跌家數統計數據」,但似乎卻沒有整理成為 「漲跌家數走勢圖」?

這讓我有些苦惱,透過 Google 查詢,也不知道有那個免費的看盤或網站有提供即時性的「漲跌家數走勢圖」呢?

若還是找不到,我在想可能自己要 DIY 一下了,就是說寫個小程式,把如 “Yeswin” 關於「漲跌家數」的即時數據定時(可能每一 ~ 五分鐘) “倒(Export)” 出來,再透過如 Excel,甚至是如 Wealth-Lab, 再轉成二維(X 軸為家數;Y 軸為時間)的趨勢圖。

再更進一步的思考,我甚至也可以過濾漲跌的家數,只倒出有權值的股票漲跌家數數據,甚至還可以依照權值的比重來加權計算,可能可以成為更精確的「漲跌權重家數走勢圖」。

想歸想,不過還是希望能有現成的最好,也希望是否有網友們能提供這類的資訊呢? 否則又要花這些小道功夫,對我現在是很累人的。 :-/

抓美股歷史資料的好幫手—免費的 YGQD

大家都知道從 Yahoo FinanceGoogle Finance 可以看到美股、台股等的大盤走勢,也可以在其提供的網頁上作一些簡單的技術分析等。不過我是打算自行寫一些大盤的趨勢分析程式,例如 “臨界轉折值“、”混沌指標“、”均線(含扣抵值)” …等。簡單的說就是希望能想要怎麼分析就愛怎麼分析,但前提就是要先能取得分析的資料,而且能免費的更是好。

透過 Google 遍尋取得資料的工具,還真讓我找到了一個免費抓取 Yahoo or Google Finance 歷史資料的工具程式: Yahoo & Google Quotes Downloader

Yahoo & Google Quotes Downloader

下載回來安裝完成後,預設內附的 symbols.txt 內容並不完整,你可以自行編輯或透過內建的一個小工具, sympreprocpr.exe,在命令列模式下執行:

sympreprocpr -o c:\symbols.txt -q

就會從 nasdaq.com 下載所有的 Symbols 資訊。不過我是嫌下載回來的 Symbols 太多了,我其實只想要 Dow, Nasdaq, S&P 500 等大盤資料即可,所以自行以純文字編輯器編輯 symbols.txt:

^DJI ^IXIC ^GSPC

沒錯,就是這麼簡單! 寫入的 Symbol 代號之間空一格即可。不過,我是不知道,到底國際是否有通用的 Symbols 標準? 我在 Yahoo Finance 看到的是 Dow(^DJI), Nasdaq(^IXIC), S&P500(^GSPC),從 nasdaq.com 下載回來的 symbols 資料卻無這些代號?

可以選擇下載是日線(Daily)、週線(Weekly)或月線(Monthly)的資料,也可以設定抓取資料的時間間隔。像我抓 Down 美股的日線資料,設定從今年的 1/1 到 12/24 止,下載的時間不到三秒鐘就完成了,真是快!只要是在 Yahoo or Google Finance 上的 Symbol 都可以抓得到,所以包括台股、台指期等,都可以抓得到,沒有問題的。

下載回來的資料為 csv 格式,要作簡單分析的話,使用 Excel 就可以直接讀取了。不過我是打算要 Import 至 Sqlite 的資料庫,再從我的分析程式抓取 Sqlite 內的資料來作分析,這可又是另外一段故事囉...

軟體思維顧問

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

Personal