持仓保护
介绍
这种对SMA策略的修改实现了使用本地保护控制器保护未平仓持仓的机制。这种方法允许灵活的风险管理,并在满足某些条件时自动平仓。
持仓保护的关键组成部分
保护控制器
该策略使用两个关键对象来保护持仓:
// 声明保护控制器
private readonly ProtectiveController _protectiveController = new();
private IProtectivePositionController _posController;
// 此代码初始化主保护控制器,并为以下内容创建占位符
// 特定持仓控制器。ProtectiveController 管理所有持仓,
// while IProtectivePositionController is responsible for a specific position.
_protectiveController:用于管理所有持仓保护的主控制器。_posController:特定位置的控制器。
保护初始化
在开设新持仓或修改现有持仓时,将初始化保护控制器:
// 为新持仓初始化保护控制器
this.WhenOwnTradeReceived()
.Do(t =>
{
// ... (other code)
if (TakeValue.IsSet() || StopValue.IsSet())
{
_posController ??= _protectiveController.GetController(
security.ToSecurityId(),
portfolio.Name,
new LocalProtectiveBehaviourFactory(security.PriceStep, security.Decimals),
TakeValue, StopValue, true, default, default, true);
}
var info = _posController?.Update(t.Trade.Price, t.GetPosition());
if (info is not null)
ActiveProtection(info.Value);
})
.Apply(this);
// 此代码为新持仓创建并初始化保护控制器
// 在收到新成交信息后执行。它还会更新信息
// 更新控制器中的持仓信息,并在需要时激活保护。
这会为特定位置创建一个带有指定止盈和止损参数的控制器。
更新位置信息
var info = _posController?.Update(t.Trade.Price, t.GetPosition());
if (info is not null)
ActiveProtection(info.Value);
这允许控制器跟踪位置的当前状态,并在必要时调整保护性指令。
检查保护的激活条件
在处理新数据的方法中(例如,当接收到新K线时),会检查启动保护性订单的条件:
// 在 ProcessCandle 方法中检查保护激活条件
var info = _posController?.TryActivate(candle.ClosePrice, CurrentTime);
if (info is not null)
ActiveProtection(info.Value);
// 此代码根据当前价格(在本例中为蜡烛的收盘价)和时间
// 检查是否需要激活保护订单。
// 如果满足条件,则调用 ActiveProtection 方法。
这里,蜡烛的收盘价被用作当前价格,但它可以是任何相关的价格值(例如,最后一次交易的价格或订单簿中的当前买卖价差)。
启动保护令
如果满足启动保护令的条件,将触发相应的逻辑:
// 激活保护订单的方法
private void ActiveProtection((bool isTake, Sides side, decimal price, decimal volume, OrderCondition condition) info)
{
// 将保护性(平仓)订单作为普通订单发送
RegisterOrder(this.CreateOrder(info.side, info.price, info.volume));
}
// 此方法创建并注册用于平仓的订单
// 基于从保护控制器收到的信息。
此方法根据保护控制器返回的参数创建并注册一个平仓订单。
与服务器端止损订单的比较
服务器端止损单的优势
- 止损单(止损和止盈)会直接发送给经纪商。
- 经纪商独立监控止损条件的达成情况。
- 当触发止损时,经纪商会自动下达市价单或限价单。
本地方法的优势
- 灵活性:能够实现标准服务器端拦截无法提供的复杂保护逻辑。
- 保密性:关于止损水平的信息不会传送给经纪商,这在某些市场中可能很重要。
- 反应速度:对不断变化的市场条件可能有更快的反应。
- 适应性:能够根据市场数据或策略逻辑动态调整保护级别。
- 独立于经纪商/交易所的实现:本地方法的工作方式相同,无论经纪商或交易所是否支持所有必要类型的保护性订单。
- 在历史数据上测试:能够在历史数据上完全测试带有持仓保护的策略,而服务器端止损无法实现这一点。
地方方法的缺点
- 依赖交易终端功能:如果终端断开连接,保护将不起作用。
- 系统负载:需要在客户端进行持续计算。
- 延迟:在触发保护条件后,下达订单可能会出现延迟。
服务器端止损订单的缺点
- 依赖经纪商/交易所的实现:并非所有经纪商或交易所都支持所有类型的保护性订单,这可能会限制策略的功能性。
- 无法在历史数据上进行全面测试:在历史数据上测试时,服务器端止损无法被准确模拟,这使得评估策略的实际有效性变得困难。
- 有限的灵活性:通常只提供基本类型的止损订单,这限制了实施复杂保护机制的可能性。
结论
在SMA策略中使用本地保护控制器可以有效管理未平仓持仓的风险。这种方法在设置保护参数和迅速应对市场变化方面提供了灵活性,这对于成功交易至关重要。