/// <summary> /// 计算冻结手续费。 /// </summary> /// <param name="orderBook"></param> /// <returns></returns> private decimal CalcOrderFronzonFee(OrderBookCalcItem orderBook) { if (orderBook.IsFinish) { return(0m); } ; if (orderBook.OffsetType != USeOffsetType.Open) { return(0m); } int volumeMultiple = orderBook.InstrumentDetail.VolumeMultiple; USeFee productFee = orderBook.FeeRate; decimal frozonFee = 0m; if (orderBook.OrderSide == USeOrderSide.Buy) { frozonFee += ((orderBook.OrderQty - orderBook.TradeQty) * productFee.OpenRatioByVolume) + (orderBook.OrderPrice * (orderBook.OrderQty - orderBook.TradeQty) * volumeMultiple * productFee.OpenRatioByMoney); } else if (orderBook.OrderSide == USeOrderSide.Sell) { frozonFee += ((orderBook.OrderQty - orderBook.TradeQty) * productFee.OpenRatioByVolume) + (orderBook.OrderPrice * (orderBook.OrderQty - orderBook.TradeQty) * volumeMultiple * productFee.OpenRatioByMoney); } else { Debug.Assert(false); } return(frozonFee); }
private decimal InternalCalculateFee(USeInstrument instrument, USeOffsetType offsetType, int qty, decimal price) { USeFee fee = InternalGetFee(instrument); if (fee == null) { return(0m); } int volumeMultiple = InternalGetVolumeMultiple(instrument); switch (offsetType) { case USeOffsetType.Open: return(fee.OpenRatioByMoney * qty * price * volumeMultiple + fee.OpenRatioByVolume * qty); case USeOffsetType.CloseHistory: case USeOffsetType.Close: return(fee.CloseRatioByMoney * qty * price * volumeMultiple + fee.CloseRatioByVolume * qty); case USeOffsetType.CloseToday: return(fee.CloseTodayRatioByMoney * qty * price * volumeMultiple + fee.CloseTodayRatioByVolume * qty); default: Debug.Assert(false); return(0m); } }
/// <summary> /// 克隆USeFee对象。 /// </summary> /// <returns></returns> public USeFee Clone() { USeFee fee = new USeFee(); fee.Instrument = this.Instrument == null? null: this.Instrument.Clone(); fee.OpenRatioByMoney = this.OpenRatioByMoney; fee.OpenRatioByVolume = this.OpenRatioByVolume; fee.CloseRatioByMoney = this.CloseRatioByMoney; fee.CloseRatioByVolume = this.CloseRatioByVolume; fee.CloseTodayRatioByMoney = this.CloseTodayRatioByMoney; fee.CloseTodayRatioByVolume = this.CloseTodayRatioByVolume; fee.StrikeRatioByMoney = this.StrikeRatioByMoney; fee.StrikeRatioByVolume = this.StrikeRatioByVolume; return(fee); }
/// <summary> /// 查询合约手续费。 /// </summary> /// <param name="instrument">合约。</param> /// <returns></returns> public override USeFee QueryInstrumentFee(USeInstrument instrument) { USeFee fee = new USeFee() { Instrument = instrument.Clone(), OpenRatioByMoney = 0.00005m, OpenRatioByVolume = 0m, CloseRatioByMoney = 0.00005m, CloseRatioByVolume = 0m, CloseTodayRatioByMoney = 0.00005m, CloseTodayRatioByVolume = 0m, StrikeRatioByMoney = 0.00005m, StrikeRatioByVolume = 0m }; return(fee); }
/// <summary> /// 查询委托回报。 /// </summary> /// <returns></returns> private List <OrderBookCalcItem> QueryOrderBooks() { USeOrderDriver orderDriver = USeManager.Instance.OrderDriver; List <USeOrderBook> orderBookList = orderDriver.QueryOrderBooks(); List <OrderBookCalcItem> list = new List <OrderBookCalcItem>(); if (orderBookList == null) { return(list); } foreach (USeOrderBook orderBookItem in orderBookList) { USeInstrumentDetail detail = orderDriver.QueryInstrumentDetail(orderBookItem.Instrument); USeMargin productMargin = orderDriver.QueryInstrumentMargin(orderBookItem.Instrument); USeFee productFee = orderDriver.QueryInstrumentFee(orderBookItem.Instrument); OrderBookCalcItem calcItem = new OrderBookCalcItem() { InstrumentDetail = detail, MarginRate = productMargin, FeeRate = productFee, OrderNum = orderBookItem.OrderNum, Account = orderBookItem.Account, Instrument = orderBookItem.Instrument, OrderQty = orderBookItem.OrderQty, OrderPrice = orderBookItem.OrderPrice, TradeQty = orderBookItem.TradeQty, TradeAmount = orderBookItem.TradeAmount, TradePrice = orderBookItem.TradePrice, TradeFee = orderBookItem.TradeFee, OrderStatus = orderBookItem.OrderStatus, CancelQty = orderBookItem.CancelQty, OrderSide = orderBookItem.OrderSide, OffsetType = orderBookItem.OffsetType, Memo = orderBookItem.Memo, OrderTime = orderBookItem.OrderTime }; list.Add(calcItem); } return(list); }
/// <summary> /// CTP InstrumentCommissionRateField To USeFee。 /// </summary> /// <param name="field"></param> /// <returns></returns> private USeFee CtpInstrumentCommissionRateFieldToUSeFeeInfo(InstrumentCommissionRateField filed) { USeFee fee = new USeFee(); try { fee.OpenRatioByMoney = filed.OpenRatioByMoney == double.MaxValue ? 0m : Convert.ToDecimal(filed.OpenRatioByMoney); fee.CloseRatioByMoney = filed.CloseRatioByMoney == double.MaxValue ? 0m : Convert.ToDecimal(filed.CloseRatioByMoney); fee.CloseTodayRatioByMoney = filed.CloseTodayRatioByMoney == double.MaxValue ? 0m : Convert.ToDecimal(filed.CloseTodayRatioByMoney); fee.OpenRatioByVolume = filed.OpenRatioByVolume == double.MaxValue ? 0m : Convert.ToDecimal(filed.OpenRatioByVolume); fee.CloseRatioByVolume = filed.CloseRatioByVolume == double.MaxValue ? 0m : Convert.ToDecimal(filed.CloseRatioByVolume); fee.CloseTodayRatioByVolume = filed.CloseTodayRatioByVolume == double.MaxValue ? 0m : Convert.ToDecimal(filed.CloseTodayRatioByVolume); } catch (Exception ex) { Debug.Assert(false, "CtpInstrumentCommissionRateFieldToUSeFeeInfo() convet failed," + ex.Message); } return(fee); }
/// <summary> /// 查询合约手续费。 /// </summary> /// <param name="instrument">合约。</param> /// <returns></returns> public override USeFee QueryInstrumentFee(USeInstrument instrument) { if (m_dataBuffer.ExistInstrument(instrument.InstrumentCode) == false) { throw new Exception(string.Format("Unsupport instrument[{0}]", instrument)); } USeFee fee = m_dataBuffer.GetFee(instrument); if (fee != null) { return(fee); } else { m_queryTimer.Change(Timeout.Infinite, Timeout.Infinite); // 先暂停自动查询 try { int index = 3; while (index > 0) { index--; try { InstrumentCommissionRateField field = QueryCommissionRateFieldFromCtp(instrument.InstrumentCode); m_dataBuffer.UpdateInstrumentFee(field, instrument.InstrumentCode); List <USeTradeBook> tradeBookList = m_dataBuffer.GetTradeBook(instrument); List <USeOrderBook> orderBookList = m_dataBuffer.GetCheckedOrderBook(instrument); if (tradeBookList != null && tradeBookList.Count > 0) { foreach (USeTradeBook tradeBook in tradeBookList) { FireTradeBookChanged(tradeBook, false); } } if (orderBookList != null && orderBookList.Count > 0) { foreach (USeOrderBook orderBook in orderBookList) { FireOrderBookChanged(orderBook); } } fee = m_dataBuffer.GetFee(instrument); Debug.Assert(fee != null, "QueryInstrumentFee(),fee is null"); return(fee); } catch (Exception ex) { m_logger.WriteError(string.Format("{0}.QueryInstrumentFee() failed,Error:{1}.", ToString(), ex.Message)); } Thread.Sleep(1000); } Debug.Assert(false, "QueryInstrumentFee(),fee is null"); // 如果还查不到则抛出异常 throw new Exception(string.Format("Query instrument[{0}] fee failed", instrument)); } catch (Exception ex) { throw ex; } finally { m_queryTimer.Change(1000, Timeout.Infinite); // 启动自动查询 } } }