/// <summary> /// 解析股票消息数据包 /// </summary> /// <param name="data"></param> /// <returns></returns> public static StockMessageNode ParseStockMessageNode(byte[] data) { var msg = new StockMessageNode(); try { var marketInfoSize = YunLib.DataHelper.StructSize <MarketMessageNode>(); msg.marketInfo = YunLib.DataHelper.BytesToStruct <MarketMessageNode>(data.Take(marketInfoSize).ToArray()); var NoMDEntriesSize = YunLib.DataHelper.StructSize <BigEndianUInt32>(); msg.NoMDEntries = YunLib.DataHelper.BytesToStruct <BigEndianUInt32>(data.Skip(marketInfoSize).Take(NoMDEntriesSize).ToArray()); UInt32 dataCount = msg.NoMDEntries; var startIndex = marketInfoSize + NoMDEntriesSize; var MDEntrySize = YunLib.DataHelper.StructSize <StockMDEntry>(); msg.MDEntry = new StockMDEntry[dataCount]; for (int i = 0; i < dataCount; ++i) { msg.MDEntry[i] = YunLib.DataHelper.BytesToStruct <StockMDEntry>(data.Skip(startIndex + i * MDEntrySize).Take(MDEntrySize).ToArray()); } } catch (Exception ex) { YunLib.LogWriter.Log(ex.ToString()); } return(msg); }
public void PubStockMessage(StockMessageNode data) { try { var xData = this.StockMessageMarketTick(data); var dataBuf = YunLib.DataHelper.StructToBytes <MarketTickNode>(xData); this.pubData("stock", dataBuf); } catch (Exception ex) { YunLib.LogWriter.Log(ex.ToString()); } }
/// <summary> /// 深交所股票消息转云财经统一数据格式 /// </summary> /// <param name="data"></param> /// <returns></returns> public MarketTickNode StockMessageMarketTick(StockMessageNode data) { MarketTickNode nodeData = new MarketTickNode(); nodeData.foxxcode = string.Format("{0}.SZ", MessageHelper.GetMessageString(data.marketInfo.SecurityID).Trim()); nodeData.code = string.Format("{0}", MessageHelper.GetMessageString(data.marketInfo.SecurityID).Trim()); nodeData.date = int.Parse(string.Format("{0}", data.marketInfo.OrigTime).Substring(0, 8)); nodeData.time = int.Parse(string.Format("{0}", data.marketInfo.OrigTime).Substring(8)); nodeData.status = MessageHelper.GetMessageString(data.marketInfo.TradingPhaseCode).Trim(); nodeData.name = string.Empty; nodeData.preclose = (int)((UInt64)data.marketInfo.PrevClosePx); nodeData.vol = (long)((Int64)data.marketInfo.TotalVolumeTrade / 100); nodeData.money = (long)((Int64)data.marketInfo.TotalValueTrade / 10000); nodeData.transnum = (long)((Int64)data.marketInfo.NumTrades); nodeData.buyorder = 0; nodeData.sellorder = 0; nodeData.buyorder_aveprice = 0; nodeData.sellorder_aveprice = 0; nodeData.buy1 = 0; nodeData.buy1_count = 0; nodeData.sell1 = 0; nodeData.sell1_count = 0; nodeData.buy2 = 0; nodeData.buy2_count = 0; nodeData.sell2 = 0; nodeData.sell2_count = 0; nodeData.buy3 = 0; nodeData.buy3_count = 0; nodeData.sell3 = 0; nodeData.sell3_count = 0; nodeData.buy4 = 0; nodeData.buy4_count = 0; nodeData.sell4 = 0; nodeData.sell4_count = 0; nodeData.buy5 = 0; nodeData.buy5_count = 0; nodeData.sell5 = 0; nodeData.sell5_count = 0; nodeData.buy6 = 0; nodeData.buy6_count = 0; nodeData.sell6 = 0; nodeData.sell6_count = 0; nodeData.buy7 = 0; nodeData.buy7_count = 0; nodeData.sell7 = 0; nodeData.sell7_count = 0; nodeData.buy8 = 0; nodeData.buy8_count = 0; nodeData.sell8 = 0; nodeData.sell8_count = 0; nodeData.buy9 = 0; nodeData.buy9_count = 0; nodeData.sell9 = 0; nodeData.sell9_count = 0; nodeData.buy10 = 0; nodeData.buy10_count = 0; nodeData.sell10 = 0; nodeData.sell10_count = 0; foreach (var item in data.MDEntry) { var mdType = MessageHelper.GetMessageString(item.MDEntryType).Trim(); //买五档 if (mdType == "0") { if (item.MDPriceLevel == 1) { nodeData.buy1 = (long)((UInt64)item.MDEntryPx / 100); nodeData.buy1_count = (long)((UInt64)item.MDEntrySize / 100); } if (item.MDPriceLevel == 2) { nodeData.buy2 = (long)((UInt64)item.MDEntryPx / 100); nodeData.buy2_count = (long)((UInt64)item.MDEntrySize / 100); } if (item.MDPriceLevel == 3) { nodeData.buy3 = (long)((UInt64)item.MDEntryPx / 100); nodeData.buy3_count = (long)((UInt64)item.MDEntrySize / 100); } if (item.MDPriceLevel == 4) { nodeData.buy4 = (long)((UInt64)item.MDEntryPx / 100); nodeData.buy4_count = (long)((UInt64)item.MDEntrySize / 100); } if (item.MDPriceLevel == 5) { nodeData.buy5 = (long)((UInt64)item.MDEntryPx / 100); nodeData.buy5_count = (long)((UInt64)item.MDEntrySize / 100); } } //卖五档 if (mdType == "1") { if (item.MDPriceLevel == 1) { nodeData.sell1 = (long)((UInt64)item.MDEntryPx / 100); nodeData.sell1_count = (long)((UInt64)item.MDEntrySize / 100); } if (item.MDPriceLevel == 2) { nodeData.sell2 = (long)((UInt64)item.MDEntryPx / 100); nodeData.sell2_count = (long)((UInt64)item.MDEntrySize / 100); } if (item.MDPriceLevel == 3) { nodeData.sell3 = (long)((UInt64)item.MDEntryPx / 100); nodeData.sell3_count = (long)((UInt64)item.MDEntrySize / 100); } if (item.MDPriceLevel == 4) { nodeData.sell4 = (long)((UInt64)item.MDEntryPx / 100); nodeData.sell4_count = (long)((UInt64)item.MDEntrySize / 100); } if (item.MDPriceLevel == 5) { nodeData.sell5 = (long)((UInt64)item.MDEntryPx / 100); nodeData.sell5_count = (long)((UInt64)item.MDEntrySize / 100); } } //最新价格 if (mdType == "2") { nodeData.close = (int)((UInt64)item.MDEntryPx / 100); continue; } //开盘价格 if (mdType == "4") { nodeData.dopen = (int)((UInt64)item.MDEntryPx / 100); continue; } //最高价格 if (mdType == "7") { nodeData.dhigh = (int)((UInt64)item.MDEntryPx / 100); continue; } //最低价格 if (mdType == "8") { nodeData.dlow = (int)((UInt64)item.MDEntryPx / 100); continue; } //平均委托买,不知道level1有不有 if (mdType == "x3") { nodeData.buyorder = (long)((UInt64)item.MDEntrySize / 100); nodeData.buyorder_aveprice = (int)((UInt64)item.MDEntryPx / 100); continue; } //平均委托卖,不知道level1有不有 if (mdType == "x4") { nodeData.sellorder = (long)((UInt64)item.MDEntrySize / 100); nodeData.sellorder_aveprice = (int)((UInt64)item.MDEntryPx / 100); continue; } } nodeData.status = this.getStatus(nodeData); return(nodeData); }