コード例 #1
0
        /// <inheritdoc />
        public async Task <string> SubscribeTradeReportsAsync(string symbol, XenaMdWsHandler handler, long throttlingMs = 0)
        {
            Validator.NotNullOrEmpty(nameof(symbol), symbol);
            Validator.NotNull(nameof(handler), handler);
            Validator.GrThanOrEq(nameof(throttlingMs), throttlingMs, 0);

            return(await SubscribeAsync("trades", handler, symbol, throttlingMs : throttlingMs).ConfigureAwait(false));
        }
コード例 #2
0
        /// <inheritdoc />
        public async Task <string> SubscribeCandlesAsync(
            string symbol,
            string timeframe,
            XenaMdWsHandler handler,
            long throttlingMs = 0)
        {
            Validator.NotNullOrEmpty(nameof(symbol), symbol);
            Validator.NotNullOrEmpty(nameof(timeframe), timeframe);
            Validator.OneOf(nameof(timeframe), timeframe, CandlesTimeframe.All);
            Validator.NotNull(nameof(handler), handler);
            Validator.GrThanOrEq(nameof(throttlingMs), throttlingMs, 0);

            return(await SubscribeAsync("candles", handler, symbol, timeframe, throttlingMs).ConfigureAwait(false));
        }
コード例 #3
0
        /// <inheritdoc />
        public async Task <string> SubscribeDOMAggregatedAsync(
            string symbol,
            XenaMdWsHandler handler,
            long throttlingMs = 0,
            long aggregation  = 0,
            long depth        = 0)
        {
            Validator.NotNullOrEmpty(nameof(symbol), symbol);
            Validator.NotNull(nameof(handler), handler);
            Validator.GrThanOrEq(nameof(throttlingMs), throttlingMs, 0);
            Validator.GrThanOrEq(nameof(aggregation), aggregation, 0);
            Validator.GrThanOrEq(nameof(depth), depth, 0);

            return(await SubscribeAsync("DOM", handler, symbol, "aggregated", throttlingMs : throttlingMs, aggregation : aggregation, depth : depth).ConfigureAwait(false));
        }
コード例 #4
0
        private async Task <string> SubscribeAsync(
            string streamName,
            XenaMdWsHandler handler,
            string symbol        = null,
            string streamPostfix = null,
            long throttlingMs    = 0,
            long aggregation     = 0,
            long depth           = 0)
        {
            var streamId = streamName;

            if (symbol != null)
            {
                streamId += $":{symbol}";
            }
            if (streamPostfix != null)
            {
                streamId += $":{streamPostfix}";
            }

            var request = new MarketDataRequest
            {
                MsgType    = MsgTypes.MarketDataRequest,
                MDStreamId = streamId,
                SubscriptionRequestType = SubscriptionRequestType.SnapshotAndUpdates,
                ThrottleType            = ThrottleType.OutstandingRequests,
                ThrottleTimeInterval    = throttlingMs,
                ThrottleTimeUnit        = ThrottleTimeUnit.Milliseconds,
                AggregatedBook          = aggregation,
            };

            var sub = new Subscription(request, handler);

            if (!_subscriptions.TryAdd(streamId, sub))
            {
                throw new DuplicateSubscriptionException($"Subscription {request.MDStreamId} done or in progress");
            }

            await SendCommandAsync(request).ConfigureAwait(false);

            return(streamId);
        }
コード例 #5
0
 public Subscription(MarketDataRequest request, XenaMdWsHandler handler)
 {
     Request = request;
     Handler = handler;
 }
コード例 #6
0
        /// <inheritdoc />
        public async Task <string> SubscribeMarketWatchAsync(XenaMdWsHandler handler)
        {
            Validator.NotNull(nameof(handler), handler);

            return(await SubscribeAsync("market-watch", handler).ConfigureAwait(false));
        }