我一直在尋找所有,並找不到任何RTD客戶端的例子(雖然許多RTD服務器樣本)。Excel以外的Excel RTD(實時數據)客戶端?
我的目標是將數據從RTD服務器「拉」到我的應用程序中,以進行算法交易。
如果可能,不使用C#/ .Net,因爲我正在尋找一種輕量級,可部署的解決方案。
你能給我任何提示嗎?
我一直在尋找所有,並找不到任何RTD客戶端的例子(雖然許多RTD服務器樣本)。Excel以外的Excel RTD(實時數據)客戶端?
我的目標是將數據從RTD服務器「拉」到我的應用程序中,以進行算法交易。
如果可能,不使用C#/ .Net,因爲我正在尋找一種輕量級,可部署的解決方案。
你能給我任何提示嗎?
通過模擬Excel對RTD服務器的調用,確實可以在Excel外創建RTD「客戶端」。畢竟,RTD服務器只是一個實現IRtdServer的COM組件(和IRTDUpdateEvent用於回調)。
您必須遵循Excel本身在與RTD交互時使用的調用順序。但是一旦你這樣做,RTD應該非常高興地將數據輸入到你的「客戶端」。事實上,這樣做可能會有好處,因爲儘管Excel只會每兩秒鐘從RTD獲取數據,但您的客戶端可以按照需要快速提取數據。這對算法交易來說當然是一個優勢。
這樣的客戶端是否可以與Excel並行工作是我沒有測試過的。
這裏是一個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);
}
}
}
}
你會使用RTD由於RTD通常是免費的並且API訪問會爲我們正在使用的數據服務的數據源費用增加$ 100 /月/ cient或更多的費用
請注意,彭博等一些數據提供商可能會對此類事情感到非常不安(並訴訟):\ – Franchesca 2014-03-05 15:04:41
提示:不要發佈多個答案,只需編輯以前的答案。 – atzz 2010-11-29 14:10:49
我已將「MyRTD.RTD」替換爲「now.scriprtd」,即RTDprogID,現在應該在「MyRTD.UpdateEvent」中替換哪些內容,即RTDUpdateEventProgID? – jwilson 2016-08-20 06:36:14