Excel以外的Excel RTD(实时数据)客户端?

时间:2010-08-30 15:50:35

标签: c++ excel client rtd

我一直在寻找,但找不到RTD CLIENT的任何示例(但很多RTD服务器示例)。

我的目标是将数据从RTD服务器“拉”到我的应用程序中进行算法交易。

如果可能的话,不使用C#/ .Net,因为我正在寻找一种轻量级,可部署的解决方案。

你能给我一些提示吗?

3 个答案:

答案 0 :(得分:6)

这是一个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);
            }
        }
    }
}

答案 1 :(得分:3)

您确实可以通过模拟Excel对RTD服务器的调用来在Excel外部创建RTD“客户端”。毕竟,RTD服务器只是一个实现IRtdServer的COM组件(和回调的IRTDUpdateEvent)。

您必须遵循Excel在与RTD交互时使用的调用顺序。但是一旦你这样做,RTD应该很乐意将数据输入你的“客户端”。实际上,这样做可能有一个优势,因为Excel只会每两秒钟从RTD中提取数据,您的客户端可以根据需要快速提取数据。这无疑是算法交易的一个优势。

这样的客户端是否可以与Excel并排工作是我尚未测试过的。

答案 2 :(得分:0)

您将使用RTD,因为RTD通常是免费的,并且API访问会为我们正在使用的数据服务的数据馈送成本增加100美元/月/次或更多