Русский

Session Color

/------------------------------------------------------------------------------
//
// Индикатор SessionColor. Copyright (c) 2023 Tiger Trade Capital AG. All rights reserved.
//
//------------------------------------------------------------------------------
 
using System;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Windows;
using System.Windows.Media;
using TigerTrade.Chart.Base;
using TigerTrade.Chart.Indicators.Common;
using TigerTrade.Chart.Indicators.Enums;
using TigerTrade.Dx;
 
namespace TigerTrade.Chart.Indicators.Custom
{
    [DataContract(Name = "SessionColorIndicator", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Indicators.Custom")]
    [Indicator("X_SessionColor", "*SessionColor", true, Type = typeof(SessionColorIndicator))]
    internal sealed class SessionColorIndicator : IndicatorBase
    {
        private TimeSpan _startTime;
 
        [DataMember(Name = "StartTime")]
        [Category("Параметры"), DisplayName("Начальное время")]
        public TimeSpan StartTime
        {
            get => _startTime;
            set
            {
                if (value == _startTime)
                {
                    return;
                }
 
                _startTime = value;
 
                OnPropertyChanged();
            }
        }
 
        private TimeSpan _endTime;
 
        [DataMember(Name = "EndTime")]
        [Category("Параметры"), DisplayName("Конечное время")]
        public TimeSpan EndTime
        {
            get => _endTime;
            set
            {
                if (value == _endTime)
                {
                    return;
                }
 
                _endTime = value;
 
                OnPropertyChanged();
            }
        }
 
        private XBrush _backBrush;
 
        private XColor _backColor;
 
        [DataMember(Name = "BackColor")]
        [Category("Стиль"), DisplayName("Цвет фона")]
        public XColor BackColor
        {
            get => _backColor;
            set
            {
                if (value == _backColor)
                {
                    return;
                }
 
                _backColor = value;
 
                _backBrush = new XBrush(_backColor);
 
                OnPropertyChanged();
            }
        }
 
        [Browsable(false)]
        public override bool ShowIndicatorValues => false;
 
        [Browsable(false)]
        public override bool ShowIndicatorLabels => false;
 
        [Browsable(false)]
        public override IndicatorCalculation Calculation => IndicatorCalculation.OnEachTick;
 
        public SessionColorIndicator()
        {
            ShowIndicatorTitle = false;
 
            StartTime = TimeSpan.FromHours(0);
            EndTime = TimeSpan.FromHours(12);
 
            BackColor = Color.FromArgb(127, 30, 144, 255);
        }
 
        protected override void Execute()
        {
        }
 
        public override void Render(DxVisualQueue visual)
        {
            var st = DateTime.MinValue;
            var et = DateTime.MinValue;
            var sp = new Point();
            var ep = new Point();
 
            for (var i = Canvas.Count - 1; i >= -Canvas.AfterBars; i--)
            {
                var index = Canvas.GetIndex(i);
 
                var d = Canvas.ConvertTimeToLocal(Canvas.IndexToDate(index));
 
                if (StartTime < EndTime)
                {
                    var newStartDate = d.Date.Add(StartTime);
                    var newEndDate = d.Date.Add(EndTime);
 
                    if (st == DateTime.MinValue && d >= newStartDate && d < newEndDate)
                    {
                        sp = new Point(Canvas.GetXX(i) - Canvas.ColumnWidth / 2.0, 0);
                        st = d;
 
                        et = DateTime.MinValue;
                        ep = new Point();
                    }
 
                    if (st != DateTime.MinValue && st.Date < d.Date)
                    {
                        ep = new Point(Canvas.GetXX(i + 1) + Canvas.ColumnWidth / 2.0, Canvas.Rect.Bottom);
                        et = d;
                    }
                    else
                    {
                        if (d >= newEndDate)
                        {
                            ep = new Point(Canvas.GetXX(i + 1) + Canvas.ColumnWidth / 2.0, Canvas.Rect.Bottom);
                            et = d;
                        }
                    }
                }
                else
                {
                    var newStartDate = d.Date.Add(StartTime);
                    var newEndDate = d.Date.Add(EndTime);
 
                    if (st == DateTime.MinValue && (d >= newStartDate || d < newEndDate))
                    {
                        sp = new Point(Canvas.GetXX(i) - Canvas.ColumnWidth / 2.0, 0);
                        st = d;
 
                        et = DateTime.MinValue;
                        ep = new Point();
                    }
 
                    if (d >= newEndDate && d < newStartDate)
                    {
                        ep = new Point(Canvas.GetXX(i + 1) + Canvas.ColumnWidth / 2.0, Canvas.Rect.Bottom);
                        et = d;
                    }
                }
 
                if (st == DateTime.MinValue || et == DateTime.MinValue)
                {
                    continue;
                }
 
                visual.FillRectangle(_backBrush, new Rect(sp, ep));
 
                st = DateTime.MinValue;
                et = DateTime.MinValue;
                sp = new Point();
                ep = new Point();
            }
 
            if (st != DateTime.MinValue)
            {
                visual.FillRectangle(_backBrush,
                    new Rect(sp, new Point(Canvas.Rect.Right, Canvas.Rect.Bottom)));
            }
        }
 
        public override void ApplyColors(IChartTheme theme)
        {
            BackColor = theme.GetNextColor();
 
            base.ApplyColors(theme);
        }
 
        public override void CopyTemplate(IndicatorBase indicator, bool style)
        {
            var i = (SessionColorIndicator)indicator;
 
            BackColor = i.BackColor;
            StartTime = i.StartTime;
            EndTime = i.EndTime;
 
            base.CopyTemplate(indicator, style);
        }
    }
}

Last updated