PaintbarsDataSeries - раскраска баров

Датасерия, позволяющая раскрашивать задавать цвет каждого бара. Каждый элемент датасерии это nullable Color

Имеет одно свойство: Visible, которое регулирует видимость датасерии.

Пример индикатор HeikenAshi, использующего эту датасерию. Здесь PaintbarsDataSeries выполняет функцию скрытия стандартных баров с помощью установки прозрачного цвета.

public class HeikenAshi:Indicator
    {
        readonly CandleDataSeries _candles=new CandleDataSeries("Heiken Ashi");
        readonly PaintbarsDataSeries _bars= new PaintbarsDataSeries("Bars"){IsHidden = true};
        
        public HeikenAshi():base(true)
        {
            DenyToChangePanel = true;
            DataSeries[0]= _bars;
            DataSeries.Add(_candles);
        }

        protected override void OnCalculate(int bar, decimal value)
        {
            var candle = GetCandle(bar);
            _bars[bar] = Colors.Transparent;

            if (bar == 0)
            {
                _candles[bar] = new Candle()
                {
                    Close = candle.Close,
                    High = candle.High,
                    Low = candle.Low,
                    Open = candle.Open
                };
            }
            else
            {
                var prevCandle = _candles[bar - 1];
                var close = (candle.Open + candle.Close + candle.High + candle.Low) * 0.25m;
                var open = (prevCandle.Open + prevCandle.Close) * 0.5m;
                var high = Math.Max(Math.Max(close, open), candle.High);
                var low = Math.Min(Math.Min(close, open), candle.Low);
                _candles[bar] = new Candle()
                {
                    Close = close,
                    High = high,
                    Low = low,
                    Open = open,
                };
            }
            
        }
    }

Пример Bar's volume filter индикатора, который раскрашивает бары в зависимости от их объема

[DisplayName("Bar's volume filter")]
    public class BarVolumeFilter : Indicator
    {
        #region Nested types

        public enum VolumeType
        {
            Volume,
            Ticks,
            Delta,
            Bid,
            Ask
        }

        #endregion

        private readonly PaintbarsDataSeries _paintBars = new PaintbarsDataSeries("Paint bars");

        private int _minFilter ;
        private int _maxFilter = 100;
        private System.Windows.Media.Color _color = System.Windows.Media.Colors.Orange;
        private VolumeType _volumeType;

        [Name = "Type", Order = 5)]
        public VolumeType Type
        {
            get => _volumeType;
            set { _volumeType = value; RecalculateValues(); }
        }

        [Display(Name = "Minimum", Order = 10)]
        public int MinFilter
        {
            get => _minFilter;
            set { _minFilter = value;RecalculateValues(); }
        }

        [Display(Name = "Maximum", Order = 20)]
        public int MaxFilter
        {
            get => _maxFilter;
            set { _maxFilter = value; RecalculateValues(); }
        }

        [Name = "Color", Order = 30)]
        public System.Windows.Media.Color FilterColor
        {
            get => _color;
            set { _color = value; RecalculateValues(); }
        }

        public BarVolumeFilter():base(true)
        {
            DataSeries[0] = _paintBars;
            _paintBars.IsHidden = true;
            DenyToChangePanel = true;
        }

        #region Overrides of BaseIndicator

        protected override void OnCalculate(int bar, decimal value)
        {
            var candle = GetCandle(bar);
            decimal volume = 0;

            switch (Type)
            {
                case VolumeType.Volume:
                {
                    volume = candle.Volume;
                    break;
                }
                case VolumeType.Ticks:
                {
                    volume = candle.Ticks;
                    break;
                }
                case VolumeType.Delta:
                {
                    volume = candle.Delta;
                    break;
                }
                case VolumeType.Bid:
                {
                    volume = candle.Bid;
                    break;
                }
                case VolumeType.Ask:
                {
                    volume = candle.Ask;
                    break;
                }
                default:
                    throw new ArgumentOutOfRangeException();
            }

            if (volume > _minFilter && volume <= _maxFilter)
            {
                _paintBars[bar] = _color;
            }
            else
            {
                _paintBars[bar] = null;
            }
        }

        #endregion
    }

Сервис поддержки клиентов работает на платформе UserEcho