/// <summary>
        /// 计算指数。
        /// </summary>
        /// <returns></returns>
        private void CalcIndexKLine()
        {
            int     totalVolume            = 0;  // 总成交量
            decimal totalTurnOver          = 0m; // 总成交金额
            decimal totalOpenInterest      = 0m; //总持仓量
            decimal totalSendimentaryMoney = 0m; //总资金沉淀
            decimal totalFlowFund          = 0m; //总资金流向
            decimal totalSpeculateRadio    = 0m; //投机度

            foreach (USeMarketData marketData in m_componentDic.Values)
            {
                if (marketData == null)
                {
                    continue;
                }

                Debug.Assert(marketData != null);
                totalVolume       += marketData.Volume;
                totalTurnOver     += marketData.Turnover;
                totalOpenInterest += marketData.OpenInterest;

                int     perSharesContract       = GetInstrumentPerSharesContract(marketData.Instrument.InstrumentCode);                 //合约规模
                decimal exchangeLongMarginRatio = GetExchangeLongMarginRatio(marketData.Instrument.InstrumentCode);                     //保证金
                totalSendimentaryMoney += marketData.OpenInterest * marketData.LastPrice * perSharesContract * exchangeLongMarginRatio; //资金沉淀

                //if (GetName(marketData.Instrument.InstrumentCode) == "ZC")
                //{
                //    string str = string.Format("InsName:{0} ,OpenInterest:{1} ,LastPrice:{2} ,perSharesContract:{3},exchangeLongMarginRatio:{4},totalSendimentaryMoney:{5}",
                //       marketData.Instrument.InstrumentCode, marketData.OpenInterest, marketData.LastPrice, perSharesContract, exchangeLongMarginRatio, totalSendimentaryMoney);
                //m_eventLogger.WriteError(str);
                //}

                if (marketData.OpenInterest != 0m)
                {
                    totalSpeculateRadio = marketData.Volume / marketData.OpenInterest;//投机度= 成交量/总持仓
                }
                else
                {
                    totalSpeculateRadio = 0m;//投机度= 成交量/总持仓
                }
            }

            decimal indexValue = 0m;

            if (totalOpenInterest > 0)
            {
                foreach (USeMarketData marketData in m_componentDic.Values)
                {
                    if (marketData == null)
                    {
                        continue;
                    }

                    indexValue += (marketData.LastPrice * marketData.OpenInterest / totalOpenInterest);
                }
                indexValue = USeMath.Round(indexValue, m_product.PriceTick);
            }

            if (indexValue <= 0)
            {
                return;
            }


            if (m_kLine.Open <= 0m)
            {
                m_kLine.Open = indexValue;
            }
            if (m_kLine.High < indexValue)
            {
                m_kLine.High = indexValue;
            }
            if (m_kLine.Low <= 0m)
            {
                m_kLine.Low = indexValue;
            }
            else if (m_kLine.Low < indexValue)
            {
                m_kLine.Low = indexValue;
            }
            m_kLine.Close             = indexValue;
            m_kLine.Volumn            = totalVolume;
            m_kLine.Turnover          = totalTurnOver;
            m_kLine.OpenInterest      = totalOpenInterest;
            m_kLine.SendimentaryMoney = totalSendimentaryMoney;
            m_kLine.SpeculateRadio    = totalSpeculateRadio;//指数投机度
            //[yangming]有问题,待确定合适算法吧
            if (m_kLine.PreSettlementPrice <= 0)
            {
                bool isReady = true;
                foreach (USeMarketData marketData in m_componentDic.Values)
                {
                    if (marketData == null || marketData.PreSettlementPrice <= 0)
                    {
                        isReady = false;
                        break;
                    }
                }
                if (isReady)
                {
                    decimal totalPreOpenInterest = 0m;
                    foreach (USeMarketData marketData in m_componentDic.Values)
                    {
                        Debug.Assert(marketData != null);
                        if (marketData == null)
                        {
                            continue;
                        }
                        totalPreOpenInterest += marketData.PreOpenInterest;
                    }

                    if (totalPreOpenInterest > 0)
                    {
                        //计算昨日结算价
                        decimal preSettelentPrice = 0m;
                        foreach (USeMarketData marketData in m_componentDic.Values)
                        {
                            if (marketData == null)
                            {
                                continue;
                            }
                            preSettelentPrice += marketData.PreSettlementPrice * marketData.PreOpenInterest / totalPreOpenInterest;
                        }
                        preSettelentPrice          = USeMath.Round(preSettelentPrice, m_product.PriceTick);
                        m_kLine.PreSettlementPrice = preSettelentPrice;
                    }
                }
            }

            if (m_kLine.SettlementPrice <= 0)
            {
                bool isReady = true;
                foreach (USeMarketData marketData in m_componentDic.Values)
                {
                    if (marketData == null || marketData.SettlementPrice <= 0)
                    {
                        isReady = false;
                        break;
                    }
                }

                if (isReady)
                {
                    decimal indexSettlemetPrice = 0m;
                    foreach (USeMarketData marketData in m_componentDic.Values)
                    {
                        Debug.Assert(marketData != null);
                        if (marketData == null)
                        {
                            continue;
                        }
                        indexSettlemetPrice = marketData.SettlementPrice * marketData.OpenInterest / totalOpenInterest;
                    }
                    indexSettlemetPrice     = USeMath.Round(indexSettlemetPrice, m_product.PriceTick);
                    m_kLine.SettlementPrice = indexSettlemetPrice;
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// 计算指数。
        /// </summary>
        /// <returns></returns>
        private void CalcIndexKLine()
        {
            int     totalVolume            = 0;  // 总成交量
            decimal totalTurnOver          = 0m; // 总成交金额
            decimal totalOpenInterest      = 0m; //总持仓量
            decimal totalSendimentaryMoney = 0m; //总资金撤
            decimal totalFlowFund          = 0m; //总资金流向

            foreach (USeMarketData marketData in m_componentDic.Values)
            {
                if (marketData == null)
                {
                    continue;
                }

                Debug.Assert(marketData != null);
                totalVolume       += marketData.Volume;
                totalTurnOver     += marketData.Turnover;
                totalOpenInterest += marketData.OpenInterest;

                int     perSharesContract       = GetInstrumentPerSharesContract(marketData.Instrument.InstrumentCode);                 //合约规模
                decimal exchangeLongMarginRatio = GetExchangeLongMarginRatio(marketData.Instrument.InstrumentCode);                     //保证金
                totalSendimentaryMoney += marketData.OpenInterest * marketData.LastPrice * perSharesContract * exchangeLongMarginRatio; //资金沉淀
            }

            decimal indexValue = 0m;

            if (totalOpenInterest > 0)
            {
                foreach (USeMarketData marketData in m_componentDic.Values)
                {
                    if (marketData == null)
                    {
                        continue;
                    }
                    indexValue += marketData.LastPrice * marketData.OpenInterest / totalOpenInterest;
                }
                indexValue = USeMath.Round(indexValue, m_product.PriceTick);
            }
            if (indexValue <= 0)
            {
                return;
            }

            if (m_kLine.Open <= 0m)
            {
                m_kLine.Open = indexValue;
            }
            if (m_kLine.High < indexValue)
            {
                m_kLine.High = indexValue;
            }
            if (m_kLine.Low <= 0m)
            {
                m_kLine.Low = indexValue;
            }
            else if (m_kLine.Low < indexValue)
            {
                m_kLine.Low = indexValue;
            }
            m_kLine.Close        = indexValue;
            m_kLine.Volumn       = totalVolume;
            m_kLine.Turnover     = totalTurnOver;
            m_kLine.OpenInterest = totalOpenInterest;
        }