持仓管理
StockSharp 提供了一个灵活的持仓管理系统,允许您跟踪持仓的当前状态,基于订单或交易进行计算,并维护持仓的生命周期历史(开仓、平仓、反转)。
持仓管理器
PositionManager 类实现了 IPositionManager 接口,并作为根据传入消息计算当前持仓的主要组件。
创建管理器
构造函数接受两个参数:
var state = new PositionManagerState();
var manager = new PositionManager(byOrders: false, state);
byOrders = true—— 该持仓是基于订单余额变化计算的。适用于交易系统接收订单状态更新但未接收单笔交易的情况。byOrders = false-- 该持仓基于交易量计算(推荐模式)。提供对已执行操作的更精确的核算。
处理传入消息
ProcessMessage 方法接收一个传入消息 (Message),并在持仓发生变化时返回 PositionChangeMessage,如果持仓未发生变化则返回 null:
var posChange = manager.ProcessMessage(executionMsg);
if (posChange != null)
{
Console.WriteLine($"Position: {posChange.CurrentValue}");
}
IPositionManagerState
IPositionManagerState 接口描述了持仓管理器的内部状态。PositionManagerState 实现存储有关当前订单和持仓的信息。
主要方法
| 方法 | 描述 |
|---|---|
AddOrGetOrder |
注册一个新订单或通过 transactionId 返回现有订单 |
TryGetOrder |
检索订单参数(交易品种、投资组合、方向、余额) |
UpdateOrderBalance |
在部分执行后更新当前订单余额 |
RemoveOrder |
从跟踪中移除已完成的订单 |
UpdatePosition |
按工具和投资组合更新持仓,返回新值 |
Clear |
重置所有管理器状态 |
与状态示例一起工作
var state = new PositionManagerState();
// 注册订单
state.AddOrGetOrder(
transactionId: 12345,
securityId: secId,
portfolioName: "MyPortfolio",
side: Sides.Buy,
volume: 100,
balance: 100
);
// 部分成交后更新
state.UpdateOrderBalance(12345, newBalance: 60);
// 直接更新仓位
var newPosition = state.UpdatePosition(secId, "MyPortfolio", diff: 40);
Console.WriteLine($"Current position: {newPosition}");
// Clear
state.Clear();
持仓生命周期追踪器
PositionLifecycleTracker 类跟踪持仓的完整生命周期——从开仓到平仓(往返)。这对于分析单个交易、计算每个持仓的利润以及生成报告非常有用。
主要特点
- 历史:
History属性(IReadOnlyList<ReportPosition>)包含所有已完成的往返持仓。 RoundTripClosed事件:当一个持仓被平仓(数值变为零)或反转(持仓符号改变)时触发。ProcessPosition方法:接受一个 Position 对象并更新内部状态。
检测到的状态
| 状态 | 描述 |
|---|---|
| 开仓 | 持仓从零变为非零 |
| 关闭 | 持仓价值为零 |
| 反转 | 持仓方向变化(e.g,从多头变为空头) |
使用示例
var tracker = new PositionLifecycleTracker();
tracker.RoundTripClosed += report =>
{
Console.WriteLine($"Round-trip completed:");
Console.WriteLine($" Opened: {report.OpenTime}");
Console.WriteLine($" Closed: {report.CloseTime}");
};
// 处理仓位更新
tracker.ProcessPosition(position);
// 查看历史
foreach (var report in tracker.History)
{
Console.WriteLine($" {report.OpenTime} -> {report.CloseTime}");
}
持仓消息适配器
PositionMessageAdapter 类是一个围绕消息适配器的封装,它可以从消息流自动计算持仓。它在内部连接器基础设施中使用。
运作方式
var innerAdapter = connector.Adapter;
var posManager = new PositionManager(byOrders: false, new PositionManagerState());
var posAdapter = new PositionMessageAdapter(innerAdapter, posManager);
适配器拦截订单执行和交易消息,调用 PositionManager.ProcessMessage,并为上游处理器生成相应的 PositionChangeMessage 实例。
策略中的持仓
在 Strategy 类中,可以通过 Position 属性访问当前持仓:
// 主交易品种的当前仓位
decimal currentPosition = Position;
// 平仓
if (Position > 0)
SellMarket(Math.Abs(Position));
else if (Position < 0)
BuyMarket(Math.Abs(Position));
// 或通过内置方法
ClosePosition();
有关策略中交易操作的更多详细信息,请参阅交易操作部分。