/// <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); }
public void AddPositionList(USePosition position) { if (m_dataBuffer.PositionDataList != null) { m_dataBuffer.PositionDataList.Add(position); } }
/// <summary> /// 将修改的初始持仓数据推送到客户端 /// </summary> public void ReloadInitPositionData(USePosition position) { try { base.FirePositionChanged(position); } catch (Exception ex) { System.Diagnostics.Debug.Assert(false); } }
//查询队列有任务发布事件 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 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; }
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); }
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); } }
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); }
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); }