Вертикальная линия

Тема в разделе "Примеры графических объектов", создана пользователем Support, 6 янв 2020.

  1. Support

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

    Регистрация:
    5 сен 2015
    Сообщения:
    1 326
    Симпатии:
    292
    Код графического объекта Вертикальная линия
    1. //------------------------------------------------------------------------------
    2. //
    3. // Графический объект VerticalLine. Copyright (c) 2020 Ilya Smirnov. All rights reserved.
    4. //
    5. //------------------------------------------------------------------------------
    6.  
    7. using System;
    8. using System.Collections.Generic;
    9. using System.ComponentModel;
    10. using System.Globalization;
    11. using System.Runtime.Serialization;
    12. using System.Windows;
    13. using System.Windows.Media;
    14. using TigerTrade.Chart.Alerts;
    15. using TigerTrade.Chart.Base;
    16. using TigerTrade.Chart.Base.Enums;
    17. using TigerTrade.Chart.Indicators.Common;
    18. using TigerTrade.Chart.Objects.Common;
    19. using TigerTrade.Core.Utils.Logging;
    20. using TigerTrade.Dx;
    21. using TigerTrade.Dx.Enums;
    22.  
    23. namespace TigerTrade.Chart.Objects.Custom
    24. {
    25.     [DataContract(Name = "VerticalLineObject", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Objects.Custom")]
    26.     [ChartObject("X_VerticalLine", "Вертикальная линия", 1, Type = typeof(VerticalLineObject))]
    27.     public sealed class VerticalLineObject : ObjectBase
    28.     {
    29.         private ChartAlertSettings _alert;
    30.  
    31.         [DataMember(Name = "Alert")]
    32.         [Category("Оповещение"), DisplayName("Оповещение")]
    33.         public ChartAlertSettings Alert
    34.         {
    35.             get => _alert ?? (_alert = new ChartAlertSettings());
    36.             set
    37.             {
    38.                 if (Equals(value, _alert))
    39.                 {
    40.                     return;
    41.                 }
    42.  
    43.                 _alert = value;
    44.  
    45.                 OnPropertyChanged();
    46.             }
    47.         }
    48.  
    49.         private XBrush _lineBrush;
    50.  
    51.         private XPen _linePen;
    52.  
    53.         private XColor _lineColor;
    54.  
    55.         [DataMember(Name = "LineColor")]
    56.         [Category("Линия"), DisplayName("Цвет линии")]
    57.         public XColor LineColor
    58.         {
    59.             get => _lineColor;
    60.             set
    61.             {
    62.                 if (value == _lineColor)
    63.                 {
    64.                     return;
    65.                 }
    66.  
    67.                 _lineColor = value;
    68.  
    69.                 _lineBrush = new XBrush(_lineColor);
    70.                 _linePen = new XPen(_lineBrush, LineWidth, LineStyle);
    71.  
    72.                 OnPropertyChanged();
    73.             }
    74.         }
    75.  
    76.         private int _lineWidth;
    77.  
    78.         [DataMember(Name = "LineWidth")]
    79.         [Category("Линия"), DisplayName("Толщина линии")]
    80.         public int LineWidth
    81.         {
    82.             get => _lineWidth;
    83.             set
    84.             {
    85.                 value = Math.Max(1, Math.Min(10, value));
    86.  
    87.                 if (value == _lineWidth)
    88.                 {
    89.                     return;
    90.                 }
    91.  
    92.                 _lineWidth = value;
    93.  
    94.                 _linePen = new XPen(_lineBrush, _lineWidth, LineStyle);
    95.  
    96.                 OnPropertyChanged();
    97.             }
    98.         }
    99.  
    100.         private XDashStyle _lineStyle;
    101.  
    102.         [DataMember(Name = "LineStyle")]
    103.         [Category("Линия"), DisplayName("Стиль линии")]
    104.         public XDashStyle LineStyle
    105.         {
    106.             get => _lineStyle;
    107.             set
    108.             {
    109.                 if (value == _lineStyle)
    110.                 {
    111.                     return;
    112.                 }
    113.  
    114.                 _lineStyle = value;
    115.  
    116.                 _linePen = new XPen(_lineBrush, LineWidth, _lineStyle);
    117.  
    118.                 OnPropertyChanged();
    119.             }
    120.         }
    121.  
    122.         protected override int PenWidth => LineWidth;
    123.  
    124.         private Rect _lineRect;
    125.  
    126.         public VerticalLineObject()
    127.         {
    128.             LineColor = Colors.Black;
    129.             LineWidth = 1;
    130.             LineStyle = XDashStyle.Solid;
    131.         }
    132.  
    133.         protected override void Draw(DxVisualQueue visual, ref List<ObjectLabelInfo> labels)
    134.         {
    135.             if (Canvas == null)
    136.             {
    137.                 return;
    138.             }
    139.  
    140.             var point = ToPoint(ControlPoints[0]);
    141.  
    142.             var startPoint = new Point(point.X, Canvas.Rect.Top);
    143.             var endPoint = new Point(point.X, Canvas.Rect.Bottom);
    144.  
    145.             _lineRect = new Rect(startPoint, endPoint);
    146.  
    147.             if (Settings.TransformVertLines && Canvas.IsStock &&
    148.                 Canvas.StockType == ChartStockType.Clusters)
    149.             {
    150.                 var brush = new XBrush(_lineBrush.Color, _lineBrush.Color.Alpha > 127 ? 127 : 255);
    151.  
    152.                 var x = point.X;
    153.  
    154.                 var x1 = x - Canvas.ColumnWidth / 2.0;
    155.                 var x2 = x + Canvas.ColumnWidth / 2.0;
    156.  
    157.                 if (x2 - x1 > LineWidth + 2)
    158.                 {
    159.                     _lineRect = new Rect(new Point(x1, startPoint.Y), new Point(x2, endPoint.Y));
    160.  
    161.                     visual.FillRectangle(brush, _lineRect);
    162.  
    163.                     return;
    164.                 }
    165.             }
    166.  
    167.             visual.DrawLine(_linePen, startPoint, endPoint);
    168.         }
    169.  
    170.         public override void DrawControlPoints(DxVisualQueue visual)
    171.         {
    172.             if (_lineRect == Rect.Empty)
    173.             {
    174.                 return;
    175.             }
    176.  
    177.             var width = LineWidth / 2 + 4;
    178.  
    179.             var center = new Point((_lineRect.Left + _lineRect.Right) / 2.0, (_lineRect.Top + _lineRect.Bottom) / 2.0);
    180.  
    181.             var rect = new Rect(center, center);
    182.  
    183.             rect.Inflate(new Size(width, width));
    184.  
    185.             visual.FillRectangle(Theme.ChartCpFillBrush, rect);
    186.             visual.DrawRectangle(Theme.ChartCpLinePen, rect);
    187.         }
    188.  
    189.         protected override bool InObject(int x, int y)
    190.         {
    191.             if (_lineRect == Rect.Empty)
    192.             {
    193.                 return false;
    194.             }
    195.  
    196.             var r = Rect.Inflate(_lineRect, new Size(2, 0));
    197.  
    198.             return r.Contains(x, y);
    199.         }
    200.  
    201.         public override void ApplyTheme(IChartTheme theme)
    202.         {
    203.             base.ApplyTheme(theme);
    204.  
    205.             LineColor = theme.ChartObjectLineColor;
    206.         }
    207.  
    208.         public override void CopyTemplate(ObjectBase objectBase, bool style)
    209.         {
    210.             if (objectBase is VerticalLineObject obj)
    211.             {
    212.                 Alert.Copy(obj.Alert, !style);
    213.  
    214.                 OnPropertyChanged(nameof(Alert));
    215.  
    216.                 LineColor = obj.LineColor;
    217.                 LineWidth = obj.LineWidth;
    218.                 LineStyle = obj.LineStyle;
    219.             }
    220.  
    221.             base.CopyTemplate(objectBase, style);
    222.         }
    223.  
    224.         private int _lastAlertIndex;
    225.         private DateTime _lastLineTime;
    226.  
    227.         public override void CheckAlert(List<IndicatorBase> indicators)
    228.         {
    229.             if (!Alert.IsActive)
    230.             {
    231.                 return;
    232.             }
    233.  
    234.             try
    235.             {
    236.                 var dp = DataProvider;
    237.  
    238.                 var lineTime = DateTime.FromOADate(ControlPoints[0].X);
    239.  
    240.                 var last = dp.GetCluster(dp.Count - 1);
    241.  
    242.                 if (lineTime != _lastLineTime)
    243.                 {
    244.                     if (lineTime > last?.CloseTime)
    245.                     {
    246.                         _lastAlertIndex = -1;
    247.  
    248.                         _lastLineTime = lineTime;
    249.                     }
    250.                 }
    251.  
    252.                 if (last?.CloseTime > lineTime && _lastAlertIndex == -1)
    253.                 {
    254.                     _lastAlertIndex = dp.Count;
    255.  
    256.                     var message =
    257.                         $"График пересёк вертикальную линию, время: {DateTime.FromOADate(ControlPoints[0].X).ToString(CultureInfo.CurrentCulture)}.";
    258.  
    259.                     AddAlert(Alert, message);
    260.                 }
    261.             }
    262.             catch (Exception e)
    263.             {
    264.                 LogManager.WriteError(e);
    265.             }
    266.         }
    267.     }
    268. }