BidAsk

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

  1. Support

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

    Регистрация:
    5 сен 2015
    Сообщения:
    1 047
    Симпатии:
    203
    Код индикатора BidAsk
    1. //------------------------------------------------------------------------------
    2. //
    3. // Индикатор BidAsk. 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.Runtime.Serialization;
    11. using System.Windows;
    12. using System.Windows.Media;
    13. using TigerTrade.Chart.Base;
    14. using TigerTrade.Chart.Indicators.Common;
    15. using TigerTrade.Chart.Indicators.Enums;
    16. using TigerTrade.Dx;
    17.  
    18. namespace TigerTrade.Chart.Indicators.Custom
    19. {
    20.     [DataContract(Name = "BidAskIndicator", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Indicators.Custom")]
    21.     [Indicator("X_BidAsk", "*BidAsk", false, Type = typeof(BidAskIndicator))]
    22.     internal sealed class BidAskIndicator : IndicatorBase
    23.     {
    24.         private XBrush _bidBrush;
    25.  
    26.         private XPen _bidPen;
    27.  
    28.         private XColor _bidColor;
    29.  
    30.         [DataMember(Name = "BidColor")]
    31.         [Category("Стиль"), DisplayName("Цвет Bid")]
    32.         public XColor BidColor
    33.         {
    34.             get => _bidColor;
    35.             set
    36.             {
    37.                 if (value == _bidColor)
    38.                 {
    39.                     return;
    40.                 }
    41.  
    42.                 _bidColor = value;
    43.  
    44.                 _bidBrush = new XBrush(_bidColor);
    45.                 _bidPen = new XPen(_bidBrush, 1);
    46.              
    47.                 OnPropertyChanged();
    48.             }
    49.         }
    50.  
    51.         private XBrush _askBrush;
    52.  
    53.         private XPen _askPen;
    54.  
    55.         private XColor _askColor;
    56.  
    57.         [DataMember(Name = "AskColor")]
    58.         [Category("Стиль"), DisplayName("Цвет Ask")]
    59.         public XColor AskColor
    60.         {
    61.             get => _askColor;
    62.             set
    63.             {
    64.                 if (value == _askColor)
    65.                 {
    66.                     return;
    67.                 }
    68.  
    69.                 _askColor = value;
    70.  
    71.                 _askBrush = new XBrush(_askColor);
    72.                 _askPen = new XPen(_askBrush, 1);
    73.              
    74.                 OnPropertyChanged();
    75.             }
    76.         }
    77.  
    78.         [Browsable(false)]
    79.         public override IndicatorCalculation Calculation => IndicatorCalculation.OnEachTick;
    80.  
    81.         public override bool IntegerValues => true;
    82.  
    83.         public BidAskIndicator()
    84.         {
    85.             BidColor = Color.FromArgb(255, 178, 34, 34);
    86.             AskColor = Color.FromArgb(255, 30, 144, 255);
    87.         }
    88.  
    89.         protected override void Execute()
    90.         {
    91.         }
    92.  
    93.         public override void Render(DxVisualQueue visual)
    94.         {
    95.             var zeroPoint = GetY(0.0);
    96.  
    97.             var width = Math.Max(Canvas.ColumnWidth - 1, 1);
    98.  
    99.             for (var i = 0; i < Canvas.Count; i++)
    100.             {
    101.                 var index = Canvas.GetIndex(i);
    102.  
    103.                 var cluster = DataProvider.GetCluster(index);
    104.  
    105.                 if (cluster == null)
    106.                 {
    107.                     continue;
    108.                 }
    109.  
    110.                 // Bid
    111.  
    112.                 var x = Canvas.GetX(index);
    113.                 var y = GetY(-cluster.Bid);
    114.                 var h = (int)zeroPoint - (int)y;
    115.  
    116.                 if (h < 0.0)
    117.                 {
    118.                     y += h;
    119.                     h = -h;
    120.                 }
    121.  
    122.                 if (h < 1)
    123.                 {
    124.                     y = (int)zeroPoint;
    125.                     h = 1;
    126.                 }
    127.  
    128.                 h = Math.Max(1, h);
    129.  
    130.                 if (width > 1.0)
    131.                 {
    132.                     visual.FillRectangle(_bidBrush, new Rect(x - width / 2.0, y, width, h));
    133.                 }
    134.                 else
    135.                 {
    136.                     visual.DrawLine(_bidPen, x, y, x, y + h);
    137.                 }
    138.  
    139.                 // Ask
    140.  
    141.                 y = GetY(cluster.Ask);
    142.                 h = (int)zeroPoint - (int)y;
    143.  
    144.                 if (h < 0.0)
    145.                 {
    146.                     y += h;
    147.                     h = -h;
    148.                 }
    149.  
    150.                 if (h < 1)
    151.                 {
    152.                     y = (int)zeroPoint - 1;
    153.                     h = 1;
    154.                 }
    155.  
    156.                 h = Math.Max(1, h);
    157.  
    158.                 if (width > 1.0)
    159.                 {
    160.                     visual.FillRectangle(_askBrush, new Rect(x - width / 2.0, y, width, h));
    161.                 }
    162.                 else
    163.                 {
    164.                     visual.DrawLine(_askPen, x, y, x, y + h);
    165.                 }
    166.             }
    167.         }
    168.  
    169.         public override bool GetMinMax(out double min, out double max)
    170.         {
    171.             var bid = 0.0;
    172.             var ask = 0.0;
    173.  
    174.             for (var i = 0; i < Canvas.Count; i++)
    175.             {
    176.                 var index = Canvas.GetIndex(i);
    177.  
    178.                 var cluster = DataProvider.GetCluster(index);
    179.  
    180.                 if (cluster == null)
    181.                 {
    182.                     continue;
    183.                 }
    184.  
    185.                 bid = Math.Max(bid, (double)cluster.Bid);
    186.                 ask = Math.Max(ask, (double)cluster.Ask);
    187.             }
    188.  
    189.             max = ask;
    190.             min = -bid;
    191.  
    192.             return true;
    193.         }
    194.  
    195.         public override List<IndicatorValueInfo> GetValues(int cursorPos)
    196.         {
    197.             var info = new List<IndicatorValueInfo>();
    198.  
    199.             var cluster = DataProvider.GetCluster(cursorPos);
    200.  
    201.             if (cluster == null)
    202.             {
    203.                 return info;
    204.             }
    205.  
    206.             info.Clear();
    207.  
    208.             var sBid = Canvas.FormatValue((double)cluster.Bid);
    209.  
    210.             info.Add(new IndicatorValueInfo(sBid, BidColor));
    211.  
    212.             var sAsk = Canvas.FormatValue((double)cluster.Ask);
    213.  
    214.             info.Add(new IndicatorValueInfo(sAsk, AskColor));
    215.  
    216.             return info;
    217.         }
    218.  
    219.         public override void GetLabels(ref List<IndicatorLabelInfo> labels)
    220.         {
    221.             if (DataProvider.Count <= Canvas.Start)
    222.             {
    223.                 return;
    224.             }
    225.  
    226.             var cluster = DataProvider.GetCluster(DataProvider.Count - 1 - Canvas.Start);
    227.  
    228.             if (cluster == null)
    229.             {
    230.                 return;
    231.             }
    232.  
    233.             labels.Add(new IndicatorLabelInfo((double)cluster.Bid, BidColor));
    234.             labels.Add(new IndicatorLabelInfo((double)cluster.Ask, AskColor));
    235.         }
    236.  
    237.         public override bool CheckAlert(double value, int distance, ref int lastIndex, ref double lastValue)
    238.         {
    239.             if (DataProvider.Count == lastIndex && value == lastValue)
    240.             {
    241.                 return false;
    242.             }
    243.  
    244.             var cluster = DataProvider.GetCluster(DataProvider.Count - 1);
    245.  
    246.             if (cluster == null)
    247.             {
    248.                 return false;
    249.             }
    250.  
    251.             var result = false;
    252.  
    253.             if (value > 0 && (double)cluster.Ask >= value - distance)
    254.             {
    255.                 result = true;
    256.             }
    257.             else if (value < 0 && (double)cluster.Bid <= value + distance)
    258.             {
    259.                 result = true;
    260.             }
    261.  
    262.             if (result == false)
    263.             {
    264.                 return false;
    265.             }
    266.  
    267.             lastIndex = DataProvider.Count;
    268.             lastValue = value;
    269.  
    270.             return true;
    271.         }
    272.  
    273.         public override void ApplyColors(IChartTheme theme)
    274.         {
    275.             BidColor = theme.PaletteColor7;
    276.             AskColor = theme.PaletteColor6;
    277.  
    278.             base.ApplyColors(theme);
    279.         }
    280.  
    281.         public override void CopyTemplate(IndicatorBase indicator, bool style)
    282.         {
    283.             var i = (BidAskIndicator)indicator;
    284.  
    285.             BidColor = i.BidColor;
    286.             AskColor = i.AskColor;
    287.  
    288.             base.CopyTemplate(indicator, style);
    289.         }
    290.     }
    291. }
     
    #1 Support, 6 июл 2019
    Последнее редактирование: 6 июл 2019