SessionColor

Тема в разделе "Примеры индикаторов", создана пользователем Support, 6 июл 2019.

  1. Support

    Support Администратор
    Команда форума

    Регистрация:
    5 сен 2015
    Сообщения:
    1 023
    Симпатии:
    195
    Код индикатора SessionColor
    1. //------------------------------------------------------------------------------
    2. //
    3. // Индикатор SessionColor. Copyright (c) 2019 Ilya Smirnov. All rights reserved.
    4. //
    5. //------------------------------------------------------------------------------
    6.  
    7. using System;
    8. using System.ComponentModel;
    9. using System.Runtime.Serialization;
    10. using System.Windows;
    11. using System.Windows.Media;
    12. using TigerTrade.Chart.Base;
    13. using TigerTrade.Chart.Indicators.Common;
    14. using TigerTrade.Chart.Indicators.Enums;
    15. using TigerTrade.Dx;
    16.  
    17. namespace TigerTrade.Chart.Indicators.Custom
    18. {
    19.     [DataContract(Name = "SessionColorIndicator", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Indicators.Custom")]
    20.     [Indicator("X_SessionColor", "*SessionColor", true, Type = typeof(SessionColorIndicator))]
    21.     internal sealed class SessionColorIndicator : IndicatorBase
    22.     {
    23.         private TimeSpan _startTime;
    24.  
    25.         [DataMember(Name = "StartTime")]
    26.         [Category("Параметры"), DisplayName("Начальное время")]
    27.         public TimeSpan StartTime
    28.         {
    29.             get => _startTime;
    30.             set
    31.             {
    32.                 if (value == _startTime)
    33.                 {
    34.                     return;
    35.                 }
    36.  
    37.                 _startTime = value;
    38.  
    39.                 OnPropertyChanged();
    40.             }
    41.         }
    42.  
    43.         private TimeSpan _endTime;
    44.  
    45.         [DataMember(Name = "EndTime")]
    46.         [Category("Параметры"), DisplayName("Конечное время")]
    47.         public TimeSpan EndTime
    48.         {
    49.             get => _endTime;
    50.             set
    51.             {
    52.                 if (value == _endTime)
    53.                 {
    54.                     return;
    55.                 }
    56.  
    57.                 _endTime = value;
    58.  
    59.                 OnPropertyChanged();
    60.             }
    61.         }
    62.  
    63.         private XBrush _backBrush;
    64.  
    65.         private XColor _backColor;
    66.  
    67.         [DataMember(Name = "BackColor")]
    68.         [Category("Стиль"), DisplayName("Цвет фона")]
    69.         public XColor BackColor
    70.         {
    71.             get => _backColor;
    72.             set
    73.             {
    74.                 if (value == _backColor)
    75.                 {
    76.                     return;
    77.                 }
    78.  
    79.                 _backColor = value;
    80.  
    81.                 _backBrush = new XBrush(_backColor);
    82.  
    83.                 OnPropertyChanged();
    84.             }
    85.         }
    86.  
    87.         [Browsable(false)]
    88.         public override bool ShowIndicatorValues => false;
    89.  
    90.         [Browsable(false)]
    91.         public override bool ShowIndicatorLabels => false;
    92.  
    93.         [Browsable(false)]
    94.         public override IndicatorCalculation Calculation => IndicatorCalculation.OnEachTick;
    95.  
    96.         public SessionColorIndicator()
    97.         {
    98.             ShowIndicatorTitle = false;
    99.  
    100.             StartTime = TimeSpan.FromHours(0);
    101.             EndTime = TimeSpan.FromHours(12);
    102.  
    103.             BackColor = Color.FromArgb(127, 30, 144, 255);
    104.         }
    105.  
    106.         protected override void Execute()
    107.         {
    108.         }
    109.  
    110.         public override void Render(DxVisualQueue visual)
    111.         {
    112.             var st = DateTime.MinValue;
    113.             var et = DateTime.MinValue;
    114.             var sp = new Point();
    115.             var ep = new Point();
    116.  
    117.             for (var i = Canvas.Count - 1; i >= -Canvas.AfterBars; i--)
    118.             {
    119.                 var index = Canvas.GetIndex(i);
    120.  
    121.                 var d = Canvas.ConvertTimeToLocal(Canvas.IndexToDate(index));
    122.  
    123.                 if (StartTime < EndTime)
    124.                 {
    125.                     var newStartDate = d.Date.Add(StartTime);
    126.                     var newEndDate = d.Date.Add(EndTime);
    127.  
    128.                     if (st == DateTime.MinValue && d >= newStartDate && d < newEndDate)
    129.                     {
    130.                         sp = new Point(Canvas.GetXX(i) - Canvas.ColumnWidth / 2.0, 0);
    131.                         st = d;
    132.  
    133.                         et = DateTime.MinValue;
    134.                         ep = new Point();
    135.                     }
    136.  
    137.                     if (st != DateTime.MinValue && st.Date < d.Date)
    138.                     {
    139.                         ep = new Point(Canvas.GetXX(i + 1) + Canvas.ColumnWidth / 2.0, Canvas.Rect.Bottom);
    140.                         et = d;
    141.                     }
    142.                     else
    143.                     {
    144.                         if (d >= newEndDate)
    145.                         {
    146.                             ep = new Point(Canvas.GetXX(i + 1) + Canvas.ColumnWidth / 2.0, Canvas.Rect.Bottom);
    147.                             et = d;
    148.                         }
    149.                     }
    150.                 }
    151.                 else
    152.                 {
    153.                     var newStartDate = d.Date.Add(StartTime);
    154.                     var newEndDate = d.Date.Add(EndTime);
    155.  
    156.                     if (st == DateTime.MinValue && (d >= newStartDate || d < newEndDate))
    157.                     {
    158.                         sp = new Point(Canvas.GetXX(i) - Canvas.ColumnWidth / 2.0, 0);
    159.                         st = d;
    160.  
    161.                         et = DateTime.MinValue;
    162.                         ep = new Point();
    163.                     }
    164.  
    165.                     if (d >= newEndDate && d < newStartDate)
    166.                     {
    167.                         ep = new Point(Canvas.GetXX(i + 1) + Canvas.ColumnWidth / 2.0, Canvas.Rect.Bottom);
    168.                         et = d;
    169.                     }
    170.                 }
    171.  
    172.                 if (st == DateTime.MinValue || et == DateTime.MinValue)
    173.                 {
    174.                     continue;
    175.                 }
    176.  
    177.                 visual.FillRectangle(_backBrush, new Rect(sp, ep));
    178.  
    179.                 st = DateTime.MinValue;
    180.                 et = DateTime.MinValue;
    181.                 sp = new Point();
    182.                 ep = new Point();
    183.             }
    184.  
    185.             if (st != DateTime.MinValue)
    186.             {
    187.                 visual.FillRectangle(_backBrush,
    188.                     new Rect(sp, new Point(Canvas.Rect.Right, Canvas.Rect.Bottom)));
    189.             }
    190.         }
    191.  
    192.         public override void ApplyColors(IChartTheme theme)
    193.         {
    194.             BackColor = theme.GetNextColor();
    195.  
    196.             base.ApplyColors(theme);
    197.         }
    198.  
    199.         public override void CopyTemplate(IndicatorBase indicator, bool style)
    200.         {
    201.             var i = (SessionColorIndicator)indicator;
    202.  
    203.             BackColor = i.BackColor;
    204.             StartTime = i.StartTime;
    205.             EndTime = i.EndTime;
    206.  
    207.             base.CopyTemplate(indicator, style);
    208.         }
    209.     }
    210. }
     
    #1 Support, 6 июл 2019
    Последнее редактирование: 6 июл 2019