private void ProcessIndicator(IndicatorToken token, IIndicatorValue input)
 {
     if (token.Indicator.CanProcess(input))
     {
         Container.AddValue(token, input, token.Indicator.Process(input));
     }
 }
        /// <summary>
        /// Сообщить, что данный токен больше не требуется.
        /// Если количество вызовов будет равно количеству вызовов <see cref="RegisterIndicator"/>, то все данные по индикатору будут удалены.
        /// </summary>
        /// <param name="indicatorToken">Токен индикатора.</param>
        public virtual void UnRegisterIndicator(IndicatorToken indicatorToken)
        {
            lock (_indicatorUsages.SyncRoot)
            {
                var inDict = _indicatorUsages[indicatorToken];

                if (inDict.Second <= 0)
                {
                    throw new InvalidOperationException();
                }

                if (--inDict.Second == 0)
                {
                    _indicatorUsages.Remove(indicatorToken);

                    //чистим значения в контейнере
                    Container.RemoveIndicator(indicatorToken);

                    //удаляем из списка источника
                    lock (_sources.SyncRoot)
                    {
                        var indicators = _sources.TryGetValue(indicatorToken.Source);
                        if (indicators != null)
                        {
                            indicators.Remove(indicatorToken);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Зарегистрировать индикатор. После регистрации данный индикатор начнет обновляться с использованием переданного источника.
        /// Если по данному источнику уже есть сохраненные данные, то они будут использованы для инициализации индикатора.
        /// Если пара индикатор-источник уже была ранее зарегистрирована, то вернется существующий токен.
        /// </summary>
        /// <param name="indicator">Индикатор.</param>
        /// <param name="source">Источник данных для индикатора.</param>
        /// <returns>Токен, который был зарегистрирован.</returns>
        public virtual IndicatorToken RegisterIndicator(IIndicator indicator, IIndicatorSource source)
        {
            lock (_indicatorUsages.SyncRoot)
            {
                var token = new IndicatorToken(indicator, source);

                var inDict = _indicatorUsages.TryGetValue(token);
                if (inDict != null)
                {
                    //найден индикатор, увеличим количество ссылок
                    inDict.Second++;
                    return(inDict.First);
                }

                //индикатора нет, добавим
                lock (_sources.SyncRoot)
                {
                    var indicators = _sources.SafeAdd(source, key => new IndicatorList(this, key));

                    token = new IndicatorToken(indicator, indicators.Source)
                    {
                        Container = Container
                    };
                    _indicatorUsages.Add(token, new RefPair <IndicatorToken, int>(token, 1));
                    indicators.Add(token);                     // тут пройдет подписка на события источника и обработка тех значений, которые уже есть в источнике
                }

                return(token);
            }
        }
                public ResetEventHandler(IndicatorToken token, IndicatorManager manager)
                {
                    Token    = token;
                    _manager = manager;

                    ResetHandler             = OnReset;
                    Token.Indicator.Reseted += ResetHandler;
                }
        private void ProcessIndicator(IndicatorToken token)
        {
            lock (_indicatorUsages.SyncRoot)
            {
                var inputs = Container.GetInputs(token.Source);

                if (inputs != null)
                {
                    inputs.ForEach(i => ProcessIndicator(token, i));
                }
            }
        }