}//StoreOrder() // // // #endregion // order update handlers #region Private Methods // ***************************************************************** // **** Private Methods **** // ***************************************************************** // // // // // ***************************************************** // **** Try Create New Book() **** // ***************************************************** private bool TryCreateNewBook(TT.InstrumentKey ttKey, out OrderBookTT book) { book = null; InstrumentName name; TT.InstrumentDetails details; if (m_Market.TryLookupInstrument(ttKey, out name) && m_Market.TryLookupInstrumentDetails(name, out details)) { // Market knows this instrument already. Log.BeginEntry(LogLevel.Minor, "TryCreateNewBook: Creating book."); book = new OrderBookTT(this, name); // Create book. double minTickSize = Convert.ToDouble(details.TickSize.Numerator) / Convert.ToDouble(details.TickSize.Denominator); book.MinimumPriceTick = minTickSize; if (m_Books.TryAdd(book.m_InstrumentName, book)) { m_TTKey2Name.TryAdd(ttKey, book.m_InstrumentName); Log.AppendEntry(" New book created {0}.", book); Log.EndEntry(); return(true); } else { Log.AppendEntry(" Failed to add book to Books."); Log.EndEntry(); return(false); } } else { // Market doesnt know this instrument yet. Log.NewEntry(LogLevel.Minor, "TryCreateNewBook: Market instrument unknown. Requesting details from market for {0}.", TTConvert.ToString(ttKey)); m_Market.RequestInstruments(ttKey); // request to look it up. return(false); } }//TryCreateNewBook()
// // // **** Store Order() **** // private void StoreTTEvent(EventArgs ttEVentArgs, TT.InstrumentKey ttKey) { ConcurrentQueue <EventArgs> eventQueue; if (m_TTEventsToProcess.TryGetValue(ttKey, out eventQueue)) { eventQueue.Enqueue(ttEVentArgs); } else if (m_TTEventsToProcess.TryAdd(ttKey, new ConcurrentQueue <EventArgs>()) && m_TTEventsToProcess.TryGetValue(ttKey, out eventQueue)) { eventQueue.Enqueue(ttEVentArgs); OrderHubRequest request = new OrderHubRequest(OrderHubRequest.RequestType.RequestCreateFillBook); request.Data = new object[] { ttKey }; this.HubEventEnqueue(request); } else { // TODO: Check whether perhaps we can fail while the orderbook is being created. Log.NewEntry(LogLevel.Warning, "Listener_OrderAdded: Failed to store order in OrdersToProcess list."); } }//StoreOrder()
} //HubEventHandler() // // // // ***************************************************** // **** Process Request() **** // ***************************************************** private void ProcessRequest(OrderHubRequest eventArg) { Log.NewEntry(LogLevel.Minor, "ProcessRequest: {0}", eventArg); switch (eventArg.Request) { case OrderHubRequest.RequestType.RequestConnect: // We automatically connect to the TT Api once we get the call back from it. break; case OrderHubRequest.RequestType.RequestCreateFillBook: if (eventArg.Data[0] is TT.InstrumentKey) { TT.InstrumentKey ttKey = (TT.InstrumentKey)eventArg.Data[0]; InstrumentName name; if (m_TTKey2Name.TryGetValue(ttKey, out name) && m_Books.ContainsKey(name)) { Log.NewEntry(LogLevel.Minor, "ProcessRequest: Already have book for {1}. Ignoring {0}.", eventArg, name); } else { OrderBookTT book; if (TryCreateNewBook(ttKey, out book)) { Log.NewEntry(LogLevel.Minor, "ProcessRequest: Create book succeeded {0}.", book); OrderBookEventArgs outgoingEventArg = new OrderBookEventArgs(this, book.m_InstrumentName, OrderBookEventArgs.EventTypes.CreatedBook); OnBookCreated(outgoingEventArg); // TODO: Load additional information needed for new book creation. // Push out waiting events. ConcurrentQueue <EventArgs> waitingTTOrders; while (m_TTEventsToProcess.TryRemove(ttKey, out waitingTTOrders)) // this should only execute once, but if new orders are added concurrently could execute more! { EventArgs eventArg1; while (waitingTTOrders.Count > 0) { if (waitingTTOrders.TryDequeue(out eventArg1)) { this.HubEventEnqueue(eventArg1); } else { break; } } } } else { Log.NewEntry(LogLevel.Minor, "ProcessRequest: Create book failed. Will try again."); m_WaitingRequests.Enqueue(eventArg); // Store this request } } } break; case OrderHubRequest.RequestType.RequestShutdown: if (m_OrderListener != null) { m_OrderListener.Dispose(); m_OrderListener = null; } base.Stop(); break; default: break; } // switch request } //ProcessRequest()