Velas
O S# suporta os seguintes tipos de candles:
- TimeFrameCandleMessage - um candle baseado em um intervalo de tempo. Você pode definir tanto intervalos populares (minutos, horas, diário) quanto personalizados. Por exemplo, 21 segundos, 4,5 minutos, etc.
- RangeCandleMessage - um candle de faixa de preço. Um novo candle é criado quando aparece uma negociação com um preço que excede os limites aceitáveis. O limite aceitável é formado a cada vez com base no preço da primeira negociação.
- VolumeCandleMessage - um candle é formado até que o volume total de negociações exceda um limite especificado. Se uma nova negociação exceder o volume permitido, ela é incluída em um novo candle.
- TickCandleMessage - o mesmo que VolumeCandleMessage, mas o número de negociações é usado como limitação em vez do volume.
- PnFCandleMessage - um candle de gráfico ponto-e-figura (gráfico X-O).
- RenkoCandleMessage - candle Renko.
Como trabalhar com candles é mostrado no exemplo localizado na pasta Samples/02_Candles/01_Realtime.
As imagens a seguir mostram os gráficos TimeFrameCandleMessage e RangeCandleMessage:


Iniciando a Obtenção de Dados
- Para obter candles, crie uma assinatura usando a classe Subscription:
// Criar uma assinatura para velas de 5 minutos
var subscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)), // Tipo de dados com especificação do período
security) // Instrumento
{
// Configurar parâmetros adicionais pela propriedade MarketData
MarketData =
{
// Período para o qual solicitamos dados históricos (últimos 30 dias)
From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
To = DateTime.Now
}
};
- Para receber candles, assine o evento Connector.CandleReceived, que sinaliza o aparecimento de um novo valor para processamento:
// Assinar o evento de recebimento de velas
_connector.CandleReceived += OnCandleReceived;
// Manipulador do evento de recebimento de velas
private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
// Aqui subscription é o objeto de assinatura que criamos
// candle — vela recebida
// Verificar se a vela pertence à nossa assinatura
if (subscription == _candleSubscription)
{
// Desenhar a vela no gráfico
Chart.Draw(_candleElement, candle);
}
}
Tip
O componente gráfico Chart é usado para exibir candles.
- Em seguida, inicie a assinatura através do método Connector.Subscribe:
// Iniciar a assinatura
_connector.Subscribe(subscription);
Depois disso, o evento Connector.CandleReceived começará a ser chamado.
- O evento Connector.CandleReceived é chamado não apenas quando um novo candle aparece, mas também quando o atual é alterado.
Se você precisar exibir apenas candles "completos", você precisa verificar a propriedade ICandleMessage.State do candle recebido:
private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
// Verificar se a vela pertence à nossa assinatura
if (subscription != _candleSubscription)
return;
// Verificar se a vela está concluída
if (candle.State == CandleStates.Finished)
{
// Criar dados para desenho
var chartData = new ChartDrawData();
chartData.Group(candle.OpenTime).Add(_candleElement, candle);
// Desenhar a vela no gráfico
this.GuiAsync(() => Chart.Draw(chartData));
}
}
- Parâmetros adicionais podem ser configurados para a assinatura:
- Modo de construção de candles - determina se dados prontos serão solicitados ou construídos a partir de outro tipo de dado:
// Solicitar apenas dados prontos
subscription.MarketData.BuildMode = MarketDataBuildModes.Load;
// Construir apenas a partir de outro tipo de dados
subscription.MarketData.BuildMode = MarketDataBuildModes.Build;
// Solicitar dados prontos e, se não estiverem disponíveis, construí-los
subscription.MarketData.BuildMode = MarketDataBuildModes.LoadAndBuild;
- Fonte para construção de candles - indica a partir de qual tipo de dado construir candles se eles não estiverem diretamente disponíveis:
// Construção de velas a partir de negociações tick
subscription.MarketData.BuildFrom = DataType.Ticks;
// Construção de velas a partir do livro de ofertas
subscription.MarketData.BuildFrom = DataType.MarketDepth;
// Construção de velas a partir de Level1
subscription.MarketData.BuildFrom = DataType.Level1;
- Campo para construção de candles - deve ser especificado para determinados tipos de dados:
// Construção de velas a partir do melhor preço bid em Level1
subscription.MarketData.BuildField = Level1Fields.BestBidPrice;
// Construção de velas a partir do melhor preço ask em Level1
subscription.MarketData.BuildField = Level1Fields.BestAskPrice;
// Construção de velas a partir do meio do spread no livro de ofertas
subscription.MarketData.BuildField = Level1Fields.SpreadMiddle;
- Perfil de volume - cálculo do perfil de volume para candles:
// Ativar o cálculo do perfil de volume
subscription.MarketData.IsCalcVolumeProfile = true;
Exemplos de Assinaturas para Diferentes Tipos de Candle
Velas com período padrão
// Velas de 5 minutos
var timeFrameSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
security);
_connector.Subscribe(timeFrameSubscription);
Carregar apenas velas históricas
// Carregar apenas velas históricas sem transição para tempo real
var historicalSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
security)
{
MarketData =
{
From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
To = DateTime.Today, // Especificar data final
BuildMode = MarketDataBuildModes.Load // Carregar apenas dados já prontos
}
};
_connector.Subscribe(historicalSubscription);
Construindo candles de período não padrão a partir de ticks
// Velas com período de 21 segundos construídas a partir de ticks
var customTimeFrameSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromSeconds(21)),
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(customTimeFrameSubscription);
Construir velas a partir de dados do livro de ofertas
// Velas construídas a partir do meio do spread no livro de ofertas
var depthBasedSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(1)),
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.MarketDepth,
BuildField = Level1Fields.SpreadMiddle
}
};
_connector.Subscribe(depthBasedSubscription);
Velas com perfil de volume
// Velas de 5 minutos com cálculo do perfil de volume
var volumeProfileSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.LoadAndBuild,
BuildFrom = DataType.Ticks,
IsCalcVolumeProfile = true
}
};
_connector.Subscribe(volumeProfileSubscription);
Velas de volume
// Velas de volume (cada vela contém volume de 1000 contratos)
var volumeCandleSubscription = new Subscription(
DataType.Volume(1000m), // Especificar tipo de candle e volume
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(volumeCandleSubscription);
Velas de contagem de ticks
// Velas por contagem de ticks (cada vela contém 1000 negociações)
var tickCandleSubscription = new Subscription(
DataType.Tick(1000), // Especificar tipo de candle e número de negócios
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(tickCandleSubscription);
Velas de faixa de preço
// Velas de faixa de preço com intervalo de 0,1 unidade
var rangeCandleSubscription = new Subscription(
DataType.Range(0.1m), // Especificar tipo de candle e intervalo de preço
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(rangeCandleSubscription);
Velas Renko
// Velas Renko com passo de 0,1
var renkoCandleSubscription = new Subscription(
DataType.Renko(0.1m), // Especificar tipo de candle e tamanho do bloco
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(renkoCandleSubscription);
Velas ponto e figura (P&F)
// Velas Point and Figure
var pnfCandleSubscription = new Subscription(
DataType.PnF(new PnfArg { BoxSize = 0.1m, ReversalAmount = 1 }), // Especificar parâmetros P&F
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(pnfCandleSubscription);