/// <summary> /// CTP InstrumentField To USeInstrumentDetail。 /// </summary> /// <param name="filed"></param> /// <returns></returns> private USeInstrumentDetail CtpInstrumentFieldToUSeInstrumentDetail(InstrumentField filed) { USeMarket market = CtpProtocol.FtdcExchangeToUSeMarket(filed.ExchangeID); Debug.Assert(market != USeMarket.Unknown, "CtpInstrumentFieldToUSeInstrumentDetail(),market is unknown."); USeInstrumentDetail detail = new USeInstrumentDetail(); detail.Instrument = new USeInstrument(filed.InstrumentID, filed.InstrumentName, market); try { detail.OpenDate = DateTime.ParseExact(filed.OpenDate, "yyyyMMdd", null); detail.ExpireDate = DateTime.ParseExact(filed.ExpireDate, "yyyyMMdd", null); if (string.IsNullOrEmpty(filed.StartDelivDate) == false) { detail.StartDelivDate = DateTime.ParseExact(filed.StartDelivDate, "yyyyMMdd", null); } else { //[yangming] 有的合约查询不到开始交割日,暂时用到期日下一天 detail.StartDelivDate = detail.ExpireDate.AddDays(1); } detail.EndDelivDate = DateTime.ParseExact(filed.EndDelivDate, "yyyyMMdd", null); detail.VolumeMultiple = filed.VolumeMultiple; detail.IsTrading = filed.IsTrading == IntBoolType.Yes; detail.Varieties = filed.ProductID; detail.PriceTick = filed.PriceTick.ToDecimal(); detail.ExchangeLongMarginRatio = filed.LongMarginRatio.ToDecimal(); detail.ExchangeShortMarginRatio = filed.ShortMarginRatio.ToDecimal(); detail.MaxMarketOrderVolume = filed.MaxMarketOrderVolume; detail.MinMarketOrderVolume = filed.MinMarketOrderVolume; detail.MaxLimitOrderVolume = filed.MaxLimitOrderVolume; detail.MinLimitOrderVolume = filed.MinLimitOrderVolume; } catch (Exception ex) { Debug.Assert(false, "CtpInstrumentFieldToUSeInstrumentDetail() convet failed," + ex.Message); } return(detail); }
/// <summary> /// CTP OrderField To USeOrderBook。 /// </summary> /// <param name="field"></param> /// <returns></returns> private USeOrderBook CtpOrderFieldToUSeOrderBook(OrderField field) { USeOrderBook orderbook = new USeOrderBook(); try { orderbook.OrderNum = new CtpOrderNum(field.FrontID, field.SessionID, field.OrderRef, field.ExchangeID, field.OrderSysID); orderbook.Account = field.InvestorID.ToString().Trim(); orderbook.Instrument = new USeInstrument(field.InstrumentID.Trim(), field.InstrumentID.Trim(), CtpProtocol.FtdcExchangeToUSeMarket(field.ExchangeID)); orderbook.OrderQty = field.VolumeTotalOriginal; orderbook.OrderPrice = Convert.ToDecimal(field.LimitPrice); orderbook.TradeQty = field.VolumeTraded; orderbook.TradeAmount = 0m; // 此处转换不处理,最终再计算 switch (field.OrderStatus) { case OrderStatusType.AllTraded: orderbook.OrderStatus = USeOrderStatus.AllTraded; break; case OrderStatusType.PartTradedNotQueueing: case OrderStatusType.PartTradedQueueing: orderbook.OrderStatus = USeOrderStatus.PartTraded; break; case OrderStatusType.Canceled: orderbook.OrderStatus = field.VolumeTraded > 0 ? USeOrderStatus.PartCanceled : USeOrderStatus.AllCanceled; break; case OrderStatusType.NoTradeQueueing: case OrderStatusType.NoTradeNotQueueing: orderbook.OrderStatus = USeOrderStatus.NoTraded; break; case OrderStatusType.Unknown: orderbook.OrderStatus = USeOrderStatus.Unknown; break; default: { Debug.Assert(false, string.Format("CtpOrderFieldToUSeOrderBook() unknown OrderStatus [{0}]", field.OrderStatus)); orderbook.OrderStatus = USeOrderStatus.Unknown; break; } } orderbook.CancelQty = field.OrderStatus == OrderStatusType.Canceled ? field.VolumeTotalOriginal - field.VolumeTraded : 0; orderbook.OrderSide = field.Direction == DirectionType.Buy ? USeOrderSide.Buy : USeOrderSide.Sell; switch (field.CombOffsetFlag1) { case OffsetFlagType.Close: case OffsetFlagType.ForceClose: orderbook.OffsetType = USeOffsetType.Close; break; case OffsetFlagType.CloseToday: orderbook.OffsetType = USeOffsetType.CloseToday; break; case OffsetFlagType.CloseYesterday: orderbook.OffsetType = USeOffsetType.CloseHistory; break; case OffsetFlagType.Open: orderbook.OffsetType = USeOffsetType.Open; break; default: Debug.Assert(false, "Invalid comb offset Flag1."); break; } orderbook.Memo = field.StatusMsg; DateTime orderTime = DateTime.Now; if (string.IsNullOrEmpty(field.InsertDate) && string.IsNullOrEmpty(field.InsertTime)) { Debug.Assert(false); orderTime = DateTime.Now; } else if (string.IsNullOrEmpty(field.InsertDate)) { if (DateTime.TryParseExact(DateTime.Today.ToString("yyyyMMdd") + field.InsertTime, "yyyyMMddHH:mm:ss", null, System.Globalization.DateTimeStyles.None, out orderTime) == false) { Debug.Assert(false); orderTime = DateTime.Now; } } else { if (DateTime.TryParseExact(field.InsertDate + field.InsertTime, "yyyyMMddHH:mm:ss", null, System.Globalization.DateTimeStyles.None, out orderTime) == false) { Debug.Assert(false); orderTime = DateTime.Now; } } orderbook.OrderTime = orderTime; } catch (Exception ex) { Debug.Assert(false, "CtpOrderFieldToUSeOrderBook() convet failed," + ex.Message); } return(orderbook); }
/// <summary> /// CTP TradeField To USeTradeBook。 /// </summary> /// <param name="field"></param> /// <returns></returns> private USeTradeBook CtpTradeFieldToUSeTradeBook(TradeField field) { USeTradeBook tradeBook = new USeTradeBook(); try { tradeBook.Instrument = new USeInstrument(field.InstrumentID.Trim(), field.InstrumentID.Trim(), CtpProtocol.FtdcExchangeToUSeMarket(field.ExchangeID)); tradeBook.TradeNum = field.TradeID.Trim(); USeOrderNum orderNum = new CtpOrderNum(field.ExchangeID, field.OrderSysID); USeOrderBook orderBook = m_dataBuffer.GetOrderBook(orderNum); if (orderBook != null) { orderNum = orderBook.OrderNum.Clone(); // 去搜索对应委托单,若存在则将委托单号设置为完整委托单号 } tradeBook.OrderNum = orderNum; tradeBook.OrderSide = field.Direction == DirectionType.Buy ? USeOrderSide.Buy : USeOrderSide.Sell; switch (field.OffsetFlag) { case OffsetFlagType.Close: case OffsetFlagType.ForceClose: tradeBook.OffsetType = USeOffsetType.Close; break; case OffsetFlagType.CloseToday: tradeBook.OffsetType = USeOffsetType.CloseToday; break; case OffsetFlagType.CloseYesterday: tradeBook.OffsetType = USeOffsetType.CloseHistory; break; case OffsetFlagType.Open: tradeBook.OffsetType = USeOffsetType.Open; break; default: Debug.Assert(false, string.Format("CtpTradeFieldToUSeTradeBook(),Invalid offsetfalg.", field.OffsetFlag)); break; } tradeBook.Price = Convert.ToDecimal(field.Price); tradeBook.Qty = field.Volume; tradeBook.Account = field.InvestorID; DateTime tradeTime = DateTime.Now; if (string.IsNullOrEmpty(field.TradeDate) && string.IsNullOrEmpty(field.TradeTime)) { Debug.Assert(false); tradeTime = DateTime.Now; } else if (string.IsNullOrEmpty(field.TradeDate)) { if (DateTime.TryParseExact(DateTime.Today.ToString("yyyyMMdd") + field.TradeTime, "yyyyMMddHH:mm:ss", null, System.Globalization.DateTimeStyles.None, out tradeTime) == false) { Debug.Assert(false); tradeTime = DateTime.Now; } } else { if (DateTime.TryParseExact(field.TradeDate + field.TradeTime, "yyyyMMddHH:mm:ss", null, System.Globalization.DateTimeStyles.None, out tradeTime) == false) { Debug.Assert(false); tradeTime = DateTime.Now; } } tradeBook.TradeTime = tradeTime; int volumeMultiple = m_dataBuffer.GetVolumeMultiple(tradeBook.Instrument); tradeBook.Amount = tradeBook.Price * tradeBook.Qty * volumeMultiple; // 手续费尝试计算 tradeBook.Fee = m_dataBuffer.CalculateFee(tradeBook.Instrument, tradeBook.OffsetType, tradeBook.Qty, tradeBook.Price); } catch (Exception ex) { Debug.Assert(false, "CtpTradeFieldToUSeTradeBook() convet failed," + ex.Message); } return(tradeBook); }