Scripts de Análise

O S# implementa um subsistema de scripts de análise que permite realizar análises arbitrárias de dados de mercado com visualização dos resultados. As classes estão localizadas no namespace StockSharp.Algo.Analytics.

IAnalyticsScript — Interface Principal

A interface IAnalyticsScript define um único método:

Task Run(
    ILogReceiver logs,
    IAnalyticsPanel panel,
    SecurityId[] securities,
    DateTime from,
    DateTime to,
    IStorageRegistry storage,
    IMarketDataDrive drive,
    StorageFormats format,
    DataType dataType,
    CancellationToken cancellationToken);

Parâmetros:

  • logs — receptor de logs para gerar mensagens de diagnóstico.
  • panel — painel para exibir os resultados da análise.
  • securities — array de instrumentos a analisar.
  • from / to — intervalo de tempo.
  • storage — registro de armazenamento de dados de mercado.
  • drive — fonte de dados.
  • format — formato de armazenamento de dados.
  • dataType — tipo de dado a analisar.
  • cancellationToken — token de cancelamento.

IAnalyticsPanel — Painel de Resultados

A interface IAnalyticsPanel fornece métodos para criar várias visualizações:

  • CreateGrid(params string[] columns) — cria uma tabela IAnalyticsGrid com as colunas especificadas.
  • CreateChart<X, Y>() — cria um gráfico bidimensional IAnalyticsChart.
  • CreateChart<X, Y, Z>() — cria um gráfico tridimensional IAnalyticsChart.
  • DrawHeatmap(string[] xTitles, string[] yTitles, double[,] data) — desenha um mapa de calor.
  • Draw3D(string[] xTitles, string[] yTitles, data, xTitle, yTitle, zTitle) — desenha uma visualização 3D.

IAnalyticsChart — Gráficos

A interface IAnalyticsChart fornece um método para adicionar séries de dados:

void Append(string title, IEnumerable<X> xValues, IEnumerable<Y> yValues,
    DrawStyles style, Color? color = null);

Estilos de desenho disponíveis (DrawStyles):

  • Line — gráfico de linha.
  • DashedLine — linha tracejada.
  • Histogram — histograma.
  • Bubble — gráfico de bolhas.

IAnalyticsGrid — Tabelas

A interface IAnalyticsGrid permite exibir dados tabulares:

  • SetSort(string column, bool ascending) — define a ordenação por coluna.
  • SetRow(params object[] values) — adiciona uma linha de dados.

Scripts Integrados

O pacote StockSharp.Algo.Analytics.CSharp inclui scripts prontos:

  • IndicatorScript — calcula e visualiza indicadores em um gráfico.
  • ChartDrawScript — demonstra a construção de vários tipos de gráficos.
  • PriceVolumeScript — analisa a distribuição de volume entre níveis de preço.

Exemplo: Script de Análise Personalizado

Abaixo está um exemplo de script que carrega candles para uma lista de instrumentos e exibe os preços de fechamento em um gráfico de linha:

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)
    {
        // criar um gráfico bidimensional
        var chart = panel.CreateChart<DateTime, decimal>();

        foreach (var secId in securities)
        {
            // obter o armazenamento de velas
            var candleStorage = storage.GetCandleMessageStorage(
                secId, dataType, drive, format);

            // carregar dados do período
            var candles = await candleStorage
                .LoadAsync(from, to)
                .WithCancellation(cancellationToken)
                .ToArrayAsync(cancellationToken);

            if (candles.Length == 0)
            {
                logs.AddWarningLog($"Sem dados para {secId}");
                continue;
            }

            // adicionar série ao gráfico
            chart.Append(secId.ToString(),
                candles.Select(c => c.OpenTime.UtcDateTime),
                candles.Select(c => c.ClosePrice),
                DrawStyles.Line);

            logs.AddInfoLog($"{secId}: {candles.Length} velas carregadas");
        }
    }
}

Exemplo: Tabela de Volume

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("Instrument", "Total de candles",
            "Volume total", "Volume médio");
        grid.SetSort("Volume total", 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);
        }
    }
}

Veja Também

Indicadores

Armazenamento de Dados