🎯 C# и WPF: создаём графики для трейдинга — реально, удобно, быстро


На главную > Блог > Категория > 🎯 C# и WPF: создаём графики для трейдинга — реально, удобно, быстро

wpf

Вступление: почему C# и WPF — отличная пара для трейдерского софта

Вы торгуете, анализируете графики, тестируете стратегии. И в какой-то момент понимаете: стандартный терминал неудобен, индикаторов не хватает, а хочется «всё своё». Вопрос: на чём писать? Python — хорошо для бэктестов и скриптов, но для десктопного приложения с красивыми графиками он не лучший выбор. Java — громоздко.

А вот C# + WPF (Windows Presentation Foundation) — это родная, мощная и очень быстрая связка от Microsoft. WPF позволяет создавать профессиональные, плавные графики, которые не уступают TradingView по удобству, но при этом вы полностью контролируете код. В этой статье я расскажу, как реализовать трейдинговые графики на C# в WPF, какие библиотеки использовать и почему это проще, чем кажется.

«WPF — это конструктор Lego для взрослых программистов. А C# — это клей, который держит всё вместе. Постройте свой идеальный терминал».

1. Что такое WPF и почему он подходит для трейдинга

WPF — это фреймворк для создания десктопных приложений под Windows. В отличие от старых WinForms, он использует векторную графику, поддерживает аппаратное ускорение и позволяет создавать интерфейсы, которые выглядят современно и работают плавно даже с тысячами точек на графике.

Почему WPF, а не веб-технологии (Electron, WebView)?

  • Производительность: WPF рендерит графику через DirectX, а не через браузерный движок. Для трейдинга, где каждая миллисекунда на счету, это важно.
  • 📊 Плавная графика: зум, панорамирование, отрисовка свечей — всё работает без тормозов даже при 10 000+ точек.
  • 🔌 Прямой доступ к API бирж: C# отлично интегрируется с WebSocket, REST, базами данных.
  • 🖥️ Нативное приложение: не нужно тащить с собой браузерный движок (как в Electron). Размер — десятки мегабайт, а не сотни.
📈 Реальный пример: Многие проп-трейдинговые фирмы пишут свои внутренние терминалы на C# + WPF (или более свежем WinUI 3). Потому что это надёжно, быстро и легко кастомизировать.

2. Библиотеки для графиков: от DIY до профессиональных контролов

Рисовать график с нуля через низкоуровневые примитивы (Line, Rectangle) — можно, но долго и муторно. Есть готовые решения.

БиблиотекаЛицензияСложностьОсобенности
LiveCharts 2 (рекомендую) Apache 2.0 (бесплатно) 🟢 средняя Современная, быстрая, поддерживает свечные графики, зум, тултипы, MVVM. Идеально для трейдинга.
OxyPlot MIT (бесплатно) 🟢 низкая Очень простая, но менее гибкая. Подходит для простых линейных графиков. Есть поддержка свечей.
SciChart Коммерческая (дорогая) 🔴 высокая Молниеносная, миллионы точек, профессиональный трейдинг-инструментарий. Используется в банках и HFT.
ScottPlot MIT (бесплатно) 🟢 низкая Научная графика, быстро рисует большие массивы, но свечи придётся допиливать.
🎯 Мой выбор для старта: LiveCharts 2. Бесплатно, активно развивается, есть примеры с финансовыми графиками. За час можно сделать работающее приложение с отображением свечей и индикаторов.

3. Быстрый старт: строим свечной график за 15 минут

Покажу на примере LiveCharts 2. Предполагаем, что у вас уже есть Visual Studio 2022 (Community Edition — бесплатно).

Шаг 1. Создаём проект WPF

В Visual Studio: «Создать проект» → «WPF Application (.NET 8 или 6)» → называем «TradingChartDemo».

Шаг 2. Устанавливаем LiveCharts 2

Откройте «Управление пакетами NuGet» (ПКМ по проекту → «Управление пакетами NuGet»). Найдите и установите:


LiveChartsCore.SkiaSharpView
LiveChartsCore.SkiaSharpView.WPF

Шаг 3. Добавляем контрол на MainWindow.xaml


<Window x:Class="TradingChartDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:lvc="clr-namespace:LiveChartsCore.SkiaSharpView.WPF;assembly=LiveChartsCore.SkiaSharpView.WPF"
        Title="Трейдинг график" Height="600" Width="800">
    
    <Grid>
        <lvc:CartesianChart x:Name="TradingChart">
            <lvc:CartesianChart.Series>
                <lvc:CandlesticksSeries x:Name="CandleSeries" />
            </lvc:CartesianChart.Series>
        </lvc:CartesianChart>
    </Grid>
</Window>

Шаг 4. Загружаем данные в code-behind (MainWindow.xaml.cs)


using LiveChartsCore;
using LiveChartsCore.SkiaSharpView;
using LiveChartsCore.SkiaSharpView.Painting;
using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Windows;

namespace TradingChartDemo
{
    public class Candle
    {
        public double High { get; set; }
        public double Low { get; set; }
        public double Open { get; set; }
        public double Close { get; set; }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // Генерируем тестовые свечи (в реальности сюда придут данные с биржи)
            var candles = GenerateTestCandles();

            // Конвертируем в формат LiveCharts
            var candleSeries = new CandlesticksSeries
            {
                Values = candles,
                Stroke = new SolidColorPaint(SKColors.Black),
                Fill = null // стандартное заполнение
            };

            TradingChart.Series = new ISeries[] { candleSeries };
        }

        private List<Candle> GenerateTestCandles()
        {
            var list = new List<Candle>();
            var rnd = new Random();
            double price = 67000;

            for (int i = 0; i < 100; i++)
            {
                double change = (rnd.NextDouble() - 0.5) * 300;
                double open = price;
                double close = open + change;
                double high = Math.Max(open, close) + rnd.NextDouble() * 150;
                double low = Math.Min(open, close) - rnd.NextDouble() * 150;
                
                list.Add(new Candle { Open = open, Close = close, High = high, Low = low });
                price = close;
            }
            return list;
        }
    }
}

Нажмите F5 — вы увидите свечной график, который можно зумить и панорамировать мышкой. Готово! 🎉

4. Подключение реальных данных (Binance, Bybit)

Красивый график — это половина дела. Теперь нужно кормить его реальными ценами. Самый простой способ — использовать WebSocket для получения свечей в реальном времени.

Пример подключения к Binance через WebSocket (библиотека WebSocketSharp или NetCoreServer):


using WebSocketSharp;
using Newtonsoft.Json.Linq;

// Подключение к стриму свечей BTC/USDT, таймфрейм 1 минута
var ws = new WebSocket("wss://stream.binance.com:9443/ws/btcusdt@kline_1m");

ws.OnMessage += (sender, e) =>
{
    dynamic data = JObject.Parse(e.Data);
    // Парсим свечу: data.k.open, data.k.high, data.k.low, data.k.close
    Dispatcher.Invoke(() =>
    {
        // Обновляем график (добавляем новую свечу в список)
        // Candle newCandle = ...
        // candles.Add(newCandle);
        // TradingChart.Core.Update();
    });
};

ws.Connect();
📦 NuGet-пакеты для API: Binance.Net, Bybit.Net — обёртки с готовыми методами для получения котировок, ордеров и баланса.

5. Добавляем индикаторы (SMA, RSI) на график

LiveCharts 2 позволяет накладывать несколько серий на один график. Добавим простую скользящую среднюю.


// Сначала рассчитываем SMA
double[] closes = candles.Select(c => c.Close).ToArray();
int period = 14;
double[] smaValues = new double[closes.Length];

for (int i = period - 1; i < closes.Length; i++)
{
    smaValues[i] = closes.Skip(i - period + 1).Take(period).Average();
}

// Добавляем новую серию (линию)
var smaSeries = new LineSeries
{
    Values = smaValues,
    Stroke = new SolidColorPaint(SKColors.Blue),
    GeometrySize = 0 // убираем точки на линии
};

// Передаём в контрол
TradingChart.Series = new ISeries[] { candleSeries, smaSeries };

6. Оптимизация: как не повесить UI при тысячах свечей

WPF может тормозить, если вы перерисовываете график слишком часто или загружаете слишком много точек. Вот несколько советов:

  • Используйте виртуализацию (LiveCharts поддерживает её из коробки).
  • Не пересоздавайте Series на каждый тик — обновляйте коллекцию Values.
  • Ограничьте количество отображаемых свечей (например, последние 500–1000).
  • Для высокочастотных данных (тиковые графики) используйте библиотеки с низкоуровневым рендерингом — SciChart, LightningChart.

7. Плюсы и минусы C# + WPF для трейдерских графиков

ПлюсыМинусы
✅ Высокая производительность (DirectX) ❌ Только под Windows (хотя .NET 8 + Avalonia позволяют кросс-платформу)
✅ Бесплатные мощные библиотеки (LiveCharts, OxyPlot) ❌ Кривая обучения: XAML, привязки данных, MVVM — придётся освоить
✅ Родной доступ к API бирж через HttpClient/WebSocket ❌ Для HFT нужны библиотеки с низкой задержкой (SciChart — платная)
✅ Современный интерфейс, анимации, скины ❌ Тяжелее WinForms, но легче Electron-приложений

Заключение: C# + WPF — выбор профессионалов для десктопных решений

Если вы хотите создать собственный торговый терминал, бэктестер или аналитическую платформу под Windows, C# + WPF — один из лучших вариантов. Он даёт высокую производительность, современный интерфейс и прямой доступ к «железу». Да, придётся освоить XAML и MVVM. Но результат того стоит: вы получите приложение, которое работает плавно, выглядит красиво и не тормозит даже при тысячах свечей.

Начните с малого: установите LiveCharts 2, нарисуйте тестовые свечи. Потом подключите Binance API — пусть график оживёт. Потом добавьте скользящие средние. А дальше — ваша фантазия: уведомления, сделки, стратегии. Главное — сделать первый шаг.

И помните: даже если вы никогда не станете профессиональным WPF-разработчиком, создание своего инструментария даст вам глубокое понимание рынка. Вы перестанете быть заложником чужого софта и начнёте торговать так, как удобно вам.

«WPF — это как швейцарский нож для трейдера: можно и график нарисовать, и ордер отправить, и отчёт сформировать. Всё в одном флаконе под Windows».

 

Дата размещения статьи: 2026-05-24T14:26:17