/// <summary> /// 内外盘方向描述。 /// </summary> /// <param name="side"></param> /// <returns></returns> public static string ToDescription(this USeActiveSide side) { switch (side) { case USeActiveSide.Ask: return("内盘"); case USeActiveSide.Bid: return("外盘"); default: return("未知"); } }
/// <summary> /// 更新K线。 /// </summary> /// <param name="kLine"></param> /// <param name="marketData"></param> private void UpdateKLine(USeKLine kLine, USeMarketData marketData) { if (marketData.Volume < kLine.Volumn) { return; } int volumeDiff = marketData.Volume - kLine.Volumn; USeActiveSide activeSide = GetActiveSide(marketData); int askVolume = 0; int bidVolume = 0; if (activeSide == USeActiveSide.Ask) { askVolume = volumeDiff; } else if (activeSide == USeActiveSide.Bid) { bidVolume = volumeDiff; } else { Debug.Assert(activeSide == USeActiveSide.None); askVolume = (int)(volumeDiff / 2); bidVolume = volumeDiff - askVolume; } //更新 if (kLine.High < marketData.LastPrice) { kLine.High = marketData.LastPrice; } if (kLine.Low > marketData.LastPrice) { kLine.Low = marketData.LastPrice; } kLine.Close = marketData.LastPrice; kLine.Volumn = marketData.Volume; kLine.Turnover = marketData.Turnover; kLine.OpenInterest = marketData.OpenInterest; kLine.AskVolumn += askVolume; kLine.BidVolumn += bidVolume; kLine.AvgPrice = marketData.AvgPrice; }
/// <summary> /// 行情更新。 /// </summary> /// <remarks>行情数据。</remarks> /// <returns></returns> public override void UpdateMarketData(USeMarketData marketData) { if (m_kLine == null) { m_kLine = CreateFirstKLine(marketData); } else { if (marketData.Volume < m_kLine.Volumn) { return; } if (GetCycleTime(marketData.UpdateTime) == m_kLine.DateTime) { int volumeDiff = marketData.Volume - m_kLine.Volumn; USeActiveSide activeSide = GetActiveSide(marketData); int askVolume = 0; int bidVolume = 0; if (activeSide == USeActiveSide.Ask) { askVolume = volumeDiff; } else if (activeSide == USeActiveSide.Bid) { bidVolume = volumeDiff; } else { Debug.Assert(activeSide == USeActiveSide.None); askVolume = (int)(volumeDiff / 2); bidVolume = volumeDiff - askVolume; } m_kLine.Open = marketData.OpenPrice; m_kLine.High = marketData.HighPrice; m_kLine.Low = marketData.LowPrice; m_kLine.Close = marketData.LastPrice; m_kLine.Volumn = marketData.Volume; m_kLine.Turnover = marketData.Turnover; m_kLine.OpenInterest = marketData.OpenInterest; m_kLine.SettlementPrice = marketData.SettlementPrice; m_kLine.PreSettlementPrice = marketData.PreSettlementPrice; m_kLine.BidVolumn += bidVolume; m_kLine.AskVolumn += askVolume; m_kLine.AvgPrice = marketData.AvgPrice; if (marketData.OpenInterest != 0m) { m_kLine.SpeculateRadio = marketData.Volume / marketData.OpenInterest; } else { m_kLine.SpeculateRadio = 0m; } Debug.Assert(m_kLine.BidVolumn + m_kLine.AskVolumn == m_kLine.Volumn); //计算资金总沉淀(盘中就用最新价计算资金沉淀,待下午结算价出来之后,按照结算价再更新一次) int perSharesContract = GetInstrumentPerSharesContract(marketData.Instrument.InstrumentCode); //合约规模 decimal exchangeLongMarginRatio = GetExchangeLongMarginRatio(marketData.Instrument.InstrumentCode); //保证金 m_kLine.SendimentaryMoney = marketData.OpenInterest * marketData.LastPrice * perSharesContract * exchangeLongMarginRatio; //资金沉淀 } else { m_eventLogger.WriteError(string.Format("[YM]{0} receive different data,Code:{3},KLindDate:{1},MarketData:{2}", ToString(), m_kLine.DateTime.ToString("yyyy-MM-dd HH:mm:ss"), marketData.UpdateTime.ToString("yyyy-MM-dd HH:mm:ss"), m_instrument.InstrumentCode.ToString())); //Debug.Assert(false); m_publisher.PublishKLine(m_kLine.Clone()); //如果是检查到该合约属于主力合约,重新克隆发送一遍存在day_kline里面作为**9999 if (m_isMainContract) { USeKLine mainKLine = m_kLine.Clone(); mainKLine.InstrumentCode = m_mainContractCode.InstrumentCode; m_publisher.PublishKLine(mainKLine); } m_nextPublishTime = DateTime.Now.AddTicks(m_publishInterval.Ticks); m_kLine = CreateFirstKLine(marketData); return; } } if (DateTime.Now >= m_nextPublishTime || m_kLine.SettlementPrice > 0m) { m_publisher.PublishKLine(m_kLine.Clone()); //如果是检查到该合约属于主力合约,重新克隆发送一遍存在day_kline里面作为**9999 if (m_isMainContract) { USeKLine mainKLine = m_kLine.Clone(); mainKLine.InstrumentCode = m_mainContractCode.InstrumentCode; m_publisher.PublishKLine(mainKLine); } m_nextPublishTime = DateTime.Now.AddTicks(m_publishInterval.Ticks); } }