Tiger.com Windows Wiki
Русский
Русский
  • 👋Добро пожаловать
  • ⭐C чего начать?
    • Рекомендуемые системные требования
    • Регистрация и установка
    • Лицензии и логин
  • ⚙️Настройки
    • Рабочее пространство
    • Режимы торговли
    • Подключения
      • Криптобиржи
        • TigerX
        • Binance via Tiger.com Broker
        • Bybit via Tiger.com Broker
        • Binance
        • Bitfinex
        • BitMEX
        • Bybit
        • OKX
        • Gate.io
        • MEXC
      • Торговые терминалы
        • DataFeed
        • MetaTrader 5
        • OEC Trader (GAIN Capital)
        • Rithmic
        • QUIK
        • SmartCOM
        • Trader WorkStation (Interactive Brokers)
        • Transaq Connector
      • Прокси
        • Настройка прокси
        • Подключение сервисов терминала через прокси
    • Основные действия
      • Выбор инструмента
      • Выбор периода (таймфрейма)
      • Линковка окон
      • Установка сигнальных уровней
    • Терминал
      • Конфигурация
      • Основные настройки
      • Настройки стакана
      • Горячие клавиши
      • Звуковые сигналы
      • Параметры Telegram
      • Параметры почты
      • Инструменты
  • 📈Торговля
    • Выбор торгового счета
    • Размеры ордеров по умолчанию
    • Выбор объема заявки
    • Какие типы ордеров доступны в Tiger.com?
    • Работа с торговым модулем
    • Параметры защитной стратегии
    • Настройка отступов
    • Спотовая торговля в терминале Tiger.com
    • Как настроить отображение ордеров и позиций в валюте котирования?
  • 🖥️Окна
    • График
      • Чем отличается загрузка графиков с биржи и с серверов Tiger.com?
      • Настройка панелей
      • Тема Графика
      • Параметры Графика
      • Масштабирование и перемещение графика
      • Кластеры
      • Кластерные пресеты
      • Графические объекты в окне График
        • Текст
        • Линейка
        • Профиль объёма
        • Угол тренда
        • Elliott Correction Wave
        • Elliott Impulse Wave
        • Fibonacci Fan
        • Fibonacci Extensions
        • Fibonacci Retracement
        • Fibonacci Time Zones
        • Linear Regression
      • Основные индикаторы окна График
        • Bar Search
        • Bar Timer
        • Bid Ask
        • Big Trades
        • BW MFI
        • Cluster Search
        • Cluster Statistic
        • Cumulative Delta
        • Delta
        • Depth Of Market
        • Dynamic Levels
        • Elders Force Index
        • External Chart
        • Gradient
        • Heatmap
        • High Low
        • Histogram
        • Ichimoku
        • Margin Zones
        • Maximum Levels
        • Open Interest
        • Price
        • Session Color
        • Trades Flow
        • Volume
        • Volume Profiles
        • VWAP
        • Weis Wave Volume
        • ZigZag
    • Стакан
      • Выбор торгового счёта
      • Линейка
      • Мультипликатор
      • Параметры окна стакан
        • Основные
        • Кластер
        • Торговля
      • Стоп-лосс
      • Тейк-профит
      • Триггерные заявки
    • Котировки
      • Фильтрация котировок
    • Лента сделок
    • Статистика
    • Поиск объема
    • Все цены
    • Доска опционов
    • Крипто скринер
  • 📋Таблицы
    • Заявки
    • Сделки
    • Позиции
    • Позиции ТТ
    • Счета
    • Лимиты
    • Плеер
    • Сигналы
    • Журнал
    • Серверные алерты
  • 📽️Обучающие видео
    • Основы работы с терминалом
    • Графики и технический анализ
    • Стакан, Лента сделок и Плеер
    • Торговля через терминал
  • 💡Версии терминала
    • Версия 7.0 Beta
    • Версия 6.9
    • Версия 6.8
    • Версия 6.7.1
    • Версия 6.7
    • Версия 6.6
    • Версия 6.5
    • Версия 6.4
    • Версия 6.3
    • Версия 6.2
    • Версия 6.1
    • Версия 6.0.2
    • Версия 6.0.1
    • Версия 6.0
    • Версия 5.0.7
    • Версия 4.5.15
    • Версия 4.4.7
    • Версия 4.4.1
    • Версия 4.3.1
    • Версия 4.2.1
    • Версия 4.1.2
    • Версия 4.1.1
    • Версия 4.1
    • Версия 4.0.5
    • Версия 4.0.4
    • Версия 4.0.3
    • Версия 4.0.2
    • Версия 4.0.1
    • Версия 4.0
    • Версия 3.0.5
    • Версия 3.0.4
    • Версия 3.0.3
    • Версия 3.0.2
    • Версия 3.0.1
  • ⌨️Разработка для Tiger.com Windows
    • Примеры индикаторов
      • Trades Flow
      • Depth Of Market
      • Volume Profiles
      • Cluster Search
      • Bar Search
      • Bar Timer
      • VWAP
      • Volume
      • Trades
      • Session Color
      • Open Interest
      • Dynamic Levels
      • Delta
      • Cumulative Delta
      • Cluster Statistic
      • Bid Ask
      • External Chart
      • High Low
      • Histogram
    • Примеры источников
      • Moving Average
      • Stock
    • Примеры графических объектов
      • Fibonacci Extensions
      • Fibonacci Retracement
      • Вертикальная линия
      • Горизонтальная линия
      • Профиль объёма
      • Прямоугольник
  • ❓Часто задаваемые вопросы
    • Вопросы по лицензиям
    • Вопросы по индикаторам
    • Вопросы по подключениям
    • Вопросы по торговле
    • Ошибка выставления заявки
    • Как стабилизировать подключение к бирже?
    • Зачем настраивать комиссию в терминале?
    • Как оптимизировать терминал для улучшения производительности?
    • Как воспользоваться криптовалютной лицензией для торговли на Binance?
    • Как настроить автообновление графиков при подключении к QUIK?
    • Как работает автовыбор типа данных?
    • Не получается установить терминал
    • Подойдёт ли моя система для установки терминала?
    • Как настроить соединение с отправкой через прокси только ордеров без потока биржевых данных?
    • Как предоставить протоколы работы терминала Tiger.com для исследования нашей командой?
    • Как настроить DNS-сервер для более стабильного соединения?
    • Как работает определение жизни плотностей в стакане?
    • Ошибка "Нет соединения" при запуске терминала
    • Как настроить отображение стакана в валюте котирования?
  • 📬Техническая поддержка
  • 💭Предложить улучшение
Powered by GitBook
On this page
  1. Разработка для Tiger.com Windows
  2. Примеры индикаторов

Delta

//------------------------------------------------------------------------------
//
// Индикатор Delta. Copyright (c) 2023 Tiger Trade Capital AG. All rights reserved.
//
//------------------------------------------------------------------------------
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Windows;
using System.Windows.Media;
using TigerTrade.Chart.Alerts;
using TigerTrade.Chart.Base;
using TigerTrade.Chart.Indicators.Common;
using TigerTrade.Chart.Indicators.Enums;
using TigerTrade.Core.UI.Converters;
using TigerTrade.Dx;
 
namespace TigerTrade.Chart.Indicators.Custom
{
    [TypeConverter(typeof(EnumDescriptionTypeConverter))]
    [DataContract(Name = "DeltaViewType", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Indicators.Custom")]
    public enum DeltaViewType
    {
        [EnumMember(Value = "Columns"), Description("Колонки")]
        Columns,
        [EnumMember(Value = "Candles"), Description("Свечи")]
        Candles
    }
 
    [DataContract(Name = "DeltaIndicator", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Indicators.Custom")]
    [Indicator("X_Delta", "*Delta", false, Type = typeof(DeltaIndicator))]
    internal sealed class DeltaIndicator : IndicatorBase
    {
        private XBrush _deltaPlusBrush;
 
        private XPen _deltaPlusPen;
 
        private XColor _deltaPlusColor;
 
        [DataMember(Name = "DeltaPlusColor")]
        [Category("Стиль"), DisplayName("Delta+")]
        public XColor DeltaPlusColor
        {
            get => _deltaPlusColor;
            set
            {
                if (value == _deltaPlusColor)
                {
                    return;
                }
 
                _deltaPlusColor = value;
 
                _deltaPlusBrush = new XBrush(_deltaPlusColor);
 
                _deltaPlusPen = new XPen(_deltaPlusBrush, 1);
 
                OnPropertyChanged();
            }
        }
 
        private XBrush _deltaMinusBrush;
 
        private XPen _deltaMinusPen;
 
        private XColor _deltaMinusColor;
 
        [DataMember(Name = "DeltaMinusColor")]
        [Category("Стиль"), DisplayName("Delta-")]
        public XColor DeltaMinusColor
        {
            get => _deltaMinusColor;
            set
            {
                if (value == _deltaMinusColor)
                {
                    return;
                }
 
                _deltaMinusColor = value;
 
                _deltaMinusBrush = new XBrush(_deltaMinusColor);
 
                _deltaMinusPen = new XPen(_deltaMinusBrush, 1);
 
                OnPropertyChanged();
            }
        }
 
        private DeltaViewType _type;
 
        [DataMember(Name = "DeltaType"), DefaultValue(DeltaViewType.Columns)]
        [Category("Параметры"), DisplayName("Тип")]
        public DeltaViewType Type
        {
            get => _type;
            set
            {
                if (value == _type)
                {
                    return;
                }
 
                _type = value;
 
                OnPropertyChanged();
            }
        }
 
        private bool _minimize;
 
        [DataMember(Name = "Minimize"), DefaultValue(false)]
        [Category("Параметры"), DisplayName("Минимизировать")]
        public bool Minimize
        {
            get => _minimize;
            set
            {
                if (value == _minimize)
                {
                    return;
                }
 
                _minimize = value;
 
                OnPropertyChanged();
            }
        }
 
        private IndicatorNullIntParam _maxDeltaParam;
 
        [DataMember(Name = "MaxDeltaParam")]
        public IndicatorNullIntParam MaxDeltaParam
        {
            get => _maxDeltaParam ?? (_maxDeltaParam = new IndicatorNullIntParam(null));
            set => _maxDeltaParam = value;
        }
 
        [DefaultValue(null)]
        [Category("Параметры"), DisplayName("Макс. дельта")]
        public int? MaxDelta
        {
            get => MaxDeltaParam.Get(SettingsLongKey);
            set
            {
                if (!MaxDeltaParam.Set(SettingsLongKey, value, 0))
                {
                    return;
                }
 
                OnPropertyChanged();
            }
        }
 
        private IndicatorNullIntParam _filter1MinParam;
 
        [DataMember(Name = "Filter1MinParam")]
        public IndicatorNullIntParam Filter1MinParam
        {
            get => _filter1MinParam ?? (_filter1MinParam = new IndicatorNullIntParam(null));
            set => _filter1MinParam = value;
        }
 
        [DefaultValue(null)]
        [Category("Фильтр 1"), DisplayName("Минимум")]
        public int? Filter1Min
        {
            get => Filter1MinParam.Get(SettingsLongKey);
            set
            {
                if (!Filter1MinParam.Set(SettingsLongKey, value, 0))
                {
                    return;
                }
 
                OnPropertyChanged();
            }
        }
 
        private IndicatorNullIntParam _filter1MaxParam;
 
        [DataMember(Name = "Filter1MaxParam")]
        public IndicatorNullIntParam Filter1MaxParam
        {
            get => _filter1MaxParam ?? (_filter1MaxParam = new IndicatorNullIntParam(null));
            set => _filter1MaxParam = value;
        }
 
        [DefaultValue(null)]
        [Category("Фильтр 1"), DisplayName("Максимум")]
        public int? Filter1Max
        {
            get => Filter1MaxParam.Get(SettingsLongKey);
            set
            {
                if (!Filter1MaxParam.Set(SettingsLongKey, value, 0))
                {
                    return;
                }
 
                OnPropertyChanged();
            }
        }
 
        private XBrush _filter1PlusBrush;
 
        private XPen _filter1PlusPen;
 
        private XColor _filter1PlusColor;
 
        [DataMember(Name = "Filter1PlusColor")]
        [Category("Фильтр 1"), DisplayName("Цвет+")]
        public XColor Filter1PlusColor
        {
            get => _filter1PlusColor;
            set
            {
                if (value == _filter1PlusColor)
                {
                    return;
                }
 
                _filter1PlusColor = value;
 
                _filter1PlusBrush = new XBrush(_filter1PlusColor);
                _filter1PlusPen = new XPen(_filter1PlusBrush, 1);
 
                OnPropertyChanged();
            }
        }
 
        private XBrush _filter1MinusBrush;
 
        private XPen _filter1MinusPen;
 
        private XColor _filter1MinusColor;
 
        [DataMember(Name = "Filter1MinusColor")]
        [Category("Фильтр 1"), DisplayName("Цвет-")]
        public XColor Filter1MinusColor
        {
            get => _filter1MinusColor;
            set
            {
                if (value == _filter1MinusColor)
                {
                    return;
                }
 
                _filter1MinusColor = value;
 
                _filter1MinusBrush = new XBrush(_filter1MinusColor);
                _filter1MinusPen = new XPen(_filter1MinusBrush, 1);
 
                OnPropertyChanged();
            }
        }
 
        private ChartAlertSettings _filter1Alert;
 
        [DataMember(Name = "Filter1Alert")]
        [Category("Фильтр 1"), DisplayName("Оповещение")]
        public ChartAlertSettings Filter1Alert
        {
            get => _filter1Alert ?? (_filter1Alert = new ChartAlertSettings());
            set
            {
                if (Equals(value, _filter1Alert))
                {
                    return;
                }
 
                _filter1Alert = value;
 
                OnPropertyChanged();
            }
        }
 
        private IndicatorNullIntParam _filter2MinParam;
 
        [DataMember(Name = "Filter2MinParam")]
        public IndicatorNullIntParam Filter2MinParam
        {
            get => _filter2MinParam ?? (_filter2MinParam = new IndicatorNullIntParam(null));
            set => _filter2MinParam = value;
        }
 
        [DefaultValue(null)]
        [Category("Фильтр 2"), DisplayName("Минимум")]
        public int? Filter2Min
        {
            get => Filter2MinParam.Get(SettingsLongKey);
            set
            {
                if (!Filter2MinParam.Set(SettingsLongKey, value, 0))
                {
                    return;
                }
 
                OnPropertyChanged();
            }
        }
 
        private IndicatorNullIntParam _filter2MaxParam;
 
        [DataMember(Name = "Filter2MaxParam")]
        public IndicatorNullIntParam Filter2MaxParam
        {
            get => _filter2MaxParam ?? (_filter2MaxParam = new IndicatorNullIntParam(null));
            set => _filter2MaxParam = value;
        }
 
        [DefaultValue(null)]
        [Category("Фильтр 2"), DisplayName("Максимум")]
        public int? Filter2Max
        {
            get => Filter2MaxParam.Get(SettingsLongKey);
            set
            {
                if (!Filter2MaxParam.Set(SettingsLongKey, value, 0))
                {
                    return;
                }
 
                OnPropertyChanged();
            }
        }
 
        private XBrush _filter2PlusBrush;
 
        private XPen _filter2PlusPen;
 
        private XColor _filter2PlusColor;
 
        [DataMember(Name = "Filter2PlusColor")]
        [Category("Фильтр 2"), DisplayName("Цвет+")]
        public XColor Filter2PlusColor
        {
            get => _filter2PlusColor;
            set
            {
                if (value == _filter2PlusColor)
                {
                    return;
                }
 
                _filter2PlusColor = value;
 
                _filter2PlusBrush = new XBrush(_filter2PlusColor);
                _filter2PlusPen = new XPen(_filter2PlusBrush, 1);
 
                OnPropertyChanged();
            }
        }
 
        private XBrush _filter2MinusBrush;
 
        private XPen _filter2MinusPen;
 
        private XColor _filter2MinusColor;
 
        [DataMember(Name = "Filter2MinusColor")]
        [Category("Фильтр 2"), DisplayName("Цвет-")]
        public XColor Filter2MinusColor
        {
            get => _filter2MinusColor;
            set
            {
                if (value == _filter2MinusColor)
                {
                    return;
                }
 
                _filter2MinusColor = value;
 
                _filter2MinusBrush = new XBrush(_filter2MinusColor);
                _filter2MinusPen = new XPen(_filter2MinusBrush, 1);
 
                OnPropertyChanged();
            }
        }
 
        private ChartAlertSettings _filter2Alert;
 
        [DataMember(Name = "Filter2Alert")]
        [Category("Фильтр 2"), DisplayName("Оповещение")]
        public ChartAlertSettings Filter2Alert
        {
            get => _filter2Alert ?? (_filter2Alert = new ChartAlertSettings());
            set
            {
                if (Equals(value, _filter2Alert))
                {
                    return;
                }
 
                _filter2Alert = value;
 
                OnPropertyChanged();
            }
        }
 
        private IndicatorNullIntParam _filter3MinParam;
 
        [DataMember(Name = "Filter3MinParam")]
        public IndicatorNullIntParam Filter3MinParam
        {
            get => _filter3MinParam ?? (_filter3MinParam = new IndicatorNullIntParam(null));
            set => _filter3MinParam = value;
        }
 
        [DefaultValue(null)]
        [Category("Фильтр 3"), DisplayName("Минимум")]
        public int? Filter3Min
        {
            get => Filter3MinParam.Get(SettingsLongKey);
            set
            {
                if (!Filter3MinParam.Set(SettingsLongKey, value, 0))
                {
                    return;
                }
 
                OnPropertyChanged();
            }
        }
 
        private IndicatorNullIntParam _filter3MaxParam;
 
        [DataMember(Name = "Filter3MaxParam")]
        public IndicatorNullIntParam Filter3MaxParam
        {
            get => _filter3MaxParam ?? (_filter3MaxParam = new IndicatorNullIntParam(null));
            set => _filter3MaxParam = value;
        }
 
        [DefaultValue(null)]
        [Category("Фильтр 3"), DisplayName("Максимум")]
        public int? Filter3Max
        {
            get => Filter3MaxParam.Get(SettingsLongKey);
            set
            {
                if (!Filter3MaxParam.Set(SettingsLongKey, value, 0))
                {
                    return;
                }
 
                OnPropertyChanged();
            }
        }
 
        private XBrush _filter3PlusBrush;
 
        private XPen _filter3PlusPen;
 
        private XColor _filter3PlusColor;
 
        [DataMember(Name = "Filter3PlusColor")]
        [Category("Фильтр 3"), DisplayName("Цвет+")]
        public XColor Filter3PlusColor
        {
            get => _filter3PlusColor;
            set
            {
                if (value == _filter3PlusColor)
                {
                    return;
                }
 
                _filter3PlusColor = value;
 
                _filter3PlusBrush = new XBrush(_filter3PlusColor);
                _filter3PlusPen = new XPen(_filter3PlusBrush, 1);
 
                OnPropertyChanged();
            }
        }
 
        private XBrush _filter3MinusBrush;
 
        private XPen _filter3MinusPen;
 
        private XColor _filter3MinusColor;
 
        [DataMember(Name = "Filter3MinusColor")]
        [Category("Фильтр 3"), DisplayName("Цвет-")]
        public XColor Filter3MinusColor
        {
            get => _filter3MinusColor;
            set
            {
                if (value == _filter3MinusColor)
                {
                    return;
                }
 
                _filter3MinusColor = value;
 
                _filter3MinusBrush = new XBrush(_filter3MinusColor);
                _filter3MinusPen = new XPen(_filter3MinusBrush, 1);
 
                OnPropertyChanged();
            }
        }
 
        private ChartAlertSettings _filter3Alert;
 
        [DataMember(Name = "Filter3Alert")]
        [Category("Фильтр 3"), DisplayName("Оповещение")]
        public ChartAlertSettings Filter3Alert
        {
            get => _filter3Alert ?? (_filter3Alert = new ChartAlertSettings());
            set
            {
                if (Equals(value, _filter3Alert))
                {
                    return;
                }
 
                _filter3Alert = value;
 
                OnPropertyChanged();
            }
        }
 
        [Browsable(false)]
        public override IndicatorCalculation Calculation => IndicatorCalculation.OnEachTick;
 
        public override bool IntegerValues => true;
 
        private int _filter1SignalIndex;
        private int _filter2SignalIndex;
        private int _filter3SignalIndex;
 
        public DeltaIndicator()
        {
            DeltaPlusColor = Color.FromArgb(255, 30, 144, 255);
            DeltaMinusColor = Color.FromArgb(255, 178, 34, 34);
 
            Type = DeltaViewType.Columns;
 
            Minimize = false;
 
            Filter1PlusColor = Colors.Orange;
            Filter1MinusColor = Colors.Orange;
 
            Filter2PlusColor = Colors.Orange;
            Filter2MinusColor = Colors.Orange;
 
            Filter3PlusColor = Colors.Orange;
            Filter3MinusColor = Colors.Orange;
 
            _filter1SignalIndex = -1;
            _filter2SignalIndex = -1;
            _filter3SignalIndex = -1;
        }
 
        protected override void Execute()
        {
            if (ClearData)
            {
                _filter1SignalIndex = -1;
                _filter2SignalIndex = -1;
                _filter3SignalIndex = -1;
            }
 
            var index = DataProvider.Count;
 
            var cluster = DataProvider.GetCluster(index - 1);
 
            if (cluster == null)
            {
                return;
            }
 
            var realDelta = cluster.Delta;
            var absDelta = Math.Abs(realDelta);
 
            if (Filter1Alert.IsActive && _filter1SignalIndex < index)
            {
                var min = Filter1Min ?? -1;
                var max = Filter1Max ?? -1;
 
                if (min >= 0 && absDelta >= min && (max < 0 || absDelta <= max))
                {
                    _filter1SignalIndex = index;
 
                    AddAlert(Filter1Alert,
                        $"Delta: фильтр 1, значение {DataProvider.Symbol.FormatSizeFull(realDelta)}.");
                }
            }
 
            if (Filter2Alert.IsActive && _filter2SignalIndex < index)
            {
                var min = Filter2Min ?? -1;
                var max = Filter2Max ?? -1;
 
                if (min >= 0 && absDelta >= min && (max < 0 || absDelta <= max))
                {
                    _filter2SignalIndex = index;
 
                    AddAlert(Filter2Alert,
                        $"Delta: фильтр 2, значение {DataProvider.Symbol.FormatSizeFull(realDelta)}.");
                }
            }
 
            if (Filter3Alert.IsActive && _filter3SignalIndex < index)
            {
                var min = Filter3Min ?? -1;
                var max = Filter3Max ?? -1;
 
                if (min >= 0 && absDelta >= min && (max < 0 || absDelta <= max))
                {
                    _filter3SignalIndex = index;
 
                    AddAlert(Filter3Alert,
                        $"Delta: фильтр 3, значение {DataProvider.Symbol.FormatSizeFull(realDelta)}.");
                }
            }
        }
 
        public override bool GetMinMax(out double min, out double max)
        {
            min = double.MaxValue;
            max = double.MinValue;
 
            if (Type == DeltaViewType.Candles)
            {
                for (var i = 0; i < Canvas.Count; i++)
                {
                    var index = Canvas.GetIndex(i);
 
                    var cluster = DataProvider.GetCluster(index);
 
                    if (cluster == null || cluster.Delta == 0)
                    {
                        continue;
                    }
 
                    var deltaHigh = (double)cluster.DeltaHigh;
                    var deltaLow = (double)cluster.DeltaLow;
 
                    if (Minimize && cluster.Delta < 0)
                    {
                        max = Math.Max(max, -deltaLow);
                        min = Math.Min(min, -deltaHigh);
 
                    }
                    else
                    {
                        min = Math.Min(min, deltaLow);
                        max = Math.Max(max, deltaHigh);
                    }
                }
            }
            else
            {
                for (var i = 0; i < Canvas.Count; i++)
                {
                    var index = Canvas.GetIndex(i);
 
                    var cluster = DataProvider.GetCluster(index);
 
                    if (cluster == null || cluster.Delta == 0)
                    {
                        continue;
                    }
 
                    var delta = (double)cluster.Delta;
 
                    if (Minimize)
                    {
                        max = Math.Max(max, Math.Abs(delta));
                    }
                    else
                    {
                        min = Math.Min(min, delta);
                        max = Math.Max(max, delta);
                    }
                }
 
                if (Minimize)
                {
                    min = 0.0;
                }
            }
 
            var maxDelta = MaxDelta ?? -1;
 
            if (maxDelta >= 0 && max > maxDelta)
            {
                max = maxDelta;
            }
 
            if (maxDelta >= 0 && min < -maxDelta)
            {
                min = -maxDelta;
            }
 
            return true;
        }
 
        public override void Render(DxVisualQueue visual)
        {
            var min1 = Filter1Min ?? -1;
            var max1 = Filter1Max ?? -1;
            var min2 = Filter2Min ?? -1;
            var max2 = Filter2Max ?? -1;
            var min3 = Filter3Min ?? -1;
            var max3 = Filter3Max ?? -1;
 
            var maxDelta = MaxDelta ?? -1;
            var maxPoint = (int)GetY((double)maxDelta);
            var minPoint = (int)GetY((double)-maxDelta);
 
            var zeroPoint = (int)GetY(0.0);
 
            switch (Type)
            {
                case DeltaViewType.Candles:
                    {
                        var width = (int)(Canvas.ColumnWidth * Canvas.ColumnPercent + 0.4);
                        var halfWith = Math.Max((int)(width / 2.0), 1.0);
 
                        var openY = zeroPoint;
 
                        for (var i = 0; i < Canvas.Count; i++)
                        {
                            var index = Canvas.GetIndex(i);
 
                            var cluster = DataProvider.GetCluster(index);
 
                            if (cluster == null || cluster.Delta == 0)
                            {
                                continue;
                            }
 
                            var delta = cluster.Delta;
 
                            var isUp = delta > 0;
 
                            var centerX = (int)Canvas.GetX(index);
                            var highY = (int)GetY(cluster.DeltaHigh);
                            var lowY = (int)GetY(cluster.DeltaLow);
                            var closeY = (int)GetY(delta);
 
                            if (Minimize && delta < 0)
                            {
                                highY = (int) GetY(-cluster.DeltaLow);
                                lowY = (int) GetY(-cluster.DeltaHigh);
                                closeY = (int) GetY(-delta);
                            }
 
                            if (maxDelta >= 0)
                            {
                                if (delta > 0 || Minimize)
                                {
                                    closeY = Math.Max(closeY, maxPoint);
                                    highY = Math.Max(highY, maxPoint);
                                    lowY = Math.Min(lowY, minPoint);
                                }
                                else
                                {
                                    closeY = Math.Min(closeY, minPoint);
                                    highY = Math.Max(highY, maxPoint);
                                    lowY = Math.Min(lowY, minPoint);
                                }
                            }
 
                            var topY = Math.Min(openY, closeY);
                            var bottomY = Math.Max(openY, closeY);
 
                            var height = bottomY - topY;
 
                            var backBrush = isUp ? _deltaPlusBrush : _deltaMinusBrush;
                            var backPen = isUp ? _deltaPlusPen : _deltaMinusPen;
 
                            var absDelta = Math.Abs(delta);
 
                            if (min1 >= 0 && absDelta >= min1 && (max1 < 0 || absDelta <= max1))
                            {
                                if (delta > 0)
                                {
                                    backBrush = _filter1PlusBrush;
                                    backPen = _filter1PlusPen;
                                }
                                else
                                {
                                    backBrush = _filter1MinusBrush;
                                    backPen = _filter1MinusPen;
                                }
                            }
                            else if (min2 >= 0 && absDelta >= min2 && (max2 < 0 || absDelta <= max2))
                            {
                                if (delta > 0)
                                {
                                    backBrush = _filter2PlusBrush;
                                    backPen = _filter2PlusPen;
                                }
                                else
                                {
                                    backBrush = _filter2MinusBrush;
                                    backPen = _filter2MinusPen;
                                }
                            }
                            else if (min3 >= 0 && absDelta >= min3 && (max3 < 0 || absDelta <= max3))
                            {
                                if (delta > 0)
                                {
                                    backBrush = _filter3PlusBrush;
                                    backPen = _filter3PlusPen;
                                }
                                else
                                {
                                    backBrush = _filter3MinusBrush;
                                    backPen = _filter3MinusPen;
                                }
                            }
 
                            if (height == 0 || width <= 1)
                            {
                                if (highY == lowY)
                                {
                                    lowY++;
                                }
 
                                visual.DrawLine(backPen,
                                        new Point(centerX, highY),
                                        new Point(centerX, lowY));
                            }
                            else
                            {
                                visual.DrawLine(backPen,
                                    new Point(centerX, highY),
                                    new Point(centerX, topY));
 
                                visual.DrawLine(backPen,
                                    new Point(centerX, bottomY),
                                    new Point(centerX, lowY));
                            }
 
                            if (width > 1)
                            {
                                if (height == 0)
                                {
                                    visual.DrawLine(backPen,
                                        new Point(centerX - halfWith, topY),
                                        new Point(centerX + halfWith + 1, topY));
                                }
                                else
                                {
                                    visual.FillRectangle(backBrush,
                                        new Rect(centerX - halfWith, topY, halfWith*2 + 1, height));
                                }
                            }
                        }
                    }
 
                    break;
 
                case DeltaViewType.Columns:
                    {
                        var width = Math.Max(Canvas.ColumnWidth - 1, 1);
 
                        for (var i = 0; i < Canvas.Count; i++)
                        {
                            var index = Canvas.GetIndex(i);
 
                            var cluster = DataProvider.GetCluster(index);
 
                            if (cluster == null || cluster.Delta == 0)
                            {
                                continue;
                            }
 
                            var delta = cluster.Delta;
 
                            var x = Canvas.GetX(index);
                            var y = GetY(Minimize ? Math.Abs(delta) : delta);
 
                            if (maxDelta >= 0)
                            {
                                if (Minimize)
                                {
                                    y = Math.Max(y, maxPoint);
                                }
                                else
                                {
                                    y = delta > 0 ? Math.Max(y, maxPoint) : Math.Min(y, minPoint);
                                }
                            }
 
                            var h = zeroPoint - (int)y;
 
                            if (h < 0.0)
                            {
                                y += h;
                                h = -h;
                            }
 
                            if (Minimize || delta > 0)
                            {
                                if (h < 1)
                                {
                                    y = zeroPoint - 1;
                                    h = 1;
                                }
                            }
                            else
                            {
                                if (h < 1)
                                {
                                    y = zeroPoint;
                                    h = 1;
                                }
                            }
 
                            var isUp = delta > 0;
 
                            XBrush filterBrush = null;
                            XPen filterPen = null;
 
                            var absDelta = Math.Abs(delta);
 
                            if (min1 >= 0 && absDelta >= min1 && (max1 < 0 || absDelta <= max1))
                            {
                                if (delta > 0)
                                {
                                    filterBrush = _filter1PlusBrush;
                                    filterPen = _filter1PlusPen;
                                }
                                else
                                {
                                    filterBrush = _filter1MinusBrush;
                                    filterPen = _filter1MinusPen;
                                }
                            }
                            else if (min2 >= 0 && absDelta >= min2 && (max2 < 0 || absDelta <= max2))
                            {
                                if (delta > 0)
                                {
                                    filterBrush = _filter2PlusBrush;
                                    filterPen = _filter2PlusPen;
                                }
                                else
                                {
                                    filterBrush = _filter2MinusBrush;
                                    filterPen = _filter2MinusPen;
                                }
                            }
                            else if (min3 >= 0 && absDelta >= min3 && (max3 < 0 || absDelta <= max3))
                            {
                                if (delta > 0)
                                {
                                    filterBrush = _filter3PlusBrush;
                                    filterPen = _filter3PlusPen;
                                }
                                else
                                {
                                    filterBrush = _filter3MinusBrush;
                                    filterPen = _filter3MinusPen;
                                }
                            }
 
                            if (width > 1.0)
                            {
                                var rect = new Rect(x - width / 2.0, y, width, h);
 
                                if (filterBrush != null)
                                {
                                    visual.FillRectangle(filterBrush, rect);
                                }
                                else
                                {
                                    visual.FillRectangle(isUp ? _deltaPlusBrush : _deltaMinusBrush, rect);
                                }
                            }
                            else
                            {
                                if (filterBrush != null)
                                {
                                    visual.DrawLine(filterPen, x, y, x, y + h);
                                }
                                else
                                {
                                    visual.DrawLine(isUp ? _deltaPlusPen : _deltaMinusPen, x, y, x, y + h);
                                }
                            }
                        }
                    }
                    break;
            }
        }
 
        public override List<IndicatorValueInfo> GetValues(int cursorPos)
        {
            var info = new List<IndicatorValueInfo>();
 
            var cluster = DataProvider.GetCluster(cursorPos);
 
            if (cluster == null)
            {
                return info;
            }
 
            var s = Canvas.FormatValue((double)cluster.Delta);
 
            info.Add(new IndicatorValueInfo(s, Canvas.Theme.ChartFontBrush));
 
            return info;
        }
 
        public override void GetLabels(ref List<IndicatorLabelInfo> labels)
        {
            if (DataProvider.Count <= Canvas.Start)
            {
                return;
            }
 
            var cluster = DataProvider.GetCluster(DataProvider.Count - 1 - Canvas.Start);
 
            if (cluster == null)
            {
                return;
            }
 
            var delta = Minimize ? Math.Abs(cluster.Delta) : cluster.Delta;
 
            labels.Add(new IndicatorLabelInfo((double)delta, cluster.Delta > 0 ? _deltaPlusColor : _deltaMinusColor));
        }
 
        public override bool CheckAlert(double value, int distance, ref int lastIndex, ref double lastValue)
        {
            if (DataProvider.Count == lastIndex && value == lastValue)
            {
                return false;
            }
 
            var cluster = DataProvider.GetCluster(DataProvider.Count - 1);
 
            if (cluster == null)
            {
                return false;
            }
 
            var result = false;
 
            var delta = (double)cluster.Delta;
 
            if (value > 0 && delta >= value - distance)
            {
                result = true;
            }
            else if (value < 0 && delta <= value + distance)
            {
                result = true;
            }
 
            if (result == false)
            {
                return false;
            }
 
            lastIndex = DataProvider.Count;
            lastValue = value;
 
            return true;
        }
 
        public override void ApplyColors(IChartTheme theme)
        {
            DeltaPlusColor = theme.PaletteColor6;
            DeltaMinusColor = theme.PaletteColor7;
 
            base.ApplyColors(theme);
        }
 
        public override void CopyTemplate(IndicatorBase indicator, bool style)
        {
            var i = (DeltaIndicator)indicator;
 
            DeltaPlusColor = i.DeltaPlusColor;
            DeltaMinusColor = i.DeltaMinusColor;
 
            Type = i.Type;
            Minimize = i.Minimize;
 
            MaxDeltaParam.Copy(i.MaxDeltaParam);
 
            Filter1MinParam.Copy(i.Filter1MinParam);
            Filter1MaxParam.Copy(i.Filter1MaxParam);
 
            OnPropertyChanged(nameof(Filter1Min));
            OnPropertyChanged(nameof(Filter1Max));
 
            Filter1PlusColor = i.Filter1PlusColor;
            Filter1MinusColor = i.Filter1MinusColor;
 
            Filter1Alert.Copy(i.Filter1Alert, !style);
 
            OnPropertyChanged(nameof(Filter1Alert));
 
            Filter2MinParam.Copy(i.Filter2MinParam);
            Filter2MaxParam.Copy(i.Filter2MaxParam);
 
            OnPropertyChanged(nameof(Filter2Min));
            OnPropertyChanged(nameof(Filter2Max));
 
            Filter2PlusColor = i.Filter2PlusColor;
            Filter2MinusColor = i.Filter2MinusColor;
 
            Filter2Alert.Copy(i.Filter2Alert, !style);
 
            OnPropertyChanged(nameof(Filter2Alert));
 
            Filter3MinParam.Copy(i.Filter3MinParam);
            Filter3MaxParam.Copy(i.Filter3MaxParam);
 
            OnPropertyChanged(nameof(Filter3Min));
            OnPropertyChanged(nameof(Filter3Max));
 
            Filter3PlusColor = i.Filter3PlusColor;
            Filter3MinusColor = i.Filter3MinusColor;
 
            Filter3Alert.Copy(i.Filter3Alert, !style);
 
            OnPropertyChanged(nameof(Filter3Alert));
 
            base.CopyTemplate(indicator, style);
        }
    }
}
PreviousDynamic LevelsNextCumulative Delta

Last updated 2 years ago

⌨️