HighLow

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

  1. Support

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

    Регистрация:
    5 сен 2015
    Сообщения:
    1 023
    Симпатии:
    195
    Код индикатора HighLow
    1. //------------------------------------------------------------------------------
    2. //
    3. // Индикатор HighLow. 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 TigerTrade.Chart.Base;
    11. using TigerTrade.Chart.Base.Enums;
    12. using TigerTrade.Chart.Indicators.Common;
    13. using TigerTrade.Chart.Indicators.Drawings;
    14. using TigerTrade.Chart.Indicators.Enums;
    15. using TigerTrade.Core.Utils.Time;
    16. using TigerTrade.Dx.Enums;
    17.  
    18. namespace TigerTrade.Chart.Indicators.Custom
    19. {
    20.     [DataContract(Name = "HighLowIndicator", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Indicators.Custom")]
    21.     [Indicator("Z_HighLow", "*HighLow", true, Type = typeof(HighLowIndicator))]
    22.     internal sealed class HighLowIndicator : IndicatorBase
    23.     {
    24.         private IndicatorPeriodType _period;
    25.  
    26.         [DataMember(Name = "Period")]
    27.         [Category("Параметры"), DisplayName("Период")]
    28.         public IndicatorPeriodType Period
    29.         {
    30.             get => _period;
    31.             set
    32.             {
    33.                 if (value == _period)
    34.                 {
    35.                     return;
    36.                 }
    37.  
    38.                 _period = value;
    39.  
    40.                 OnPropertyChanged();
    41.             }
    42.         }
    43.  
    44.         private ChartLine _highLowSeries;
    45.  
    46.         [DataMember(Name = "HighLow")]
    47.         [Category("Графики"), DisplayName("High/Low")]
    48.         public ChartLine HighLowSeries
    49.         {
    50.             get => _highLowSeries ?? (_highLowSeries = new ChartLine());
    51.             private set
    52.             {
    53.                 if (Equals(value, _highLowSeries))
    54.                 {
    55.                     return;
    56.                 }
    57.  
    58.                 _highLowSeries = value;
    59.  
    60.                 OnPropertyChanged();
    61.             }
    62.         }
    63.  
    64.         private ChartLine _medianSeries;
    65.  
    66.         [DataMember(Name = "Median")]
    67.         [Category("Графики"), DisplayName("Median")]
    68.         public ChartLine MedianSeries
    69.         {
    70.             get => _medianSeries ?? (_medianSeries = new ChartLine());
    71.             private set
    72.             {
    73.                 if (Equals(value, _medianSeries))
    74.                 {
    75.                     return;
    76.                 }
    77.  
    78.                 _medianSeries = value;
    79.  
    80.                 OnPropertyChanged();
    81.             }
    82.         }
    83.  
    84.         private ChartLine _prevMedianSeries;
    85.  
    86.         [DataMember(Name = "PrevMedian")]
    87.         [Category("Графики"), DisplayName("PrevMedian")]
    88.         public ChartLine PrevMedianSeries
    89.         {
    90.             get => _prevMedianSeries ?? (_prevMedianSeries = new ChartLine
    91.             {
    92.                 Style = XDashStyle.Dash
    93.             });
    94.             private set
    95.             {
    96.                 if (Equals(value, _prevMedianSeries))
    97.                 {
    98.                     return;
    99.                 }
    100.  
    101.                 _prevMedianSeries = value;
    102.  
    103.                 OnPropertyChanged();
    104.             }
    105.         }
    106.  
    107.         [Browsable(false)]
    108.         public override IndicatorCalculation DefaultCalculation => IndicatorCalculation.OnBarClose;
    109.  
    110.         public HighLowIndicator()
    111.         {
    112.             Period = IndicatorPeriodType.Day;
    113.         }
    114.  
    115.         protected override void Execute()
    116.         {
    117.             var date = Helper.Date;
    118.             var high = Helper.High;
    119.             var low = Helper.Low;
    120.  
    121.             var highData = new double[date.Length];
    122.             var lowData = new double[date.Length];
    123.             var medianData = new double[date.Length];
    124.             var prevMedianData = new double[date.Length];
    125.  
    126.             var splits = new bool[date.Length];
    127.  
    128.             var lastSequence = -1;
    129.  
    130.             var highValue = 0.0;
    131.             var lowValue = 0.0;
    132.  
    133.             var prevMedian = double.NaN;
    134.  
    135.             var timeOffset = TimeHelper.GetSessionOffset(DataProvider.Symbol.Exchange);
    136.  
    137.             for (var i = 0; i < date.Length; i++)
    138.             {
    139.                 var sequence = 1;
    140.  
    141.                 switch (Period)
    142.                 {
    143.                     case IndicatorPeriodType.Day:
    144.  
    145.                         sequence = DataProvider.Period.GetSequence(ChartPeriodType.Day, 1, date[i], timeOffset);
    146.  
    147.                         break;
    148.  
    149.                     case IndicatorPeriodType.Week:
    150.  
    151.                         sequence = DataProvider.Period.GetSequence(ChartPeriodType.Week, 1, date[i], timeOffset);
    152.  
    153.                         break;
    154.  
    155.                     case IndicatorPeriodType.Month:
    156.  
    157.                         sequence = DataProvider.Period.GetSequence(ChartPeriodType.Month, 1, date[i], timeOffset);
    158.  
    159.                         break;
    160.                 }
    161.  
    162.                 if (sequence != lastSequence)
    163.                 {
    164.                     lastSequence = sequence;
    165.  
    166.                     highValue = high[i];
    167.                     lowValue = low[i];
    168.  
    169.                     if (i > 0 && medianData.Length > i)
    170.                     {
    171.                         prevMedian = medianData[i - 1];
    172.                     }
    173.  
    174.                     splits[i] = true;
    175.                 }
    176.  
    177.                 highValue = Math.Max(highValue, high[i]);
    178.                 lowValue = Math.Min(lowValue, low[i]);
    179.  
    180.                 highData[i] = highValue;
    181.                 lowData[i] = lowValue;
    182.  
    183.                 medianData[i] = (highValue + lowValue) / 2.0;
    184.                 prevMedianData[i] = prevMedian;
    185.             }
    186.  
    187.             Series.Add(new IndicatorSeriesData(prevMedianData, PrevMedianSeries)
    188.             {
    189.                 Style =
    190.                 {
    191.                     DisableMinMax = true,
    192.                     StraightLine = true
    193.                 },
    194.  
    195.             }, new IndicatorSeriesData(highData, HighLowSeries)
    196.             {
    197.                 Style =
    198.                 {
    199.                     DisableMinMax = true,
    200.                     StraightLine = true
    201.                 }
    202.             }, new IndicatorSeriesData(lowData, HighLowSeries)
    203.             {
    204.                 Style =
    205.                 {
    206.                     DisableMinMax = true,
    207.                     StraightLine = true
    208.                 }
    209.             }, new IndicatorSeriesData(medianData, MedianSeries)
    210.             {
    211.                 Style =
    212.                 {
    213.                     DisableMinMax = true,
    214.                     StraightLine = true
    215.                 }
    216.             });
    217.  
    218.             foreach (var series in Series)
    219.             {
    220.                 series.UserData["S"] = splits;
    221.                 series.UserData["SE"] = true;
    222.             }
    223.         }
    224.  
    225.         public override void ApplyColors(IChartTheme theme)
    226.         {
    227.             HighLowSeries.Color = theme.GetNextColor();
    228.             MedianSeries.Color = theme.GetNextColor();
    229.             PrevMedianSeries.Color = theme.GetNextColor();
    230.  
    231.             base.ApplyColors(theme);
    232.         }
    233.  
    234.         public override void CopyTemplate(IndicatorBase indicator, bool style)
    235.         {
    236.             var i = (HighLowIndicator)indicator;
    237.  
    238.             Period = i.Period;
    239.  
    240.             HighLowSeries.CopyTheme(i.HighLowSeries);
    241.             MedianSeries.CopyTheme(i.MedianSeries);
    242.             PrevMedianSeries.CopyTheme(i.PrevMedianSeries);
    243.  
    244.             base.CopyTemplate(indicator, style);
    245.         }
    246.  
    247.         public override string ToString()
    248.         {
    249.             return $"{Name} ({Period})";
    250.         }
    251.     }
    252. }
     
    #1 Support, 3 июл 2019
    Последнее редактирование: 6 июл 2019