/// <summary>
        /// To create a rule for the event of candle total volume excess above a specific level.
        /// </summary>
        /// <param name="candleManager">The candles manager.</param>
        /// <param name="series">Candles series, from which a candle will be taken.</param>
        /// <param name="volume">The level. If the <see cref="Unit.Type"/> type equals to <see cref="UnitTypes.Limit"/>, specified price is set. Otherwise, shift value is specified.</param>
        /// <returns>Rule.</returns>
        public static MarketRule <CandleSeries, Candle> WhenCurrentCandleTotalVolumeMore(this ICandleManager candleManager, CandleSeries series, Unit volume)
        {
            if (series == null)
            {
                throw new ArgumentNullException(nameof(series));
            }

            var finishVolume = volume;

            if (volume.Type != UnitTypes.Limit)
            {
                var curCandle = candleManager.GetCurrentCandle <Candle>(series);

                if (curCandle == null)
                {
                    throw new ArgumentException(LocalizedStrings.Str1070, nameof(series));
                }

                finishVolume = curCandle.TotalVolume + volume;
            }

            return(new CurrentCandleSeriesRule(candleManager, series, candle => candle.TotalVolume > finishVolume)
            {
                Name = series + LocalizedStrings.Str1071Params.Put(volume)
            });
        }
        /// <summary>
        /// To create a Reactive Extension for the event of candle total volume excess above a specific level.
        /// </summary>
        /// <param name="candleManager">The candles manager.</param>
        /// <param name="series">Candles series, from which a candle will be taken.</param>
        /// <param name="volume">The level. If the <see cref="Unit.Type"/> type equals to <see cref="UnitTypes.Limit"/>, specified price is set. Otherwise, shift value is specified.</param>
        /// <returns>Reactive Extension.</returns>
        public static IObservable <Candle> RxWhenCurrentCandleTotalVolumeMore(this ICandleManager candleManager,
                                                                              CandleSeries series, Unit volume)
        {
            if (series == null)
            {
                throw new ArgumentNullException(nameof(series));
            }
            if (volume == null)
            {
                throw new ArgumentNullException(nameof(volume));
            }
            var finishVolume = volume;

            if (volume.Type != UnitTypes.Limit)
            {
                var curCandle = candleManager.GetCurrentCandle <Candle>(series);

                if (curCandle == null)
                {
                    throw new ArgumentException(nameof(series));
                }

                finishVolume = curCandle.TotalVolume + volume;
            }

            return(candleManager.RxProcessing()
                   .Where(arg => arg.Series == series && arg.Candle.TotalVolume > finishVolume)
                   .Select(arg => arg.Candle));
        }
            public TimeFrameCandlesChangedSeriesRule(ICandleManager candleManager, CandleSeries series, IConnector connector, decimal percent)
                : base(series)
            {
                if (candleManager == null)
                {
                    throw new ArgumentNullException(nameof(candleManager));
                }

                _timer = CreateAndActivateTimeFrameTimer(series.Security, (TimeSpan)series.Arg, connector, () => Activate(candleManager.GetCurrentCandle <Candle>(Series)), percent, true);
            }