行情订阅

订阅调用返回 uint 请求 ID;最终结果由回调异步确认。

完整行情推送示例

以下控制台程序通过第一个命令行参数选择 Quote、Depth、Kline、Tick 或 FullTick 模式。例如:dotnet run -- FullTick。请先在用户主目录的 .tigeropen 目录中准备 SDK 配置文件。

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using TigerOpenAPI.Config;
using TigerOpenAPI.Push;
using TigerOpenAPI.Push.Model;
using TigerOpenAPI.Quote.Pb;

enum MarketPushMode { Quote, Depth, Kline, Tick, FullTick }

sealed class MarketPushCallback : IApiComposeCallback
{
    private readonly ConcurrentDictionary<int, TaskCompletionSource<string>> pending = new();
    private readonly TaskCompletionSource<string> globalFailure =
        new(TaskCreationOptions.RunContinuationsAsynchronously);

    public TaskCompletionSource<bool> Stopped { get; } =
        new(TaskCreationOptions.RunContinuationsAsynchronously);

    private void Complete(int id, string result)
    {
        TaskCompletionSource<string> completion = pending.GetOrAdd(
            id, _ => new(TaskCreationOptions.RunContinuationsAsynchronously));
        try
        {
            JObject parsed = JObject.Parse(result);
            int? code = parsed.Value<int?>("code");
            if (code == 0)
                completion.TrySetResult(result);
            else
                completion.TrySetException(new InvalidOperationException(
                    $"Subscription command failed: {result}"));
        }
        catch (Exception error)
        {
            completion.TrySetException(new InvalidOperationException(
                $"Invalid subscription result: {result}", error));
        }
    }

    private void Fail(int id, string error) =>
        pending.GetOrAdd(id, _ => new(TaskCreationOptions.RunContinuationsAsynchronously))
            .TrySetException(new InvalidOperationException(error));

    private void StopWithFailure(string error)
    {
        globalFailure.TrySetResult(error);
        Stopped.TrySetResult(true);
    }

    public void ThrowIfFailed()
    {
        if (globalFailure.Task.IsCompletedSuccessfully)
            throw new InvalidOperationException(globalFailure.Task.Result);
    }

    public async Task<string> WaitForResultAsync(uint requestId, TimeSpan timeout)
    {
        int id = unchecked((int)requestId);
        TaskCompletionSource<string> completion = pending.GetOrAdd(
            id, _ => new(TaskCreationOptions.RunContinuationsAsynchronously));
        try
        {
            Task delay = Task.Delay(timeout);
            Task winner = await Task.WhenAny(globalFailure.Task, completion.Task, delay);
            if (winner == globalFailure.Task)
                throw new InvalidOperationException(await globalFailure.Task);
            if (winner == delay)
                throw new TimeoutException($"Timed out waiting for request {requestId}.");
            return await completion.Task;
        }
        finally
        {
            pending.TryRemove(id, out _);
        }
    }

    public void QuoteChange(QuoteBasicData data) => Console.WriteLine($"QuoteChange: {data}");
    public void QuoteAskBidChange(QuoteBBOData data) => Console.WriteLine($"QuoteAskBidChange: {data}");
    public void DepthQuoteChange(QuoteDepthData data) => Console.WriteLine($"DepthQuoteChange: {data}");
    public void KlineChange(KlineData data) => Console.WriteLine($"KlineChange: {data}");
    public void TradeTickChange(TradeTick data) => Console.WriteLine($"TradeTickChange: {data.Symbol}, ticks={data.Ticks.Count}");
    public void FullTickChange(TickData data) => Console.WriteLine($"FullTickChange: {data}");
    public void SubscribeEnd(int id, string subject, string result) => Complete(id, result);
    public void CancelSubscribeEnd(int id, string subject, string result) => Complete(id, result);
    public void ConnectionAck() => Console.WriteLine("ConnectionAck");
    public void ConnectionAck(int serverSendInterval, int serverReceiveInterval) => Console.WriteLine($"ConnectionAck: send={serverSendInterval}, receive={serverReceiveInterval}");
    public void ConnectionClosed() => StopWithFailure("Connection closed.");
    public void ConnectionKickout(int errorCode, string errorMsg) =>
        StopWithFailure($"Connection kickout {errorCode}: {errorMsg}");
    public void Error(string errorMsg) => StopWithFailure(errorMsg);
    public void Error(int id, int errorCode, string errorMsg)
    {
        Fail(id, $"Error {errorCode}: {errorMsg}");
        Stopped.TrySetResult(true);
    }
    public void HearBeat(string heartBeatContent) => Console.WriteLine($"HearBeat: {heartBeatContent}");
    public void ServerHeartBeatTimeOut(string channelId) =>
        StopWithFailure($"Server heartbeat timed out for channel {channelId}.");
    public void OrderStatusChange(OrderStatusData data) { }
    public void OrderTransactionChange(OrderTransactionData data) { }
    public void PositionChange(PositionData data) { }
    public void AssetChange(AssetData data) { }
    public void OptionChange(QuoteBasicData data) { }
    public void OptionAskBidChange(QuoteBBOData data) { }
    public void FutureChange(QuoteBasicData data) { }
    public void FutureAskBidChange(QuoteBBOData data) { }
    public void StockTopPush(StockTopData data) { }
    public void OptionTopPush(OptionTopData data) { }
    public void GetSubscribedSymbolEnd(SubscribedSymbol subscribedSymbol) { }
}

static class Program
{
    private static async Task WaitForCancelAsync(
        MarketPushCallback callback, uint requestId)
    {
        string result = await callback.WaitForResultAsync(requestId, TimeSpan.FromSeconds(10));
        Console.WriteLine($"CancelSubscribeEnd: id={unchecked((int)requestId)}, result={result}");
    }

    public static async Task Main(string[] args)
    {
        if (args.Length == 0 || !Enum.TryParse(args[0], true, out MarketPushMode mode))
        {
            Console.Error.WriteLine("Usage: dotnet run -- Quote|Depth|Kline|Tick|FullTick");
            return;
        }

        var config = new TigerConfig
        {
            ConfigFilePath = Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".tigeropen"),
            UseFullTick = mode == MarketPushMode.FullTick
        };
        var callback = new MarketPushCallback();
        PushClient client = PushClient.GetInstance()
            .Config(config)
            .ApiComposeCallback(callback);
        var symbols = new HashSet<string> { "AAPL" };
        bool connected = false;

        try
        {
            connected = await client.ConnectAsync();
            if (!connected)
                throw new InvalidOperationException("Market-push connection failed.");

            Console.CancelKeyPress += (_, eventArgs) =>
            {
                eventArgs.Cancel = true;
                callback.Stopped.TrySetResult(true);
            };

            uint requestId = mode switch
            {
                MarketPushMode.Quote => client.SubscribeQuote(symbols),
                MarketPushMode.Depth => client.SubscribeDepthQuote(symbols),
                MarketPushMode.Kline => client.SubscribeKline(symbols),
                MarketPushMode.Tick or MarketPushMode.FullTick => client.SubscribeTradeTick(symbols),
                _ => 0
            };
            if (requestId == 0)
                throw new InvalidOperationException("The subscription request was not sent.");
            string result = await callback.WaitForResultAsync(requestId, TimeSpan.FromSeconds(10));
            Console.WriteLine($"SubscribeEnd: id={unchecked((int)requestId)}, result={result}");
            Console.WriteLine("Press Ctrl+C to stop.");
            await callback.Stopped.Task;
            callback.ThrowIfFailed();
        }
        finally
        {
            try
            {
                if (client.IsConnected())
                {
                    uint cancelRequestId = mode switch
                    {
                        MarketPushMode.Quote => client.CancelSubscribeQuote(symbols),
                        MarketPushMode.Depth => client.CancelSubscribeDepthQuote(symbols),
                        MarketPushMode.Kline => client.CancelSubscribeKline(symbols),
                        MarketPushMode.Tick or MarketPushMode.FullTick => client.CancelSubscribeTradeTick(symbols),
                        _ => 0
                    };
                    if (cancelRequestId != 0)
                        await WaitForCancelAsync(callback, cancelRequestId);
                }
            }
            finally
            {
                client.Disconnect();
            }
        }
    }
}

ConnectAsync 会一直重试,直到 TCP 连接成功。若要在连接成功前停止程序,请终止进程;连接成功后,按 Ctrl+C 会触发取消订阅和断开连接。连接关闭、被踢下线、服务端心跳超时或无请求 ID 的全局错误会记录为全局失败并结束等待;无论全局失败发生在请求等待之前还是期间,WaitForResultAsync 都会抛出异常。带 ID 的错误使对应请求失败,并结束主等待。停止等待后,ThrowIfFailed() 会再次检查全局失败,避免没有活动请求时静默退出。清理阶段仅在连接仍然有效时取消订阅,但只要执行进入 finally,其中的 Disconnect() 就会执行。

订阅和取消方法返回 uint 请求 ID;SubscribeEnd、CancelSubscribeEnd 和带 ID 的 Error 回调中的 int id 携带同一个 32 位请求标识符。应使用 unchecked((int)requestId) 比较其未经检查的 32 位位模式,不能按有符号数值比较。回调和等待方都使用 GetOrAdd,因此即使回调先于 WaitForResultAsync 到达,也不会丢失结果;带 ID 的错误会由等待方以异常形式抛出。非零 ID 仅表示请求已发送;示例会解析回调 result JSON,只有结果 JSON 的 code 字段为 0 才完成成功,否则抛出异常。完整逐笔与普通逐笔都调用 SubscribeTradeTick;UseFullTick = true 只需在连接之前设置,此时数据进入 FullTickChange,普通模式则进入 TradeTickChange。

订阅股票行情

操作名

PushClient.SubscribeQuote. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint SubscribeQuote(ISet<string> symbols)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

连接、订阅、取消与退出处理参见完整行情推送示例(选择 Quote 模式)。

订阅完成回调

SubscribeEnd(int id, string subject, string result)

数据回调

QuoteChange(QuoteBasicData data)(BASIC,详见 完整字段表)和 QuoteAskBidChange(QuoteBBOData data)(BBO,详见 完整字段表)

Protobuf JSON 表示

基本行情(BASIC):

{
    "symbol": "AAPL",
    "type": "BASIC",
    "timestamp": "1684766012120",
    "serverTimestamp": "1684766012129",
    "avgPrice": 174.1721,
    "latestPrice": 174.175,
    "latestPriceTimestamp": "1684766011918",
    "latestTime": "05-22 10:33:31 EDT",
    "preClose": 175.16,
    "volume": "12314802",
    "amount": 2144365591.41,
    "open": 173.98,
    "high": 174.71,
    "low": 173.45,
    "marketStatus": "Trading",
    "mi": {
        "p": 174.175,
        "a": 174.1721,
        "t": "1684765980000",
        "v": "57641",
        "o": 174.21,
        "h": 174.22,
        "l": 174.14
    }
}

最优报价(BBO):

{
    "symbol": "AAPL",
    "type": "BBO",
    "timestamp": "1676992715509",
    "askPrice": 149.96,
    "askSize": "200",
    "askTimestamp": "1676992715367",
    "bidPrice": 149.94,
    "bidSize": "700",
    "bidTimestamp": "1676992715367"
}

字段类型、可选字段和嵌套 Mi 的完整定义见 QuoteChange 字段表;BBO 字段见 QuoteAskBidChange 字段表。

取消订阅

操作名

PushClient.CancelSubscribeQuote. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint CancelSubscribeQuote(ISet<string>? symbols = null)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.CancelSubscribeQuote(new HashSet<string> { "AAPL" });

取消订阅完成回调

CancelSubscribeEnd(int id, string subject, string result)

订阅逐笔成交

操作名

PushClient.SubscribeTradeTick. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint SubscribeTradeTick(ISet<string> symbols)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

连接、订阅、取消与退出处理参见完整行情推送示例(选择 Tick 模式)。

订阅完成回调

SubscribeEnd(int id, string subject, string result)

数据回调

TradeTickChange(TradeTick data),详见 完整字段表。

JSON 表示

{
    "symbol": "AAPL",
    "secType": "STK",
    "quoteLevel": "usQuoteBasic",
    "timestamp": 1676993925700,
    "ticks": [
        {
            "sn": 116202,
            "volume": 50,
            "tickType": "*",
            "price": 149.665,
            "time": 1676993924289,
            "cond": "US_REGULAR_SALE"
        }
    ]
}

普通 TradeTickChange 回调中的 Cond 是 SDK 解码后的名称,详见逐笔成交条件。完整逐笔模式下,FullTickChange 返回单字符条件代码,详见逐笔成交条件。

字段类型见 TradeTickChange 字段表。

完整逐笔成交

完整逐笔与普通逐笔使用相同的 SubscribeTradeTick(ISet<string> symbols) 和 CancelSubscribeTradeTick(ISet<string>? symbols = null) 方法。区别是连接前设置 TigerConfig.UseFullTick = true,数据回调改为 FullTickChange(TickData data)(详见 完整字段表);订阅完成回调仍为 SubscribeEnd(int id, string subject, string result)。完整流程参见完整行情推送示例(选择 FullTick 模式)。

Protobuf JSON 表示

{
    "symbol": "AAPL",
    "timestamp": "1676993925700",
    "source": "",
    "ticks": [
        {
            "sn": "116202",
            "time": "1676993924289",
            "price": 149.665,
            "volume": 50,
            "type": "*",
            "cond": "@",
            "partCode": "Q"
        }
    ]
}

字段类型见 FullTickChange 字段表。

取消订阅

操作名

PushClient.CancelSubscribeTradeTick. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint CancelSubscribeTradeTick(ISet<string>? symbols = null)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.CancelSubscribeTradeTick(new HashSet<string> { "AAPL" });

取消订阅完成回调

CancelSubscribeEnd(int id, string subject, string result)

订阅期权行情

操作名

PushClient.SubscribeOption. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint SubscribeOption(ISet<string> symbols)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.SubscribeOption(new HashSet<string> { "AAPL  260821C00200000" });

订阅完成回调

SubscribeEnd(int id, string subject, string result)

数据回调

OptionChange(QuoteBasicData data)(详见 完整字段表)和 OptionAskBidChange(QuoteBBOData data)(详见 完整字段表)

Protobuf JSON 表示

{
    "symbol": "AAPL 20230317 150.0 CALL",
    "type": "BASIC",
    "timestamp": "1676994444927",
    "latestPrice": 4.83,
    "preClose": 6.21,
    "volume": "3181",
    "amount": 939117.01,
    "open": 4.85,
    "high": 5.6,
    "low": 4.64,
    "identifier": "AAPL  230317C00150000",
    "openInt": "82677"
}

取消订阅

操作名

PushClient.CancelSubscribeOption. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint CancelSubscribeOption(ISet<string>? symbols = null)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.CancelSubscribeOption(new HashSet<string> { "AAPL  260821C00200000" });

取消订阅完成回调

CancelSubscribeEnd(int id, string subject, string result)

订阅期货行情

操作名

PushClient.SubscribeFuture. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint SubscribeFuture(ISet<string> symbols)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.SubscribeFuture(new HashSet<string> { "ES2609" });

订阅完成回调

SubscribeEnd(int id, string subject, string result)

数据回调

FutureChange(QuoteBasicData data)(详见 完整字段表)和 FutureAskBidChange(QuoteBBOData data)(详见 完整字段表)

Protobuf JSON 表示

{
    "symbol": "ESmain",
    "type": "BASIC",
    "timestamp": "1684766824130",
    "avgPrice": 4206.476,
    "latestPrice": 4202.5,
    "preClose": 4204.75,
    "volume": "557570",
    "open": 4189,
    "high": 4221.75,
    "low": 4186.5,
    "marketStatus": "Trading",
    "preSettlement": 4204.75,
    "minTick": 0.25
}

取消订阅

操作名

PushClient.CancelSubscribeFuture. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint CancelSubscribeFuture(ISet<string>? symbols = null)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.CancelSubscribeFuture(new HashSet<string> { "ES2609" });

取消订阅完成回调

CancelSubscribeEnd(int id, string subject, string result)

订阅深度行情

操作名

PushClient.SubscribeDepthQuote. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint SubscribeDepthQuote(ISet<string> symbols)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

连接、订阅、取消与退出处理参见完整行情推送示例(选择 Depth 模式)。

订阅完成回调

SubscribeEnd(int id, string subject, string result)

数据回调

DepthQuoteChange(QuoteDepthData data),详见 完整字段表。

Protobuf JSON 表示

{
    "symbol": "AAPL",
    "timestamp": "1676993368405",
    "ask": {
        "price": [149.69, 149.70, 149.71],
        "volume": ["100", "200", "185"]
    },
    "bid": {
        "price": [149.68, 149.67, 149.66],
        "volume": ["84", "100", "100"]
    }
}

字段类型见 DepthQuoteChange 字段表。

取消订阅

操作名

PushClient.CancelSubscribeDepthQuote. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint CancelSubscribeDepthQuote(ISet<string>? symbols = null)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.CancelSubscribeDepthQuote(new HashSet<string> { "AAPL" });

取消订阅完成回调

CancelSubscribeEnd(int id, string subject, string result)

订阅 K 线

操作名

PushClient.SubscribeKline. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint SubscribeKline(ISet<string> symbols)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

连接、订阅、取消与退出处理参见完整行情推送示例(选择 Kline 模式)。

订阅完成回调

SubscribeEnd(int id, string subject, string result)

数据回调

KlineChange(KlineData data),详见 完整字段表。

Protobuf JSON 表示

{
    "symbol": "AAPL",
    "time": "1712584560000",
    "open": 168.9779,
    "high": 169.0015,
    "low": 168.9752,
    "close": 169.0,
    "avg": 168.778,
    "volume": "3664",
    "count": 114,
    "amount": 617820.6508,
    "serverTimestamp": "1712584569746"
}

字段类型见 KlineChange 字段表。

取消订阅

操作名

PushClient.CancelSubscribeKline. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint CancelSubscribeKline(ISet<string>? symbols = null)

参数

symbols 必须实现 ISet 泛型接口(元素为 string);取消方法传 null 表示取消该主题全部代码。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.CancelSubscribeKline(new HashSet<string> { "AAPL" });

取消订阅完成回调

CancelSubscribeEnd(int id, string subject, string result)

订阅整体市场行情

操作名

PushClient.SubscribeMarketQuote. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint SubscribeMarketQuote(Market market, QuoteSubject subject)

参数

market 与 QuoteSubject 必填;主题必须与取消命令匹配。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.SubscribeMarketQuote(Market.US, QuoteSubject.Quote);

订阅完成回调

SubscribeEnd(int id, string subject, string result)

数据回调

具体数据回调由 QuoteSubject 决定:Quote 对应 QuoteChange / QuoteAskBidChange 字段表;Option 对应 OptionChange / OptionAskBidChange 字段表;Future 对应 FutureChange / FutureAskBidChange 字段表;QuoteDepth 对应 DepthQuoteChange 字段表;TradeTick 根据 UseFullTick 对应 TradeTickChange 字段表 或 FullTickChange 字段表;Kline 对应 KlineChange 字段表;StockTop 对应 StockTopPush 字段表;OptionTop 对应 OptionTopPush 字段表。

取消订阅

操作名

PushClient.CancelSubscribeMarketQuote. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint CancelSubscribeMarketQuote(Market market, QuoteSubject subject)

参数

market 与 QuoteSubject 必填;主题必须与取消命令匹配。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.CancelSubscribeMarketQuote(Market.US, QuoteSubject.Quote);

取消订阅完成回调

CancelSubscribeEnd(int id, string subject, string result)

订阅股票榜单

操作名

PushClient.SubscribeStockTop. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint SubscribeStockTop(Market market, ISet<Indicator>? indicators = null)

参数

market 必填;indicators 可为 null,非 null 时转换为指标名称集合。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.SubscribeStockTop(Market.US);

订阅完成回调

SubscribeEnd(int id, string subject, string result)

数据回调

StockTopPush(StockTopData data),详见 完整字段表。

Protobuf JSON 表示

{
    "market": "US",
    "timestamp": "1687271010482",
    "topData": [
        {
            "targetName": "changeRate",
            "item": [
                {"symbol": "ICAD", "latestPrice": 1.63, "targetValue": 0.393162}
            ]
        },
        {
            "targetName": "volume",
            "item": [
                {"symbol": "TSLA", "latestPrice": 263.21, "targetValue": 40190416}
            ]
        }
    ]
}

取消订阅

操作名

PushClient.CancelSubscribeStockTop. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint CancelSubscribeStockTop(Market market, ISet<Indicator>? indicators = null)

参数

market 必填;indicators 可为 null,非 null 时转换为指标名称集合。

返回

Return: uint 请求 ID。订阅和取消结果分别进入 SubscribeEnd / CancelSubscribeEnd 完整字段表。

示例

uint requestId = client.CancelSubscribeStockTop(Market.US);

取消订阅完成回调

CancelSubscribeEnd(int id, string subject, string result)

订阅期权行情 Top

操作名

PushClient.SubscribeOptionTop. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint SubscribeOptionTop(Market market, ISet<Indicator>? indicators = null)

参数

market 必填;indicators 可为 null,非 null 时转换为指标名称集合。

返回

Return: uint request ID. 订阅结果进入 SubscribeEnd;取消结果进入 CancelSubscribeEnd。

示例

uint requestId = client.SubscribeOptionTop(Market.US);

订阅完成回调

SubscribeEnd(int id, string subject, string result)

数据回调

OptionTopPush(OptionTopData data),详见 完整字段表。

Protobuf JSON 表示

{
    "market": "US",
    "timestamp": "1687277160445",
    "topData": [
        {
            "targetName": "volume",
            "item": [
                {
                    "symbol": "SPY",
                    "expiry": "20230620",
                    "strike": "435.0",
                    "right": "PUT",
                    "totalVolume": 212478
                }
            ]
        }
    ]
}

取消订阅

操作名

PushClient.CancelSubscribeOptionTop. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint CancelSubscribeOptionTop(Market market, ISet<Indicator>? indicators = null)

参数

market 必填;indicators 可为 null,非 null 时转换为指标名称集合。

返回

Return: uint request ID. 订阅结果进入 SubscribeEnd;取消结果进入 CancelSubscribeEnd。

示例

uint requestId = client.CancelSubscribeOptionTop(Market.US);

取消订阅完成回调

CancelSubscribeEnd(int id, string subject, string result)

查询已订阅标的

操作名

PushClient.GetSubscribedSymbols. 已连接通道上的订阅、取消订阅或订阅状态查询命令。发送成功不等于服务端确认成功。

请求

uint GetSubscribedSymbols()

参数

无参数;查询当前连接的行情代码订阅集合。

返回

Return: uint 请求 ID。结果进入 GetSubscribedSymbolEnd 完整字段表,但该回调参数不含 ID,因此返回值不能用于关联查询结果。同一连接上一次只发起一个此类查询,或由应用自行串行化查询。

示例

uint requestId = client.GetSubscribedSymbols();
// GetSubscribedSymbolEnd 仅返回 SubscribedSymbol,不返回 requestId。

查询完成回调

GetSubscribedSymbolEnd(SubscribedSymbol subscribedSymbol),详见 完整字段表。


Did this page help you?