VWAP

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

  1. Support

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

    Регистрация:
    5 сен 2015
    Сообщения:
    1 047
    Симпатии:
    203
    Код индикатора VWAP
    1. //------------------------------------------------------------------------------
    2. //
    3. // Индикатор VWAP. Copyright (c) 2019 Ilya Smirnov. All rights reserved.
    4. //
    5. //------------------------------------------------------------------------------
    6.  
    7. using System;
    8. using System.Collections.Generic;
    9. using System.ComponentModel;
    10. using System.Linq;
    11. using System.Runtime.Serialization;
    12. using System.Windows.Media;
    13. using TigerTrade.Chart.Base;
    14. using TigerTrade.Chart.Base.Enums;
    15. using TigerTrade.Chart.Indicators.Common;
    16. using TigerTrade.Chart.Indicators.Drawings;
    17. using TigerTrade.Chart.Indicators.Drawings.Enums;
    18. using TigerTrade.Chart.Indicators.Enums;
    19. using TigerTrade.Core.Utils.Time;
    20.  
    21. namespace TigerTrade.Chart.Indicators.Custom
    22. {
    23.     [DataContract(Name = "VWAPIndicator", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Indicators.Custom")]
    24.     [Indicator("X_VWAP", "*VWAP", true, Type = typeof(VWAPIndicator))]
    25.     internal sealed class VWAPIndicator : IndicatorBase
    26.     {
    27.         private IndicatorPeriodType _period;
    28.  
    29.         [DataMember(Name = "Period")]
    30.         [Category("Параметры"), DisplayName("Период")]
    31.         public IndicatorPeriodType Period
    32.         {
    33.             get => _period;
    34.             set
    35.             {
    36.                 if (value == _period)
    37.                 {
    38.                     return;
    39.                 }
    40.  
    41.                 _period = value;
    42.  
    43.                 StdDevCache.Clear();
    44.  
    45.                 OnPropertyChanged();
    46.             }
    47.         }
    48.  
    49.         private TimeSpan? _startTime;
    50.  
    51.         [DataMember(Name = "StartTime")]
    52.         [Category("Параметры"), DisplayName("Время")]
    53.         public TimeSpan? StartTime
    54.         {
    55.             get => _startTime;
    56.             set
    57.             {
    58.                 if (value.Equals(_startTime))
    59.                 {
    60.                     return;
    61.                 }
    62.  
    63.                 _startTime = value;
    64.  
    65.                 StdDevCache.Clear();
    66.  
    67.                 OnPropertyChanged();
    68.             }
    69.         }
    70.  
    71.         private IndicatorPriceType _priceType;
    72.  
    73.         [DataMember(Name = "PriceType")]
    74.         [Category("Параметры"), DisplayName("Цена")]
    75.         public IndicatorPriceType PriceType
    76.         {
    77.             get => _priceType;
    78.             set
    79.             {
    80.                 if (value == _priceType)
    81.                 {
    82.                     return;
    83.                 }
    84.  
    85.                 _priceType = value;
    86.  
    87.                 StdDevCache.Clear();
    88.  
    89.                 OnPropertyChanged();
    90.             }
    91.         }
    92.  
    93.         private List<decimal> _stdDevs;
    94.  
    95.         [DataMember(Name = "StdDevs")]
    96.         [Category("Параметры"), DisplayName("StdDevs")]
    97.         public List<decimal> StdDevs
    98.         {
    99.             get => _stdDevs ?? (StdDevs = new List<decimal>());
    100.             set
    101.             {
    102.                 if (Equals(value, _stdDevs))
    103.                 {
    104.                     return;
    105.                 }
    106.  
    107.                 _stdDevs = value;
    108.              
    109.                 OnPropertyChanged();
    110.             }
    111.         }
    112.  
    113.         private ChartSeries _vwapSeries;
    114.  
    115.         [DataMember(Name = "VWAP")]
    116.         [Category("ChartIndicatorsCharts"), DisplayName("VWAP")]
    117.         public ChartSeries VWAPSeries
    118.         {
    119.             get => _vwapSeries ?? (_vwapSeries = new ChartSeries(ChartSeriesType.Line, Colors.Blue));
    120.             private set
    121.             {
    122.                 if (Equals(value, _vwapSeries))
    123.                 {
    124.                     return;
    125.                 }
    126.  
    127.                 _vwapSeries = value;
    128.  
    129.                 OnPropertyChanged();
    130.             }
    131.         }
    132.  
    133.         private ChartSeries _stdDevSeries;
    134.      
    135.         [DataMember(Name = "StdDev")]
    136.         [Category("ChartIndicatorsCharts"), DisplayName("StdDev")]
    137.         public ChartSeries StdDevSeries
    138.         {
    139.             get => _stdDevSeries ?? (_stdDevSeries = new ChartSeries(ChartSeriesType.Line, Colors.Red));
    140.             private set
    141.             {
    142.                 if (Equals(value, _stdDevSeries))
    143.                 {
    144.                     return;
    145.                 }
    146.  
    147.                 _stdDevSeries = value;
    148.  
    149.                 OnPropertyChanged();
    150.             }
    151.         }
    152.  
    153.         public VWAPIndicator()
    154.         {
    155.             Period = IndicatorPeriodType.Day;
    156.  
    157.             StartTime = null;
    158.  
    159.             PriceType = IndicatorPriceType.Median;
    160.  
    161.             StdDevs.Add(1);
    162.             StdDevs.Add(2);
    163.         }
    164.  
    165.         private List<double> _stdDevCache;
    166.      
    167.         private List<double> StdDevCache => _stdDevCache ?? (_stdDevCache = new List<double>(1000));
    168.  
    169.         protected override void Execute()
    170.         {
    171.             var date = Helper.Date;
    172.             var price = Helper.Price(_priceType);
    173.             var vol = Helper.Volume;
    174.  
    175.             var vwap = new double[date.Length];
    176.             var stdDev = new double[date.Length];
    177.             var splits = new bool[date.Length];
    178.  
    179.             var calcStdDevs = StdDevs.Count > 0;
    180.  
    181.             if (date.Length < StdDevCache.Count)
    182.             {
    183.                 StdDevCache.Clear();
    184.             }
    185.  
    186.             var lastSequence = -1;
    187.  
    188.             var cumVolumePrice = 0.0;
    189.             var cumVolume = 0.0;
    190.  
    191.             var newDayIndex = 0;
    192.  
    193.             double timeOffset;
    194.  
    195.             if (StartTime.HasValue)
    196.             {
    197.                 var oaBaseDate = DateTime.FromOADate(0);
    198.  
    199.                 timeOffset = -oaBaseDate.Add(StartTime.Value).ToOADate();
    200.             }
    201.             else
    202.             {
    203.                 timeOffset = TimeHelper.GetSessionOffset(DataProvider.Symbol.Exchange);
    204.             }
    205.  
    206.             for (var i = 0; i < date.Length; i++)
    207.             {
    208.                 var sequence = -1;
    209.  
    210.                 switch (Period)
    211.                 {
    212.                     case IndicatorPeriodType.Day:
    213.  
    214.                         sequence = DataProvider.Period.GetSequence(ChartPeriodType.Day, 1, date[i], timeOffset);
    215.  
    216.                         break;
    217.  
    218.                     case IndicatorPeriodType.Week:
    219.  
    220.                         sequence = DataProvider.Period.GetSequence(ChartPeriodType.Week, 1, date[i], timeOffset);
    221.  
    222.                         break;
    223.  
    224.                     case IndicatorPeriodType.Month:
    225.  
    226.                         sequence = DataProvider.Period.GetSequence(ChartPeriodType.Month, 1, date[i], timeOffset);
    227.  
    228.                         break;
    229.                 }
    230.  
    231.                 if (sequence != lastSequence)
    232.                 {
    233.                     lastSequence = sequence;
    234.  
    235.                     newDayIndex = i;
    236.  
    237.                     cumVolumePrice = 0.0;
    238.                     cumVolume = 0.0;
    239.  
    240.                     splits[i] = true;
    241.                 }
    242.  
    243.                 cumVolumePrice += price[i] * vol[i];
    244.                 cumVolume += vol[i];
    245.  
    246.                 if (cumVolume == 0)
    247.                 {
    248.                     continue;
    249.                 }
    250.  
    251.                 vwap[i] = cumVolumePrice / cumVolume;
    252.  
    253.                 if (calcStdDevs)
    254.                 {
    255.                     if (i < StdDevCache.Count)
    256.                     {
    257.                         stdDev[i] = StdDevCache[i];
    258.                     }
    259.                     else
    260.                     {
    261.                         var variance = 0.0;
    262.  
    263.                         for (var j = newDayIndex; j < i; j++)
    264.                         {
    265.                             variance += (vol[j]/cumVolume)*(price[j] - vwap[i])*(price[j] - vwap[i]);
    266.                         }
    267.  
    268.                         stdDev[i] = Math.Sqrt(variance);
    269.  
    270.                         StdDevCache.Add(stdDev[i]);
    271.                     }
    272.                 }
    273.             }
    274.  
    275.             var vwapSeries = new IndicatorSeriesData(vwap, VWAPSeries)
    276.             {
    277.                 Style =
    278.                 {
    279.                     DisableMinMax = true
    280.                 }
    281.             };
    282.  
    283.             Series.Add(vwapSeries);
    284.  
    285.             if (calcStdDevs)
    286.             {
    287.                 foreach (var dev in StdDevs)
    288.                 {
    289.                     if (dev <= 0)
    290.                     {
    291.                         continue;
    292.                     }
    293.  
    294.                     var stdDevPos = new double[date.Length];
    295.                     var stdDevNeg = new double[date.Length];
    296.  
    297.                     var d = (double) dev;
    298.  
    299.                     for (var i = 0; i < date.Length; i++)
    300.                     {
    301.                         stdDevPos[i] = vwap[i] + stdDev[i] * d;
    302.                         stdDevNeg[i] = vwap[i] - stdDev[i] * d;
    303.                     }
    304.  
    305.                     var stdDevPosSeries = new IndicatorSeriesData(stdDevPos, StdDevSeries)
    306.                     {
    307.                         Style = {DisableMinMax = true}
    308.                     };
    309.  
    310.                     var stdDevNegSeries = new IndicatorSeriesData(stdDevNeg, StdDevSeries)
    311.                     {
    312.                         Style = {DisableMinMax = true}
    313.                     };
    314.  
    315.                     Series.Add(stdDevPosSeries, stdDevNegSeries);
    316.                 }
    317.             }
    318.  
    319.             foreach (var series in Series)
    320.             {
    321.                 series.UserData["S"] = splits;
    322.                 series.UserData["SE"] = false;
    323.             }
    324.         }
    325.  
    326.         public override void ApplyColors(IChartTheme theme)
    327.         {
    328.             VWAPSeries.AllColors = theme.GetNextColor();
    329.             StdDevSeries.AllColors = theme.GetNextColor();
    330.  
    331.             base.ApplyColors(theme);
    332.         }
    333.  
    334.         public override void CopyTemplate(IndicatorBase indicator, bool style)
    335.         {
    336.             var i = (VWAPIndicator)indicator;
    337.  
    338.             Period = i.Period;
    339.             PriceType = i.PriceType;
    340.  
    341.             StdDevs = i.StdDevs.ToList();
    342.  
    343.             VWAPSeries.CopyTheme(i.VWAPSeries);
    344.             StdDevSeries.CopyTheme(i.StdDevSeries);
    345.  
    346.             base.CopyTemplate(indicator, style);
    347.         }
    348.     }
    349. }
     
    #1 Support, 6 июл 2019
    Последнее редактирование: 6 июл 2019