リスク管理
概要
StockSharp のすべてのストラテジーには、取引リスクを自動的に制御できる組み込みの RiskManager があります。ルールがトリガーされると、マネージャーはポジションをクローズしたり、アクティブな注文をキャンセルしたり、ストラテジーの取引を完全に停止したりできます。
リスク マネージャーは、ストラテジーを通過するすべての取引メッセージを処理し、ルール条件が満たされると、ストラテジー ロジックに追加コードを記述しなくても指定されたアクションを自動的に実行します。
ストラテジー プロパティ
RiskManager
ルールのリストを管理する IRiskManager オブジェクトです。ストラテジーの初期化時に自動的に作成されます。
// リスク マネージャーへアクセスする
IRiskManager manager = strategy.RiskManager;
RiskRules
ルールのリストを読み取り、設定するための便利なプロパティです。
// 現在のルールを読み取る
IEnumerable<IRiskRule> rules = strategy.RiskRules;
// 新しいルールを設定する
strategy.RiskRules = new IRiskRule[]
{
new RiskPnLRule { PnL = -1000m, Action = RiskActions.StopTrading },
new RiskPositionSizeRule { Position = 100m, Action = RiskActions.ClosePositions },
};
トリガー アクション
RiskActions 列挙体は、実行可能なアクションを定義します。
| アクション | 説明 |
|---|---|
ClosePositions |
すべてのオープン ポジションを成行注文でクローズする |
StopTrading |
ストラテジーの取引をブロックする |
CancelOrders |
すべてのアクティブ注文をキャンセルする |
ルールがトリガーされると、ストラテジーはルール名、そのパラメーター、実行されたアクションを含む警告をログに記録します。
利用可能なルール
RiskPnLRule -- 損益管理
指定された P&L レベルに到達するとトリガーされます。正の値は利益を制御し、負の値は損失を制御します。
// 5000 を超える損失で取引を停止する
new RiskPnLRule
{
PnL = -5000m,
Action = RiskActions.StopTrading
}
RiskPositionSizeRule -- ポジション サイズ管理
指定されたポジション サイズに到達するとトリガーされます。
// ポジション >= 100 のとき注文をキャンセルする
new RiskPositionSizeRule
{
Position = 100m,
Action = RiskActions.CancelOrders
}
RiskOrderFreqRule -- 注文頻度管理
指定された間隔内の注文数が上限を超えるとトリガーされます。
// 1 分あたり 50 件を超える注文で停止する
new RiskOrderFreqRule
{
Count = 50,
Interval = TimeSpan.FromMinutes(1),
Action = RiskActions.StopTrading
}
RiskOrderVolumeRule -- 注文数量管理
単一注文の数量が上限を超えるとトリガーされます。
RiskOrderPriceRule -- 注文価格管理
注文価格が設定された境界を超えるとトリガーされます。
RiskTradeVolumeRule -- 約定数量管理
単一約定の数量が上限を超えるとトリガーされます。
RiskTradePriceRule -- 約定価格管理
約定価格が設定された境界を超えるとトリガーされます。
RiskTradeFreqRule -- 約定頻度管理
間隔内の約定数が上限を超えるとトリガーされます。
RiskPositionTimeRule -- ポジション保有時間管理
ポジションが設定された時間より長く保有されるとトリガーされます。
RiskCommissionRule -- 手数料管理
総手数料が上限を超えるとトリガーされます。
RiskSlippageRule -- スリッページ管理
スリッページ レベルが上限を超えるとトリガーされます。
RiskErrorRule -- エラー管理
一定数のエラーが蓄積されるとトリガーされます。
RiskOrderErrorRule -- 注文登録エラー管理
注文登録エラーが蓄積されるとトリガーされます。
使用例
public class RiskAwareStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public RiskAwareStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame());
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// リスク管理ルールを設定する
RiskRules = new IRiskRule[]
{
// 10000 を超える損失でポジションをクローズする
new RiskPnLRule
{
PnL = -10000m,
Action = RiskActions.ClosePositions
},
// ポジションが 500 コントラクトを超えたとき取引を停止する
new RiskPositionSizeRule
{
Position = 500m,
Action = RiskActions.StopTrading
},
// 頻度が 1 分あたり 100 件を超えたとき注文をキャンセルする
new RiskOrderFreqRule
{
Count = 100,
Interval = TimeSpan.FromMinutes(1),
Action = RiskActions.CancelOrders
},
};
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle)
{
if (!IsFormedAndOnlineAndAllowTrading())
return;
// 取引ロジック
if (candle.OpenPrice < candle.ClosePrice && Position <= 0)
BuyMarket(Volume + Math.Abs(Position));
else if (candle.OpenPrice > candle.ClosePrice && Position >= 0)
SellMarket(Volume + Math.Abs(Position));
}
}
この例では、ストラテジー開始時にリスク管理ルールが設定されます。10000 の損失に到達すると、ポジションは自動的にクローズされます。ポジション サイズが 500 コントラクトを超えると、取引はブロックされます。注文が頻繁に発注されすぎると、アクティブ注文はキャンセルされます。これらすべてのチェックは、ProcessCandle メソッドに追加コードを記述しなくても自動的に実行されます。