Аналитические скрипты
В S# реализована подсистема аналитических скриптов, позволяющая выполнять произвольный анализ маркет-данных с визуализацией результатов. Классы расположены в пространстве имён StockSharp.Algo.Analytics.
IAnalyticsScript — основной интерфейс
Интерфейс IAnalyticsScript определяет единственный метод:
Task Run(
ILogReceiver logs,
IAnalyticsPanel panel,
SecurityId[] securities,
DateTime from,
DateTime to,
IStorageRegistry storage,
IMarketDataDrive drive,
StorageFormats format,
DataType dataType,
CancellationToken cancellationToken);
Параметры:
- logs — приёмник логов для вывода диагностических сообщений.
- panel — панель для отображения результатов анализа.
- securities — массив анализируемых инструментов.
- from / to — временной диапазон.
- storage — реестр хранилищ маркет-данных.
- drive — источник данных.
- format — формат хранения данных.
- dataType — тип анализируемых данных.
- cancellationToken — токен отмены.
IAnalyticsPanel — панель результатов
Интерфейс IAnalyticsPanel предоставляет методы для создания различных визуализаций:
- CreateGrid(params string[] columns) — создаёт таблицу IAnalyticsGrid с указанными колонками.
- CreateChart<X, Y>() — создаёт двумерный график IAnalyticsChart.
- CreateChart<X, Y, Z>() — создаёт трёхмерный график IAnalyticsChart.
- DrawHeatmap(string[] xTitles, string[] yTitles, double[,] data) — рисует тепловую карту.
- Draw3D(string[] xTitles, string[] yTitles, data, xTitle, yTitle, zTitle) — рисует 3D-визуализацию.
IAnalyticsChart — графики
Интерфейс IAnalyticsChart предоставляет метод для добавления серий данных:
void Append(string title, IEnumerable<X> xValues, IEnumerable<Y> yValues,
DrawStyles style, Color? color = null);
Доступные стили отрисовки (DrawStyles):
- Line — линейный график.
- DashedLine — пунктирная линия.
- Histogram — гистограмма.
- Bubble — пузырьковый график.
IAnalyticsGrid — таблицы
Интерфейс IAnalyticsGrid позволяет отображать табличные данные:
- SetSort(string column, bool ascending) — задать сортировку по колонке.
- SetRow(params object[] values) — добавить строку данных.
Встроенные скрипты
В пакете StockSharp.Algo.Analytics.CSharp доступны готовые скрипты:
- IndicatorScript — расчёт и визуализация индикаторов на графике.
- ChartDrawScript — демонстрация построения различных типов графиков.
- PriceVolumeScript — анализ распределения объёмов по ценовым уровням.
Пример: пользовательский аналитический скрипт
Ниже приведён пример скрипта, который загружает свечи для списка инструментов и отображает цены закрытия на линейном графике:
public class MyAnalyticsScript : IAnalyticsScript
{
public async Task Run(ILogReceiver logs, IAnalyticsPanel panel,
SecurityId[] securities, DateTime from, DateTime to,
IStorageRegistry storage, IMarketDataDrive drive,
StorageFormats format, DataType dataType,
CancellationToken cancellationToken)
{
// создание двумерного графика
var chart = panel.CreateChart<DateTime, decimal>();
foreach (var secId in securities)
{
// получение хранилища свечей
var candleStorage = storage.GetCandleMessageStorage(
secId, dataType, drive, format);
// загрузка данных за период
var candles = await candleStorage
.LoadAsync(from, to)
.WithCancellation(cancellationToken)
.ToArrayAsync(cancellationToken);
if (candles.Length == 0)
{
logs.AddWarningLog($"Нет данных для {secId}");
continue;
}
// добавление серии на график
chart.Append(secId.ToString(),
candles.Select(c => c.OpenTime.UtcDateTime),
candles.Select(c => c.ClosePrice),
DrawStyles.Line);
logs.AddInfoLog($"{secId}: загружено {candles.Length} свечей");
}
}
}
Пример: таблица с объёмами
public class VolumeTableScript : IAnalyticsScript
{
public async Task Run(ILogReceiver logs, IAnalyticsPanel panel,
SecurityId[] securities, DateTime from, DateTime to,
IStorageRegistry storage, IMarketDataDrive drive,
StorageFormats format, DataType dataType,
CancellationToken cancellationToken)
{
var grid = panel.CreateGrid("Инструмент", "Всего свечей",
"Суммарный объём", "Средний объём");
grid.SetSort("Суммарный объём", false);
foreach (var secId in securities)
{
var candleStorage = storage.GetCandleMessageStorage(
secId, dataType, drive, format);
var candles = await candleStorage
.LoadAsync(from, to)
.WithCancellation(cancellationToken)
.ToArrayAsync(cancellationToken);
if (candles.Length == 0)
continue;
var totalVolume = candles.Sum(c => c.TotalVolume);
var avgVolume = totalVolume / candles.Length;
grid.SetRow(secId.ToString(), candles.Length,
totalVolume, avgVolume);
}
}
}