static readonly string BATS = "BATS"; // Citirus Demo server
        private unsafe void RequestStartSymbol(SymbolInfo symbol, Agent symbolAgent)
        {
            StartSymbolHandler(symbol, symbolAgent);
            if (symbol.OptionChain != OptionChain.None)
            {
                //TODO: Implement options
                throw new NotSupportedException();
                //StartSymbolOptionHandler(symbol, symbolAgent);
            }

            LimeQuoteMessage message = (LimeQuoteMessage)Socket.MessageFactory.Create();

            LimeQuotesInterop.subscription_request_msg *subRequest = (LimeQuotesInterop.subscription_request_msg *)message.Ptr;

            subRequest->msg_type = LimeQuotesInterop.limeq_message_type.SUBSCRIPTION_REQUEST;
            ushort msgLength = (ushort)(sizeof(LimeQuotesInterop.subscription_request_msg) - 64 + symbol.Symbol.Length + 1);

            subRequest->msg_len = Reverse(msgLength);
            message.Length      = msgLength;

            //TODO: Fix to use user selected qsid
            for (int i = 0; i < 4; i++)
            {
                subRequest->qsid[i] = (byte)BATS[i];
            }
            subRequest->flags       = LimeQuotesInterop.subscription_flags.SUBSCRIPTION_FLAG_MARKET_DATA;
            subRequest->num_symbols = 1;
            for (int i = 0; i < symbol.Symbol.Length; i++)
            {
                subRequest->syb_symbols[i] = (byte)symbol.Symbol[i];
            }
            subRequest->syb_symbols[symbol.Symbol.Length] = 0;
            log.InfoFormat("Sending subscrption request for {0}", symbol.Symbol);
            while (!Socket.TrySendMessage(message))
            {
                if (IsInterrupted)
                {
                    return;
                }
                Factory.Parallel.Yield();
            }

            //TODO: Options not yet implemented

            EventItem item;

            if (symbol.DisableRealtimeSimulation)
            {
                item = new EventItem(symbol, EventType.StartBroker);
                symbolAgent.SendEvent(item);
            }

            item = new EventItem(symbol, EventType.StartRealTime);
            symbolAgent.SendEvent(item);
        }
Exemplo n.º 2
0
        private unsafe void SymbolRequest(LimeQuoteMessage message)
        {
            LimeQuotesInterop.subscription_request_msg *subRequest = (LimeQuotesInterop.subscription_request_msg *)message.Ptr;
            String symbol = "";

            for (int i = 0; subRequest->syb_symbols[i] != 0; i++)
            {
                symbol += (char)subRequest->syb_symbols[i];
            }

            var symbolInfo = Factory.Symbol.LookupSymbol(symbol);

            log.Info("Lime: Received symbol request for " + symbolInfo);

            ProviderSimulator.AddSymbol(symbolInfo.Symbol);

            var writePacket = (LimeQuoteMessage)QuoteSocket.MessageFactory.Create();

            LimeQuotesInterop.subscription_reply_msg *reply = (LimeQuotesInterop.subscription_reply_msg *)writePacket.Ptr;
            reply->msg_type = LimeQuotesInterop.limeq_message_type.SUBSCRIPTION_REPLY;
            var msg_len = (ushort)sizeof(LimeQuotesInterop.subscription_reply_msg);

            reply->msg_len     = Reverse(msg_len);
            writePacket.Length = msg_len;
            reply->outcome     = LimeQuotesInterop.subscription_outcome.SUBSCRIPTION_SUCCESSFUL;
            for (int i = 0; i < 4; i++)
            {
                reply->qsid[i] = subRequest->qsid[i];
            }

            QuotePacketQueue.Enqueue(writePacket, message.SendUtcTime);


            var bookRebuildMessage = (LimeQuoteMessage)QuoteSocket.MessageFactory.Create();

            LimeQuotesInterop.book_rebuild_msg *book = (LimeQuotesInterop.book_rebuild_msg *)bookRebuildMessage.Ptr;
            book->msg_type            = LimeQuotesInterop.limeq_message_type.BOOK_REBUILD;
            msg_len                   = (ushort)sizeof(LimeQuotesInterop.book_rebuild_msg);
            book->msg_len             = Reverse(msg_len);
            bookRebuildMessage.Length = msg_len;
            book->symbol_index        = (uint)symbolInfo.BinaryIdentifier;
            for (int i = 0; i < symbol.Length; i++)
            {
                book->symbol[i] = (byte)symbol[i];
            }
            QuotePacketQueue.Enqueue(bookRebuildMessage, message.SendUtcTime);
        }