ストラテジーの取引モード

概要

TradingMode プロパティを使用すると、ストラテジーを完全に停止せずに取引アクティビティを制限できます。これはリスク管理に有用です。たとえば、新規ポジションのオープンを禁止し、既存ポジションのクローズだけを許可したり、注文送信を完全にブロックしたりできます。

モードは StrategyTradingModes 列挙体を使用して設定し、ストラテジーの実行中にも変更できます。

StrategyTradingModes 列挙体

説明
Full 完全な取引アクセス。注文に制限はありません。既定値です。
Disabled 取引は完全に禁止されます。すべての注文発注の試行は拒否されます。
CancelOrdersOnly 注文のキャンセルのみ許可されます。新規注文および既存注文の変更は禁止されます。
ReducePositionOnly 現在のポジションを減少させる注文のみ許可されます。新規ポジションのオープンおよび既存ポジションの増加は禁止されます。
LongOnly ロングポジションのみ許可されます。売りは既存のロングポジションをクローズする場合にのみ許可されます(売り数量は現在のポジションを超えることはできません)。ショートポジションのオープンは禁止されます。

モードの設定

// ストラテジー作成時
var strategy = new MyStrategy();
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// 稼働中の動的な変更
strategy.TradingMode = StrategyTradingModes.Disabled;

モード確認ロジック

注文を登録しようとすると、ストラテジーは現在のモードを確認します。

  • Disabled -- 注文は「trading is prohibited」という理由で拒否されます。
  • ReducePositionOnly -- 現在のポジションがゼロの場合、注文方向がポジション方向と一致する場合、または注文数量がポジションの絶対値を超える場合、注文は拒否されます。
  • LongOnly -- 売り注文は、現在のポジションが正でない場合、または売り数量が現在のポジションを超える場合に拒否されます。
  • Full -- 制限はありません。
  • CancelOrdersOnly -- 注文のキャンセルのみ許可されます。

IsFormedAndOnlineAndAllowTrading メソッド

IsFormedAndOnlineAndAllowTrading 拡張メソッドは、ストラテジーが形成済み(IsFormed)であり、オンライン状態(IsOnline)であり、取引モードが必要なアクションを許可していることを確認します。

// 完全な取引の権限を確認(既定)
if (!IsFormedAndOnlineAndAllowTrading())
    return;

// 注文キャンセルのみの権限を確認
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.CancelOrdersOnly))
    CancelActiveOrders();

// ポジション削減の権限を確認
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.ReducePositionOnly))
    return;

required パラメーターを指定して呼び出した場合の許可ロジック:

現在の TradingMode \ required Full CancelOrdersOnly ReducePositionOnly
Full はい はい はい
Disabled いいえ いいえ いいえ
CancelOrdersOnly いいえ はい いいえ
ReducePositionOnly いいえ はい はい
LongOnly いいえ はい はい

使用例

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)
    {
        // ストラテジーが完全な取引を行う準備ができていることを確認
        if (!IsFormedAndOnlineAndAllowTrading())
            return;

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

// 制限付きでストラテジーを開始 -- ロングポジションのみ
var strategy = new TradingModeStrategy();
strategy.TradingMode = StrategyTradingModes.LongOnly;
strategy.Start();

// 後で -- ポジションクローズモードに切り替え
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// 取引を完全にブロック
strategy.TradingMode = StrategyTradingModes.Disabled;

この例では、ストラテジーは最初に LongOnly モードで動作し、買いおよびロングポジションのクローズのみを許可します。市場状況が変化したら、段階的にポジションをクローズするためにモードを ReducePositionOnly に切り替え、その後、取引アクティビティを完全に停止するために Disabled に切り替えることができます。