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:

sample timeframecandles

sample rangecandles

Iniciando a Obtenção de Dados

  1. 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
	}
};
  1. 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.

  1. 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.

  1. 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));
	}
}
  1. 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);

Próximos Passos

Gráfico

Tipo Personalizado de Candle