Modos de Negociação da Estratégia

Visão Geral

A propriedade TradingMode permite restringir a atividade de negociação de uma estratégia sem a parar completamente. Isto é útil para a gestão de risco -- por exemplo, proibir a abertura de novas posições permitindo apenas fechar posições existentes, ou bloquear completamente o envio de ordens.

O modo é definido usando a enumeração StrategyTradingModes e pode ser alterado enquanto a estratégia está em execução.

Enumeração StrategyTradingModes

Valor Descrição
Full Acesso total à negociação. Sem restrições sobre ordens. Valor predefinido.
Disabled A negociação é completamente proibida. Todas as tentativas de colocação de ordens serão rejeitadas.
CancelOrdersOnly Apenas o cancelamento de ordens é permitido. Novas ordens e a modificação de ordens existentes são proibidas.
ReducePositionOnly Apenas são permitidas ordens que reduzam a posição atual. A abertura de novas posições e o aumento das existentes são proibidos.
LongOnly Apenas são permitidas posições longas. A venda só é permitida para fechar uma posição longa existente (o volume de venda não pode exceder a posição atual). A abertura de posições curtas é proibida.

Definir o Modo

// Ao criar a estratégia
var strategy = new MyStrategy();
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// Alteração dinâmica durante a operação
strategy.TradingMode = StrategyTradingModes.Disabled;

Lógica de Verificação do Modo

Ao tentar registar uma ordem, a estratégia verifica o modo atual:

  • Disabled -- a ordem é rejeitada com o motivo "trading is prohibited".
  • ReducePositionOnly -- a ordem é rejeitada se a posição atual for zero, se a direção da ordem corresponder à direção da posição, ou se o volume da ordem exceder o valor absoluto da posição.
  • LongOnly -- uma ordem de venda é rejeitada se a posição atual não for positiva ou se o volume de venda exceder a posição atual.
  • Full -- sem restrições.
  • CancelOrdersOnly -- apenas o cancelamento de ordens é permitido.

Método IsFormedAndOnlineAndAllowTrading

O método de extensão IsFormedAndOnlineAndAllowTrading verifica se a estratégia está formada (IsFormed), está num estado online (IsOnline) e se o modo de negociação permite a ação necessária:

// Verificar permissão para negociação completa (predefinição)
if (!IsFormedAndOnlineAndAllowTrading())
    return;

// Verificar permissão apenas para cancelamento de ordens
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.CancelOrdersOnly))
    CancelActiveOrders();

// Verificar permissão para redução de posição
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.ReducePositionOnly))
    return;

Lógica de permissões quando chamado com um parâmetro required:

TradingMode atual \ required Full CancelOrdersOnly ReducePositionOnly
Full sim sim sim
Disabled não não não
CancelOrdersOnly não sim não
ReducePositionOnly não sim sim
LongOnly não sim sim

Exemplo de Utilização

public class TradingModeStrategy : Strategy
{
    private readonly StrategyParam<DataType> _candleType;

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

    public TradingModeStrategy()
    {
        _candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame());
    }

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

        var subscription = SubscribeCandles(CandleType);

        subscription
            .Bind(ProcessCandle)
            .Start();
    }

    private void ProcessCandle(ICandleMessage candle)
    {
        // Verificar se a estratégia está pronta para negociação completa
        if (!IsFormedAndOnlineAndAllowTrading())
            return;

        if (candle.ClosePrice > candle.OpenPrice)
        {
            BuyMarket(Volume);
        }
        else if (candle.ClosePrice < candle.OpenPrice)
        {
            SellMarket(Volume);
        }
    }
}

// Iniciar a estratégia com uma restrição -- apenas posições longas
var strategy = new TradingModeStrategy();
strategy.TradingMode = StrategyTradingModes.LongOnly;
strategy.Start();

// Mais tarde -- mudar para o modo de fecho de posição
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// Bloqueio completo da negociação
strategy.TradingMode = StrategyTradingModes.Disabled;

Neste exemplo, a estratégia opera inicialmente no modo LongOnly, que permite apenas compras e o fecho de posições longas. Quando as condições de mercado mudam, o modo pode ser alterado para ReducePositionOnly para o fecho gradual da posição, e depois para Disabled para uma paragem completa da atividade de negociação.