Gestão de Risco
Visão Geral
Cada estratégia no StockSharp tem um RiskManager integrado que permite o controlo automático dos riscos de negociação. Quando uma regra é acionada, o gestor pode fechar posições, cancelar ordens ativas ou parar completamente a negociação da estratégia.
O gestor de risco processa todas as mensagens de negociação que passam pela estratégia e, quando as condições das regras são cumpridas, executa automaticamente a ação especificada sem qualquer código adicional na lógica da estratégia.
Propriedades da Estratégia
RiskManager
O objeto IRiskManager que gere a lista de regras. É criado automaticamente quando a estratégia é inicializada:
// Aceder ao gestor de risco
IRiskManager manager = strategy.RiskManager;
RiskRules
Uma propriedade conveniente para ler e definir a lista de regras:
// Ler regras atuais
IEnumerable<IRiskRule> rules = strategy.RiskRules;
// Definir novas regras
strategy.RiskRules = new IRiskRule[]
{
new RiskPnLRule { PnL = -1000m, Action = RiskActions.StopTrading },
new RiskPositionSizeRule { Position = 100m, Action = RiskActions.ClosePositions },
};
Ações de Acionamento
A enumeração RiskActions define as ações possíveis:
| Ação | Descrição |
|---|---|
ClosePositions |
Fechar todas as posições abertas com uma ordem de mercado |
StopTrading |
Bloquear a negociação da estratégia |
CancelOrders |
Cancelar todas as ordens ativas |
Quando uma regra é acionada, a estratégia regista um aviso com o nome da regra, os seus parâmetros e a ação executada.
Regras Disponíveis
RiskPnLRule -- controlo de lucro/perda
Aciona quando o nível de P&L especificado é atingido. Um valor positivo controla o lucro, um valor negativo controla a perda:
// Parar a negociação com uma perda superior a 5000
new RiskPnLRule
{
PnL = -5000m,
Action = RiskActions.StopTrading
}
RiskPositionSizeRule -- controlo do tamanho da posição
Aciona quando o tamanho de posição especificado é atingido:
// Cancelar ordens quando posição >= 100
new RiskPositionSizeRule
{
Position = 100m,
Action = RiskActions.CancelOrders
}
RiskOrderFreqRule -- controlo da frequência de ordens
Aciona quando o número de ordens dentro do intervalo especificado excede o limite:
// Parar com mais de 50 ordens por minuto
new RiskOrderFreqRule
{
Count = 50,
Interval = TimeSpan.FromMinutes(1),
Action = RiskActions.StopTrading
}
RiskOrderVolumeRule -- controlo do volume da ordem
Aciona quando o volume de uma única ordem é excedido.
RiskOrderPriceRule -- controlo do preço da ordem
Aciona quando o preço da ordem ultrapassa os limites estabelecidos.
RiskTradeVolumeRule -- controlo do volume da transação
Aciona quando o volume de uma única transação é excedido.
RiskTradePriceRule -- controlo do preço da transação
Aciona quando o preço da transação ultrapassa os limites estabelecidos.
RiskTradeFreqRule -- controlo da frequência de transações
Aciona quando o número de transações dentro do intervalo é excedido.
RiskPositionTimeRule -- controlo do tempo de manutenção da posição
Aciona quando uma posição foi mantida durante mais tempo do que o estabelecido.
RiskCommissionRule -- controlo da comissão
Aciona quando a comissão total é excedida.
RiskSlippageRule -- controlo do slippage
Aciona quando o nível de slippage é excedido.
RiskErrorRule -- controlo de erros
Aciona quando se acumulou um determinado número de erros.
RiskOrderErrorRule -- controlo de erros de registo de ordens
Aciona quando se acumularam erros de registo de ordens.
Exemplo de Utilização
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);
// Configurar regras de gestão de risco
RiskRules = new IRiskRule[]
{
// Fechar posições com uma perda superior a 10000
new RiskPnLRule
{
PnL = -10000m,
Action = RiskActions.ClosePositions
},
// Parar a negociação quando a posição excede 500 contratos
new RiskPositionSizeRule
{
Position = 500m,
Action = RiskActions.StopTrading
},
// Cancelar ordens quando a frequência excede 100 por minuto
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;
// Lógica de negociação
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));
}
}
Neste exemplo, as regras de gestão de risco são definidas quando a estratégia inicia. Quando é atingida uma perda de 10000, as posições são fechadas automaticamente. Quando o tamanho da posição excede 500 contratos, a negociação é bloqueada. Quando as ordens são colocadas com demasiada frequência, as ordens ativas são canceladas. Todas estas verificações são executadas automaticamente sem qualquer código adicional no método ProcessCandle.