/// <summary>
        /// Get the current Tradier stream session
        /// </summary>
        private TradierStreamSession GetStreamSession()
        {
            if (_streamSession == null)
            {
                var request = new RestRequest("markets/events/session", Method.POST);
                _streamSession = Execute <TradierStreamSession>(request, TradierApiRequestType.Data, "stream");
            }

            return(_streamSession);
        }
예제 #2
0
        /// <summary>
        /// Get the current market status
        /// </summary>
        public TradierStreamSession CreateStreamSession()
        {
            var session = new TradierStreamSession();

            try
            {
                var request = new RestRequest("markets/events/session", Method.POST);
                session = Execute <TradierStreamSession>(request, TradierApiRequestType.Data, "stream");
            }
            catch (Exception err)
            {
                Log.Error("Tradier.Stream(): " + err.Message + ">> " + _previousRequestRaw);
            }
            return(session);
        }
        /// <summary>
        /// Subscribe to the specified configuration
        /// </summary>
        /// <param name="dataConfig">defines the parameters to subscribe to a data feed</param>
        /// <param name="newDataAvailableHandler">handler to be fired on new data available</param>
        /// <returns>The new enumerator for this subscription request</returns>
        public IEnumerator <BaseData> Subscribe(SubscriptionDataConfig dataConfig, EventHandler newDataAvailableHandler)
        {
            // streaming is not supported by sandbox
            if (_useSandbox)
            {
                throw new NotSupportedException(
                          "TradierBrokerage.DataQueueHandler.Subscribe(): The sandbox does not support data streaming.");
            }

            // initialize data queue handler on-demand
            if (!_isDataQueueHandlerInitialized)
            {
                _isDataQueueHandlerInitialized = true;

                _streamSession = CreateStreamSession();

                using (var resetEvent = new ManualResetEvent(false))
                {
                    EventHandler triggerEvent = (o, args) => resetEvent.Set();
                    _webSocketClient.Open += triggerEvent;

                    _webSocketClient.Connect();

                    if (!resetEvent.WaitOne(ConnectionTimeout))
                    {
                        throw new TimeoutException("Websockets connection timeout.");
                    }

                    _webSocketClient.Open -= triggerEvent;
                }
            }

            if (!CanSubscribe(dataConfig.Symbol))
            {
                return(Enumerable.Empty <BaseData>().GetEnumerator());
            }

            var enumerator = _aggregator.Add(dataConfig, newDataAvailableHandler);

            _subscriptionManager.Subscribe(dataConfig);

            return(enumerator);
        }