COCO研究院

 找回密碼
 註冊
搜索
樓主: special

[EXCEL] 元大RTD報價元件

[複製鏈接]
發表於 18-12-19 09:12 | 顯示全部樓層
kuolung 發表於 18-12-18 22:55
因為我是用 vc++ 寫的 不是用 excel 收 所以沒在查 sub..count值
另 我的 rtd 版本是最新的 20181116 訂閱  ...

請問一下, RTD不是只能拿 excel來當server? 可以自己寫程式來當server?
哪裡可以找到相關資料? 謝謝

發表於 18-12-20 12:23 | 顯示全部樓層
kuolung 發表於 18-12-19 18:11
RTD 是 COM 元件 只要能符合規範 你要自己寫 server 還是 client 都可以
至於相關資料 我也是用 google 大 ...

原來如此, 我再來找一下資料, 看看要如何收到元大RTD的資料

發表於 18-12-20 13:04 | 顯示全部樓層
能否請教收得到rtd的各位。
東工交易所的紅豆、玉米 、黃豆我收不到,我代碼用猜的。
但都是錯,可是我其它商品都收得到。

能請教上面這三個商品的代碼嗎
發表於 18-12-21 00:06 | 顯示全部樓層
kuolung 發表於 18-12-19 01:38
我沒載點  
你安裝完 rtd 桌面上 會有一個 rtd 的 icon
沒事就執行一下 就會自動更新為最新版

謝謝,我點桌面 yeswin 報價交易元件RTD icon都沒有辦法更新,打客服問原因,她說問題出在有沒有安裝 .Net FrameWork 4。
原來是我一直連錯,連結到未安裝Net FrameWork的網址,所以怎麼安裝或點選更新,都還在2018.0518。
對於已安裝 .Net FrameWork 4的用戶,RTD安裝的下載點為:
元大
yeswin 報價交易元件
[/tr]
名稱:yeswin 報價交易元件
版本:4.2018.1116.1600
發行者:元大
  
需要下列必要條件:
  • Windows Installer 3.1
  • Microsoft .NET Framework 4 (x86 和 x64)
如果已經安裝這些元件,您可以立即 啟動 應用程式。否則,請按下面的按鈕,安裝必要條件並執行應用程式。
發表於 19-1-2 13:58 | 顯示全部樓層
本帖最後由 heavenweaver 於 19-1-2 14:11 編輯
kuolung 發表於 18-12-19 18:11
RTD 是 COM 元件 只要能符合規範 你要自己寫 server 還是 client 都可以
至於相關資料 我也是用 google 大 ...

VC++似乎在ATL COM開發上,比C#擁有太多資源可以參考。
我完全不懂VC++,花了10天左右,終於將C# 程式改成 C++ /CLI 。
似乎也是循您以前走過的歷程,您的經驗提供了一些很好的思考線索。
由於VC++沒有經驗,使得我在STA及Type Convert/Casting真是吃盡苦頭。
特別是在Using nampespace std及Using nampespace System交互使用下,還真是一場混戰。
發表於 19-1-3 17:18 | 顯示全部樓層
kuolung 發表於 19-1-3 07:42
你真是神人
也可能是我笨  我用了 3個月的時間 才寫出來
不過那是 2013 年的事了

小弟不是神人啦,如果我直接向您請教,才有可能升到神人助手的等級。
因為您說Google大神都查的到,所以小弟只好先求助於Google大神。
C#基本上就是Managed Code,建立在CLI /CLR的整合環境下。如果想要跳脫Managed Code的圈子,C++是最合適的選項。
因為元大RTD是用C#寫的,所以我才會從C#寫Client端程式。
與您有相同的狀況,就是想把資料源餵進C++寫的AmiBroker Plugin,所以又改寫為C++的版本,但對於怎麼寫入到AmiBroker Plugin中還沒理出頭緒?
Client端程式雖然是C++的版本,但卻有點C#的風格,Managed & unManaged mixed coding,這都拜Google大神所賜,程式有點像拼花。
過去沒有動機想寫程式,或者是說看不懂也不會寫,一直都在惡性循環中蹉跎歲月。直到前一陣子才鼓起勇氣練習寫程式,還在學習中。我現在是用VS2015,很難跳脫Managed Code的誘惑,所以我準備再花點時間用改寫成VC++6.0或8.0的版本。在微軟VS2005_CPP_en-us.pdf中有一篇Walkthrough:Creating a COM Server Using a Text Editor,將Client程式寫的超簡潔,我看完Walkthrough後,實際以VC++6.0&8.0 Mixed版 Go Through一次,過程所產生的.idl、tlh、tli等內容,都是值得玩味,相當有意思。雖然我曾經用VC++6.0的Wizzard玩過,但總是稀哩呼魯的,不明就裡。
發表於 19-1-4 01:30 | 顯示全部樓層
kuolung 發表於 19-1-3 23:00
不用換回 vc++ 6.0 or 8.0  我現在用 vs 2017 版 也全部是 unmanaged code
我是完全不會 oo 的 所以寫出來 ...

謝謝您的指導,但人通常會先入為主,一旦用慣VS2015 C++ 14, 就會融入其中,特別是對我這種新手而言。
我用VC++ 6.0 or 8.0只是基於好玩而已,先試看看有幾種啟動RTD連線的方式(Coding)。

VC++6.0

VC++6.0


發表於 19-1-5 11:14 | 顯示全部樓層
本帖最後由 zaqimon 於 19-1-5 12:23 編輯

我只在Excel用過RTD(元大)跟DDE(精誠GPM系統)
還不清楚怎麼樣在Excel以外的程式接入RTD報價
我的感覺RTD報價速度比DDE快一些尤其是海期更明顯
例如公布原油庫存之類的快市當下RTD很順暢但DDE卻可能會lag好幾秒

但我覺得RTD似乎不夠穩定(也許是我個人的問題)
我測試過周一至周五開著Excel報價
只有開DDE報價時可以撐過五天沒問題
但開RTD報價卻很容易在一兩天後Excel就當掉重開停在RTD登入畫面
可能必須每天重新登入RTD會比較保險

而且RTD的台指期夜盤被切割成後面加"PM"的另一個商品代碼
沒有辦法從早盤到夜盤使用同一個代碼
還需要特別處理比較麻煩

RTD的TY US報價也是要特別處理因為並非小數報價
例如US的RTD報價146.25其實是146 25/32
還好用Excel公式就能直接轉成小數報價
  1. =INT(RTD("money.excel", , "US1903.CME", "Price"))+100*(RTD("money.excel", , "US1903.CME", "Price")-INT(RTD("money.excel", , "US1903.CME", "Price")))/32
複製代碼

我的Excel報價類似這樣
台指期代碼我有自己改過比較好看
正確RTD代碼應該是TXFA9
可以發現台指期報價還停留在上午盤收盤
因為夜盤的台指期代碼應該是TXFA9PM
20190105 105948.png

發表於 19-1-5 13:09 | 顯示全部樓層
zaqimon 發表於 19-1-5 11:14
我只在Excel用過RTD(元大)跟DDE(精誠GPM系統)
還不清楚怎麼樣在Excel以外的程式接入RTD報價
我的感覺RTD報 ...

我覺得DDE效能差好像是有部分被誤解

就是像這篇#20樓中之前試AB時前發現到的
http://www.coco-in.net/thread-145893-2-1.html

感覺RTD的作法大概就是每個商品為一個topic

但是當前DDE的作法常常把一堆商品放同一個topic(sheet)導致訊息量倍增

用港股的模擬資訊放很多商品在一個sheet時AB訂閱的負載會比較重

如果改用分開的方式一個sheet只放一個商品報價,AB訂閱的負載狀況就比較輕

海期的訊息量本來就多,都用一個sheet放多個商品的狀況當然就更容易發生問題

發表於 19-1-5 18:44 | 顯示全部樓層
本帖最後由 heavenweaver 於 19-1-5 19:00 編輯
kuolung 發表於 19-1-5 09:52
會開啟這個程式,到可以用還有一段距離,能正常收到 rtd event 才算完成

還有這個 RTD 我一直沒有找到自動 ...

您是過來人,很清楚其中的細節。這次我用VC++6.0就是不想用比較高階版本所提供的函式及工具。
例如我在C#及VS2015呼叫IRDTServer.ServerStart, 它會回應 1 ,代表成功, 其他值代表失敗。
但是在VC++6.0呼叫ServerStart時,成功啟動它會回應 HRESULT == S_OK。其他的代碼為失敗,可以參考HRESULT Code。
真正的細工,在如何撰寫ConnectData及RefreshData 的 I/O,型態轉換錯誤,程式一定當掉,特別是RefreshData的SAFEARRAY兩個元素值的型態,要debug才會看到它要的型態是什麼。
    virtual HRESULT __stdcall ConnectData (
        long TopicID,
        SAFEARRAY * * Strings,,
        VARIANT_BOOL * GetNewValues,
        VARIANT * pRetVal ) = 0;
    virtual HRESULT __stdcall RefreshData (
        long * TopicCount,
        SAFEARRAY * * pRetVal ) = 0;
在VS2015 C++我可以採用 marshal_as 將 System::String轉換為std::string ,但在VC++6.0實在想不出甚麼方法?

在自動登入方面,我也找不到可以輸入密碼及按確定的Control Class及Instance。如果您能提示一點,真是感激不盡了。

發表於 19-1-10 13:22 | 顯示全部樓層
新手
我這幾月用下來的感想,RTD與DDE的差異
RTD是針對多筆股票的監控,要在1秒以上取才不會當掉
DDE可針對少筆的期貨的監控,1分鐘我跑了5千多LOOP都不會當

期貨等1秒會掉tick,DDE比較好用
回復 支持 0 反對 1

使用道具 舉報

發表於 19-1-18 11:05 | 顯示全部樓層
先感謝kuolung大大的指導,讓我用VC++6.0開拓unmanaged code的視野。沒有kuolung大大像燈塔般的指引,還真的持續不下去。

新的程式讓我發現以前未曾注意的異常狀況,也就是當我每一秒或每二秒RefreshData時,
不時發生只有topicID, 卻沒有 eventData(retVal)的配對輸出的現象。
這種狀況是否就是所謂的掉 Tick?

以下是我的測試數據:只顯示異常部分
PropertyArray Size = 262
**************  ConnectData **************
ConnectData == S_OK
RetVal = 10:23:18
ConnectData == S_OK
RetVal = 00:00:00
ConnectData == S_OK
RetVal = 2018.1116
ConnectData == S_OK
RetVal = 1 / 2200 / 4
下略
**************  RefreshData **************
SafeArray dimensions =  2
1 Dim lBound =  0 , uBound = 1
2 Dim lBound =  0 , uBound = 3
正常 topicId與retVal成對輸出,略
**************  RefreshData **************
SafeArray dimensions =  2
1 Dim lBound =  0 , uBound = 1
2 Dim lBound =  0 , uBound = 3
正常 topicId與retVal成對輸出,略
**************  RefreshData **************
SafeArray dimensions =  2
1 Dim lBound =  0 , uBound = 1
2 Dim lBound =  0 , uBound = 261
正常 topicId與retVal成對輸出,略
11  12   , topicId = 7
13  14   , topicId = 8
15  16   , topicId = 9
正常 topicId與retVal成對輸出,略
27  28   , topicId = 15
29  30   , topicId = 16
31  32   , topicId = 17
33  34   , topicId = 18
35  36   , topicId = 19
正常 topicId與retVal成對輸出,略
41  42   , topicId = 22
43  44   , topicId = 23
45  46   , topicId = 24
47  48   , topicId = 25
49  50   , topicId = 26
正常 topicId與retVal成對輸出,略
55  56   , topicId = 29
57  58   , topicId = 30
59  60   , topicId = 31
正常 topicId與retVal成對輸出,略
69  70   , topicId = 36
71  72   , topicId = 37
73  74   , topicId = 38
75  76   , topicId = 39
77  78   , topicId = 40
資料太多,以下省略。
發表於 19-1-18 21:28 | 顯示全部樓層
kuolung 發表於 19-1-18 13:19
是您很棒,我也沒有說什麼,您就可以自己寫出程式來了,

不過,看了您這一篇回文,才發現一個問題,

您的成功案例,對於後續想要自行開發RTD Client的人,具有積極的鼓舞及精神燈塔的象徵。簡單的說:您是我的偶像!
我不懂 VC++的 Event Trigger 要如何實現,基本上我還在 Console Mode 學習中,對於 Win App 或 MFC,還只是生字而已。
另外我想請問:
1、RTD Server 若有資料更新,它會用Callback.UpdateNotify主動通知Client端來作 RefreshData, 自己寫的Client端如何接收 UpdateNotify 的通知?
2、上述的UpdateNotify是針對某一個 topicID,還是整批的 topicCount?
麻煩您,謝謝!
發表於 19-1-20 10:52 | 顯示全部樓層
kuolung 發表於 19-1-19 07:55
先回答你第二個問題

是整批的 是收到 topicCount

我猜第一個也不是取得 CallBack.UpdateNotify的Hwnd Handler,
因為元大RTD並沒有實作IRTDUpdateEvent,
而是另有旁蹊小徑。

真是佩服到極點了!

發表於 19-1-22 16:57 來自手機 | 顯示全部樓層
上述的方法再測試,只是感覺有點複雜
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-11-22 08:43

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |