C# qSharp股票报价器工厂订阅
我目前正试图使用qsharp订阅我的tickerplant,但是当我试图获取消息数据时,我只得到要返回的C# qSharp股票报价器工厂订阅,c#,kdb,q-lang,exxeleron-q,C#,Kdb,Q Lang,Exxeleron Q,我目前正试图使用qsharp订阅我的tickerplant,但是当我试图获取消息数据时,我只得到要返回的System.Int64[]或System.object[],如下所示: C#代码取自样本: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using NetMQ; using System.Text.RegularEx
System.Int64[]
或System.object[]
,如下所示:
C#代码取自样本:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using NetMQ;
using System.Text.RegularExpressions;
using qSharp;
namespace SubscribeToData
{
class Program
{
static void Main(string[] args)
{
QCallbackConnection q = new QCallbackConnection("localhost", 5005);
try
{
Console.WriteLine("conn: " + q + " protocol: " + q.ProtocolVersion);
Console.WriteLine("Press <ENTER> to close application");
q.DataReceived += OnData;
q.ErrorOccured += OnError;
q.Open();
Console.WriteLine("conn: " + q + " protocol: " + q.ProtocolVersion);
Console.WriteLine("Press <ENTER> to close application");
Object response = q.Sync(".u.sub", "trade", ""); // subscribe to tick
QTable model = (QTable)((Object[])response)[1]; // get table model
Console.WriteLine(model);
q.StartListener();
Console.ReadLine();
q.StopListener();
}
catch (Exception e)
{
Console.Error.WriteLine("Error occured: " + e);
Console.ReadLine();
}
finally
{
q.Close();
}
}
static void OnData(object sender, QMessageEvent message)
{
Object data = message.Message.Data;
Console.WriteLine(sender);
Console.WriteLine(message.Message.Data);
Console.WriteLine("message type: " + message.Message.MessageType + " size: " + message.Message.MessageSize + " isCompressed: " + message.Message.Compressed + " endianess: " + message.Message.Endianess);
PrintResult(message.Message.Data);
if (data is Object[])
{
Console.WriteLine("TEST");
Console.WriteLine(message);
// unpack upd message
Object[] args = ((Object[])data);
Console.WriteLine("testargs");
Console.WriteLine(args[0].ToString());
Console.WriteLine(args[1]);
Console.WriteLine(args[2].GetType());
Console.WriteLine(data);
if (args.Length == 3 && args[0].Equals("upd") && args[2] is QTable)
{
QTable table = (QTable)args[2];
foreach (QTable.Row row in table)
{
Console.WriteLine(row);
}
}
}
}
static void PrintResult(object obj)
{
if (obj == null)
{
Console.WriteLine("::");
}
else if (obj is QDictionary)
{
PrintResult(obj as QDictionary);
}
else
{
Console.WriteLine(obj);
}
}
static void PrintResult(QDictionary d)
{
foreach (QDictionary.KeyValuePair e in d)
{
Console.WriteLine(e.Key + "| " + e.Value);
}
}
static void OnError(object sender, QErrorEvent error)
{
Console.Error.WriteLine("Error received via callback: " + error.Cause.Message);
}
}
我使用
.u.pub[`trade;2,2,2,2,2,1,1,1,1]
现在的问题是,它似乎确实收到了
QMessage
,但只是解析不正确?我不清楚您的问题是什么……。您正在发布一个long(int64)列表,而您正在接收一个int64列表。您是否希望收到QTable类型?但是您还没有从tickerplant发布QTable尝试从tickerplant发布一个表,即u.pub[`tab;([]col1:`a`b`c;col2:1 23)]是的,发布记录更高效,这是tickerplant通常做的事情。kdb能够以这种方式将记录插入表中,例如'trade insert 2,2,2,2,1,1,1,1在您的情况下,使用qSharp,您必须相应地处理该记录。例如,您不能选中“&&args[2]是QTable”,因为发布的消息不包含QTable,而是包含混合的记录列表。换句话说,您从tickerplant发布的记录(列表)不会在过程中变成一个表,它仍然是一个列表。您可以将记录本身作为另一个对象来读取,其中arg[0]是您的第一个字段(白天),arg[1]是您的下一个字段(instrumenttype)等等。最终,从tickerplant发布为表可能会更容易—这取决于您期望的吞吐量/卷量!正如@terrylynch所写,记录(q混合列表)在qSharp中被解析为object[]
。列表中的每个元素都被单独解析,并按照所述进行解析。
.u.pub[`trade;2,2,2,2,2,1,1,1,1]