风险管理
概览
StockSharp 中的每个策略都内置了 RiskManager,可实现交易风险的自动控制。当触发规则时,管理者可以平仓、取消活动订单,或完全停止策略交易。
风险管理器处理通过策略的所有交易信息,当规则条件满足时,它会自动执行指定操作,而无需在策略逻辑中添加任何额外代码。
策略属性
风险管理者
IRiskManager 对象用于管理规则列表。当策略初始化时,它会自动创建:
// 访问风险管理器
IRiskManager manager = strategy.RiskManager;
风险规则
一个用于读取和设置规则列表的方便属性:
// 读取当前规则
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 |
取消所有活动订单 |
当规则被触发时,该策略会记录一条警告,其中包含规则名称、其参数以及执行的操作。
可用规则
风险盈亏规则 -- 盈利/亏损控制
当达到指定的盈亏水平时触发。正值控制利润,负值控制亏损:
// 亏损超过 5000 时停止交易
new RiskPnLRule
{
PnL = -5000m,
Action = RiskActions.StopTrading
}
风险持仓规模规则 -- 持仓规模控制
当达到指定的持仓规模时触发:
// 当持仓 >= 100 时取消订单
new RiskPositionSizeRule
{
Position = 100m,
Action = RiskActions.CancelOrders
}
RiskOrderFreqRule -- 订单频率控制
当指定时间间隔内的订单数量超过限制时触发:
// 每分钟超过 50 个订单时停止
new RiskOrderFreqRule
{
Count = 50,
Interval = TimeSpan.FromMinutes(1),
Action = RiskActions.StopTrading
}
风险订单量规则 -- 订单量控制
当单个订单的数量超出时触发。
风险订单价格规则 -- 订单价格控制
当订单价格超过设定的边界时触发。
风险交易量规则 -- 交易量控制
当单笔交易的交易量被超过时触发。
风险交易价格规则 -- 交易价格控制
当交易价格超过设定的边界时触发。
风险交易频率规则 -- 交易频率控制
当在该时间间隔内的交易数量被超过时触发。
风险持仓时间规则 -- 持仓时间控制
当一个持仓持有时间超过既定时间时触发。
风险佣金规则 -- 佣金控制
当总佣金超出时触发。
风险滑点规则 -- 滑点控制
当滑点水平被超过时触发。
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
},
// 频率超过每分钟 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方法中编写任何额外代码。