Exemplo n.º 1
0
        /// <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("未知");
            }
        }
Exemplo n.º 2
0
        /// <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;
        }
Exemplo n.º 3
0
        /// <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);
            }
        }