Excel RTD (данные в реальном времени), кроме Excel? - PullRequest
3 голосов
/ 30 августа 2010

Я искал повсюду и не смог найти ни одного примера для КЛИЕНТА RTD (хотя много примеров RTD-серверов).

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

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

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

Ответы [ 3 ]

6 голосов
/ 22 октября 2010

Вот клиент C #, который я создал в качестве тестового набора для серверов RTD Excel (как внутри 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 голосов
/ 18 октября 2010

Вы действительно можете создавать «клиенты» RTD вне Excel, эмулируя вызовы, которые Excel будет выполнять на сервере RTD.В конце концов, RTD-сервер - это всего лишь COM-компонент, который реализует IRtdServer (и IRTDUpdateEvent для обратного вызова).

Вы должны следовать последовательности вызовов, которую Excel использует при взаимодействии с RTD.Но как только вы это сделаете, RTD должен с радостью накачать данные в ваш «клиент».Действительно, это может иметь преимущество, потому что, хотя Excel будет извлекать данные из RTD только каждые две секунды, ваш клиент может извлекать данные так быстро, как ему хочется.Это, безусловно, преимущество для алгоритмической торговли.

Может ли такой клиент работать бок о бок с Excel - это то, что я не проверял.

0 голосов
/ 17 августа 2013

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

...