/// <summary>
        /// CTP InvestorPositionField To USePosition。
        /// </summary>
        /// <param name="field"></param>
        /// <returns></returns>
        private USePosition CtpInvestorPositonFieldToUSePosition(InvestorPositionField field)
        {
            USePosition position = new USePosition();

            position.Instrument = m_dataBuffer.GetInstrumnetByCode(field.InstrumentID.Trim());
            Debug.Assert(position.Instrument != null && position.InstrumentCode == field.InstrumentID.Trim(), "position.Instrument is null");

            int volumeMultiple = m_dataBuffer.GetVolumeMultiple(position.Instrument);

            switch (field.PosiDirection)
            {
            case PosiDirectionType.Long: position.Direction = USeDirection.Long; break;

            case PosiDirectionType.Short: position.Direction = USeDirection.Short; break;

            default:
                Debug.Assert(false, "Invalid PosiDirection");
                break;
            }
            position.NewPosition       = field.TodayPosition;
            position.YesterdayPosition = field.YdPosition;
            position.OldPosition       = field.Position - field.TodayPosition;
            position.AvgPirce          = 0m;
            position.Amount            = 0m;
            position.OpenQty           = field.OpenVolume;
            position.CloseQty          = field.CloseVolume;

            return(position);
        }
示例#2
0
 public void AddPositionList(USePosition position)
 {
     if (m_dataBuffer.PositionDataList != null)
     {
         m_dataBuffer.PositionDataList.Add(position);
     }
 }
示例#3
0
 /// <summary>
 /// 将修改的初始持仓数据推送到客户端
 /// </summary>
 public void ReloadInitPositionData(USePosition position)
 {
     try
     {
         base.FirePositionChanged(position);
     }
     catch (Exception ex)
     {
         System.Diagnostics.Debug.Assert(false);
     }
 }
示例#4
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);
                 }
             }
         }
     }
 }
示例#5
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());
        }
 public void Update(USePosition entity)
 {
     this.Instrument           = entity.Instrument;
     this.Direction            = entity.Direction;
     this.NewPosition          = entity.NewPosition;
     this.OldPosition          = entity.OldPosition;
     this.NewFrozonPosition    = entity.NewFrozonPosition;
     this.NewAvaliablePosition = entity.NewAvaliablePosition;
     this.OldFrozonPosition    = entity.OldFrozonPosition;
     this.OldAvaliablePosition = entity.OldAvaliablePosition;
     this.YesterdayPosition    = entity.YesterdayPosition;
     this.AvaliablePosition    = entity.AvaliablePosition;
     this.AvgPrice             = entity.AvgPirce;
     this.Amount   = entity.Amount;
     this.OpenQty  = entity.OpenQty;
     this.CloseQty = entity.CloseQty;
 }
示例#7
0
            public USePosition GetPositionCu1708Buy()
            {
                USePosition   position   = new USePosition();
                USeInstrument instrument = new USeInstrument("cu1708", "沪铜1708", USeMarket.SHFE);

                position.Instrument  = instrument;
                position.Direction   = USeDirection.Long;
                position.NewPosition = 8;
                position.OldPosition = 2;

                position.YesterdayPosition = 10;
                position.OpenQty           = 0;
                position.AvgPirce          = 46400.560m;
                position.Amount            = 62000.570m;
                position.CloseQty          = 0;
                position.NewFrozonPosition = 0;
                position.OldFrozonPosition = 0;

                return(position);
            }
示例#8
0
            public USePosition GetPositionCu1708Sell()
            {
                USePosition   position   = new USePosition();
                USeInstrument instrument = new USeInstrument("cu1708", "沪铜1708", USeMarket.SHFE);

                position.Instrument  = instrument;
                position.Direction   = USeDirection.Short;
                position.NewPosition = 9;
                position.OldPosition = 2;

                position.YesterdayPosition = 11;
                position.OpenQty           = 0;
                position.AvgPirce          = 56000.560m;
                position.Amount            = 75000.570m;
                position.CloseQty          = 0;
                position.NewFrozonPosition = 0;
                position.OldFrozonPosition = 0;

                return(position);
            }
        public USePosition ConvertModelPositon(TestPositionDataViewModel position_model)
        {
            USePosition positionData = new USePosition();

            if (position_model == null)
            {
                return(positionData);
            }
            positionData.Instrument        = position_model.Instrument;
            positionData.Direction         = position_model.Direction;
            positionData.NewPosition       = position_model.NewPosition;
            positionData.OldPosition       = position_model.OldPosition;
            positionData.NewFrozonPosition = position_model.NewFrozonPosition;
            positionData.OldFrozonPosition = position_model.OldFrozonPosition;
            positionData.YesterdayPosition = position_model.YesterdayPosition;
            positionData.AvgPirce          = position_model.AvgPrice;
            positionData.Amount            = position_model.Amount;
            positionData.OpenQty           = position_model.OpenQty;
            positionData.CloseQty          = position_model.CloseQty;
            return(positionData);
        }
        public static TestPositionDataViewModel Creat(USePosition entity)
        {
            TestPositionDataViewModel data_model = new TestPositionDataViewModel();

            data_model.Instrument           = entity.Instrument;
            data_model.Direction            = entity.Direction;
            data_model.NewPosition          = entity.NewPosition;
            data_model.OldPosition          = entity.OldPosition;
            data_model.NewFrozonPosition    = entity.NewFrozonPosition;
            data_model.NewAvaliablePosition = entity.NewAvaliablePosition;
            data_model.OldFrozonPosition    = entity.OldFrozonPosition;
            data_model.OldAvaliablePosition = entity.OldAvaliablePosition;
            data_model.YesterdayPosition    = entity.YesterdayPosition;
            data_model.AvaliablePosition    = entity.AvaliablePosition;
            data_model.AvgPrice             = entity.AvgPirce;
            data_model.Amount   = entity.Amount;
            data_model.OpenQty  = entity.OpenQty;
            data_model.CloseQty = entity.CloseQty;

            return(data_model);
        }
        /// <summary>
        /// 修改后的Position数据同步到前台客户端
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button_AsycToClient_Click(object sender, EventArgs e)
        {
            DataGridViewRowCollection rows_collection = this.gridPosition.Rows;

            if (rows_collection.Count == 0)
            {
                return;
            }

            m_orderDriver.ClearPositionList();

            foreach (DataGridViewRow row in rows_collection)
            {
                TestPositionDataViewModel positionModel = row.DataBoundItem as TestPositionDataViewModel;
                USePosition positionData = ConvertModelPositon(positionModel);
                //重新更新持仓列表
                m_orderDriver.AddPositionList(positionData);

                //同步到客户端
                m_orderDriver.ReloadInitPositionData(positionData);
            }
        }
示例#12
0
        private void UpdatePositionBook(USePosition position)
        {
            PositionDataViewModel Position_Model = m_position_data_source.FirstOrDefault(p => (p.InstrumentCode == position.InstrumentCode) && (p.Direction == position.Direction));

            if (Position_Model != null)
            {
                if (position.NewPosition + position.OldPosition == 0)
                {
                    m_position_data_source.Remove(Position_Model);
                }
                else
                {
                    Position_Model.Update(position);

                    if (position.NewPosition < position.NewFrozonPosition)
                    {
                        string tmpTestText = string.Format(@"[HanyuListUpdate],DateTime:{0} InstrumentCode:{1} Direction:{2} OpenQty:{3},NewAvaliablePosition:{4} ,NewFrozonPosition:{5},NewPosition{6}," +
                                                           "OldAvaliablePosition:{7},OldFrozonPosition:{8},OldPosition:{9}",
                                                           DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), position.InstrumentCode, position.Direction, position.OpenQty, position.NewAvaliablePosition,
                                                           position.NewFrozonPosition, position.NewPosition, position.OldAvaliablePosition, position.OldFrozonPosition, position.OldPosition);

                        USeManager.Instance.EventLogger.WriteAudit(tmpTestText);
                    }
                }
            }
            else
            {
                if (position.NewPosition + position.OldPosition == 0)
                {
                    m_position_data_source.Remove(Position_Model);
                }
                else
                {
                    PositionDataViewModel position_model = PositionDataViewModel.Creat(position);
                    m_position_data_source.Add(position_model);
                }
            }
        }
        /// <summary>
        /// 创建委托命令集合。
        /// </summary>
        /// <param name="taskId">任务ID。</param>
        /// <param name="instrument">合约。</param>
        /// <param name="orderSide">买卖方向。</param>
        /// <param name="offsetType">开平方向。</param>
        /// <param name="orderQty">委托量。</param>
        /// <param name="orderPrice">委托价格。</param>
        /// <param name="orderReason">委托原因。</param>
        /// <returns></returns>
        private List <OrderCommand> CreateOrderCommands(int taskId, USeInstrument instrument, USeOrderSide orderSide, USeOffsetType offsetType, int orderQty, decimal orderPrice, string orderReason)
        {
            List <OrderCommand> commandList = new List <OrderCommand>();

            //构造指令
            if (offsetType == USeOffsetType.Open)
            {
                OrderCommand command = new OrderCommand()
                {
                    TaskId      = taskId,
                    Instrument  = instrument,
                    OrderSide   = orderSide,
                    OffsetType  = USeOffsetType.Open,
                    OrderQty    = orderQty,
                    OrderPrice  = orderPrice,
                    OrderReason = orderReason
                };

                commandList.Add(command);
            }
            else
            {
                Debug.Assert(offsetType == USeOffsetType.Close);

                if (instrument.Market == USeMarket.SHFE)
                {
                    #region  交所平仓
                    USeDirection direction = orderSide == USeOrderSide.Buy ? USeDirection.Short : USeDirection.Long;
                    //上海交易所平仓需区分平今还是平昨
                    USePosition position = m_orderDriver.QueryPositions(instrument, direction);
                    //[yangming]
                    string tmpTestText = string.Format(@"[hanyuClose]Ins:{0} OrderSide:{1} OffsetFlag:{2} OrderQty:{3},NewAvaliablePosition:{4} ,NewFrozonPosition:{5},NewPosition{6}," +
                                                       "OldAvaliablePosition:{7},OldFrozonPosition:{8},OldPosition:{9}", instrument.InstrumentCode, orderSide, offsetType, orderQty, position.NewAvaliablePosition,
                                                       position.NewFrozonPosition, position.NewPosition, position.OldAvaliablePosition, position.OldFrozonPosition, position.OldPosition);

                    USeManager.Instance.EventLogger.WriteAudit(tmpTestText);
                    //
                    if (position == null || position.AvaliablePosition < orderQty)
                    {
                        //查询不到仓位,或者仓位不足,直接构造平今指令
                        OrderCommand command = new OrderCommand()
                        {
                            TaskId      = taskId,
                            Instrument  = instrument,
                            OrderSide   = orderSide,
                            OffsetType  = USeOffsetType.CloseToday,
                            OrderQty    = orderQty,
                            OrderPrice  = orderPrice,
                            OrderReason = orderReason
                        };

                        commandList.Add(command);
                    }
                    else
                    {
                        //平今
                        int remainQty = orderQty;
                        if (position.NewAvaliablePosition > 0)
                        {
                            int          closeQty = Math.Min(position.NewAvaliablePosition, remainQty);
                            OrderCommand command  = new OrderCommand()
                            {
                                TaskId      = taskId,
                                Instrument  = instrument,
                                OrderSide   = orderSide,
                                OffsetType  = USeOffsetType.CloseToday,
                                OrderQty    = closeQty,
                                OrderPrice  = orderPrice,
                                OrderReason = orderReason
                            };
                            remainQty -= closeQty;
                            commandList.Add(command);
                        }

                        //平昨
                        if (remainQty > 0)
                        {
                            Debug.Assert(remainQty <= position.OldAvaliablePosition);
                            int          closeQty = remainQty;
                            OrderCommand command  = new OrderCommand()
                            {
                                TaskId      = taskId,
                                Instrument  = instrument,
                                OrderSide   = orderSide,
                                OffsetType  = USeOffsetType.CloseHistory,
                                OrderQty    = closeQty,
                                OrderPrice  = orderPrice,
                                OrderReason = orderReason
                            };
                            remainQty -= closeQty;
                            commandList.Add(command);
                        }
                        Debug.Assert(remainQty == 0);
                    }
                    #endregion
                }
                else
                {
                    OrderCommand command = new OrderCommand()
                    {
                        TaskId      = taskId,
                        Instrument  = instrument,
                        OrderSide   = orderSide,
                        OffsetType  = USeOffsetType.Close,
                        OrderQty    = orderQty,
                        OrderPrice  = orderPrice,
                        OrderReason = orderReason
                    };
                }
            }

            return(commandList);
        }
示例#14
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);
        }