2010-08-30 273 views
1

我一直在尋找所有,並找不到任何RTD客戶端的例子(雖然許多RTD服務器樣本)。Excel以外的Excel RTD(實時數據)客戶端?

我的目標是將數據從RTD服務器「拉」到我的應用程序中,以進行算法交易。

如果可能,不使用C#/ .Net,因爲我正在尋找一種輕量級,可部署的解決方案。

你能給我任何提示嗎?

回答

3

通過模擬Excel對RTD服務器的調用,確實可以在Excel外創建RTD「客戶端」。畢竟,RTD服務器只是一個實現IRtdServer的COM組件(和IRTDUpdateEvent用於回調)。

您必須遵循Excel本身在與RTD交互時使用的調用順序。但是一旦你這樣做,RTD應該非常高興地將數據輸入到你的「客戶端」。事實上,這樣做可能會有好處,因爲儘管Excel只會每兩秒鐘從RTD獲取數據,但您的客戶端可以按照需要快速提取數據。這對算法交易來說當然是一個優勢。

這樣的客戶端是否可以與Excel並行工作是我沒有測試過的。

5

這裏是一個C#的客戶我建的測試工具爲Excel RTD服務器(無論是在進程中DLL進出的進程EXE):

using System; 
using System.Reflection; 
using System.Threading; 

namespace MyRTD 
{ 
    class Program 
    { 
     // ProgIDs for COM classes. 
     private const String RTDProgID = "MyRTD.RTD"; 
     private const String RTDUpdateEventProgID = "MyRTD.UpdateEvent"; 
     private const String RTDEXEProgID = "MyRTDEXE.RTD"; 
     private const String RTDEXEUpdateEventProgID = "MyRTDEXE.UpdateEvent"; 

     // Dummy topic. 
     private const int topicID = 12345; 
     private const String topic = "topic"; 

     static void Main(string[] args) 
     { 
      Console.WriteLine("Test in-process (DLL) RTD server."); 
      TestMyRTD(RTDProgID,RTDUpdateEventProgID); 

      Console.WriteLine("Test out-of-process (EXE) RTD server."); 
      TestMyRTD(RTDEXEProgID,RTDEXEUpdateEventProgID); 

      Console.WriteLine("Press enter to exit ..."); 
      Console.ReadLine(); 
     } 

     static void TestMyRTD(String rtdID, String eventID) 
     { 
      try 
      { 
       // Create the RTD server. 
       Type rtd; 
       Object rtdServer = null; 
       rtd = Type.GetTypeFromProgID(rtdID); 
       rtdServer = Activator.CreateInstance(rtd); 
       Console.WriteLine("rtdServer = {0}", rtdServer.ToString()); 

       // Create a callback event. 
       Type update; 
       Object updateEvent = null; 
       update = Type.GetTypeFromProgID(eventID); 
       updateEvent = Activator.CreateInstance(update); 
       Console.WriteLine("updateEvent = {0}", updateEvent.ToString()); 

       // Start the RTD server. 
       Object[] param = new Object[1]; 
       param[0] = updateEvent; 
       MethodInfo method = rtd.GetMethod("ServerStart"); 
       Object ret; // Return value. 
       ret = method.Invoke(rtdServer, param); 
       Console.WriteLine("ret for 'ServerStart()' = {0}", ret.ToString()); 

       // Request data from the RTD server. 
       Object[] topics = new Object[1]; 
       topics[0] = topic; 
       Boolean newData = true; // Request new data, not cached data. 
       param = new Object[3]; 
       param[0] = topicID; 
       param[1] = topics; 
       param[2] = newData; 
       method = rtd.GetMethod("ConnectData"); 
       ret = method.Invoke(rtdServer, param); 
       Console.WriteLine("ret for 'ConnectData()' = {0}", ret.ToString()); 

       // Loop and wait for RTD to notify (via callback) that 
       // data is available. 
       int count = 0; 
       do 
       { 
        count++; 

        // Check that the RTD server is still alive. 
        Object status; 
        param = null; 
        method = rtd.GetMethod("Heartbeat"); 
        status = method.Invoke(rtdServer, param); 
        Console.WriteLine("status for 'Heartbeat()' = {0}", status.ToString()); 

        // Get data from the RTD server. 
        int topicCount = 0; 
        param = new Object[1]; 
        param[0] = topicCount; 
        method = rtd.GetMethod("RefreshData"); 
        Object[,] retval = new Object[2, 1]; 
        retval = (Object[,])method.Invoke(rtdServer, param); 
        Console.WriteLine("retval for 'RefreshData()' = {0}", retval[1,0].ToString()); 

        // Wait for 2 seconds before getting 
        // more data from the RTD server. 
        Thread.Sleep(2000); 

       } while (count < 5); // Loop 5 times. 

       // Disconnect from data topic. 
       param = new Object[1]; 
       param[0] = topicID; 
       method = rtd.GetMethod("DisconnectData"); 
       method.Invoke(rtdServer, param); 

       // Shutdown the RTD server. 
       param = null; 
       method = rtd.GetMethod("ServerTerminate"); 
       method.Invoke(rtdServer, param); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Error: {0} ", e.Message); 
      } 
     } 
    } 
} 
+3

提示:不要發佈多個答案,只需編輯以前的答案。 – atzz 2010-11-29 14:10:49

+0

我已將「MyRTD.RTD」替換爲「now.scriprtd」,即RTDprogID,現在應該在「MyRTD.UpdateEvent」中替換哪些內容,即RTDUpdateEventProgID? – jwilson 2016-08-20 06:36:14

0

你會使用RTD由於RTD通常是免費的並且API訪問會爲我們正在使用的數據服務的數據源費用增加$ 100 /月/ cient或更多的費用

+0

請注意,彭博等一些數據提供商可能會對此類事情感到非常不安(並訴訟):\ – Franchesca 2014-03-05 15:04:41