Ver no GitHub

Estratégia de Gestão de Ordens Trading Boxing

Visão geral

A Estratégia de Gestão de Ordens Trading Boxing recria o painel de gerenciamento manual de ordens do consultor especialista TradingBoxing original. Em vez de botões no gráfico, a versão StockSharp expõe parâmetros que podem ser alternados pela interface da estratégia ou automação. Cada interruptor executa imediatamente a ação solicitada e depois se redefine, fornecendo uma superfície de controle conveniente para entradas no mercado, colocação de ordens pendentes e limpeza de posições existentes.

A estratégia não depende de lógica de indicadores ou eventos de dados de mercado. Ela simplesmente coordena o envio e cancelamento de ordens para o instrumento e o portfólio atribuídos à instância da estratégia.

Parâmetros

Configuração de volume

  • BuyVolume – quantidade usada quando a ação Open Buy Market é acionada. Deve ser positiva.
  • SellVolume – quantidade usada quando a ação Open Sell Market é acionada. Deve ser positiva.
  • BuyStopVolume – quantidade para novas ordens de stop de compra.
  • BuyLimitVolume – quantidade para novas ordens de limite de compra.
  • SellStopVolume – quantidade para novas ordens de stop de venda.
  • SellLimitVolume – quantidade para novas ordens de limite de venda.

Configuração de preço

  • BuyStopPrice – preço de ativação para ordens de stop de compra.
  • BuyLimitPrice – preço para ordens de limite de compra.
  • SellStopPrice – preço de ativação para ordens de stop de venda.
  • SellLimitPrice – preço para ordens de limite de venda.

Interruptores de ação

Todos os parâmetros de ação são interruptores booleanos. Definir um interruptor como true realiza a tarefa correspondente e a estratégia o redefine para false no mesmo ciclo de processamento.

  • CloseBuyPositions – fecha a exposição comprada atual (se Position > 0).
  • CloseSellPositions – fecha a exposição vendida atual (se Position < 0).
  • DeleteBuyStops – cancela as ordens de stop de compra rastreadas.
  • DeleteBuyLimits – cancela as ordens de limite de compra rastreadas.
  • DeleteSellStops – cancela as ordens de stop de venda rastreadas.
  • DeleteSellLimits – cancela as ordens de limite de venda rastreadas.
  • OpenBuyMarket – envia uma ordem de compra a mercado usando BuyVolume.
  • OpenSellMarket – envia uma ordem de venda a mercado usando SellVolume.
  • PlaceBuyStop – registra uma nova ordem de stop de compra em BuyStopPrice com BuyStopVolume e a armazena para cancelamento posterior.
  • PlaceBuyLimit – registra uma nova ordem de limite de compra em BuyLimitPrice com BuyLimitVolume e a armazena para cancelamento posterior.
  • PlaceSellStop – registra uma nova ordem de stop de venda em SellStopPrice com SellStopVolume e a armazena para cancelamento posterior.
  • PlaceSellLimit – registra uma nova ordem de limite de venda em SellLimitPrice com SellLimitVolume e a armazena para cancelamento posterior.

Detalhes de comportamento

  • As ordens criadas através das ações de ordens pendentes são rastreadas internamente para que as ações de exclusão possam cancelá-las posteriormente. Ordens externas que não foram colocadas por esta estratégia não são afetadas.
  • A estratégia verifica que está em execução e que tanto Security quanto Portfolio estão atribuídos antes de executar qualquer solicitação. Quando um requisito está faltando, ela registra um aviso e ignora o interruptor.
  • A validação de volume e preço replica as salvaguardas do painel original: qualquer quantidade não positiva aciona um aviso e nenhuma ordem é enviada.
  • As ações de fechamento operam sobre a posição líquida mantida pela estratégia. Se um vendido precisar ser coberto, a estratégia envia uma ordem de compra a mercado igual a Math.Abs(Position); para uma posição comprada, envia uma ordem de venda a mercado do valor atual de Position.

Notas de uso

  1. Inicie a estratégia com um portfólio e um instrumento válidos.
  2. Ajuste os parâmetros de volume e preço para corresponder ao instrumento que você negocia.
  3. Acione ações manuais definindo o parâmetro booleano necessário como true. A propriedade reverte automaticamente para false após a conclusão da ação, então o próximo acionamento está pronto imediatamente.
  4. Use os interruptores de exclusão para limpar ordens pendentes colocadas anteriormente sempre que o plano de operação mudar.

Como a estratégia é puramente orientada por eventos de entrada do usuário, não há necessidade de se inscrever em velas ou cotações. Ela age como um assistente de execução simples, espelhando a flexibilidade da interface TradingBoxing original dentro do ambiente StockSharp.

using System;
using System.Collections.Generic;

using Ecng.Common;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Trading Boxing strategy (simplified). Uses CCI momentum for entries.
/// </summary>
public class TradingBoxingStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _cciLength;

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public int CciLength
	{
		get => _cciLength.Value;
		set => _cciLength.Value = value;
	}

	public TradingBoxingStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candles", "General");

		_cciLength = Param(nameof(CciLength), 20)
			.SetGreaterThanZero()
			.SetDisplay("CCI Length", "CCI period", "Indicators");
	}

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

		var cci = new CommodityChannelIndex { Length = CciLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(cci, (ICandleMessage candle, decimal cciValue) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (cciValue < -100 && Position <= 0)
				{
					BuyMarket();
				}
				else if (cciValue > 100 && Position >= 0)
				{
					SellMarket();
				}
			})
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawOwnTrades(area);
		}
	}
}