2010-08-30 4 views
1

Я искал по всему и не нашел никакого примера для RTD CLIENT (многие образцы сервера RTD).Клиент Excel RTD (Real Time Data) отличается от Excel?

Моя цель - «вытащить» данные с сервера RTD в мое приложение для использования в целях торговли.

Если возможно, без использования C#/.Net, поскольку я ищу легкое, развертываемое решение.

Можете ли вы дать мне какие-либо советы?

ответ

3

Вы действительно можете создавать RTD-клиенты вне Excel, эмулируя вызовы, которые Excel будет делать на сервере RTD. RTD-сервер - это, в конце концов, только COM-компонент, который реализует IRtdServer (и 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

+0

Я заменил «MyRTD.RTD» на «now.scriprtd», то есть RTDprogID, и теперь, что я должен заменить на «MyRTD.UpdateEvent», то есть на RTDUpdateEventProgID? – jwilson

0

Вы должны использовать RTD, потому что RTD обычно бесплатно и доступ API добавляет $ 100/month/cient или больше к стоимости передачи данных для используемого нами сервиса

+0

Будьте осторожны, некоторые поставщики данных, такие как Bloomberg, могут очень расстроиться (и судебными) в отношении такого рода вещей: \ – Franchesca