public void AddBar(Bar newbar)
        {
            if (newbar == null)
            {
                ChangeState = 4;
                return;
            }

            lock (_lockobj)
            {
                if (IsEnd)
                {
                    ChangeState = 4;
                    return;
                }

                int idx;
                int ir = MoveTo(newbar.BeginTime, out idx);
                if (ir == -1)
                {
                    ChangeState = 4;
                    return;
                }

                var baropencount  = 0;
                var barclosecount = 0;
                for (; _posTime < idx; ++_posTime)
                {
                    DateTimeSlice currentT = _lstslice[_posTime];

                    if (_posBar == _posTime)
                    {
                    }
                    else
                    {
                        #region 20150628 去掉空Bar

                        //Bar bar = new Bar();
                        //bar.BeginTime = _tradeDay + currentT.BeginTime;
                        //if (_posBar >= 0)
                        //{
                        //    bar.Close = bar.PreClose = bar.Open = bar.High = bar.Low = _bars.Last.Close;
                        //    bar.OpenInterest = _bars.Last.OpenInterest;
                        //}

                        //_bars.Add(bar);

                        //_bars.Last.CloseBar(_tradeDay + currentT.EndTime);

                        #endregion

                        ++_posBar;

                        //OnBarClosed(_bars.Last);
                    }
                }

                if (ir == 0)
                {
                    if (_posBar == _posTime)
                    {
                        Bar bar = _bars.Last;
                        bar.AddBar(newbar);
                    }
                    else
                    {
                        Bar bar = new Bar {
                            TradingDate = newbar.TradingDate
                        };
                        bar.OpenBar(newbar);
                        _bars.Add(bar);

                        ++baropencount;

                        OnBarOpened(bar);

                        ++_posBar;
                    }

                    //if (_posBar == _posTime)
                    {
                        DateTimeSlice currentT = _lstslice[_posTime];
                        if (newbar.EndTime >= currentT.EndTime)
                        {
                            ++barclosecount;

                            _bars.Last.CloseBar(currentT.EndTime);
                            OnBarClosed(_bars.Last);
                        }
                    }
                }

                if (baropencount == 0 && barclosecount == 0)
                {
                    ChangeState = 0;
                    return;
                }

                if (baropencount > barclosecount)
                {
                    ChangeState = 2;
                    return;
                }

                if (barclosecount > baropencount)
                {
                    ChangeState = 1;
                    return;
                }

                ChangeState = 3;
            }
        }