Estratégia de Cotação

Visão Geral

MqStrategy é uma estratégia que utiliza um mecanismo de cotação para gerir posições de mercado. Cria um processador de cotação com base na posição atual, permitindo responder de forma adaptativa a alterações nas condições de mercado.

Componentes Principais

public class MqStrategy : Strategy
{
	private readonly StrategyParam<MarketPriceTypes> _priceType;
	private readonly StrategyParam<Unit> _priceOffset;
	private readonly StrategyParam<Unit> _bestPriceOffset;

	private QuotingProcessor _quotingProcessor;
}

Parâmetros da Estratégia

A estratégia permite personalizar os seguintes parâmetros:

  • PriceType - tipo de preço de mercado para cotação (predefinição Following)
  • PriceOffset - desvio do preço em relação ao preço de mercado
  • BestPriceOffset - desvio mínimo para atualização da cotação (predefinição 0,1%)

Inicialização da Estratégia

No método OnStarted2, a estratégia subscreve alterações do tempo de mercado:

protected override void OnStarted2(DateTime time)
{
	base.OnStarted2(time);

	// Subscrever alterações do tempo de mercado para atualizações de cotação
	Connector.CurrentTimeChanged += Connector_CurrentTimeChanged;
	Connector_CurrentTimeChanged(default);
}

Gestão do Processador de Cotação

O método Connector_CurrentTimeChanged é chamado quando o tempo de mercado muda e gere a criação e atualização do processador de cotação:

private void Connector_CurrentTimeChanged(TimeSpan obj)
{
	// Criar um novo processador apenas se o atual estiver parado ou não existir
	if (_quotingProcessor != null && _quotingProcessor.LeftVolume > 0)
		return;

	// Libertar recursos do processador antigo, se existir
	_quotingProcessor?.Dispose();
	_quotingProcessor = null;

	// Determinar o lado da cotação com base na posição atual
	var side = Position <= 0 ? Sides.Buy : Sides.Sell;

	// Criar novo comportamento de cotação
	var behavior = new MarketQuotingBehavior(
		PriceOffset,
		BestPriceOffset,
		PriceType
	);

	// Calcular volume de cotação
	var quotingVolume = Volume + Math.Abs(Position);

	// Criar e inicializar o processador
	_quotingProcessor = new QuotingProcessor(
		behavior,
		Security,
		Portfolio,
		side,
		quotingVolume,
		Volume, // Volume máximo da ordem
		TimeSpan.Zero, // Sem timeout
		this, // A estratégia implementa ISubscriptionProvider
		this, // A estratégia implementa IMarketRuleContainer
		this, // A estratégia implementa ITransactionProvider
		this, // A estratégia implementa ITimeProvider
		this, // A estratégia implementa IMarketDataProvider
		IsFormedAndOnlineAndAllowTrading, // Verificar permissão de negociação
		true, // Utilizar preços do livro de ordens
		true  // Utilizar o preço da última transação se o livro de ordens estiver vazio
	)
	{
		Parent = this
	};

	// Subscrever eventos do processador para logging
	_quotingProcessor.OrderRegistered += order =>
		this.AddInfoLog($"Ordem {order.TransactionId} registada ao preço {order.Price}");

	_quotingProcessor.OrderFailed += fail =>
		this.AddInfoLog($"Falha na ordem: {fail.Error.Message}");

	_quotingProcessor.OwnTrade += trade =>
		this.AddInfoLog($"Negócio executado: {trade.Trade.Volume} ao preço {trade.Trade.Price}");

	_quotingProcessor.Finished += isOk => {
		this.AddInfoLog($"Cotação concluída com sucesso: {isOk}");
		_quotingProcessor?.Dispose();
		_quotingProcessor = null;
	};

	// Iniciar o processador
	_quotingProcessor.Start();
}

Libertação de Recursos

No método OnStopped, a estratégia liberta recursos:

protected override void OnStopped()
{
	// Anular subscrição para evitar fugas de memória
	Connector.CurrentTimeChanged -= Connector_CurrentTimeChanged;

	// Libertar recursos do processador atual, se existir
	_quotingProcessor?.Dispose();
	_quotingProcessor = null;

	base.OnStopped();
}

Lógica de Negociação

  • A estratégia responde a alterações do tempo de mercado
  • A direção da cotação é determinada com base na posição atual:
    • Se posição <= 0, é criada uma cotação de compra
    • Se posição > 0, é criada uma cotação de venda
  • O volume de cotação é calculado como o volume base mais o valor absoluto da posição atual
  • QuotingProcessor com MarketQuotingBehavior é utilizado para cotação

Funcionalidades

  • Utiliza o processador de cotação moderno em vez das estratégias de cotação legadas
  • Responde de forma adaptativa a alterações de posição ao mudar a direção da cotação
  • Suporta a configuração de vários parâmetros de cotação (tipo de preço, desvio, desvio mínimo)
  • Inclui logging detalhado dos eventos do processador de cotação
  • Gere corretamente recursos ao parar a estratégia e ao criar novos processadores
  • Suporta trabalho com diferentes tipos de preços de mercado (Following, Best, Opposite, etc.)