예제 #1
0
            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);
            }
예제 #2
0
 //查询队列有任务发布事件
 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);
                 }
             }
         }
     }
 }
예제 #3
0
 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;
 }
예제 #4
0
        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());
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
        }
예제 #8
0
        /// <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);
        }
예제 #9
0
        private void UpdateTradeBook(USeTradeBook tradeBook)
        {
            TradeBookViewModel trade_data_model = TradeBookViewModel.Creat(tradeBook);

            m_trade_data_source.Insert(0, trade_data_model);
        }