Для изменения размера нажмите или перетащите
Свечной график

Chart - графический компонет, который позволяет строить биржевые графики: свечи, индикаторы, и отображать на графиках маркеры заявок и сделок.

Ниже приведен пример построения графика при помощи компонета Chart. За основу взят пример из Samples/Quik/SampleCandles, в который внесены некоторые изменения.

Gui Chart Sample

Пример построения графика при помощи Chart

  1. В XAML создаем окно и добавляем в него графический компонент StockSharp.Xaml.ChartingChart. Присваиваем компоненту имя Chart. Обратите внимание, что при создании окна нужно добавить пространство имен http://schemas.stocksharp.com/xaml.

    XAML
    <Window x:Class="SampleCandles.ChartWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:charting="http://schemas.stocksharp.com/xaml"
            Title="ChartWindow" Height="300" Width="300">
       <charting:Chart x:Name="Chart" x:FieldModifier="public" />
    </Window>
  2. В коде главного окна декларируем переменные для CandleManager, областей графика, элементов графика и индикаторов.

    C#
    private readonly Dictionary<CandleSeries, ChartWindow> _chartWindows = new Dictionary<CandleSeries, ChartWindow>();
    private QuikTrader _trader;
    
    private CandleManager _candleManager;
    private readonly LogManager _logManager;
    
    private ChartArea _candlesArea;
    private ChartArea _indicatorsArea;
    
    private ChartIndicatorElement _smaChartElement;
    private ChartIndicatorElement _macdChartElement;
    private ChartCandleElement _candlesElem;
    
    private SimpleMovingAverage _sma;
    private MovingAverageConvergenceDivergence _macd;
  3. В обработчике события Click кнопки Connect, наряду с подпиской на события коннектора и вызовом метода Connect, инициализируем кандлменеджер и подписываемся на событие CandleManagerProcessing. В обработчике этого события при получении новой свечи будет выполнятся отрисовка графика.

    C#
    private void ConnectClick(object sender, RoutedEventArgs e)
    {
    
        ..........................................         
    
        if (_trader == null)
        {
            // создаем подключение
            _trader = isLua
                ? new QuikTrader
                {
                    LuaFixServerAddress = Address.Text.To<EndPoint>(),
                    LuaLogin = Login.Text,
                    LuaPassword = Password.Password.To<SecureString>()
                }
                : new QuikTrader(Path.Text) { IsDde = true };
    
            ..........................................         
    
            _logManager.Sources.Add(_trader);
            // подписываемся на событие об успешном восстановлении соединения
            _trader.Restored += () => this.GuiAsync(() => MessageBox.Show(this, LocalizedStrings.Str2958));
    
            // подписываемся на событие разрыва соединения
            _trader.ConnectionError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString()));
    
            // подписываемся на ошибку обработки данных (транзакций и маркет)
            _trader.Error += error =>
                this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных"));
    
            // подписываемся на ошибку подписки маркет-данных
            _trader.MarketDataSubscriptionFailed += (security, type, error) =>
                this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(type, security)));
    
            Security.SecurityProvider = new FilterableSecurityProvider(_trader);
    
            _trader.Connect();
    
            // инициализуруем _candleManager и подписываемся на событие получения свечи
            _candleManager = new CandleManager(_trader);
            _candleManager.Processing += DrawCandle;
    
            ConnectBtn.IsEnabled = false;
        }
    }
  4. В обработчике кнопки ShowChart создаем объекты индикаторов, областей и элементов графика. Добавляем элементы к областям, а области к чарту. Открываем окно графика и запускаем работу кандлменеджера.

    C#
    private void ShowChartClick(object sender, RoutedEventArgs e)
    {
        var security = SelectedSecurity;
    
        var series = new CandleSeries(CandlesSettings.Settings.CandleType, security, CandlesSettings.Settings.Arg);
    
        _chartWindows.SafeAdd(series, key =>
        {
            var wnd = new ChartWindow
            {
                Title = "{0} {1} {2}".Put(security.Code, series.CandleType.Name, series.Arg)
            };
    
            wnd.MakeHideable();
    
            // инициализируем индикаторы
            _sma = new SimpleMovingAverage() { Length = 11 };
            _macd = new MovingAverageConvergenceDivergence();
    
            // инициализируем элементы графика
            _smaChartElement = new ChartIndicatorElement();
            _macdChartElement = new ChartIndicatorElement();
            _candlesElem = new ChartCandleElement();
    
            // устанавливаем стиль отображения MACD в виде гистограммы
            _macdChartElement.DrawStyle = ChartIndicatorDrawStyles.Histogram;
    
            // инициализируем области графика
            _candlesArea = new ChartArea();
            _indicatorsArea = new ChartArea();
    
            // добавляем области к чарту
            wnd.Chart.Areas.Add(_candlesArea);
            wnd.Chart.Areas.Add(_indicatorsArea);
    
            // добавляем элементы к областям
            _candlesArea.Elements.Add(_candlesElem);
            _candlesArea.Elements.Add(_smaChartElement);
            _indicatorsArea.Elements.Add(_macdChartElement);
    
            return wnd;
        }).Show();
    
        // стартуем кандлменеджер
        _candleManager.Start(series);
    }
  5. В обработчике события CandleManagerProcessing производим отрисовку свечи и значений индикаторов для каждой завершенной свечи. Для этого:

    1. Вычисляем значения индикаторов.

    2. Заполняем словарь elements парами "объект элемента - значение элемента"

    3. Для отрисовки графика вызываем метод ChartDraw(ChartDrawData), в который передаем время и словарь элементов.

    Результат работы программы представлен на рисунке выше.

    C#
    private void DrawCandle(CandleSeries series, Candle candle)
    {
        var wnd = _chartWindows.TryGetValue(series);
    
        if (wnd != null)
        {
            if (candle.State != CandleStates.Finished)
                return;
    
            var smaValue = _sma.Process(candle);
            var macdValue = _macd.Process(candle);
    
            var data = new ChartingDrawData();
            data
              .Group(candle.OpenTime)
                .Add(_candlesElem, candle)
                .Add(_smaChartElement, smaValue)
                .Add(_macdChartElement, macdValue);
    
                wnd.Chart.Draw(data);
    
        }
    }