void m_nativeUtilities_OnMessage(object sender, EventArgs e) { Action a = delegate { try { BloombergMessageEventArgs args = e as BloombergMessageEventArgs; ISubscriptionId subscription = args.SubscriptionId; DataSet1.StockQuotesRow row = subscription.QuoteObject as DataSet1.StockQuotesRow; if (checkBoxLog.Checked) { m_log.Info(args.MessageToXml()); } bool bUpdated = false; switch (args.Message.MessageType.ToString()) { case "SubscriptionStarted": row.Subscribed = true; break; case "SubscriptionTerminated": case "SubscriptionFailure": row.Subscribed = false; break; case "MarketDataEvents": if (args.Message.HasElement("OPEN")) { row.Open = (double)args.Message.GetElementAsFloat64("OPEN"); bUpdated = true; } if (args.Message.HasElement("PREV_CLOSE_VALUE_REALTIME")) { row.PrevClose = (double)args.Message.GetElementAsFloat64("PREV_CLOSE_VALUE_REALTIME"); bUpdated = true; } if (args.Message.HasElement("LAST_PRICE")) { if (!row.Closed) { row.LastPrice = (double)args.Message.GetElementAsFloat64("LAST_PRICE"); bUpdated = true; } } if (args.Message.HasElement("BID")) { if (!row.Closed) { row.Bid = (double)args.Message.GetElementAsFloat64("BID"); bUpdated = true; } } if (args.Message.HasElement("ASK")) { if (!row.Closed) { row.Ask = (double)args.Message.GetElementAsFloat64("ASK"); bUpdated = true; } } if (args.Message.HasElement("MID")) { if (!row.Closed) { row.Mid = (double)args.Message.GetElementAsFloat64("MID"); bUpdated = true; } } if (args.Message.HasElement("DELTA_MID_RT")) { if (!row.Closed) { row.Delta = (double)args.Message.GetElementAsFloat64("DELTA_MID_RT"); bUpdated = true; } } if (args.Message.HasElement("GAMMA_MID_RT")) { if (!row.Closed) { row.Gamma = (double)args.Message.GetElementAsFloat64("GAMMA_MID_RT"); bUpdated = true; } } if (args.Message.HasElement("THETA_MID_RT")) { if (!row.Closed) { row.Theta = (double)args.Message.GetElementAsFloat64("THETA_MID_RT"); bUpdated = true; } } if (args.Message.HasElement("VEGA_MID_RT")) { if (!row.Closed) { row.Vega = (double)args.Message.GetElementAsFloat64("VEGA_MID_RT"); bUpdated = true; } } if (args.Message.HasElement("IVOL_MID_RT")) { if (!row.Closed) { row.ImpliedVol = (double)args.Message.GetElementAsFloat64("IVOL_MID_RT"); bUpdated = true; } } if (args.Message.HasElement("OFFICIAL_CLOSE_TODAY_RT")) { double closingPrice = (double)args.Message.GetElementAsFloat64("OFFICIAL_CLOSE_TODAY_RT"); row.ClosingPrice = closingPrice; bUpdated = true; } if (args.Message.HasElement("RT_SIMP_SEC_STATUS")) { switch (args.Message.GetElementAsString("RT_SIMP_SEC_STATUS")) { case "CLOS": case "POST": case "OUT": if (!row.Closed) { row.Closed = true; bUpdated = true; } break; default: if (row.Closed) { row.Closed = false; bUpdated = true; } break; } } break; } if (bUpdated) { row.Time = DateTime.Now - DateTime.Today; } } catch (Exception ex) { OnError("Error in message handler", ex); } }; if (InvokeRequired) { BeginInvoke(a); } else { a.Invoke(); } }
QuoteMessage BuildQuoteMessage(Message message, ISubscriptionId id) { QuoteMessage quote = new QuoteMessage() { Ticker = id.Symbol }; try { switch (message.MessageType.ToString()) { case "SubscriptionStarted": quote.SubscriptionStatus = SubscriptionStatus.Subscribed; Info("Subscription started for " + id.Symbol); break; case "SubscriptionTerminated": quote.SubscriptionStatus = SubscriptionStatus.Unsubscribed; Info("Subscription terminated for " + id.Symbol); break; case "SubscriptionFailure": quote.SubscriptionStatus = SubscriptionStatus.Rejected; Info("Subscription rejected for " + id.Symbol); break; case "MarketDataEvents": if (message.HasElement("OPEN", true)) { quote.Open = (double)message.GetElementAsFloat64("OPEN"); } if (message.HasElement("PREV_CLOSE_VALUE_REALTIME", true)) { quote.PrevClose = (double)message.GetElementAsFloat64("PREV_CLOSE_VALUE_REALTIME"); } if (message.HasElement("LAST_PRICE", true)) { quote.Last = (double)message.GetElementAsFloat64("LAST_PRICE"); } if (message.HasElement("BID", true)) { quote.Bid = (double)message.GetElementAsFloat64("BID"); } if (message.HasElement("ASK", true)) { quote.Ask = (double)message.GetElementAsFloat64("ASK"); } if (message.HasElement("DELTA_MID_RT", true)) { quote.Delta = (double)message.GetElementAsFloat64("DELTA_MID_RT"); } if (message.HasElement("GAMMA_MID_RT", true)) { quote.Gamma = (double)message.GetElementAsFloat64("GAMMA_MID_RT"); } if (message.HasElement("THETA_MID_RT", true)) { quote.Theta = (double)message.GetElementAsFloat64("THETA_MID_RT"); } if (message.HasElement("VEGA_MID_RT", true)) { quote.Vega = (double)message.GetElementAsFloat64("VEGA_MID_RT"); } if (message.HasElement("IVOL_MID_RT", true)) { quote.ImpliedVol = (double)message.GetElementAsFloat64("IVOL_MID_RT"); } if (message.HasElement("OFFICIAL_CLOSE_TODAY_RT", true)) { quote.Close = (double)message.GetElementAsFloat64("OFFICIAL_CLOSE_TODAY_RT"); } if (message.HasElement("RT_SIMP_SEC_STATUS", true)) { switch (message.GetElementAsString("RT_SIMP_SEC_STATUS")) { case "CLOS": case "POST": case "OUT": quote.OpenStatus = OpenStatus.Closed; break; default: quote.OpenStatus = OpenStatus.Open; break; } } break; default: return(null); } } catch (Exception ex) { Error("ERROR in Message handler: ", ex); return(null); } return(quote); }