Ejemplo n.º 1
0
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <param name="orderDriver">交易驱动。</param>
        /// <param name="quoteDriver">行情驱动。</param>
        /// <param name="autoTraderManager">自动下单机管理类。</param>
        public void Initialize(USeOrderDriver orderDriver, USeQuoteDriver quoteDriver)
        {
            m_orderDriver = orderDriver;
            m_quoteDriver = quoteDriver;

            m_updateTimer = new System.Threading.Timer(QueryAndUpdate, false, Timeout.Infinite, Timeout.Infinite);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 计算平仓损益。
        /// </summary>
        /// <param name="arbitrageOrder"></param>
        /// <returns></returns>
        private ProfitResult CalculatCloseProfit(USeArbitrageOrder arbitrageOrder)
        {
            USeOrderDriver orderDriver = USeManager.Instance.OrderDriver;
            USeQuoteDriver quoteDriver = USeManager.Instance.QuoteDriver;

            Debug.Assert(orderDriver != null);
            Debug.Assert(quoteDriver != null);

            ArbitrageTaskGroup  closeTaskGroup = arbitrageOrder.CloseTaskGroup;
            List <USeOrderBook> orderBookList  = arbitrageOrder.GetAllOrderBooks();


            USeMarketData       buyMarketData        = USeManager.Instance.QuoteDriver.Query(closeTaskGroup.BuyInstrument);
            USeMarketData       sellMarketData       = USeManager.Instance.QuoteDriver.Query(closeTaskGroup.SellInstrument);
            USeInstrumentDetail buyInstrumentDetail  = USeManager.Instance.OrderDriver.QueryInstrumentDetail(closeTaskGroup.BuyInstrument);
            USeInstrumentDetail sellInstrumentDetail = USeManager.Instance.OrderDriver.QueryInstrumentDetail(closeTaskGroup.SellInstrument);

            decimal buyProfit   = CalculateProfitByOrderBook(orderBookList, buyInstrumentDetail, buyMarketData);
            decimal sellProfit  = CalculateProfitByOrderBook(orderBookList, sellInstrumentDetail, sellMarketData);
            decimal totalProfit = buyProfit + sellProfit;

            ProfitResult result = new ProfitResult()
            {
                BuyProfit  = buyProfit,
                SellProfit = sellProfit
            };

            return(result);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 评估创建套利单需要保证金。
        /// </summary>
        /// <param name="openArg"></param>
        /// <returns></returns>
        public decimal EvaluateMargin(ArbitrageOpenArgument openArg)
        {
            USeOrderDriver orderDriver = USeManager.Instance.OrderDriver;
            USeQuoteDriver quoteDriver = USeManager.Instance.QuoteDriver;

            USeInstrumentDetail buyInstrumentDetail  = orderDriver.QueryInstrumentDetail(openArg.BuyInstrument);
            USeInstrumentDetail sellInstrumentDetail = orderDriver.QueryInstrumentDetail(openArg.SellInstrument);
            USeMarketData       buyMarketData        = quoteDriver.Query(openArg.BuyInstrument);
            USeMarketData       sellMarketData       = quoteDriver.Query(openArg.SellInstrument);
            USeMargin           buyMarginRate        = orderDriver.QueryInstrumentMargin(openArg.BuyInstrument);
            USeMargin           sellMarginRate       = orderDriver.QueryInstrumentMargin(openArg.SellInstrument);

            decimal buyMargin = (openArg.TotalOrderQty * buyMarginRate.BrokerLongMarginRatioByVolume) +
                                (buyMarketData.LastPrice * openArg.TotalOrderQty * buyInstrumentDetail.VolumeMultiple * buyMarginRate.BrokerLongMarginRatioByMoney);
            decimal sellMargin = (openArg.TotalOrderQty * sellMarginRate.BrokerShortMarginRatioByVolume) +
                                 (sellMarketData.LastPrice * openArg.TotalOrderQty * sellInstrumentDetail.VolumeMultiple * sellMarginRate.BrokerShortMarginRatioByMoney);

            if (openArg.BuyInstrument.Market == USeMarket.SHFE && openArg.SellInstrument.Market == USeMarket.SHFE)
            {
                return(Math.Max(buyMargin, sellMargin));
            }
            else
            {
                return(buyMargin + sellMargin);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 初始化。
        /// </summary>
        public override void Initialize()
        {
            this.btnChangeProduct.Text = "选择品种";
            USeOrderDriver orderDriver = USeManager.Instance.OrderDriver;
            USeQuoteDriver quoteDriver = USeManager.Instance.QuoteDriver;

            quoteDriver.OnDriverStateChanged += QuoteDriver_OnDriverStateChanged;
            orderDriver.OnDriverStateChanged += OrderDriver_OnDriverStateChanged;
            USeManager.Instance.AutoTraderManager.OnAutoTraderNotify += AutoTraderManager_OnAutoTraderNotify;

            SetQuoteDriverState(quoteDriver.DriverState);
            SetOrderDriverState(orderDriver.DriverState);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 预启动。
        /// </summary>
        /// <param name="orderDriver"></param>
        /// <param name="quoteDriver"></param>
        public void PreStart(USeOrderDriver orderDriver, USeQuoteDriver quoteDriver)
        {
            if (orderDriver.DriverState != USeOrderDriverState.Ready)
            {
                throw new Exception("交易服务未登录");
            }

            if (quoteDriver.DriverState != USeQuoteDriverState.Ready)
            {
                throw new Exception("行情服务未登录");
            }
            m_loginUser = new InvestorAccount(orderDriver.BrokerId, orderDriver.Account, orderDriver.Password);

            m_orderDriver = orderDriver;
            m_quoteDriver = quoteDriver;

            m_orderDriver.SetAppLogger(m_eventLogger);
        }
Ejemplo n.º 6
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);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 校验保证金。
        /// </summary>
        /// <param name="errorMessage"></param>
        /// <returns></returns>
        private bool VerifyMargin(ArbitrageOpenArgument openArg, out string errorMessage)
        {
            errorMessage = string.Empty;
            USeOrderDriver orderDriver = USeManager.Instance.OrderDriver;

            try
            {
                OrderMarginSetting marginSetting = USeManager.Instance.SystemConfigManager.GetOrderMarginSetting();
                USeFundDetail      fundDetail    = orderDriver.QueryFundDetailInfo();
                if (fundDetail == null)
                {
                    errorMessage = "查询资金信息失败";
                    return(false);
                }

                decimal evaluateMargin = EvaluateMargin(openArg);                                   // 评估当前开仓参数可能占用保证金

                decimal investorMaxUse = fundDetail.DynamicBenefit * marginSetting.MaxUseRate;      // 账户最大占用保证金
                decimal usedMargin     = USeManager.Instance.AutoTraderManager.CalculatUseMargin(); // 当前套利单占用保证金

                if (investorMaxUse < usedMargin + evaluateMargin)
                {
                    errorMessage = string.Format("套利单预计占用{0}保证金,当前账户占用保证金超出设定预警阀值", evaluateMargin.ToString("#,0"));
                    return(false);
                }

                if (fundDetail.Available < evaluateMargin)
                {
                    errorMessage = string.Format("套利单预计占用{0}保证金,当前账户可用余额不足", evaluateMargin.ToString("#,0"));
                    return(false);
                }

                return(true);
            }
            catch (Exception ex)
            {
                Debug.Assert(false, ex.Message);
                errorMessage = "校验保证金失败";
                return(false);
            }
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 查询持仓明细。
        /// </summary>
        /// <returns></returns>
        private List <PositionDetailCalcItem> QueryPositonDetails()
        {
            USeOrderDriver           orderDriver = USeManager.Instance.OrderDriver;
            USeQuoteDriver           quoteDriver = USeManager.Instance.QuoteDriver;
            List <USePositionDetail> positonList = orderDriver.QueryPositionDetail();

            List <PositionDetailCalcItem> list = new List <PositionDetailCalcItem>();

            if (positonList == null)
            {
                return(list);
            }
            foreach (USePositionDetail posItem in positonList)
            {
                USeInstrumentDetail detail        = orderDriver.QueryInstrumentDetail(posItem.Instrument);
                USeMargin           productMargin = orderDriver.QueryInstrumentMargin(posItem.Instrument);
                USeMarketData       marketData    = quoteDriver.Query(posItem.Instrument);

                PositionDetailCalcItem calcItem = new PositionDetailCalcItem()
                {
                    InstrumentDetail = detail,
                    Margin           = productMargin,
                    MarketData       = marketData,

                    ID           = posItem.ID,
                    Instrument   = posItem.Instrument.Clone(),
                    Direction    = posItem.Direction,
                    PositionType = posItem.PositionType,
                    OpenQty      = posItem.OpenQty,
                    OpenPrice    = posItem.OpenPrice,
                    OpenTime     = posItem.OpenTime,
                    CloseQty     = posItem.CloseQty,
                    CloseAmount  = posItem.CloseAmount,
                    ClosePrice   = posItem.ClosePrice
                };
                list.Add(calcItem);
            }

            return(list);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <param name="arbitrageOrderList">套利单信息。</param>
        /// <param name="orderDriver">交易驱动。</param>
        /// <param name="quoteDriver">行情驱动。</param>
        /// <param name="alarmManager">预警管理类。</param>
        /// <param name="systemConfigManager">系统配置管理类。</param>
        public void Initialize(List <USeArbitrageOrder> arbitrageOrderList, USeOrderDriver orderDriver, USeQuoteDriver quoteDriver, AlarmManager alarmManager, SystemConfigManager systemConfigManager)
        {
            m_orderDriver         = orderDriver;
            m_quoteDriver         = quoteDriver;
            m_alarmManager        = alarmManager;
            m_systemConfigManager = systemConfigManager;

            m_systemConfigManager.OnSystemSettingChanged += M_systemConfigManager_OnSystemSettingChanged1;

            if (arbitrageOrderList == null || arbitrageOrderList.Count <= 0)
            {
                return;
            }

            lock (m_syncObj)
            {
                int maxAliasNum = 0;  // 当日别名最大号码

                TaskOrderSetting taskOrderSetting = m_systemConfigManager.GetTaskOrderSetting();
                foreach (USeArbitrageOrder arbitrageOrder in arbitrageOrderList)
                {
                    AutoTrader autoTrader = new AutoTrader();
                    autoTrader.SetRecordLogger(USeManager.Instance.CommandLogger);
                    autoTrader.SetTryOrderCondition(taskOrderSetting.TaskMaxTryCount, taskOrderSetting.TryOrderMinInterval);
                    autoTrader.Initialize(arbitrageOrder, m_orderDriver, m_quoteDriver, m_alarmManager);
                    autoTrader.OnNotify                += AutoTrader_OnNotify;
                    autoTrader.OnAlarm                 += AutoTrader_OnAlarm;
                    autoTrader.OnStateChanged          += AutoTrader_OnStateChanged;
                    autoTrader.OnArbitrageOrderChanged += AutoTrader_OnArbitrageOrderChanged;
                    m_autoTraderDic.Add(autoTrader.TraderIdentify, autoTrader);

                    if (arbitrageOrder.CreateTime.Date == DateTime.Today && arbitrageOrder.AliasNum > maxAliasNum)
                    {
                        maxAliasNum = arbitrageOrder.AliasNum;
                    }
                }

                m_aliasIdCrateor.Set(maxAliasNum);
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 计算当前套利单占用的保证金。
        /// </summary>
        /// <returns></returns>
        public decimal CalculatUseMargin()
        {
            ArbitrageOpenArgument openArg = null;

            lock (m_syncObj)
            {
                if (m_arbitrageOrder.State == ArbitrageOrderState.Finish ||
                    m_arbitrageOrder.State == ArbitrageOrderState.Closed)
                {
                    //平仓完成套利单不占用保证金
                    return(0m);
                }
                openArg = m_arbitrageOrder.OpenArgument.Clone();
            }

            USeOrderDriver orderDriver = USeManager.Instance.OrderDriver;
            USeQuoteDriver quoteDriver = USeManager.Instance.QuoteDriver;

            USeInstrumentDetail buyInstrumentDetail  = orderDriver.QueryInstrumentDetail(openArg.BuyInstrument);
            USeInstrumentDetail sellInstrumentDetail = orderDriver.QueryInstrumentDetail(openArg.SellInstrument);
            USeMarketData       buyMarketData        = quoteDriver.Query(openArg.BuyInstrument);
            USeMarketData       sellMarketData       = quoteDriver.Query(openArg.SellInstrument);
            USeMargin           buyMarginRate        = orderDriver.QueryInstrumentMargin(openArg.BuyInstrument);
            USeMargin           sellMarginRate       = orderDriver.QueryInstrumentMargin(openArg.SellInstrument);

            decimal buyMargin = (openArg.TotalOrderQty * buyMarginRate.BrokerLongMarginRatioByVolume) +
                                (buyMarketData.LastPrice * openArg.TotalOrderQty * buyInstrumentDetail.VolumeMultiple * buyMarginRate.BrokerLongMarginRatioByMoney);
            decimal sellMargin = (openArg.TotalOrderQty * sellMarginRate.BrokerShortMarginRatioByVolume) +
                                 (sellMarketData.LastPrice * openArg.TotalOrderQty * sellInstrumentDetail.VolumeMultiple * sellMarginRate.BrokerShortMarginRatioByMoney);

            if (openArg.BuyInstrument.Market == USeMarket.SHFE && openArg.SellInstrument.Market == USeMarket.SHFE)
            {
                return(Math.Max(buyMargin, sellMargin));
            }
            else
            {
                return(buyMargin + sellMargin);
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 查询成交回报。
        /// </summary>
        /// <returns></returns>
        private List <TradeBookCalcItem> QueryTradeBooks()
        {
            USeOrderDriver      orderDriver   = USeManager.Instance.OrderDriver;
            List <USeTradeBook> tradeBookList = orderDriver.QueryTradeBooks();

            List <TradeBookCalcItem> list = new List <TradeBookCalcItem>();

            if (tradeBookList == null)
            {
                return(list);
            }
            foreach (USeTradeBook tradeItem in tradeBookList)
            {
                USeInstrumentDetail detail = orderDriver.QueryInstrumentDetail(tradeItem.Instrument);
                //USeMargin productMargin = orderDriver.QueryInstrumentMargin(tradeItem.Instrument);

                TradeBookCalcItem calcItem = new TradeBookCalcItem()
                {
                    InstrumentDetail = detail,

                    TradeNum   = tradeItem.TradeNum,
                    Instrument = tradeItem.Instrument,
                    OrderNum   = tradeItem.OrderNum,
                    OrderSide  = tradeItem.OrderSide,
                    OffsetType = tradeItem.OffsetType,
                    Price      = tradeItem.Price,
                    Qty        = tradeItem.Qty,
                    Amount     = tradeItem.Amount,
                    Fee        = tradeItem.Fee,
                    TradeTime  = tradeItem.TradeTime,
                    Account    = tradeItem.Account
                };
                list.Add(calcItem);
            }

            return(list);
        }
Ejemplo n.º 12
0
        private USeFundDetail CalculFoundBeforeTrade()
        {
            USeOrderDriver orderDriver = USeManager.Instance.OrderDriver;
            USeQuoteDriver quoteDriver = USeManager.Instance.QuoteDriver;

            try
            {
                List <USeTradeBook>      tradeBookList       = orderDriver.QueryTradeBooks();
                List <USePositionDetail> tradeAccountPosList = orderDriver.QueryPositionDetail();
                List <USeOrderBook>      orderBookList       = orderDriver.QueryOrderBooks();
                USeFund accountInfo = orderDriver.QueryFundInfo();
                if (tradeBookList == null || tradeAccountPosList == null || orderBookList == null || accountInfo == null)
                {
                    return(null);
                }

                #region 读取
                decimal preBalance     = accountInfo.PreBalance;     //上日客户权益(读取)即上日结算准备金
                decimal preCredit      = accountInfo.PreCredit;      // 上日信用额度
                decimal preMortgage    = accountInfo.PreMortgage;    // 上次质押金额
                decimal mortgage       = accountInfo.Mortgage;       // 质押金额
                decimal withDraw       = accountInfo.WithDraw;       // 今日出金
                decimal deposit        = accountInfo.Deposit;        // 今日入金
                decimal deliveryMargin = accountInfo.DeliveryMargin; //交割保证金
                #endregion 读取

                // 静态权益 =  上日结存 - 上次信用额度 - 上次质押金额
                //           + 质押金额(可能有延时)- 今日出金(可能有延时) + 今日入金(可能有延时)
                decimal staticBenefit = preBalance - preCredit - preMortgage + mortgage - withDraw + deposit;


                #region 成交回报推算
                decimal holdHistoryMargin = 0m;
                decimal holdMargin        = 0m;

                foreach (USePositionDetail posItem in tradeAccountPosList)
                {
                    USeInstrumentDetail detail   = orderDriver.QueryInstrumentDetail(posItem.Instrument);
                    int           volumeMultiple = detail.VolumeMultiple;
                    USeMargin     productMargin  = orderDriver.QueryInstrumentMargin(posItem.Instrument);
                    USeMarketData marketData     = quoteDriver.Query(posItem.Instrument);

                    if (posItem.RemainQty > 0) // 有持仓
                    {
                        if (posItem.PositionType == USePositionType.Yestorday && posItem.Direction == USeDirection.Long)
                        {
                            // 历史多头持仓保证金 = 上日结算价 × 合约乘数 × 持仓手数 × 交易所多头保证金率
                            decimal margin = (marketData.PreSettlementPrice * volumeMultiple * posItem.RemainQty * productMargin.BrokerLongMarginRatioByMoney) +
                                             (posItem.RemainQty * productMargin.BrokerLongMarginRatioByVolume);
                            holdHistoryMargin += margin;
                        }
                        else if (posItem.PositionType == USePositionType.Yestorday && posItem.Direction == USeDirection.Short)
                        {
                            decimal margin = (marketData.PreSettlementPrice * volumeMultiple * posItem.RemainQty * productMargin.BrokerShortMarginRatioByMoney) +
                                             (posItem.RemainQty * productMargin.BrokerLongMarginRatioByVolume);
                            holdHistoryMargin += margin;
                        }
                        else
                        {
                            Debug.Assert(false);
                        }
                    }
                }
                holdMargin = holdHistoryMargin;
                #endregion

                // 动态权益 = 静态权益
                decimal dynamicBenefit = staticBenefit;
                decimal frozon         = 0;
                decimal closeProfit    = 0m;
                decimal holdProfit     = 0m;
                decimal tradeFee       = 0m;

                decimal available = dynamicBenefit - holdMargin - frozon - deliveryMargin;

                //风险度 = (占用保证金 + 交割保证金) / 动态权益
                decimal risk       = decimal.Divide((holdMargin + deliveryMargin), dynamicBenefit);
                decimal preferCash = available;
                if (tradeBookList.Count != 0 || tradeAccountPosList.Count != 0)
                {
                    preferCash = (decimal)(preferCash * 7 / 10);
                }

                USeFundDetail fundDetail = new USeFundDetail();
                fundDetail.AccountID      = string.Empty;
                fundDetail.Available      = available;
                fundDetail.Deposit        = deposit;
                fundDetail.Mortgage       = mortgage;
                fundDetail.PreBalance     = preBalance;
                fundDetail.PreCredit      = preCredit;
                fundDetail.PreMortgage    = preMortgage;
                fundDetail.WithDraw       = withDraw;
                fundDetail.StaticBenefit  = staticBenefit;
                fundDetail.CloseProfit    = closeProfit;
                fundDetail.TradeFee       = tradeFee;
                fundDetail.HoldProfit     = holdProfit;
                fundDetail.HoldMargin     = holdMargin;
                fundDetail.DynamicBenefit = dynamicBenefit;
                fundDetail.FrozonMargin   = 0; fundDetail.AccountID = string.Empty;
                fundDetail.Available      = available;
                fundDetail.Deposit        = deposit;
                fundDetail.Mortgage       = mortgage;
                fundDetail.PreBalance     = preBalance;
                fundDetail.PreCredit      = preCredit;
                fundDetail.PreMortgage    = preMortgage;
                fundDetail.WithDraw       = withDraw;
                fundDetail.StaticBenefit  = staticBenefit;
                fundDetail.CloseProfit    = closeProfit;
                fundDetail.TradeFee       = tradeFee;
                fundDetail.HoldProfit     = holdProfit;
                fundDetail.HoldMargin     = holdMargin;
                fundDetail.DynamicBenefit = dynamicBenefit;
                fundDetail.FrozonMargin   = 0;
                fundDetail.FrozonFee      = 0;
                fundDetail.Fronzon        = frozon;
                fundDetail.Risk           = risk;
                fundDetail.PreferCash     = preferCash;
                return(fundDetail);
            }
            catch (Exception ex)
            {
                Debug.Assert(false, ex.Message);
                return(null);
            }
        }
Ejemplo n.º 13
0
        /// <summary>
        /// 计算帐户数据。
        /// </summary>
        private USeFundDetail CalculateFundInfo()
        {
            USeOrderDriver orderDriver = USeManager.Instance.OrderDriver;
            USeQuoteDriver quoteDriver = USeManager.Instance.QuoteDriver;

            try
            {
                List <TradeBookCalcItem>      tradeBookList       = QueryTradeBooks();;
                List <PositionDetailCalcItem> tradeAccountPosList = QueryPositonDetails();
                List <OrderBookCalcItem>      orderBookList       = QueryOrderBooks();
                USeFund accountInfo = orderDriver.QueryFundInfo();

                //if (tradeBookList == null || tradeAccountPosList == null || orderBookList == null || accountInfo == null) return null;

                #region 读取
                decimal preBalance     = accountInfo.PreBalance;     //上日客户权益(读取)即上日结算准备金
                decimal preCredit      = accountInfo.PreCredit;      // 上日信用额度
                decimal preMortgage    = accountInfo.PreMortgage;    // 上次质押金额
                decimal mortgage       = accountInfo.Mortgage;       // 质押金额
                decimal withDraw       = accountInfo.WithDraw;       // 今日出金
                decimal deposit        = accountInfo.Deposit;        // 今日入金
                decimal deliveryMargin = accountInfo.DeliveryMargin; //交割保证金
                #endregion 读取

                // 静态权益 =  上日结存 - 上次信用额度 - 上次质押金额
                //           + 质押金额(可能有延时)- 今日出金(可能有延时) + 今日入金(可能有延时)
                decimal staticBenefit = preBalance - preCredit - preMortgage + mortgage - withDraw + deposit;

                #region 成交回报推算
                // 手续费 = SUM(成交回报手续费)
                decimal tradeFee = tradeBookList.Sum(t => t.Fee);

                // 平历史仓盈亏 = SUM((平仓价 - 上日结算价) × 多头合约平仓量 × 合约乘数+ (上日结算价-平仓价)× 空头合约平仓量 × 合约乘数))
                // 平当日仓盈亏 = SUM((平仓价 - 开仓价)× 多头合约持仓量 × 合约乘数 + (开仓价-平仓价)× 空头合约平仓量 × 合约乘数)
                // 历史持仓盈亏 = SUM((最新价 - 上日结算价) × 多头合约持仓量× 合约乘数 + (上日结算价-最新价)× 空头合约持仓量 × 合约乘数)
                // 当日持仓盈亏 = SUM((最新价 - 开仓价) × 多头合约持仓量 × 合约乘数 + (开仓价-最新价) × 空头合约持仓量 × 合约乘数)
                // 历史持仓保证金 = SUM(上日结算价 × 合约乘数 × 持仓手数 × 保证金率)
                // 当日持仓保证金 = SUM(开仓价×合约乘数×持仓手数×保证金率)

                decimal closeProfit  = 0m;
                decimal holdProfit   = 0m;
                decimal holdMargin   = 0m;
                decimal frozonMargin = 0m;
                decimal frozonFee    = 0m;

                #region 计算持仓盈亏
                holdProfit  = tradeAccountPosList.Sum((p) => CalcHoldingProfit(p));
                closeProfit = tradeAccountPosList.Sum((p) => CalcCloseProfit(p));
                #endregion

                #region 计算持仓占用保证金
                List <MarginCalcResultByProductAndDirection> holdMarginList = (tradeAccountPosList.Where(p => p.RemainQty > 0)
                                                                               .GroupBy(p => new { p.InstrumentDetail.Varieties, p.Instrument.Market, p.Direction })
                                                                               .Select(g => new MarginCalcResultByProductAndDirection {
                    Product = g.Key.Varieties,
                    Market = g.Key.Market,
                    Direction = g.Key.Direction,
                    HoldMargin = g.Sum((i) => CalcHoldingPositonMargin(i)),
                })).ToList();

                List <MarginCalcResultByProductAndDirection> fronzonMarginList = (orderBookList.Where(o => (o.IsFinish == false && o.OffsetType == USeOffsetType.Open))
                                                                                  .GroupBy(o => new { o.InstrumentDetail.Varieties, o.Instrument.Market, o.Direction })
                                                                                  .Select(g => new MarginCalcResultByProductAndDirection {
                    Product = g.Key.Varieties,
                    Market = g.Key.Market,
                    Direction = g.Key.Direction,
                    HoldMargin = g.Sum((i) => CalcOrderFronzonMargin(i))
                })).ToList();

                List <MarginCalcResultByProduct> holdProductMargin = (holdMarginList.GroupBy(p => new { p.Product, p.Market })
                                                                      .Select(g => new MarginCalcResultByProduct {
                    Product = g.Key.Product,
                    Market = g.Key.Market,
                    HoldLongMargin = g.Where(i => i.Direction == USeDirection.Long).Sum(i => i.HoldMargin),
                    HoldShortMargin = g.Where(i => i.Direction == USeDirection.Short).Sum(i => i.HoldMargin)
                })).ToList();

                List <MarginCalcResultByProduct> fronzonProductMargin = (fronzonMarginList.GroupBy(p => new { p.Product, p.Market })
                                                                         .Select(g => new MarginCalcResultByProduct {
                    Product = g.Key.Product,
                    Market = g.Key.Market,
                    FrozonLongMargin = g.Where(i => i.Direction == USeDirection.Long).Sum(i => i.HoldMargin),
                    FrozonShortMargin = g.Where(i => i.Direction == USeDirection.Short).Sum(i => i.HoldMargin)
                })).ToList();

                List <MarginCalcResultByProduct> marginList = new List <MarginCalcResultByProduct>();
                marginList.AddRange(holdProductMargin);
                marginList.AddRange(fronzonProductMargin);

                holdMargin   = CalculateHoldMargin(marginList);
                frozonMargin = CalculateFronzonMargin(marginList);
                frozonFee    = orderBookList.Where(o => o.IsFinish == false).Sum((i) => CalcOrderFronzonFee(i));
                #endregion

                #endregion

                // 动态权益 = 静态权益 + 持仓盈亏 + 平仓盈亏 - 手续费(取成交回报手续费)
                decimal dynamicBenefit = staticBenefit + holdProfit + closeProfit - tradeFee;

                #region 委托回报推算
                // 买冻结保证金 = SUM(委托价格 * 合约乘数 * 委托手数 * 多头保证金率)
                // 卖冻结保证金 = SUM(委托价格 * 合约乘数 * 委托手数 * 空头保证金率)
                // 买冻结手续费	= SUM(委托价格 * 合约乘数 * 委托手数 * 期货多头手续费率)
                // 卖冻结手续费 = SUM(委托价格 * 合约乘数 * 委托手数 * 期货空头手续费率)
                decimal frozon = frozonMargin + frozonFee;
                #endregion

                decimal available = 0m;
                // 可用资金(当持仓盈亏>=0时) = 动态权益 - 持仓盈亏 – 占用保证金 – 下单冻结 - 交割保证金
                //[yangming]新版本好似可用资金要减去平仓盈亏

                // 可用资金(当持仓盈亏 <0时) = 动态权益 – 占用保证金 – 下单冻结 - 交割保证金
                available = dynamicBenefit - holdMargin - frozon - deliveryMargin;

                if (holdProfit > 0)
                {
                    available = available - holdProfit;
                }
                if (closeProfit > 0)
                {
                    available = available - closeProfit;
                }

                //风险度 = (占用保证金 + 交割保证金 + 买冻结保证金 + 卖冻结保证金) / 动态权益
                //decimal risk = decimal.Divide((holdMargin + deliveryMargin + frozonMargin),(dynamicBenefit));
                decimal risk       = decimal.Divide(holdMargin, (dynamicBenefit));
                decimal preferCash = available;
                if (tradeBookList.Count != 0 || tradeAccountPosList.Count != 0)
                {
                    preferCash = (decimal)(preferCash * 7 / 10);
                }

                USeFundDetail fundDetail = new USeFundDetail();
                fundDetail.AccountID      = string.Empty;
                fundDetail.Available      = available;
                fundDetail.Deposit        = deposit;
                fundDetail.Mortgage       = mortgage;
                fundDetail.PreBalance     = preBalance;
                fundDetail.PreCredit      = preCredit;
                fundDetail.PreMortgage    = preMortgage;
                fundDetail.WithDraw       = withDraw;
                fundDetail.StaticBenefit  = staticBenefit;
                fundDetail.CloseProfit    = closeProfit;
                fundDetail.TradeFee       = tradeFee;
                fundDetail.HoldProfit     = holdProfit;
                fundDetail.HoldMargin     = holdMargin;
                fundDetail.DynamicBenefit = dynamicBenefit;
                fundDetail.FrozonMargin   = frozonMargin;
                fundDetail.FrozonFee      = frozonFee;
                fundDetail.Fronzon        = frozon;
                fundDetail.Risk           = risk;
                fundDetail.PreferCash     = preferCash;
                return(fundDetail);
            }
            catch (Exception ex)
            {
                //Debug.Assert(false, ex.Message);
                return(null);
            }
        }
Ejemplo n.º 14
0
 public QuerySettlementInfoForm(USeOrderDriver orderDriver)
 {
     m_orderDriver = orderDriver;
     InitializeComponent();
 }
Ejemplo n.º 15
0
        /// <summary>
        /// 初始化套利下单机。
        /// </summary>
        /// <param name="arbitrageOrder">套利单信息。</param>
        /// <param name="orderDriver">下单驱动。</param>
        /// <param name="quoteDriver">行情驱动。</param>
        /// <param name="alarmManager">预警管理类。</param>
        public void Initialize(USeArbitrageOrder arbitrageOrder, USeOrderDriver orderDriver, USeQuoteDriver quoteDriver, AlarmManager alarmManager)
        {
            if (m_initialized)
            {
                throw new ApplicationException(string.Format("{0} already initialized.", this));
            }

            if (arbitrageOrder == null)
            {
                throw new ArgumentNullException("arbitrageOrder", "arbitrageOrder is null");
            }

            if (orderDriver == null)
            {
                throw new ArgumentNullException("orderDriver", "orderDriver is null");
            }

            if (quoteDriver == null)
            {
                throw new ArgumentNullException("quoteDrvier", "quoteDrvier is null");
            }

            if (alarmManager == null)
            {
                throw new ArgumentNullException("alarmManager", "alarmManager is null");
            }

            try
            {
                lock (m_syncObj)
                {
                    m_arbitrageOrder = arbitrageOrder.Clone();

                    m_orderDriver = orderDriver;
                    m_quoteDriver = quoteDriver;
                }

                m_orderDriver.OnOrderBookChanged  += OrderDriver_OnOrderBookChanged;
                m_quoteDriver.OnMarketDataChanged += QuoteDriver_OnMarketDataChanged;

                if (arbitrageOrder.OpenArgument != null)
                {
                    m_quoteDriver.Subscribe(arbitrageOrder.OpenArgument.BuyInstrument);
                    m_quoteDriver.Subscribe(arbitrageOrder.OpenArgument.SellInstrument);
                }

                string           text   = string.Format("初始化套利单完成,当前状态为[{0}]", arbitrageOrder.State.ToDescription());
                AutoTraderNotice notice = CreateTraderNotice(text);
                SafeFireAutoTraderNotice(notice);
                WriteTraderNoticeLog(notice);
            }
            catch (Exception ex)
            {
                string           text   = string.Format("初始化套利单失败,原因:{0}", ex.Message);
                AutoTraderNotice notice = CreateTraderNotice(text);
                SafeFireAutoTraderNotice(notice);
                WriteTraderNoticeLog(notice);

                throw new Exception("初始化自定下单机失败");
            }
            m_initialized = true;
        }
Ejemplo n.º 16
0
 public QualityAlalisyForm(USeOrderDriver orderDriver)
 {
     m_orderDriver = orderDriver;
     m_dateQuality = new Dictionary <string, decimal>();
     InitializeComponent();
 }
Ejemplo n.º 17
0
 public SettlementInfoConfirmForm(USeOrderDriver orderDriver)
 {
     m_orderDriver = orderDriver;
     InitializeComponent();
 }
Ejemplo n.º 18
0
        private void btnOK_Click(object sender, EventArgs e)
        {
            List <ErrorUSeOrderBook> result = new List <ErrorUSeOrderBook>();

            try
            {
                //如果存在未被处理的委托单,提示处理
                foreach (DataRow row in m_dataTable.Rows)
                {
                    string errorMessage = string.Empty;
                    if (IsMatchRule(row, out errorMessage) == false)
                    {
                        USeFuturesSpiritUtility.ShowErrrorMessageBox(this, "请处理异常委托单");
                        return;
                    }
                }

                USeOrderDriver orderDriver = USeManager.Instance.OrderDriver;
                Debug.Assert(orderDriver != null);

                //根据界面生成结果保存到Result
                foreach (DataRow row in m_dataTable.Rows)
                {
                    USeInstrument instrument = row["Instrument"] as USeInstrument;
                    Debug.Assert(instrument != null);

                    USeInstrumentDetail instrumentDetail = orderDriver.QueryInstrumentDetail(instrument);
                    //[yangming]合约过期后可能查不到了,此处可以考虑用品种信息获取合约乘数
                    Debug.Assert(instrumentDetail != null);
                    int orderQty  = Convert.ToInt32(row["OrderQty"]);
                    int tradeQty  = Convert.ToInt32(row["TradeQty"]);
                    int cancelQty = orderQty - tradeQty;
                    Debug.Assert(cancelQty >= 0);

                    decimal tradePrice  = Convert.ToDecimal(row["TradePrice"]);
                    decimal tradeFee    = Convert.ToDecimal(row["TradeFee"]);
                    decimal tradeAmount = tradePrice * tradeQty * instrumentDetail.VolumeMultiple;

                    USeOrderStatus selectedOrderStatus = (USeOrderStatus)row["SelectedOrderStatus"];
                    USeOrderStatus status = USeOrderStatus.Unknown;
                    if (selectedOrderStatus == USeOrderStatus.AllTraded)
                    {
                        status = USeOrderStatus.AllTraded;
                    }
                    else if (selectedOrderStatus == USeOrderStatus.AllCanceled)
                    {
                        if (cancelQty == orderQty)
                        {
                            status = USeOrderStatus.AllCanceled;
                        }
                        else
                        {
                            status = USeOrderStatus.PartCanceled;
                        }
                    }

                    USeOrderNum       orderNum      = row["OrderNum"] as USeOrderNum;
                    ErrorUSeOrderBook erroOrderBook = row["ErrorUSeOrderBook"] as ErrorUSeOrderBook;
                    erroOrderBook.OrderBook.OrderStatus = status;
                    erroOrderBook.OrderBook.CancelQty   = cancelQty;
                    erroOrderBook.OrderBook.TradeQty    = tradeQty;
                    erroOrderBook.OrderBook.TradePrice  = tradePrice;
                    erroOrderBook.OrderBook.TradeAmount = tradeAmount;
                    erroOrderBook.OrderBook.TradeFee    = tradeFee;

                    result.Add(erroOrderBook);
                }

                this.Result = result;
            }
            catch (Exception ex)
            {
                USeFuturesSpiritUtility.ShowWarningMessageBox(this, ex.Message);
                return;
            }

            this.DialogResult = DialogResult.Yes;
            this.Close();
        }