public List <USeTradeBook> GetTradeBookList() { //查找orderlist里面状态为全部成交的Order返回 List <USeTradeBook> trade_book_list = new List <USeTradeBook>(); foreach (USeOrderBook order_book in m_order_list) { USeOrderStatus order_status = order_book.OrderStatus; if (order_status == USeOrderStatus.AllTraded) { USeTradeBook tradeBook = new USeTradeBook(); tradeBook.TradeNum = order_book.OrderNum.ToString(); tradeBook.Instrument = order_book.Instrument; tradeBook.OrderNum = order_book.OrderNum; tradeBook.OrderSide = order_book.OrderSide; tradeBook.OffsetType = order_book.OffsetType; tradeBook.Price = order_book.OrderPrice; tradeBook.Qty = order_book.OrderQty; tradeBook.Amount = 0; tradeBook.Fee = 0; tradeBook.TradeTime = DateTime.Now; tradeBook.Account = order_book.Account; trade_book_list.Add(tradeBook); } } return(trade_book_list); }
//查询队列有任务发布事件 public void execEventList() { while (m_runFlag) { Thread.Sleep(500); if (m_pushTradeBookList.Count > 0) { USeTradeBook tradeBook = m_pushTradeBookList.Dequeue(); if (tradeBook != null) { try { base.FireTradeBookChanged(tradeBook, true); } catch (Exception ex) { System.Diagnostics.Debug.Assert(false); } } } if (m_pushOrderBookList.Count > 0) { USeOrderBook order_book = m_pushOrderBookList.Dequeue(); if (order_book != null) { try { base.FireOrderBookChanged(order_book); } catch (Exception ex) { System.Diagnostics.Debug.Assert(false); } } } if (m_pushPositionList.Count > 0) { USePosition position_book = m_pushPositionList.Dequeue(); if (position_book != null) { try { base.FirePositionChanged(position_book); } catch (Exception ex) { System.Diagnostics.Debug.Assert(false); } } } } }
public void Update(USeTradeBook entity) { this.TradeNum = entity.TradeNum; this.Instrument = entity.Instrument; this.OrderNum = entity.OrderNum; this.OrderSide = entity.OrderSide; this.OffsetType = entity.OffsetType; this.Price = entity.Price; this.Qty = entity.Qty; this.Amount = entity.Amount; this.Fee = entity.Fee; this.TradeTime = entity.TradeTime; this.Account = entity.Account; }
public void AllTrade(USeOrderNum orderNum, int slipPoint) { USeOrderBook orderBook = (from p in m_dataBuffer.OrderBookList where p.OrderNum.Equals(orderNum) select p).FirstOrDefault(); if (orderBook == null) { return; } USeInstrumentDetail instrumentDetail = QueryInstrumentDetail(orderBook.Instrument); int tradeQty = (orderBook.OrderQty - orderBook.TradeQty); decimal tradePrice = 0; if (orderBook.OrderSide == USeOrderSide.Buy) { tradePrice = orderBook.OrderPrice - instrumentDetail.PriceTick * slipPoint; } else if (orderBook.OrderSide == USeOrderSide.Sell) { tradePrice = orderBook.OrderPrice + instrumentDetail.PriceTick * slipPoint; } int volumeMultiple = instrumentDetail.VolumeMultiple; int orderBookTradeQty = orderBook.TradeQty + tradeQty; orderBook.TradeQty = orderBookTradeQty; orderBook.TradeAmount = tradePrice * orderBookTradeQty * volumeMultiple; orderBook.TradePrice = tradePrice; orderBook.TradeFee = 5 * orderBookTradeQty; orderBook.CancelQty = 0; orderBook.Memo = orderBook.Memo; orderBook.OrderTime = DateTime.Now; orderBook.OrderStatus = USeOrderStatus.AllTraded; USeTradeBook tradeBook = CreateTradeBook(orderBook, tradeQty, tradePrice, tradeQty * tradePrice * volumeMultiple, 5 * tradeQty); USePosition positionBook = CreatePositionBook(tradeBook); m_pushTradeBookList.Enqueue(tradeBook); m_pushOrderBookList.Enqueue(orderBook.Clone()); //推送持仓信息 m_pushPositionList.Enqueue(positionBook.Clone()); }
private USeTradeBook CreateTradeBook(USeOrderBook orderBook, int tradeQty, decimal tradePrice, decimal amount, decimal fee) { USeTradeBook tradeBook = new USeTradeBook(); tradeBook.TradeNum = m_tradeNumCreateor.Next().ToString(); tradeBook.Instrument = orderBook.Instrument.Clone(); tradeBook.OrderNum = orderBook.OrderNum; tradeBook.OrderSide = orderBook.OrderSide; tradeBook.OffsetType = orderBook.OffsetType; tradeBook.Price = tradePrice; tradeBook.Qty = tradeQty; tradeBook.Amount = amount; tradeBook.Fee = fee; tradeBook.TradeTime = DateTime.Now; tradeBook.Account = this.Account; return(tradeBook); }
public static TradeBookViewModel Creat(USeTradeBook trade_book) { TradeBookViewModel data_model = new TradeBookViewModel(); data_model.TradeNum = trade_book.TradeNum; data_model.Instrument = trade_book.Instrument; data_model.OrderNum = trade_book.OrderNum; data_model.OrderSide = trade_book.OrderSide; data_model.OffsetType = trade_book.OffsetType; data_model.Price = trade_book.Price; data_model.Qty = trade_book.Qty; data_model.Amount = trade_book.Amount; data_model.Fee = trade_book.Fee; data_model.TradeTime = trade_book.TradeTime; data_model.m_account = trade_book.Account; return(data_model); }
private USePosition CreatePositionBook(USeTradeBook traderBook) { System.Diagnostics.Debug.Assert(traderBook != null); USeDirection direction; if (traderBook.OffsetType == USeOffsetType.Open) { direction = traderBook.OrderSide == USeOrderSide.Buy? USeDirection.Long:USeDirection.Short; } else { direction = traderBook.OrderSide == USeOrderSide.Buy? USeDirection.Short:USeDirection.Long; } USePosition position = null; //维护持仓列表-从持仓列表中要移除总持仓为0的Item for (int i = 0; i < m_dataBuffer.PositionDataList.Count; i++) { if (m_dataBuffer.PositionDataList[i].TotalPosition == 0) { m_dataBuffer.PositionDataList.RemoveAt(i); } } position = (from p in m_dataBuffer.PositionDataList where (p.Instrument == traderBook.Instrument && p.Direction == direction) select p).FirstOrDefault(); if (position == null) { Debug.Assert(traderBook.OffsetType == USeOffsetType.Open); position = new USePosition() { Instrument = traderBook.Instrument, Direction = direction, NewPosition = traderBook.Qty, Amount = traderBook.Amount, AvgPirce = traderBook.Price }; m_dataBuffer.PositionDataList.Add(position); } else { switch (traderBook.OffsetType) { case USeOffsetType.Open: position.NewPosition = position.NewPosition + traderBook.Qty; break; case USeOffsetType.CloseToday: position.NewPosition = position.NewPosition - traderBook.Qty; break; case USeOffsetType.CloseHistory: position.OldPosition = position.OldPosition - traderBook.Qty; break; case USeOffsetType.Close: int oldCloseQty = Math.Min(traderBook.Qty, position.OldPosition); position.OldPosition = position.OldPosition - oldCloseQty; int newCloseQty = traderBook.Qty - oldCloseQty; position.NewPosition = position.NewPosition - newCloseQty; break; default: Debug.Assert(false); break; } } return(position); }
/// <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); }
private void UpdateTradeBook(USeTradeBook tradeBook) { TradeBookViewModel trade_data_model = TradeBookViewModel.Creat(tradeBook); m_trade_data_source.Insert(0, trade_data_model); }