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. Примеры индикаторов

Cluster Statistic

//------------------------------------------------------------------------------
//
// Индикатор ClusterStatistic. Copyright (c) 2023 Tiger Trade Capital AG. All rights reserved.
//
//------------------------------------------------------------------------------
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;
using System.Windows;
using TigerTrade.Chart.Base.Enums;
using TigerTrade.Chart.Indicators.Common;
using TigerTrade.Chart.Indicators.Enums;
using TigerTrade.Core.UI.Converters;
using TigerTrade.Core.Utils.Time;
using TigerTrade.Dx;
 
namespace TigerTrade.Chart.Indicators.Custom
{
    [TypeConverter(typeof(EnumDescriptionTypeConverter))]
    [DataContract(Name = "ClusterStatisticPeriodType", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Indicators.Custom")]
    public enum ClusterStatisticPeriodType
    {
        [EnumMember(Value = "Day"), Description("День")]
        Day,
        [EnumMember(Value = "Week"), Description("Неделя")]
        Week,
        [EnumMember(Value = "Month"), Description("Месяц")]
        Month,
        [EnumMember(Value = "VisibleBars"), Description("Видимые бары")]
        VisibleBars,
        [EnumMember(Value = "AllBars"), Description("Все бары")]
        AllBars
    }
 
    [DataContract(Name = "ClusterStatisticIndicator", Namespace = "http://schemas.datacontract.org/2004/07/TigerTrade.Chart.Indicators.Custom")]
    [Indicator("X_ClusterStatistic", "*ClusterStatistic", false, Type = typeof(ClusterStatisticIndicator))]
    internal sealed class ClusterStatisticIndicator : IndicatorBase
    {
        private ClusterStatisticPeriodType _period;
 
        [DataMember(Name = "Period")]
        [Category("Параметры"), DisplayName("Период")]
        public ClusterStatisticPeriodType Period
        {
            get => _period;
            set
            {
                if (value == _period)
                {
                    return;
                }
 
                _period = value;
 
                OnPropertyChanged();
            }
        }
 
        private bool _minimizeValues;
 
        [DataMember(Name = "MinimizeValues")]
        [Category("Параметры"), DisplayName("Минимизировать значения")]
        public bool MinimizeValues
        {
            get => _minimizeValues;
            set
            {
                if (value == _minimizeValues)
                {
                    return;
                }
 
                _minimizeValues = value;
 
                OnPropertyChanged();
            }
        }
 
        private IndicatorIntParam _roundValuesParam;
 
        [DataMember(Name = "RoundValueParam")]
        public IndicatorIntParam RoundValuesParam
        {
            get => _roundValuesParam ?? (_roundValuesParam = new IndicatorIntParam(0));
            set => _roundValuesParam = value;
        }
 
        [DefaultValue(0)]
        [Category("Параметры"), DisplayName("Округлять значения")]
        public int RoundValues
        {
            get => RoundValuesParam.Get(SettingsLongKey);
            set
            {
                if (!RoundValuesParam.Set(SettingsLongKey, value, -4, 4))
                {
                    return;
                }
 
                OnPropertyChanged();
            }
        }
 
        private bool _ask;
 
        [DataMember(Name = "ShowAsk")]
        [Category("Вывод данных"), DisplayName("Ask")]
        public bool ShowAsk
        {
            get => _ask;
            set
            {
                if (value == _ask)
                {
                    return;
                }
 
                _ask = value;
             
                OnPropertyChanged();
            }
        }
 
        private bool _bid;
 
        [DataMember(Name = "ShowBid")]
        [Category("Вывод данных"), DisplayName("Bid")]
        public bool ShowBid
        {
            get => _bid;
            set
            {
                if (value == _bid)
                {
                    return;
                }
 
                _bid = value;
             
                OnPropertyChanged();
            }
        }
 
        private bool _delta;
 
        [DataMember(Name = "ShowDelta")]
        [Category("Вывод данных"), DisplayName("Delta")]
        public bool ShowDelta
        {
            get => _delta;
            set
            {
                if (value == _delta)
                {
                    return;
                }
 
                _delta = value;
             
                OnPropertyChanged();
            }
        }
 
        private bool _volume;
 
        [DataMember(Name = "ShowVolume")]
        [Category("Вывод данных"), DisplayName("Volume")]
        public bool ShowVolume
        {
            get => _volume;
            set
            {
                if (value == _volume)
                {
                    return;
                }
 
                _volume = value;
             
                OnPropertyChanged();
            }
        }
 
        private bool _trades;
 
        [DataMember(Name = "ShowTrades")]
        [Category("Вывод данных"), DisplayName("Trades")]
        public bool ShowTrades
        {
            get => _trades;
            set
            {
                if (value == _trades)
                {
                    return;
                }
 
                _trades = value;
 
                OnPropertyChanged();
            }
        }
 
        [Browsable(false)]
        public override bool ShowIndicatorValues => false;
 
        [Browsable(false)]
        public override bool ShowIndicatorLabels => false;
 
        [Browsable(false)]
        public override IndicatorCalculation Calculation => IndicatorCalculation.OnEachTick;
 
        public ClusterStatisticIndicator()
        {
            ShowIndicatorTitle = false;
 
            Period = ClusterStatisticPeriodType.Day;
 
            MinimizeValues = false;
 
            ShowAsk = true;
            ShowBid = true;
            ShowDelta = true;
            ShowVolume = true;
            ShowTrades = true;
        }
 
        protected override void Execute()
        {
        }
 
        public override void Render(DxVisualQueue visual)
        {
            var labels = new List<string>();
 
            if (ShowVolume)
            {
                labels.Add("Volume");
            }
 
            if (ShowTrades)
            {
                labels.Add("Trades");
            }
 
            if (ShowDelta)
            {
                labels.Add("Delta");
            }
 
            if (ShowBid)
            {
                labels.Add("Bid");
            }
 
            if (ShowAsk)
            {
                labels.Add("Ask");
            }
 
            if (labels.Count == 0)
            {
                return;
            }
 
            var symbol = DataProvider.Symbol;
 
            var linePen = new XPen(new XBrush(Canvas.Theme.ChartAxisColor), 1);
 
            var lastSequence = -1;
 
            var maxVolume = 0m;
            var maxTrades = 0L;
            var maxDelta = 0m;
 
            var updateMaxValues = true;
 
            switch (Period)
            {
                case ClusterStatisticPeriodType.AllBars:
                {
                    updateMaxValues = false;
 
                    var count = DataProvider.Count;
 
                    for (var i = 0; i < count; i++)
                    {
                        var cluster = DataProvider.GetCluster(i);
 
                        if (cluster == null)
                        {
                            continue;
                        }
 
                        var maxValues = cluster.MaxValues;
 
                        maxVolume = Math.Max(maxVolume, cluster.Volume);
                        maxTrades = Math.Max(maxTrades, cluster.Trades);
                        maxDelta = Math.Max(maxDelta, Math.Max(maxValues.MaxDelta, -maxValues.MinDelta));
                    }
 
                    break;
                }
                case ClusterStatisticPeriodType.VisibleBars:
                {
                    updateMaxValues = false;
 
                    for (var i = 0; i < Canvas.Count; i++)
                    {
                        var cluster = DataProvider.GetCluster(Canvas.GetIndex(i));
 
                        if (cluster == null)
                        {
                            continue;
                        }
 
                        var maxValues = cluster.MaxValues;
 
                        maxVolume = Math.Max(maxVolume, cluster.Volume);
                        maxTrades = Math.Max(maxTrades, cluster.Trades);
                        maxDelta = Math.Max(maxDelta, Math.Max(maxValues.MaxDelta, -maxValues.MinDelta));
                    }
 
                    break;
                }
            }
 
            var baseHeight = (int)Canvas.ChartFont.GetHeight() + 4;
 
            var height = labels.Count * baseHeight + 2;
 
            var prevLeft = 0.0;
 
            var columnWidth = Canvas.ColumnWidth;
            var r = Canvas.Rect;
 
            var roundValues = RoundValues;
 
            var timeOffset = TimeHelper.GetSessionOffset(DataProvider.Symbol.Exchange);
 
            for (var i = 0; i < Canvas.Count; i++)
            {
                var x = Canvas.GetXX(i);
 
                var left = x - columnWidth * .5;
 
                if (i == 0)
                {
                    prevLeft = left + columnWidth;
 
                    var backRect = new Rect(new Point(r.Left, r.Bottom - baseHeight*labels.Count - 2),
                        new Point(prevLeft, r.Bottom));
 
                    visual.FillRectangle(XBrush.White, backRect);
                    visual.FillRectangle(Canvas.Theme.ChartBackBrush, backRect);
 
                    for (var j = 1; j <= labels.Count; j++)
                    {
                        var h = baseHeight * j + 2;
 
                        visual.DrawLine(linePen,
                            new Point(r.Left, r.Bottom - h),
                            new Point(x + columnWidth * .5, r.Bottom - h));
                    }
                }
 
                visual.DrawLine(linePen,
                    new Point(left + columnWidth, r.Bottom - height),
                    new Point(left + columnWidth, r.Bottom));
 
                var index = Canvas.GetIndex(i);
 
                var cluster = DataProvider.GetCluster(index);
 
                if (cluster == null)
                {
                    continue;
                }
 
                if (updateMaxValues)
                {
                    var sequence = 1;
 
                    switch (Period)
                    {
                        case ClusterStatisticPeriodType.Day:
 
                            sequence = DataProvider.Period.GetSequence(ChartPeriodType.Day, 1, cluster.Time, timeOffset);
 
                            break;
 
                        case ClusterStatisticPeriodType.Week:
 
                            sequence = DataProvider.Period.GetSequence(ChartPeriodType.Week, 1, cluster.Time, timeOffset);
 
                            break;
 
                        case ClusterStatisticPeriodType.Month:
 
                            sequence = DataProvider.Period.GetSequence(ChartPeriodType.Month, 1, cluster.Time, timeOffset);
 
                            break;
                    }
 
                    if (sequence != lastSequence)
                    {
                        lastSequence = sequence;
 
                        maxVolume = 0;
                        maxTrades = 0;
                        maxDelta = 0;
 
                        for (var j = index; j >= 0; j--)
                        {
                            var cl = DataProvider.GetCluster(j);
 
                            if (cl == null)
                            {
                                continue;
                            }
 
                            var newSequence = 1;
 
                            switch (Period)
                            {
                                case ClusterStatisticPeriodType.Day:
 
                                    newSequence = DataProvider.Period.GetSequence(ChartPeriodType.Day, 1, cl.Time, timeOffset);
 
                                    break;
 
                                case ClusterStatisticPeriodType.Week:
 
                                    newSequence = DataProvider.Period.GetSequence(ChartPeriodType.Week, 1, cl.Time, timeOffset);
 
                                    break;
 
                                case ClusterStatisticPeriodType.Month:
 
                                    newSequence = DataProvider.Period.GetSequence(ChartPeriodType.Month, 1, cl.Time, timeOffset);
 
                                    break;
                            }
 
                            if (newSequence != sequence)
                            {
                                break;
                            }
 
                            var maxValues = cl.MaxValues;
 
                            maxVolume = Math.Max(maxVolume, cl.Volume);
                            maxTrades = Math.Max(maxTrades, cl.Trades);
                            maxDelta = Math.Max(maxDelta, Math.Max(maxValues.MaxDelta, -maxValues.MinDelta));
                        }
                    }
                }
 
                var deltaBrush = new XBrush(
                        (cluster.Delta > 0
                            ? Canvas.Theme.ClusterDeltaPlusColor
                            : Canvas.Theme.ClusterDeltaMinusColor).ChangeOpacity(Math.Abs(cluster.Delta), maxDelta));
 
                var volumeBrush = new XBrush(Canvas.Theme.ClusterVolumeColor.ChangeOpacity(cluster.Volume, maxVolume));
                var tradesBrush = new XBrush(Canvas.Theme.ClusterTradesColor.ChangeOpacity(cluster.Trades, maxTrades));
                var textBrush = new XBrush(Canvas.Theme.ClusterTextColor);
 
                for (var j = 1; j <= labels.Count; j++)
                {
                    var label = labels[j - 1];
 
                    var h = baseHeight * j + 2;
 
                    var cellRect = new Rect(new Point((int)left, r.Bottom - h + 1),
                        new Point((int)prevLeft, r.Bottom - (h - baseHeight) + (j == 1 ? 2 : 0)));
 
                    var cellTextRect = new Rect(new Point(left + 2, r.Bottom - h),
                        new Point(left + columnWidth - 2, r.Bottom - (h - baseHeight)));
 
                    var value = "";
 
                    switch (label)
                    {
                        case "Volume":
 
                            value = symbol.FormatSize(cluster.Volume, roundValues, MinimizeValues);
 
                            break;
 
                        case "Trades":
 
                            value = symbol.FormatTrades(cluster.Trades, roundValues, MinimizeValues);
 
                            break;
 
                        case "Delta":
 
                            value = symbol.FormatSize(cluster.Delta, roundValues, MinimizeValues);
 
                            break;
 
                        case "Bid":
 
                            value = symbol.FormatSize(cluster.Bid, roundValues, MinimizeValues);
 
                            break;
 
                        case "Ask":
 
                            value = symbol.FormatSize(cluster.Ask, roundValues, MinimizeValues);
 
                            break;
                    }
 
                    if (!string.IsNullOrEmpty(value))
                    {
                        visual.FillRectangle(
                            label == "Volume" ? volumeBrush : (label == "Trades" ? tradesBrush : deltaBrush), cellRect);
 
                        visual.DrawString(value, Canvas.ChartFont, textBrush, cellTextRect);
                    }
                }
 
                prevLeft = left;
            }
 
            // labels
 
            var labelMaxWidth = labels.Aggregate(0,
                (current, label) => (int)Math.Max(current, Canvas.ChartFont.GetWidth(label))) + 5;
 
            visual.FillRectangle(Canvas.Theme.ChartBackBrush,
                new Rect(new Point(r.Left, r.Bottom - height), new Point(r.Left + labelMaxWidth, r.Bottom)));
 
            visual.DrawLine(linePen,
                new Point(r.Left + labelMaxWidth, r.Bottom - height),
                new Point(r.Left + labelMaxWidth, r.Bottom));
 
            var labelHeight = 2;
 
            foreach (var label in labels)
            {
                labelHeight += baseHeight;
 
                visual.DrawLine(linePen, new Point(r.Left, r.Bottom - labelHeight),
                    new Point(r.Left + labelMaxWidth, r.Bottom - labelHeight));
 
                var labelTextRect = new Rect(new Point(r.Left + 2, r.Bottom - labelHeight),
                        new Point(r.Left + labelMaxWidth - 2, r.Bottom - (labelHeight - baseHeight)));
 
                visual.DrawString(label, Canvas.ChartFont, Canvas.Theme.ChartFontBrush, labelTextRect);
            }
        }
 
        public override void CopyTemplate(IndicatorBase indicator, bool style)
        {
            var i = (ClusterStatisticIndicator)indicator;
 
            Period = i.Period;
 
            MinimizeValues = i.MinimizeValues;
 
            RoundValuesParam.Copy(i.RoundValuesParam);
 
            ShowAsk = i.ShowAsk;
            ShowBid = i.ShowBid;
            ShowDelta = i.ShowDelta;
            ShowVolume = i.ShowVolume;
            ShowTrades = i.ShowTrades;
 
            base.CopyTemplate(indicator, style);
        }
    }
}
PreviousCumulative DeltaNextBid Ask

Last updated 2 years ago

⌨️