示例#1
0
        /// <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);
        }
示例#2
0
            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);
                }
            }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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); // 启动自动查询
                }
            }
        }