private void DMUpdateInternationalLong(object sender, AxDBCCTRLLib._IDataManagerEvents_UpdateInternationalLongEvent e) { //Debug.WriteLine("UPDATE SYMBOL!"); // build a StockInfo object for the update event StockInfo stockInfo = new StockInfo(); // symbol stockInfo.Symbol = e.symbol; // TODO: Do we care about category? e.il.cat? // time if (e.il.MonthUpdate != null) { string t = e.il.MonthUpdate.ToString() + "/" + e.il.DayUpdate.ToString() + "/" + e.il.YearUpdate.ToString() + " " + Convert.ToSByte(e.il.HourUpdate).ToString() + ":" + e.il.MinuteUpdate.ToString() + ":" + e.il.SecondUpdate.ToString(); DateTime tDate = Convert.ToDateTime(t); stockInfo.LastTime = DataManager.UTCToLocalTime(tDate); } if (e.il.Last != null) { stockInfo.LastPrice = dataManager.BLToDouble(Convert.ToInt32(e.il.Last), Convert.ToInt16(e.il.Base)); } if (e.il.Bid != null) { stockInfo.BidPrice = dataManager.BLToDouble(Convert.ToInt32(e.il.Bid), Convert.ToInt16(e.il.Base)); } if (e.il.BidSize != null) { stockInfo.BidSize = Convert.ToUInt32(e.il.BidSize); } if (e.il.BidExg != null) { stockInfo.BidExchange = e.il.BidExg.ToString(); } if (e.il.Ask != null) { stockInfo.AskPrice = dataManager.BLToDouble(Convert.ToInt32(e.il.Ask), Convert.ToInt16(e.il.Base)); } if (e.il.AskSize != null) { stockInfo.AskSize = Convert.ToUInt32(e.il.AskSize); } if (e.il.AskExg != null) { stockInfo.AskExchange = e.il.AskExg.ToString(); } if (e.il.High != null) { stockInfo.HighPrice = dataManager.BLToDouble(Convert.ToInt32(e.il.High), Convert.ToInt16(e.il.Base)); } if (e.il.Low != null) { stockInfo.LowPrice = dataManager.BLToDouble(Convert.ToInt32(e.il.Low), Convert.ToInt16(e.il.Base)); } if (e.il.Open != null) { stockInfo.OpenPrice = dataManager.BLToDouble(Convert.ToInt32(e.il.Open), Convert.ToInt16(e.il.Base)); } if (e.il.Prev != null) { stockInfo.PreviousPrice = dataManager.BLToDouble(Convert.ToInt32(e.il.Prev), Convert.ToInt16(e.il.Base)); } if (e.il.TradeVol != null) { stockInfo.TradeVolume = Convert.ToUInt32(e.il.TradeVol.ToString()); } if (e.il.TradeExg != null) { stockInfo.TradeExchange = e.il.TradeExg.ToString(); } if (e.il.TotalVol != null) { stockInfo.TotalVolume = Convert.ToUInt32(e.il.TotalVol); } // call our wrapped event handler DMUpdateSymbolArgs args = new DMUpdateSymbolArgs(stockInfo); if (OnUpdateSymbolDM != null) { OnUpdateSymbolDM(this, args); } }
public DMUpdateSymbolArgs(StockInfo stockInfo) { this.stockInfo = stockInfo; }
public static void OnUpdateSymbolDM(object wrapper, DMUpdateSymbolArgs args) { // StockInfo object holding the new symbol data for this update StockInfo stockInfo = args.stockInfo; try { // Lock the tables. Debug.Assert(!ServerMarketData.IsLocked); ServerMarketData.EquityLock.AcquireReaderLock(Timeout.Infinite); ServerMarketData.PriceLock.AcquireWriterLock(Timeout.Infinite); ServerMarketData.SecurityLock.AcquireReaderLock(Timeout.Infinite); // make sure the symbol is in the hash table - and that we added it to the data manager if (!symbolToSecurityIdTable.ContainsKey(stockInfo.Symbol)) { throw new Exception("Received update for unknown symbol: " + stockInfo.Symbol); } // get the security id of the symbol int securityID = (int)symbolToSecurityIdTable[stockInfo.Symbol]; // get the security row ServerMarketData.SecurityRow securityRow = ServerMarketData.Security.FindBySecurityId(securityID); if (securityRow == null) { throw new Exception("Warning: Could not find security row for symbol: " + stockInfo.Symbol); } //int equityId = Security.FindRequiredKey(configurationId, "equityId", externalEquityId); // Only Equities are priced by this simulator. All others are ignored. ServerMarketData.EquityRow equityRow = ServerMarketData.Equity.FindByEquityId(securityRow.SecurityId); if (equityRow != null) { // Find a price that matches the equity's default settlement. This is the price record that will be updated // with the simulated market conditions. ServerMarketData.PriceRow priceRow = ServerMarketData.Price.FindBySecurityId(securityRow.SecurityId); if (priceRow == null) { priceRow = ServerMarketData.Price.NewPriceRow(); //priceRow.RowVersion = ServerMarketData.RowVersion.Increment(); priceRow.SecurityId = equityRow.EquityId; priceRow.CurrencyId = equityRow.SettlementId; priceRow.LastPrice = 0.0M; priceRow.AskPrice = 0.0M; priceRow.BidPrice = 0.0M; priceRow.Volume = 0.0M; priceRow.ClosePrice = 0.0M; priceRow.VolumeWeightedAveragePrice = 0.0M; priceRow.HighPrice = 0.0M; priceRow.LowPrice = 0.0M; ServerMarketData.Price.AddPriceRow(priceRow); } // set the new values from the real time event into the price row priceRow.BidSize = stockInfo.BidSize; priceRow.BidPrice = Convert.ToDecimal(stockInfo.BidPrice); priceRow.AskPrice = Convert.ToDecimal(stockInfo.AskPrice); priceRow.AskSize = Convert.ToDecimal(stockInfo.AskSize); priceRow.LastPrice = Convert.ToDecimal(stockInfo.LastPrice); priceRow.LastSize = stockInfo.TradeVolume; priceRow.Volume = Convert.ToDecimal(stockInfo.TotalVolume); priceRow.VolumeWeightedAveragePrice = (Convert.ToDecimal(stockInfo.LastPrice) + Convert.ToDecimal(stockInfo.OpenPrice)) / 2; priceRow.OpenPrice = Convert.ToDecimal(stockInfo.OpenPrice); priceRow.LowPrice = Convert.ToDecimal(stockInfo.LowPrice); priceRow.HighPrice = Convert.ToDecimal(stockInfo.HighPrice); priceRow.ClosePrice = Convert.ToDecimal(stockInfo.PreviousPrice); // increment the RowVersion so the client notices!!! priceRow.RowVersion = ServerMarketData.RowVersion.Increment(); // commit the changes priceRow.AcceptChanges(); } } catch (Exception exception) { String msg = String.Format("{0}, {1}", exception.Message, exception.StackTrace); // Write the error and stack trace out to the debug listener //Debug.WriteLine(msg); MarkThree.EventLog.Warning(msg); } finally { // Release the global tables. if (ServerMarketData.EquityLock.IsReaderLockHeld) { ServerMarketData.EquityLock.ReleaseReaderLock(); } if (ServerMarketData.PriceLock.IsWriterLockHeld) { ServerMarketData.PriceLock.ReleaseWriterLock(); } if (ServerMarketData.SecurityLock.IsReaderLockHeld) { ServerMarketData.SecurityLock.ReleaseReaderLock(); } Debug.Assert(!ServerMarketData.IsLocked); } }