Ejemplo n.º 1
0
        public void RequestRealTimeData(RealTimeDataRequest request)
        {
            int id = _requestCounter++;

            _requestIdMap.Add(request.AssignedID, id);

            if (request.Frequency == BarSize.Tick)
            {
                string symbol     = GetSymbol(request).ToLower();
                string url        = $"wss://stream.binance.com:9443/ws/{symbol}@aggTrade";
                var    tickSocket = new WebSocket(url);
                tickSocket.MessageReceived += (s, e) => RealTimeTick(request.Instrument.ID.Value, request.AssignedID, e);
                _sockets.Add(id, tickSocket);
                tickSocket.Open();
            }
            else
            {
                string symbol    = GetSymbol(request).ToLower();
                string interval  = BarSizetoInterval(request.Frequency);
                string url       = $"wss://stream.binance.com:9443/ws/{symbol}@kline_{interval}";
                var    barSocket = new WebSocket(url);
                barSocket.MessageReceived += (s, e) => RealTimeBar(request.Instrument.ID.Value, request.AssignedID, e);
                _sockets.Add(id, barSocket);
                barSocket.Open();
            }
        }
Ejemplo n.º 2
0
        private static void Main()
        {
            //create the client, assuming the default port settings
            using (var client = new QDMSClient.QDMSClient("SampleClient", "127.0.0.1", 5556, 5557, 5558, 5555)) {
                //hook up the events needed to receive data & error messages
                client.HistoricalDataReceived           += client_HistoricalDataReceived;
                client.RealTimeDataReceived             += client_RealTimeDataReceived;
                client.LocallyAvailableDataInfoReceived += client_LocallyAvailableDataInfoReceived;
                client.Error += client_Error;
                //connect to the server
                client.Connect();
                //make sure the connection was succesful before we continue
                if (!client.Connected)
                {
                    Console.WriteLine("Could not connect.");
                    Console.WriteLine("Press enter to exit.");
                    Console.ReadLine();
                    return;
                }
                //request the list of available instruments
                var instruments = client.FindInstruments();

                foreach (var i in instruments)
                {
                    Console.WriteLine($"Instrument ID {i.ID}: {i.Symbol} ({i.Type}), Datasource: {i.Datasource.Name}");
                }

                Thread.Sleep(3000);
                //then we grab some historical data from Yahoo
                //start by finding the SPY instrument
                var spy = instruments.FirstOrDefault(x => x.Symbol == "SPY" && x.Datasource.Name == "Yahoo");
                if (spy != null)
                {
                    var req = new HistoricalDataRequest(
                        spy,
                        BarSize.OneDay,
                        new DateTime(2013, 1, 1),
                        new DateTime(2013, 1, 15));

                    client.RequestHistoricalData(req);

                    Thread.Sleep(3000);
                    //now that we downloaded the data, let's make a request to see what is stored locally
                    client.GetLocallyAvailableDataInfo(spy);

                    Thread.Sleep(3000);
                    //finally send a real time data request (from the simulated data datasource)
                    spy.Datasource.Name = "SIM";
                    var rtReq = new RealTimeDataRequest(spy, BarSize.OneSecond);
                    client.RequestRealTimeData(rtReq);

                    Thread.Sleep(3000);
                    //And then cancel the real time data stream
                    client.CancelRealTimeData(spy);
                }

                Console.WriteLine("Press enter to exit.");
                Console.ReadLine();
            }
        }
Ejemplo n.º 3
0
        private void SendIntradayBarRequest(Session session, RealTimeDataRequest req)
        {
            session.OpenService("//blp/refdata");
            Service refDataService = session.GetService("//blp/refdata");
            Request request        = refDataService.CreateRequest("IntradayBarRequest");

            // only one security/eventType per request
            request.Set("security", req.Instrument.DatasourceSymbol);
            request.Set("eventType", "TRADE");
            request.Set("interval", req.Frequency.ToTimeSpan().TotalSeconds);

            DateTime prevTradedDate = DateTime.Now.AddDays(-1); //todo fix
            var      startDateTime  = string.Format("{0}-{1}-{2}T13:30:00", prevTradedDate.Year, prevTradedDate.Month, prevTradedDate.Day);

            prevTradedDate = prevTradedDate.AddDays(1); // next day for end date
            var endDateTime = string.Format("{0}-{1}-{2}T13:30:00", prevTradedDate.Year, prevTradedDate.Month, prevTradedDate.Day);

            request.Set("startDateTime", startDateTime);
            request.Set("endDateTime", endDateTime);


            request.Set("gapFillInitialBar", true);

            session.SendRequest(request, null);
        }
Ejemplo n.º 4
0
        public void RequestsFrontContractFromCFBrokerForContinuousFuturesRequests()
        {
            var cf = new ContinuousFuture()
            {
                ID               = 1,
                InstrumentID     = 1,
                Month            = 1,
                UnderlyingSymbol = new UnderlyingSymbol
                {
                    ID     = 1,
                    Symbol = "VIX",
                    Rule   = new ExpirationRule()
                }
            };

            var inst = new Instrument
            {
                ID                 = 1,
                Symbol             = "VIXCONTFUT",
                IsContinuousFuture = true,
                ContinuousFuture   = cf,
                Datasource         = new Datasource {
                    ID = 999, Name = "MockSource"
                }
            };

            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds);

            _cfBrokerMock.Setup(x => x.RequestFrontContract(It.IsAny <Instrument>(), It.IsAny <DateTime?>())).Returns(0);

            _broker.RequestRealTimeData(req);

            _cfBrokerMock.Verify(x => x.RequestFrontContract(It.IsAny <Instrument>(), It.IsAny <DateTime?>()));
        }
Ejemplo n.º 5
0
        public void RealTimeDataIsSavedToLocalStorageIfFlagIsSet()
        {
            var inst = new Instrument
            {
                ID         = 1,
                Symbol     = "SPY",
                Datasource = new Datasource {
                    ID = 999, Name = "MockSource"
                }
            };

            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds, savetoLocalStorage: true);

            int assignedID = 0;

            _dataSourceMock.Setup(x => x.RequestRealTimeData(It.IsAny <RealTimeDataRequest>())).Callback <RealTimeDataRequest>(r => assignedID = r.AssignedID);

            _broker.RequestRealTimeData(req);
            Thread.Sleep(100);


            _dataSourceMock.Raise(x => x.DataReceived += null, new RealTimeDataEventArgs(1, 1389906576, 100, 100, 100, 100, 1000, 100, 5, assignedID));

            _localStorageMock.Verify(x => x.AddDataAsync(
                                         It.Is <OHLCBar>(y => y.Open == 100 && y.Volume == 1000),
                                         It.Is <Instrument>(y => y.ID == 1 && y.Symbol == "SPY"),
                                         It.Is <BarSize>(y => y == BarSize.FiveSeconds),
                                         It.Is <bool>(y => y == false)));
        }
Ejemplo n.º 6
0
        public void ServerForwardsErrorToClientIfExceptionIsThrownInRequestRealTimeData()
        {
            var ds = new Datasource()
            {
                ID = 1, Name = "TestDS"
            };
            var inst = new Instrument()
            {
                ID = 1, Datasource = ds, DatasourceID = 1, Symbol = "SPY", Type = InstrumentType.Stock
            };
            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds, rthOnly: false, savetoLocalStorage: false);

            string error     = null;
            int?   requestID = -1;

            _client.Error += (s, e) =>
            {
                error     = e.ErrorMessage;
                requestID = e.RequestID;
            };

            _brokerMock.Setup(x => x.RequestRealTimeData(It.IsAny <RealTimeDataRequest>())).Throws(new Exception("testerror"));

            _client.RequestRealTimeData(req);

            Thread.Sleep(100);

            Assert.AreEqual("Real time data request error: testerror", error);
        }
Ejemplo n.º 7
0
        public void ServerReturnsErrorToClientIfNoInstrumentIdIsSet()
        {
            var ds = new Datasource()
            {
                ID = 1, Name = "TestDS"
            };
            var inst = new Instrument()
            {
                ID = null, Datasource = ds, DatasourceID = 1, Symbol = "SPY", Type = InstrumentType.Stock
            };
            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds, rthOnly: false, savetoLocalStorage: false);

            string error     = null;
            int?   requestID = -1;

            _client.Error += (s, e) =>
            {
                error     = e.ErrorMessage;
                requestID = e.RequestID;
            };

            _client.RequestRealTimeData(req);

            Thread.Sleep(100);

            Assert.AreEqual("Real time data request error: Instrument had no ID set.", error);
        }
Ejemplo n.º 8
0
        public void ArrivedRealTimeDataCorrentlyRaisesEvent()
        {
            var exchange = new Exchange {
                ID = 1, Name = "Ex", Timezone = "Pacific Standard Time"
            };
            var req = new RealTimeDataRequest
            {
                Instrument = new Instrument {
                    ID = 1, Symbol = "SPY", UnderlyingSymbol = "SPY", Exchange = exchange, Currency = "USD", Type = InstrumentType.Stock
                },
                Frequency = QDMS.BarSize.FiveSeconds,
                RTHOnly   = true
            };

            int requestID = -1;

            _ibClientMock
            .Setup(x => x.RequestRealTimeBars(
                       It.IsAny <int>(),
                       It.IsAny <Contract>(),
                       It.IsAny <string>(),
                       It.IsAny <bool>(),
                       It.IsAny <List <TagValue> >()))
            .Callback <int, Contract, string, Boolean, List <TagValue> >((y, a, b, c, d) => requestID = y);

            _ibDatasource.RequestRealTimeData(req);

            bool received = false;

            _ibDatasource.DataReceived += (sender, e) => received = true;

            _ibClientMock.Raise(x => x.RealTimeBar += null, new RealTimeBarEventArgs(requestID, 10000000, 1, 2, 3, 4, 5, 3, 5));

            Assert.IsTrue(received);
        }
Ejemplo n.º 9
0
        public void ServerForwardsErrorToClientIfExceptionIsThrownInRequestRealTimeData()
        {
            var ds = new Datasource {
                ID = 1, Name = "TestDS"
            };
            var inst = new Instrument {
                ID = 1, Datasource = ds, DatasourceID = 1, Symbol = "SPY", Type = InstrumentType.Stock
            };
            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds, false);

            string error     = null;
            int?   requestId = null;

            _client.Error += (s, e) =>
            {
                error     = e.ErrorMessage;
                requestId = e.RequestID;
            };

            _brokerMock.Setup(x => x.RequestRealTimeData(It.IsAny <RealTimeDataRequest>())).Throws(new Exception("testerror"));

            _client.RequestRealTimeData(req);

            Thread.Sleep(DefaultDelayInMilliseconds);

            Assert.IsTrue(!string.IsNullOrEmpty(error));
            Assert.IsTrue(requestId.HasValue);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Request a new real time data stream. Data will be delivered through the RealTimeDataReceived event.
        /// </summary>
        /// <returns>An ID uniquely identifying this real time data request. -1 if there was an error.</returns>
        public int RequestRealTimeData(RealTimeDataRequest request)
        {
            if (!Connected)
            {
                RaiseEvent(Error, this, new ErrorArgs(-1, "Could not request real time data - not connected."));
                return(-1);
            }

            if (request.Instrument == null)
            {
                RaiseEvent(Error, this, new ErrorArgs(-1, "Real Time Data Request Failed: null Instrument."));
                return(-1);
            }

            request.RequestID = _requestCount++;

            lock (_reqSocketLock)
            {
                //two part message:
                //1: "RTD"
                //2: serialized RealTimeDataRequest
                var ms = new MemoryStream();
                _reqSocket.SendMore("");
                _reqSocket.SendMore("RTD");
                _reqSocket.Send(MyUtils.ProtoBufSerialize(request, ms));
            }
            return(request.RequestID);
        }
Ejemplo n.º 11
0
        public void ServerReturnsErrorToClientIfNoInstrumentIdIsSet()
        {
            var ds = new Datasource {
                ID = 1, Name = "TestDS"
            };
            var inst = new Instrument {
                ID = null, Datasource = ds, DatasourceID = 1, Symbol = "SPY", Type = InstrumentType.Stock
            };
            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds, false);

            string error     = null;
            int?   requestId = null;

            _client.Error += (s, e) =>
            {
                error     = e.ErrorMessage;
                requestId = e.RequestID;
            };

            _client.RequestRealTimeData(req);

            Thread.Sleep(DefaultDelayInMilliseconds);

            Assert.IsTrue(!string.IsNullOrEmpty(error));
            Assert.IsTrue(requestId.HasValue);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// real time data request
        /// </summary>
        public int RequestRealTimeData(RealTimeDataRequest request)
        {
            lock (_requestIDMapLock)
            {
                _requestCounter++;
                _realTimeDataRequests.Add(_requestCounter, request);
                _requestIDMap.Add(_requestCounter, request.AssignedID);
            }

            try
            {
                Contract contract = TWSUtils.InstrumentToContract(request.Instrument);

                _client.RequestRealTimeBars(
                    _requestCounter,
                    contract,
                    (int)TWSUtils.BarSizeConverter(request.Frequency),
                    RealTimeBarType.Trades, request.RTHOnly);
            }
            catch (Exception ex)
            {
                Log(LogLevel.Error, "IB: Could not send real time data request: " + ex.Message);
                RaiseEvent(Error, this, new ErrorArgs(-1, "Could not send real time data request: " + ex.Message));
            }
            return(_requestCounter);
        }
Ejemplo n.º 13
0
        public void RequestRealTimeData(RealTimeDataRequest request)
        {
            if (!request.Instrument.ID.HasValue)
            {
                throw new Exception("ID doesn't have value.");
            }


            bool success = _requestedInstrumentIDs.TryAdd(_requestIDs, request.Instrument.ID.Value);

            _reqIdMap.Add(request.AssignedID, _requestIDs);
            _requests.Add(request.AssignedID, request);

            int number;

            if (request.Frequency == BarSize.Tick)
            {
                number = 1;
            }
            else
            {
                number = (int)(request.Frequency.ToTimeSpan().TotalMilliseconds);
            }

            _loopsPassed.TryAdd(request.Instrument.ID.Value, number);
            _loopLimit.TryAdd(request.Instrument.ID.Value, number);
            _idMap.TryAdd(request.Instrument.ID.Value, request.AssignedID);

            _requestIDs++;
        }
Ejemplo n.º 14
0
        public void HistoricalDataUpdateCorrectlyRaisesRealTimeDataEvent()
        {
            //need to set it up from the start w/ the right setting
            _ibClientMock = new Mock <IIBClient>();
            _ibClientMock.Setup(x => x.Connect(It.IsAny <string>(), It.IsAny <int>(), It.IsAny <int>())).Callback(() => _clientIsConnected = true);
            _ibClientMock.Setup(x => x.Connected).Returns(() => _clientIsConnected);

            var settings = new Mock <ISettings>();

            settings.Setup(x => x.ibClientHost).Returns(Host);
            settings.Setup(x => x.ibUseNewRealTimeDataSystem).Returns(true);

            _ibDatasource = new IB(settings.Object, client: _ibClientMock.Object);
            _ibDatasource.Connect();

            var exchange = new Exchange {
                ID = 1, Name = "Ex", Timezone = "Pacific Standard Time"
            };
            var req = new RealTimeDataRequest
            {
                Instrument = new Instrument {
                    ID = 1, Symbol = "SPY", UnderlyingSymbol = "SPY", Exchange = exchange, Currency = "USD", Type = InstrumentType.Stock
                },
                Frequency = QDMS.BarSize.FiveSeconds,
                RTHOnly   = true
            };

            int requestID = -1;

            _ibClientMock
            .Setup(x => x.RequestHistoricalData(
                       It.IsAny <int>(),
                       It.IsAny <Contract>(),
                       It.IsAny <string>(),
                       It.IsAny <string>(),
                       It.IsAny <QDMSIBClient.BarSize>(),
                       It.IsAny <HistoricalDataType>(),
                       It.IsAny <bool>(),
                       It.IsAny <bool>(),
                       It.IsAny <List <TagValue> >()))
            .Callback <int, Contract, string, string, BarSize, HistoricalDataType, bool, bool, List <TagValue> >((y, a, b, c, d, e, f, g, h) => requestID = y);

            _ibDatasource.RequestRealTimeData(req);

            bool received = false;

            _ibDatasource.DataReceived += (sender, e) => received = true;

            _ibClientMock.Raise(x => x.HistoricalDataUpdate += null, new HistoricalDataEventArgs(requestID, new Bar(new DateTime(2014, 1, 15),
                                                                                                                    1,
                                                                                                                    2,
                                                                                                                    3,
                                                                                                                    4,
                                                                                                                    5,
                                                                                                                    5,
                                                                                                                    3)));

            Assert.IsTrue(received);
        }
Ejemplo n.º 15
0
        public void RaisesDataEventWithTheContinuousFuturesAlias()
        {
            var cf = new ContinuousFuture()
            {
                ID               = 1,
                InstrumentID     = 1,
                Month            = 1,
                UnderlyingSymbol = new UnderlyingSymbol
                {
                    ID     = 1,
                    Symbol = "VIX",
                    Rule   = new ExpirationRule()
                }
            };

            var inst = new Instrument
            {
                ID                 = 1,
                Symbol             = "VIXCONTFUT",
                IsContinuousFuture = true,
                ContinuousFuture   = cf,
                Datasource         = new Datasource {
                    ID = 999, Name = "MockSource"
                }
            };

            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds);

            _cfBrokerMock.Setup(x => x.RequestFrontContract(It.IsAny <Instrument>(), It.IsAny <DateTime?>())).Returns(0);
            int assignedID = 0;

            _dataSourceMock.Setup(x => x.RequestRealTimeData(It.IsAny <RealTimeDataRequest>())).Callback <RealTimeDataRequest>(r => assignedID = r.AssignedID);

            bool raisedCorrectSymbol = false;

            _broker.RealTimeDataArrived += (sender, e) =>
                                           raisedCorrectSymbol = raisedCorrectSymbol ? raisedCorrectSymbol : e.InstrumentID == 1;
            _broker.RequestRealTimeData(req);

            var frontFutureInstrument = new Instrument
            {
                Symbol     = "VXF4",
                ID         = 2,
                Datasource = new Datasource {
                    ID = 999, Name = "MockSource"
                }
            };

            _cfBrokerMock.Raise(x => x.FoundFrontContract += null, new FoundFrontContractEventArgs(0, frontFutureInstrument, DateTime.Now));

            _dataSourceMock.Raise(x => x.DataReceived += null,
                                  new RealTimeDataEventArgs(2, MyUtils.ConvertToTimestamp(DateTime.Now), 100, 100, 100, 100, 50, 100, 2, assignedID));

            Thread.Sleep(50);

            Assert.IsTrue(raisedCorrectSymbol);
        }
        public int RequestRealTimeData(RealTimeDataRequest request)
        {
            if (!request.Instrument.ID.HasValue)
            {
                throw new Exception("ID doesn't have value.");
            }

            _requestIDs++;

            var requestGrouping = new RequestGrouping
            {
                Instrument = request.Instrument,
                Frequency  = request.Frequency
            };

            var requestList = _connectedRequests.GetOrAdd(requestGrouping,
                                                          new ConcurrentDictionary <int, RealTimeDataRequest>());
            bool success = requestList.TryAdd(_requestIDs, request);

            lock (_historicalDataRequestLock)
            {
                int historicalRequestId;
                if (!_historicalRequests.TryGetValue(requestGrouping, out historicalRequestId))
                {
                    var asyncCall = new RequestHistoricalDataCaller(RequestHistoricalData);
                    asyncCall.BeginInvoke(requestGrouping, null, null);
                }
            }

            Timer timer;
            bool  result = _timers.TryGetValue(request.Frequency, out timer);

            if (result)
            {
                // start timer if not is already started:
                if (!timer.Enabled)
                {
                    timer.Start();
                }
            }

            ShortTimerController controller;

            result = _shortTimers.TryGetValue(request.Frequency, out controller);
            if (result)
            {
                if (!controller.Active)
                {
                    controller.Active = true;
                    // start simulatetimer
                    controller.AsyncResult = controller.Caller.BeginInvoke(controller, request.Frequency, null, null);
                }
            }

            return(_requestIDs);
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Request real time data.
        /// </summary>
        /// <param name="request"></param>
        /// <returns>The ID associated with this real time data request.</returns>
        public int RequestRealTimeData(RealTimeDataRequest request)
        {
            //var contract = new OEC.API.Contract();
            //_client.Subscribe()

            //So here's what's going on: it won't let us create a contract.
            //We have to request it, then when it arrives we request the data stream.

            //Depending on the BarSize we have to request either ticks or bars

            return(0); //fix
            //TODO write
        }
Ejemplo n.º 18
0
        public int RequestRealTimeData(RealTimeDataRequest request)
        {
            if (!Connected)
            {
                throw new Exception("The datasource is not connected. A request is not possible.");
            }

            if (!request.Instrument.ID.HasValue)
            {
                throw new Exception("ID doesn't have value.");
            }
            if (!_intervalCache.ContainsKey(request.Frequency) || request.Frequency > BarSize.OneDay)
            {
                throw new Exception("Bar size is not supported");
            }

            string symbol = request.Instrument.DatasourceSymbol;

            if (string.IsNullOrEmpty(symbol))
            {
                symbol = request.Instrument.Symbol;
            }

            var availableSymbols = GetAvailableSymbols();

            if (!availableSymbols.Contains(symbol))
            {
                throw new Exception("Symbol is not available");
            }

            _requestIDs++;

            var  requestList = _connectedRequests.GetOrAdd(request.Frequency, new ConcurrentDictionary <int, RealTimeDataRequest>());
            bool success     = requestList.TryAdd(_requestIDs, request);

            FeedTimer timer;
            bool      result = _timers.TryGetValue(request.Frequency, out timer);

            if (!result)
            {
                throw new NotSupportedException($"Timer not found for freq. {request.Frequency}");
            }

            // start timer if not is already started:
            if (!timer.Active)
            {
                timer.Start();
            }

            return(_requestIDs);
        }
Ejemplo n.º 19
0
        public void RequestRealTimelDataRaisesErrorEventAndReturnsMinusOneWhenInstrumentIsNull()
        {
            var req = new RealTimeDataRequest
            {
                Instrument = null
            };

            bool errorTriggered = false;

            _client.Error += (sender, e) => errorTriggered = true;

            Assert.AreEqual(-1, _client.RequestRealTimeData(req));

            Assert.IsTrue(errorTriggered);
        }
Ejemplo n.º 20
0
        public void CancelRealTimeData(int requestID)
        {
            RealTimeDataRequest request = null;

            foreach (var key1Request in _connectedRequests)
            {
                if (key1Request.Value.TryGetValue(requestID, out request))
                {
                    break;
                }
            }

            if (request == null)
            {
                // kein Request gefunden ...
                return;
            }

            var requestGrouping = new RequestGrouping
            {
                Instrument = request.Instrument,
                Frequency  = request.Frequency
            };

            RealTimeDataRequest dummy;
            Timer timer;
            ConcurrentDictionary <int, RealTimeDataRequest> dummy2;

            if (_connectedRequests[requestGrouping].TryRemove(requestID, out dummy))
            {
                if (_connectedRequests[requestGrouping].Count == 0)
                {
                    if (_connectedRequests.TryRemove(requestGrouping, out dummy2))
                    {
                        if (_connectedRequests.Count == 0)
                        {
                            if (_timers.TryGetValue(request.Frequency, out timer))
                            {
                                if (timer.Enabled)
                                {
                                    timer.Stop();
                                }
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 21
0
        public void RequestsCorrectFuturesContractForContinuousFutures()
        {
            var cf = new ContinuousFuture()
            {
                ID               = 1,
                InstrumentID     = 1,
                Month            = 1,
                UnderlyingSymbol = new UnderlyingSymbol
                {
                    ID     = 1,
                    Symbol = "VIX",
                    Rule   = new ExpirationRule()
                }
            };

            var inst = new Instrument
            {
                ID                 = 1,
                Symbol             = "VIXCONTFUT",
                IsContinuousFuture = true,
                ContinuousFuture   = cf,
                Datasource         = new Datasource {
                    ID = 999, Name = "MockSource"
                }
            };

            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds);

            _cfBrokerMock.Setup(x => x.RequestFrontContract(It.IsAny <Instrument>(), It.IsAny <DateTime?>())).Returns(0);

            _broker.RequestRealTimeData(req);

            var frontFutureInstrument = new Instrument
            {
                Symbol     = "VXF4",
                ID         = 2,
                Datasource = new Datasource {
                    ID = 999, Name = "MockSource"
                }
            };

            _cfBrokerMock.Raise(x => x.FoundFrontContract += null, new FoundFrontContractEventArgs(0, frontFutureInstrument, DateTime.Now));

            _dataSourceMock.Verify(x => x.RequestRealTimeData(
                                       It.Is <RealTimeDataRequest>(y =>
                                                                   y.Instrument.ID == 2)), Times.Once);
        }
Ejemplo n.º 22
0
        public void RequestRealTimelDataRaisesErrorEventAndReturnsMinusOneWhenNotConnected()
        {
            var req = new RealTimeDataRequest
            {
                Instrument = new Instrument {
                    ID = 1, Symbol = "SPY"
                }
            };

            bool errorTriggered = false;

            _client.Error += (sender, e) => errorTriggered = true;

            Assert.AreEqual(-1, _client.RequestRealTimeData(req));

            Assert.IsTrue(errorTriggered);
        }
Ejemplo n.º 23
0
Archivo: IB.cs Proyecto: herbota/QDMS
        /// <summary>
        /// real time data request
        /// </summary>
        public void RequestRealTimeData(RealTimeDataRequest request)
        {
            var id = _requestCounter++;

            lock (_requestIDMapLock)
            {
                _realTimeDataRequests.Add(id, request);
                _requestIDMap.Add(id, request.AssignedID);
                if (_reverseRequestIDMap.ContainsKey(request.AssignedID))
                {
                    _reverseRequestIDMap[request.AssignedID] = id;
                }
                else
                {
                    _reverseRequestIDMap.Add(request.AssignedID, id);
                }
            }

            try
            {
                Contract contract = TWSUtils.InstrumentToContract(request.Instrument);

                if (_ibUseNewRealTimeDataSystem)
                {
                    //the new system uses the historical data update endpoint instead of realtime data
                    _client.RequestHistoricalData(id, contract, "",
                                                  "60 S", QDMSIBClient.BarSize.FiveSeconds, HistoricalDataType.Trades, request.RTHOnly, true);

                    //todo: write test
                }
                else
                {
                    _client.RequestRealTimeBars(
                        id,
                        contract,
                        "TRADES",
                        request.RTHOnly);
                }
            }
            catch (Exception ex)
            {
                Log(LogLevel.Error, "IB: Could not send real time data request: " + ex.Message);
                RaiseEvent(Error, this, new ErrorArgs(-1, "Could not send real time data request: " + ex.Message));
            }
        }
Ejemplo n.º 24
0
        /// <summary>
        ///     Request a new real time data stream. Data will be delivered through the RealTimeDataReceived event.
        /// </summary>
        /// <returns>An ID uniquely identifying this real time data request. -1 if there was an error.</returns>
        public int RequestRealTimeData(RealTimeDataRequest request)
        {
            if (request == null)
            {
                RaiseEvent(Error, this, new ErrorArgs(-1, "Real Time Data Request Failed: Request cannot be null."));

                return(-1);
            }

            if (request.Instrument == null)
            {
                RaiseEvent(Error, this, new ErrorArgs(-1, "Real Time Data Request Failed: null Instrument."));

                return(-1);
            }

            if (!Connected)
            {
                RaiseEvent(Error, this, new ErrorArgs(-1, "Could not request real time data - not connected."));

                return(-1);
            }

            request.RequestID = Interlocked.Increment(ref _requestCount);

            lock (_realTimeRequestSocketLock)
            {
                if (_realTimeRequestSocket != null)
                {
                    // Two part message:
                    // 1: "RTD"
                    // 2: serialized RealTimeDataRequest
                    _realTimeRequestSocket.SendMoreFrame(string.Empty);
                    _realTimeRequestSocket.SendMoreFrame(MessageType.RTDRequest);

                    using (var ms = new MemoryStream())
                    {
                        _realTimeRequestSocket.SendFrame(MyUtils.ProtoBufSerialize(request, ms));
                    }
                }
            }

            return(request.RequestID);
        }
Ejemplo n.º 25
0
        /// <summary>
        ///     Request to initiate a real time data stream.
        /// </summary>
        /// <param name="request">The request</param>
        /// <returns>True is the request was successful, false otherwise.</returns>
        public bool RequestRealTimeData(RealTimeDataRequest request)
        {
            request.AssignedID = GetUniqueRequestID();
            lock (requestsLock)
            {
                requests.Add(request.AssignedID, request);
            }

            //if there is already an active stream of this instrument
            bool streamExists;

            lock (activeStreamsLock)
            {
                streamExists = ActiveStreams.Collection.Any(x => x.Instrument.ID == request.Instrument.ID);
            }
            if (streamExists)
            {
                IncrementSubscriberCount(request.Instrument);

                //log the request
                Log(LogLevel.Info,
                    $"RTD Request for existing stream: {request.Instrument.Symbol} from {request.Instrument.Datasource.Name} @ {Enum.GetName(typeof(BarSize), request.Frequency)}");

                return(true);
            }
            if (DataSources.ContainsKey(request.Instrument.Datasource.Name) &&
                //make sure the datasource is present & connected
                DataSources[request.Instrument.Datasource.Name].Connected)
            {
                ForwardRtdRequest(request);

                return(true);
            }
            if (!DataSources.ContainsKey(request.Instrument.Datasource.Name))
            {
                throw new Exception("No such datasource.");
            }
            if (!DataSources[request.Instrument.Datasource.Name].Connected)
            {
                throw new Exception("Datasource not connected.");
            }
            return(false);
        }
Ejemplo n.º 26
0
        public void RealTimeRequestsAreReSentAfterARealTimeDataPacingViolation()
        {
            var exchange = new Exchange {
                ID = 1, Name = "Ex", Timezone = "Pacific Standard Time"
            };
            var req = new RealTimeDataRequest
            {
                Instrument = new Instrument {
                    ID = 1, Symbol = "SPY", Exchange = exchange
                },
                Frequency = QDMS.BarSize.FiveSeconds,
                RTHOnly   = true
            };

            int requestID = 0;

            _ibClientMock
            .Setup(x => x.RequestRealTimeBars(
                       It.IsAny <int>(),
                       It.IsAny <Contract>(),
                       It.IsAny <int>(),
                       It.IsAny <RealTimeBarType>(),
                       It.IsAny <bool>(),
                       It.IsAny <List <TagValue> >()))
            .Callback <int, Contract, int, RealTimeBarType, bool, List <TagValue> >((y, a, b, c, d, e) => requestID = y);


            _ibDatasource.RequestRealTimeData(req);

            _ibClientMock.Raise(x => x.Error += null, new ErrorEventArgs(requestID, (ErrorMessage)420, ""));

            Thread.Sleep(25000);

            _ibClientMock.Verify(x => x.RequestRealTimeBars(
                                     It.IsAny <int>(),
                                     It.IsAny <Contract>(),
                                     It.IsAny <int>(),
                                     It.IsAny <RealTimeBarType>(),
                                     It.IsAny <bool>(),
                                     It.IsAny <List <TagValue> >()),
                                 Times.Exactly(2));
        }
Ejemplo n.º 27
0
        public void CancelRealTimeData(int requestID)
        {
            RealTimeDataRequest request = null;

            foreach (var key1Request in _connectedRequests)
            {
                if (key1Request.Value.TryGetValue(requestID, out request))
                {
                    break;
                }
            }

            if (request == null)
            {
                // kein Request gefunden ...
                return;
            }

            RealTimeDataRequest dummy;
            FeedTimer           timer;
            ConcurrentDictionary <int, RealTimeDataRequest> dummy2;

            if (_connectedRequests[request.Frequency].TryRemove(requestID, out dummy))
            {
                if (_connectedRequests[request.Frequency].Count == 0)
                {
                    if (_connectedRequests.TryRemove(request.Frequency, out dummy2))
                    {
                        if (_connectedRequests.Count == 0)
                        {
                            if (_timers.TryGetValue(request.Frequency, out timer))
                            {
                                if (timer.Active)
                                {
                                    timer.Stop();
                                }
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 28
0
        /// <summary>
        /// Sends a real time data request to the correct data source, logs it, and updates subscriber counts
        /// </summary>
        /// <param name="request"></param>
        private void ForwardRTDRequest(RealTimeDataRequest request)
        {
            //send the request to the correct data source
            int reqID;

            try
            {
                reqID = DataSources[request.Instrument.Datasource.Name].RequestRealTimeData(request);
            }
            catch (Exception ex)
            {
                Log(LogLevel.Error, "Error requesting real time data: " + ex.Message);
                return;
            }

            //log the request
            Log(LogLevel.Info,
                string.Format("RTD Request: {0} from {1} @ {2} ID:{3}",
                              request.Instrument.Symbol,
                              request.Instrument.Datasource.Name,
                              Enum.GetName(typeof(BarSize), request.Frequency),
                              reqID));

            //add the request to the active streams, though it's not necessarily active yet
            var streamInfo = new RealTimeStreamInfo(
                request.Instrument,
                reqID,
                request.Instrument.Datasource.Name,
                request.Frequency,
                request.RTHOnly);

            lock (_activeStreamsLock)
            {
                ActiveStreams.TryAdd(streamInfo);
            }

            lock (_subscriberCountLock)
            {
                StreamSubscribersCount.Add(streamInfo, 1);
            }
        }
Ejemplo n.º 29
0
        public void DoesNotRepeatRequestToSourceWhenARealTimeStreamAlreadyExists()
        {
            var inst = new Instrument
            {
                ID         = 1,
                Symbol     = "SPY",
                Datasource = new Datasource {
                    ID = 999, Name = "MockSource"
                }
            };

            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds);

            _broker.RequestRealTimeData(req);
            Thread.Sleep(100);
            _broker.RequestRealTimeData(req);

            _dataSourceMock.Verify(x => x.RequestRealTimeData(
                                       It.IsAny <RealTimeDataRequest>()),
                                   Times.Once);
        }
Ejemplo n.º 30
0
        public void DoesNotRepeatRequestToSourceWhenARealTimeContinuousFuturesStreamAlreadyExists()
        {
            var inst = new Instrument
            {
                ID                 = 1,
                Symbol             = "ContinuousVIXFutures",
                IsContinuousFuture = true,
                Type               = InstrumentType.Future,
                Datasource         = new Datasource {
                    ID = 999, Name = "MockSource"
                }
            };

            var frontContract = new Instrument
            {
                ID         = 2,
                Symbol     = "VXF3",
                Type       = InstrumentType.Future,
                Datasource = new Datasource {
                    ID = 999, Name = "MockSource"
                }
            };

            var req = new RealTimeDataRequest(inst, BarSize.FiveSeconds);

            _cfBrokerMock.Setup(x => x.RequestFrontContract(It.IsAny <Instrument>(), It.IsAny <DateTime?>())).Returns(1);
            _broker.RequestRealTimeData(req);

            _cfBrokerMock.Raise(x => x.FoundFrontContract += null, new FoundFrontContractEventArgs(1, frontContract, DateTime.Now));

            _broker.RequestRealTimeData(req);

            _dataSourceMock.Verify(x => x.RequestRealTimeData(
                                       It.IsAny <RealTimeDataRequest>()),
                                   Times.Once);
            _cfBrokerMock.Verify(x => x.RequestFrontContract(
                                     It.IsAny <Instrument>(),
                                     It.IsAny <DateTime?>()),
                                 Times.Once);
        }