Excel以外的Excel RTD(实时数据)客户端? [英] Excel RTD (Real Time Data) client other than Excel?

查看:948
本文介绍了Excel以外的Excel RTD(实时数据)客户端?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我的目标是为了RTD客户端如果可能,不使用C#/ .Net,因为我正在寻找一个轻量级,部署



您能给我任何提示吗?

解决方案

这是一个C#客户端,我构建为Excel RTD服务器(进程内DLL和进程外EXE)的测试工具:

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

命名空间MyRTD
{
类程序
{
// COM类的ProgID。
private const String RTDProgID =MyRTD.RTD;
private const String RTDUpdateEventProgID =MyRTD.UpdateEvent;
private const String RTDEXEProgID =MyRTDEXE.RTD;
private const String RTDEXEUpdateEventProgID =MyRTDEXE.UpdateEvent;

//虚拟主题。
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(按Enter键退出...);
Console.ReadLine();
}

static void TestMyRTD(String rtdID,String eventID)
{
try
{
//创建RTD服务器。
键入rtd;
对象rtdServer = null;
rtd = Type.GetTypeFromProgID(rtdID);
rtdServer = Activator.CreateInstance(rtd);
Console.WriteLine(rtdServer = {0},rtdServer.ToString());

//创建一个回调事件。
类型更新;
object updateEvent = null;
update = Type.GetTypeFromProgID(eventID);
updateEvent = Activator.CreateInstance(update);
Console.WriteLine(updateEvent = {0},updateEvent.ToString());

//启动RTD服务器。
Object [] param = new Object [1];
param [0] = updateEvent;
MethodInfo method = rtd.GetMethod(ServerStart);
Object ret; //返回值。
ret = method.Invoke(rtdServer,param);
Console.WriteLine(ret for'ServerStart()'= {0},ret.ToString());

//从RTD服务器请求数据。
Object [] topics = new Object [1];
topics [0] = topic;
Boolean newData = true; //请求新数据,而不是缓存数据。
param = new Objects [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());

//循环并等待RTD通知(通过回调)
//数据可用。
int count = 0;
do
{
count ++;

//检查RTD服务器是否仍然有效。
对象状态;
param = null;
method = rtd.GetMethod(Heartbeat);
status = method.Invoke(rtdServer,param);
Console.WriteLine(statusbeat()'= {0},status.ToString());

//从RTD服务器获取数据。
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());

//从RTD服务器获取
//更多数据之前等待2秒。
Thread.Sleep(2000);

} while(count< 5); //循环5次。

//断开与数据主题的连接。
param = new Object [1];
param [0] = topicID;
method = rtd.GetMethod(DisconnectData);
method.Invoke(rtdServer,param);

//关闭RTD服务器。
param = null;
method = rtd.GetMethod(ServerTerminate);
method.Invoke(rtdServer,param);
}
catch(Exception e)
{
Console.WriteLine(Error:{0},e.Message);
}
}
}
}


I have been looking all over, and couldn't find any example for an RTD CLIENT (many RTD server samples, though).

My goal is to 'pull' data from an RTD server into my application for algo-trading purposes.

If possible, without using C# / .Net, as I am looking for a lightweight, deploy-able solution.

Can you give me any tips?

解决方案

Here is a C# client I built as a test harness for Excel RTD servers (both in-process DLL and out-of-process 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);
            }
        }
    }
}

这篇关于Excel以外的Excel RTD(实时数据)客户端?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆