Handelsmodi von Strategien

Überblick

Die Eigenschaft TradingMode ermöglicht es, die Handelsaktivität einer Strategie einzuschränken, ohne sie vollständig zu stoppen. Dies ist für das Risikomanagement nützlich, beispielsweise um das Öffnen neuer Positionen zu verbieten und nur das Schließen bestehender Positionen zu erlauben oder die Orderübermittlung vollständig zu blockieren.

Der Modus wird über die Enumeration StrategyTradingModes gesetzt und kann geändert werden, während die Strategie läuft.

StrategyTradingModes-Enumeration

Wert Beschreibung
Full Voller Handelszugriff. Keine Einschränkungen für Orders. Standardwert.
Disabled Handel ist vollständig verboten. Alle Versuche zur Orderplatzierung werden abgelehnt.
CancelOrdersOnly Nur Orderstornierung ist erlaubt. Neue Orders und Änderungen bestehender Orders sind verboten.
ReducePositionOnly Nur Orders, die die aktuelle Position reduzieren, sind erlaubt. Das Öffnen neuer Positionen und das Erhöhen bestehender Positionen sind verboten.
LongOnly Nur Long-Positionen sind erlaubt. Verkaufen ist nur zum Schließen einer bestehenden Long-Position erlaubt; das Verkaufsvolumen darf die aktuelle Position nicht überschreiten. Das Öffnen von Short-Positionen ist verboten.

Modus setzen

// Beim Erstellen der Strategie
var strategy = new MyStrategy();
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// Dynamische Änderung während der Ausführung
strategy.TradingMode = StrategyTradingModes.Disabled;

Logik der Modusprüfung

Beim Versuch, eine Order zu registrieren, prüft die Strategie den aktuellen Modus:

  • Disabled -- die Order wird mit dem Grund "trading is prohibited" abgelehnt.
  • ReducePositionOnly -- die Order wird abgelehnt, wenn die aktuelle Position null ist, wenn die Orderrichtung der Positionsrichtung entspricht oder wenn das Ordervolumen den absoluten Wert der Position überschreitet.
  • LongOnly -- eine Verkaufsorder wird abgelehnt, wenn die aktuelle Position nicht positiv ist oder wenn das Verkaufsvolumen die aktuelle Position überschreitet.
  • Full -- keine Einschränkungen.
  • CancelOrdersOnly -- nur Orderstornierung ist erlaubt.

Methode IsFormedAndOnlineAndAllowTrading

Die Erweiterungsmethode IsFormedAndOnlineAndAllowTrading prüft, ob die Strategie gebildet ist (IsFormed), sich im Online-Zustand befindet (IsOnline) und der Handelsmodus die erforderliche Aktion erlaubt:

// Berechtigung für vollen Handel prüfen (Standard)
if (!IsFormedAndOnlineAndAllowTrading())
    return;

// Berechtigung nur für Orderstornierung prüfen
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.CancelOrdersOnly))
    CancelActiveOrders();

// Berechtigung für Positionsreduktion prüfen
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.ReducePositionOnly))
    return;

Berechtigungslogik beim Aufruf mit einem required-Parameter:

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

Verwendungsbeispiel

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)
    {
        // Prüfen, ob die Strategie für vollen Handel bereit ist
        if (!IsFormedAndOnlineAndAllowTrading())
            return;

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

// Strategie mit Einschränkung starten -- nur Long-Positionen
var strategy = new TradingModeStrategy();
strategy.TradingMode = StrategyTradingModes.LongOnly;
strategy.Start();

// Später -- in Positionsschließungsmodus wechseln
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// Vollständige Handelssperre
strategy.TradingMode = StrategyTradingModes.Disabled;

In diesem Beispiel arbeitet die Strategie zunächst im Modus LongOnly, der nur Käufe und das Schließen von Long-Positionen erlaubt. Wenn sich die Marktbedingungen ändern, kann der Modus auf ReducePositionOnly für schrittweises Schließen von Positionen und anschließend auf Disabled für eine vollständige Unterbrechung der Handelsaktivität umgeschaltet werden.