/// <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; } } }
/// <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; }