Modos de trading de estrategias

Descripción general

La propiedad TradingMode permite restringir la actividad de trading de una estrategia sin detenerla por completo. Esto es útil para la gestión de riesgos: por ejemplo, prohibir la apertura de nuevas posiciones permitiendo solo cerrar las existentes, o bloquear por completo el envío de órdenes.

El modo se establece mediante la enumeración StrategyTradingModes y se puede cambiar mientras la estrategia se ejecuta.

Enumeración StrategyTradingModes

Valor Descripción
Full Acceso completo a trading. Sin restricciones sobre órdenes. Valor predeterminado.
Disabled El trading está completamente prohibido. Todos los intentos de colocación de órdenes serán rechazados.
CancelOrdersOnly Solo se permite cancelar órdenes. Se prohíben nuevas órdenes y modificaciones de órdenes existentes.
ReducePositionOnly Solo se permiten órdenes que reducen la posición actual. Se prohíbe abrir nuevas posiciones y aumentar las existentes.
LongOnly Solo se permiten posiciones largas. La venta solo se permite para cerrar una posición larga existente (el volumen de venta no puede superar la posición actual). Se prohíbe abrir posiciones cortas.

Establecer el modo

// Al crear la estrategia
var strategy = new MyStrategy();
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// Cambio dinámico durante la operación
strategy.TradingMode = StrategyTradingModes.Disabled;

Lógica de comprobación del modo

Al intentar registrar una orden, la estrategia comprueba el modo actual:

  • Disabled -- la orden se rechaza con el motivo "trading is prohibited".
  • ReducePositionOnly -- la orden se rechaza si la posición actual es cero, si la dirección de la orden coincide con la dirección de la posición o si el volumen de la orden supera el valor absoluto de la posición.
  • LongOnly -- una orden de venta se rechaza si la posición actual no es positiva o si el volumen de venta supera la posición actual.
  • Full -- sin restricciones.
  • CancelOrdersOnly -- solo se permite cancelar órdenes.

Método IsFormedAndOnlineAndAllowTrading

El método de extensión IsFormedAndOnlineAndAllowTrading comprueba que la estrategia esté formada (IsFormed), esté en estado online (IsOnline) y que el modo de trading permita la acción requerida:

// Comprobar permiso para trading completo (predeterminado)
if (!IsFormedAndOnlineAndAllowTrading())
    return;

// Comprobar permiso solo para cancelación de órdenes
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.CancelOrdersOnly))
    CancelActiveOrders();

// Comprobar permiso para reducción de posición
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.ReducePositionOnly))
    return;

Lógica de permisos al llamar con un parámetro required:

Current TradingMode \ required Full CancelOrdersOnly ReducePositionOnly
Full yes yes yes
Disabled no no no
CancelOrdersOnly no yes no
ReducePositionOnly no yes yes
LongOnly no yes yes

Ejemplo de uso

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)
    {
        // Comprobar que la estrategia esté lista para trading completo
        if (!IsFormedAndOnlineAndAllowTrading())
            return;

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

// Iniciar la estrategia con una restricción -- solo posiciones largas
var strategy = new TradingModeStrategy();
strategy.TradingMode = StrategyTradingModes.LongOnly;
strategy.Start();

// Más tarde -- cambiar al modo de cierre de posiciones
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// Bloqueo completo del trading
strategy.TradingMode = StrategyTradingModes.Disabled;

En este ejemplo, la estrategia opera inicialmente en modo LongOnly, que permite solo compras y cierre de posiciones largas. Cuando cambian las condiciones de mercado, el modo puede cambiarse a ReducePositionOnly para un cierre gradual de posiciones, y luego a Disabled para detener por completo la actividad de trading.