欢迎光临
我们一直在努力

StockSharp.BusinessEntities 深度解析:交易领域模型与 Provider 接口体系

  • 金融科技
  • 后端
  • 即时通讯

【免费下载链接】StockSharp

Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options).

项目地址:
https://gitcode.com/gh_mirrors/st/StockSharp

点击查看 免费下载

StockSharp.BusinessEntities 是 StockSharp(S#)开源量化交易平台的核心领域模型库,它定义了交易所、交易板块、合约、组合、持仓、订单、成交、K 线等贯穿全平台的交易实体,以及 IConnector 等 Provider 接口。读完本文,你将理解这些实体类在源码中的实际字段与约束、各 Provider 接口的职责边界与事件模型,并学会通过 EntitiesExtensions 扩展方法完成 pip/point 换算、订单重注册、实体与 StockSharp.Messages 消息互转等高频操作,最终结合 Samples/01_Basic 示例跑通"连接—拉取合约—订阅行情"的完整链路。

BusinessEntities 在 StockSharp 中的定位

StockSharp.BusinessEntities 定义了 S# 平台各层共用的"业务词汇表":

  • 实体侧:描述交易所(Exchange)、电子交易板块(ExchangeBoard)、金融合约(Security)、交易账户(Portfolio)、持仓(Position)、已注册订单(Order)、自有成交(MyTrade)、K 线(Candle 及其派生类)等领域对象;
  • 接口侧:声明与市场数据源和交易系统交互的基础接口——行情接入、订单管理、订阅管理、合约/组合/持仓查询、时间源等;
  • 扩展侧:EntitiesExtensions 提供了 pip/point 换算、订单克隆重注册、实体到消息的转换等实用工具。

该库位于整个分层的"地基"位置:上层 Algo(策略/连接器)、Fix.Core(FIX 报文转换)、Diagram.Core(可视化策略设计器)都依赖它。从 BusinessEntities.csproj 可见,它自身只反向依赖一个项目 Messages,说明实体模型与消息模型的边界划分非常清晰:

<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\\props\\common_target_net.props" />
<ItemGroup>
<PackageReference Include="Ecng.Configuration" Version="$(EcngVer)" />
<PackageReference Include="Ecng.Drawing" Version="$(EcngVer)" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\\Messages\\Messages.csproj" />
</ItemGroup>
</Project>

其中 Ecng.Configuration 提供实体持久化所需的 SettingsStorage 与配置校验能力([BasicSetting]、[Required] 等特性均来自它),Ecng.Drawing 服务于 K 线等带绘制语义的实体。

核心领域实体

Exchange 与 ExchangeBoard:交易所与交易板块

Exchange 描述一个交易所,只包含三个核心字段(见 Exchange.cs):

属性类型含义
Name string 交易所代码名(如 MOEX),也是相等性判定的唯一依据
FullNameLoc string 全名的本地化键,FullName 通过 LocalizedStrings.GetString 解析
CountryCode CountryCodes? ISO 国家代码

它实现了 IAsyncPersistable,可异步加载/保存配置(LoadAsync/SaveAsync),并实现 INotifyPropertyChanged 以支持 UI 绑定。

ExchangeBoard(见 ExchangeBoard.cs)描述某交易所下的具体电子板,字段更丰富:

属性类型含义
Code string 板块代码,不能为 null,相等性按 Code + Exchange 判定
Exchange Exchange 所属交易所
WorkingTime WorkingTime 板块交易时段,K 线构建等逻辑会直接取用
TimeZone TimeZoneInfo 交易所所在时区,默认 TimeZoneInfo.Utc
ExpiryTime TimeSpan 板块内合约的到期时限

值得注意的是,由于 XmlSerializer 不支持 TimeSpan,ExpiryTime 通过 [XmlElement(DataType = "duration")] 修饰的 ExpiryTimeStr 桥接属性完成 XML 序列化;TimeZone 同理经 TimeZoneStr 存储。

平台预置的交易所/板块实例以静态属性形式声明在 Exchange_Instances.cs 和 ExchangeBoard_Instances.cs 中,例如:

public static Exchange Moex { get; } = new()
{
Name = "MOEX",
FullNameLoc = LocalizedStrings.MoscowExchangeKey,
CountryCode = CountryCodes.RU,
};

这一"静态实例 + 反射枚举"的设计直接决定了 EntitiesExtensions.EnumerateExchanges() 的实现方式(见后文),也意味着 InMemoryExchangeInfoProvider 的构造函数可以零配置地初始化出全量交易所与板块清单(见 IExchangeInfoProvider.cs#L93-L97)。

Security:合约模型

Security(见 Security.cs)是平台中最核心的实体,描述股票、期货、期权等任意金融工具,继承 Cloneable<Security> 并实现 INotifyPropertyChanged。字段可分几组理解:

基本身份组:Id(全局唯一 ID,ReadOnly 标记)、Code(合约代码,[Required(AllowEmptyStrings = false)] 强制非空)、Board(所属板块,[Required])、Type(SecurityTypes?)、Name/ShortName、Currency(CurrencyTypes?)、ExternalId(在其他系统中的外部 ID,SecurityExternalId 值对象)、Class、PrimaryId(主交易所上的标识)。

交易规则组(下单前必须关注的约束):

属性校验含义
PriceStep 设置 ≤0 抛 ArgumentOutOfRangeException 最小价格步长
VolumeStep 同上 最小数量步长
MinVolume / MaxVolume ≥0 单笔订单允许的最小/最大数量
Multiplier ≥0 合约乘数(期货/期权名义价值换算)
Decimals ≥0 价格小数位数
ExpiryDate / SettlementDate — 到期日/结算日(衍生品到期、债券赎回)
Shortable — 是否允许做空

衍生品组:UnderlyingSecurityId(标的资产)、OptionType、Strike、OptionStyle、BinaryOptionType、UnderlyingSecurityType、UnderlyingSecurityMinVolume。

其他:CfiCode(ISO 10962 分类)、FaceValue(面值)、SettlementType、IssueSize/IssueDate(发行规模/日期)、BasketCode/BasketExpression(篮子合约)、CommissionTaker/CommissionMaker(手续费,标记 [XmlIgnore] 不参与序列化)。

Security 还内置了完整的 Clone()/CopyTo(Security destination) 实现,逐字段拷贝并深拷贝 ExternalId,这保证了实体在持久化、消息转换时不会产生共享引用问题。

Portfolio 与 Position:账户与持仓

Portfolio(见 Portfolio.cs)继承自 Position,这体现了"交易账户本身就是一种特殊持仓"的建模思想:

  • Portfolio:Name(账户代码名,同时作为 PortfolioName 返回)、Board(账户所属板块)、State(PortfolioStates? 账户状态);
  • Position(见 Position.cs):BeginValue(交易日初持仓)、CurrentValue(当前持仓,[BasicSetting] 标记为持久化必需字段)、BlockedValue(被活动订单冻结的数量)、CurrentPrice(持仓价格)以及 Portfolio/Security/Side 等归属字段,实现 ILocalTimeMessage/IServerTimeMessage。

Position 的持仓语义遵循 BeginValue + 成交流 − BlockedValue 的记账模型:MyTrade 中的 Position 字段记录单笔成交后产生的净持仓变化,配合 PnL、Slippage、Commission 字段可直接用于统计。

Order 与 MyTrade:订单与成交

Order(见 Order.cs,实现 IOrderMessage)承载订单全生命周期信息:

  • 标识组:Id(交易所订单号)、StringId、BoardId、TransactionId(本端交易号)、UserOrderId、StrategyId;
  • 报单组:Side(方向)、Price、Volume、VisibleVolume、Type(OrderTypes 市价/限价/止损等)、TimeInForce、ExpiryDate、Condition(条件单,可 TypedClone() 深拷贝)、PostOnly、MarginMode、Leverage、MinVolume;
  • 状态组:State(OrderStates,如 PendingNew/Open/Matched/Cancelled/Failed)、Status、Balance(剩余数量)、AveragePrice(均价)、IsSystem、IsManual、IsMarketMaker;
  • 统计组:LatencyRegistration/LatencyCancellation/LatencyEdition(注册/撤单/改单延迟)、Slippage、Commission、Yield(收益率);
  • 归属组:Portfolio、Security、BrokerCode/ClientCode、ServerTime/LocalTime。

MyTrade(见 MyTrade.cs)表示"自有成交",由两部分组成:Order(触发该成交的订单)与 Trade(成交明细)。当前代码中 Trade 的属性类型为 ITickTradeMessage(Tick 成交通用消息接口,定义于 Messages 项目),说明成交明细已从独立的 Trade 实体统一收敛到消息体系;此外还有 Commission/CommissionCurrency、Slippage(成交价滑点)、PnL(该笔实现的盈亏)、Position(成交后净持仓)、Initiator(是否为主动方)、Yield 等统计字段。

原文档 README 中提到的 MarketDepth(盘口)与 Trade 两个实体,从当前源码结构看已不再以独立类形式存在于 BusinessEntities:盘口数据现由 Messages 项目的 IOrderBookMessage 接口表达(QuoteChange[] Bids、QuoteChange[] Asks、QuoteChangeStates? State,见 IOrderBookMessage.cs),成交明细由 ITickTradeMessage 表达。这一变化体现了 S# 的演进方向——业务实体与消息模型逐步合一,BusinessEntities 侧重"静态描述",Messages 侧重"动态流转"。

Candle 与 K 线模型

Candle(见 Candles/Candle.cs)是 K 线基类,实现 ICandleMessage,核心字段包括 Security、OpenTime/CloseTime/HighTime/LowTime 四个时间点以及 OHLCV 价格/量字段。派生类通过泛型参数 TArg 表达"如何切分 K 线":

public class TimeFrameCandle : Candle<TimeSpan>, ITimeFrameCandleMessage
{
public TimeSpan TimeFrame { get => TypedArg; set => TypedArg = value; }

protected override void Validate(TimeSpan value)
{
if (value <= TimeSpan.Zero)
throw new ArgumentOutOfRangeException(nameof(value));
}
}

即 TimeFrameCandle 用时间周期(TimeSpan)切分,TickCandle 用成交量切分,两者的参数校验逻辑都在 Validate 中收紧。需要说明的版本前提:当前代码中 Candle、TimeFrameCandle、TickCandle 及 CandleSeries 均已标注 [Obsolete](分别建议改用 ICandleMessage、TimeFrameCandleMessage 和 Subscription 类),属于保留的兼容层;新代码应优先使用 Messages 中的 ICandleMessage 消息体系与 Subscription.cs 订阅模型,而 BusinessEntities/Candles 下的类型仍承担序列化兼容([KnownType]、[DataContract])职责。

Provider 接口体系

IConnector:连接交易系统的"主入口"

IConnector(见 IConnector.cs#L6-L9)是整个库最重要的接口,它组合了消息传输、持久化、日志与全部业务 Provider:

public interface IConnector : IMessageTransport, IAsyncPersistable, ILogReceiver,
IMarketDataProvider, ITransactionProvider, ISecurityProvider,
ISubscriptionProvider, ITimeProvider,
IPortfolioProvider, IPositionProvider, IAsyncDisposable

(README 中的接口片段未列出 IAsyncDisposable,当前源码已补充,说明连接器现支持异步释放资源。)

其自有的成员可分为三类:

连接生命周期事件:

event Action Connected;
event Action Disconnected;
event Action<Exception> ConnectionError; // 连接被服务端中断等
event Action<IMessageAdapter> ConnectedEx; // 携带具体适配器的重载
event Action<IMessageAdapter> DisconnectedEx;
event Action<IMessageAdapter, Exception> ConnectionErrorEx;
event Action<IMessageAdapter> ConnectionLost; // 连接丢失(区别于主动断开)
event Action<IMessageAdapter> ConnectionRestored; // 连接恢复
event Action<Exception> Error; // 数据处理错误

从 ConnectionLost/ConnectionRestored 与 Disconnected 的区分可以看出,接口明确支持"瞬时断线—自动重连"场景,这对实盘机器人非常关键。

状态与数据访问属性:ExchangeBoards(已加载合约的板块列表)、Securities(已加载合约列表,接口注释明确要求在 ISubscriptionProvider.SecurityReceived 事件触发后再读取,否则返回空集)、CanConnect、ConnectionState,以及 TransactionAdapter/MarketDataAdapter 两条消息通道(交易与行情物理分离)。

核心方法:Connect()/Disconnect()、GetSecurityId(Security)(实体 ID → 消息 SecurityId 值对象)、GetSecurityAsync(SecurityId, CancellationToken)、SendOutMessageAsync(Message, CancellationToken)。注意 GetSecurity 与 SendOutMessage(同步版)均已 [Obsolete],平台已全面转向 ValueTask + CancellationToken 的异步模型。

IMarketDataProvider 与 ITransactionProvider

IMarketDataProvider(见 IMarketDataProvider.cs)负责 Level1 行情取值与变化通知:

event Action<Security, IEnumerable<KeyValuePair<Level1Fields, object>>, DateTime, DateTime> ValuesChanged;
object GetSecurityValue(Security security, Level1Fields field);
IEnumerable<Level1Fields> GetLevel1Fields(Security security);

其中 ValuesChanged 的四个参数依次为合约、变更的字段键值对、服务器时间、本地时间,策略可据此增量更新 Level1 快照。

ITransactionProvider(见 ITransactionProvider.cs#L86-L123)是订单操作的权威入口,五个核心方法与两个能力探测:

IdGenerator TransactionIdGenerator { get; } // 交易号生成器

void RegisterOrder(Order order); // 注册新订单
void EditOrder(Order order, Order changes); // 修改订单(changes 只含变更字段)
void ReRegisterOrder(Order oldOrder, Order newOrder); // 撤单并重新报单
void CancelOrder(Order order);
void CancelOrders(bool? isStopOrder = null, Portfolio portfolio = null,
Sides? direction = null, ExchangeBoard board = null,
Security security = null, SecurityTypes? securityType = null,
long? transactionId = null); // 按组合/板块/合约/方向批量撤单

bool? IsOrderEditable(Order order); // 是否可 EditOrder(null 表示未知)
bool? IsOrderReplaceable(Order order); // 是否可 ReRegisterOrder

CancelOrders 的过滤参数均为可空,null 表示"该维度不参与过滤",isStopOrder 三态(true 只撤止损单、false 只撤普通单、null 都撤)。IsOrderEditable/IsOrderReplaceable 返回 bool? 三态,允许连接器诚实地表达"我不知道",这是 EntitiesExtensions.ReRegisterOrderEx 能做智能降级的前提(后文详述)。

ISubscriptionProvider:统一订阅与数据分发

ISubscriptionProvider(见 ISubscriptionProvider.cs)是数据到达事件的分发中枢。它持有五个全局查询订阅(SecurityLookup、PortfolioLookup、BoardLookup、OrderLookup、DataTypeLookup,可为 null),以及覆盖全数据类型的 Action<Subscription, T> 事件族:

事件载荷语义
Level1Received Level1ChangeMessage Level1 报价变化
OrderBookReceived IOrderBookMessage 盘口快照/增量
TickTradeReceived ITickTradeMessage Tick 成交
OrderLogReceived IOrderLogMessage 订单簿日志
CandleReceived ICandleMessage K 线(含未收盘/收盘状态)
SecurityReceived Security 合约到达
BoardReceived / NewsReceived ExchangeBoard / News 板块/新闻
OwnTradeReceived / OrderReceived MyTrade / Order 自有成交/订单状态
OrderRegisterFailReceived 等 OrderFail 注册/撤单/改单失败
PortfolioReceived / PositionReceived Portfolio / Position 账户/持仓
SubscriptionOnline / SubscriptionStarted / SubscriptionStopped / SubscriptionFailed Subscription 订阅生命周期

每个数据事件都携带触发它的具体 Subscription 对象,便于同一进程内多订阅者按订阅来源分发。接口注释明确将 ITransactionProvider 中一大批旧事件(NewMyTrade、NewOrder、OrderChanged、LookupSecuritiesResult 等)标记为 [Obsolete] 并指向 ISubscriptionProvider 对应事件——从源码结构看,S# 正在把所有"数据到达"通知统一收敛到订阅模型。

其余 Provider 接口

  • ISecurityProvider(ISecurityProvider.cs):合约查询。Count、Added/Removed/Cleared 集合变更事件,ValueTask<Security> LookupByIdAsync(SecurityId, CancellationToken),以及支持流式返回的 IAsyncEnumerable<Security> LookupAsync(SecurityLookupMessage criteria)——合约数量大时按枚举器惰性拉取,避免一次性物化。
  • IPortfolioProvider(IPortfolioProvider.cs):Portfolios 集合、LookupByPortfolioName(string)、NewPortfolio/PortfolioChanged 事件。
  • IPositionProvider(IPositionProvider.cs):Positions 集合、NewPosition/PositionChanged 事件,以及精细的持仓查询:

Position GetPosition(Portfolio portfolio, Security security, string strategyId,
Sides? side, string clientCode = "", string depoName = "",
TPlusLimits? limitType = null);

depoName 参数支持按托管账户(金交所场景下股票物理所在的保管处)查分仓持仓,limitType 支持 T+0/T+1 限制下的可用量计算。

  • ITimeProvider(ITimeProvider.cs):DateTime CurrentTime 与 Action<TimeSpan> CurrentTimeChanged(首次触发传 TimeSpan.Zero,之后传距上次的时间差),提供经过校准的服务器时间源。
  • IExchangeInfoProvider(IExchangeInfoProvider.cs):交易所/板块的增删查与持久化(Save/Delete/TryGetExchangeBoard),同文件内附带内存实现 InMemoryExchangeInfoProvider,其构造即调用 EntitiesExtensions.EnumerateExchanges() 预置全部内置交易所。

EntitiesExtensions:实体工具集

EntitiesExtensions(EntitiesExtensions.cs)是实体层的"瑞士军刀",按用途可分四类。

Pip/Point 换算与价格收缩

public static Unit Pips(this decimal value, Security security)
{
if (security == null)
throw new ArgumentNullException(nameof(security));

var step = security.PriceStep ??
throw new ArgumentException(LocalizedStrings.PriceStepNotSpecified, nameof(security));

return new Unit(value * step, UnitTypes.Absolute);
}

Pips(int/double/decimal, Security) 三个重载把"N 个 pip"按合约的 PriceStep 换算为绝对价格幅度 Unit;若 PriceStep 未设置则直接抛异常(PriceStepNotSpecified)。Points 重载族基于已废弃的 StepPrice 字段,整体标记 [Obsolete]。ShrinkPrice 则把任意价格"收缩"为符合最小步长且小数位受 Decimals 限制的合法报价:

public static decimal ShrinkPrice(this Security security, decimal price)
{
// …
return price.Round(security.PriceStep ?? 1m, security.Decimals ?? 0);
}

这两组方法正是策略里"止损距离 10 pips""价格对齐最小报价单位"的底层实现。

订单重注册的智能降级

ReRegisterClone 深拷贝原订单(Condition 用 TypedClone()),newPrice/newVolume 为 null 时保留原值;ReRegisterOrderEx 则演示了如何用 bool? 三态做能力探测与降级:

public static void ReRegisterOrderEx(this ITransactionProvider provider, Order order, Order clone)
{
if (provider.IsOrderReplaceable(order) == true)
{
if (provider.IsOrderEditable(order) == true)
provider.EditOrder(order, clone); // 首选:原地改单(1 次往返)
else
provider.ReRegisterOrder(order, clone); // 次选:原子替换(若连接器支持)
}
else
{
provider.CancelOrder(order); // 兜底:撤单 + 重新报单(2 次往返)
provider.RegisterOrder(clone);
}
}

优先 EditOrder(原子改单)→ 其次 ReRegisterOrder → 最后"撤+报",在延迟与一致性之间逐级退让,是实盘代码里处理"移动止损单/改价"的推荐范式。

实体 ↔ Messages 互转

扩展方法族 ToMessage/ToSecurity/ToOrder/ToBoard/ToChangeMessage/CreateRegisterMessage/CreateCancelMessage/CreateReplaceMessage 构成实体与消息的双向映射层,例如:

  • MyTrade.ToMessage() → ExecutionMessage(把成交、订单、持仓、PnL、手续费一次性拍平成执行消息,见 EntitiesExtensions.cs#L246-L283);
  • Order.ToMessage() → ExecutionMessage,OrderFail.ToMessage(originalTransactionId) → 带错误信息的 ExecutionMessage;
  • Order.CreateRegisterMessage() / CreateCancelMessage() / CreateReplaceMessage() 生成 OrderRegisterMessage/OrderCancelMessage/OrderReplaceMessage,供消息驱动型连接器(而非实体驱动)发送;
  • Security.ToMessage() → SecurityMessage,内部 FillMessage<TMessage> 逐字段搬运,IsAllSecurity()(通配查询条件)时返回空消息表示"查全部";反向 SecurityMessage.ToSecurity(IExchangeInfoProvider) 依赖交易所信息把 BoardCode 还原为 ExchangeBoard 对象。

EntitiesExtensions.LookupAllCriteria 静态字段与 IsLookupAll/ToLookupMessage/ToLookupCriteria 构成"通配查询条件"协议:一个未填字段的 Security 即表示"查询全部合约"。

EnumerateExchanges:反射驱动的静态实例枚举

README 给出的示例方法在源码中完整存在(EntitiesExtensions.cs#L214-L232):

private const BindingFlags _publicStatic = BindingFlags.Public | BindingFlags.Static;

public static IEnumerable<Exchange> EnumerateExchanges()
=> typeof(Exchange)
.GetMembers<PropertyInfo>(_publicStatic, typeof(Exchange))
.Select(prop => (Exchange)prop.GetValue(null, null));

原理是:内置交易所/板块以 Exchange/ExchangeBoard 的 public static 属性声明(Exchange.Moex、ExchangeBoard.Future……),反射收集这些静态属性即得全量清单。EnumerateExchangeBoards() 同构。InMemoryExchangeInfoProvider 构造函数(IExchangeInfoProvider.cs#L93-L97)正是用它完成初始化的,这条"反射枚举 → 内存字典"链路是板块/交易所数据的零配置来源。

项目结构与构建配置

BusinessEntities.csproj 通过 <Import Project="..\\props\\common_target_net.props" /> 引入共享构建属性(common_target_net.props):

<Import Project="common_target_common.props" />
<PropertyGroup>
<StockSharpTargets Condition="'$(StockSharpTargets)' == ''">$(NetTfm)</StockSharpTargets>
<TargetFrameworks>$(StockSharpTargets)</TargetFrameworks>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

由此可知:目标框架由 MSBuild 属性 StockSharpTargets(缺省取 NetTfm)统一控制,可在构建时用属性覆盖而无需改动 csproj;GenerateDocumentationFile 强制生成 XML 文档,保证所有 public API 的 XML 注释进入 IntelliSense。README 文档中 csproj 片段包含的 <ProjectGuid> 节在当前仓库文件中已不存在,说明项目文件做过精简,实际依赖与引用以仓库内文件为准。

实战示例:连接并订阅合约行情

BusinessEntities 被所有 Samples 项目与生产连接器使用。README 指向的完整示例位于 Samples/01_Basic/01_ConnectAndDownloadInstruments,其 MainWindow.xaml.cs 浓缩了 BusinessEntities + Algo.Connector 的标准用法(该目录另含 WPF 与 Avalonia 两个变体,_Avalonia 项目可跨平台运行):

private readonly Connector _connector = new();
private const string _connectorFile = "ConnectorFile.json";
private readonly IFileSystem _fileSystem = Paths.FileSystem;

public MainWindow()
{
InitializeComponent();

// 把 Connector 内部的全部适配器注册为平台消息源
ConfigManager.RegisterService<IMessageAdapterProvider>(
new InMemoryMessageAdapterProvider(_connector.Adapter.InnerAdapters));
}

private async void OnLoaded(object sender, RoutedEventArgs e)
{
ThemeExtensions.ApplyDefaultTheme();

// 连接器配置持久化:IAsyncPersistable 接口的 LoadAsync
if (_fileSystem.FileExists(_connectorFile))
await _connector.LoadAsync(
await _connectorFile.DeserializeAsync<SettingsStorage>(_fileSystem, default), default);
}

private async void Setting_Click(object sender, RoutedEventArgs e)
{
if (_connector.Configure(this))
await (await _connector.SaveAsync(default)).SerializeAsync(_fileSystem, _connectorFile, true, default);
}

private void Connect_Click(object sender, RoutedEventArgs e)
{
SecurityPicker.SecurityProvider = _connector; // ISecurityProvider
SecurityPicker.MarketDataProvider = _connector; // IMarketDataProvider
_connector.Connected += Connector_Connected;
_connector.Connect();
}

private void Connector_Connected()
{
// 通配查询:拉取全部合约(IConnector : ISubscriptionProvider)
_connector.Subscribe(new(StockSharp.Messages.Extensions.LookupAllCriteriaMessage));
}

private void SecurityPicker_SecuritySelected(Security security)
{
if (security == null) return;
_connector.Subscribe(new(DataType.Level1, security)); // 订阅该合约 Level1
}

从源码结构看,这段示例把本文讲解的机制串成了一条完整链路:

  • Connector 实现 IConnector,其 Adapter.InnerAdapters 暴露内部消息适配器链,InMemoryMessageAdapterProvider 将其注册到 ConfigManager,供 UI/策略按需取用;
  • 连接器的配置加载/保存走 IAsyncPersistable(LoadAsync/SaveAsync + SettingsStorage 序列化到 ConnectorFile.json),与 Exchange/ExchangeBoard 的持久化接口同源;
  • 连接成功后订阅 LookupAllCriteriaMessage(对应 EntitiesExtensions.LookupAllCriteria 协议),合约逐个经 SecurityReceived 事件到达并汇入 Securities 集合;
  • 选中某 Security 后以 new Subscription(DataType.Level1, security) 发起订阅,行情经 Level1Received 事件分发。
  • 同目录下的 02_MarketDepths 与 03_Orders 示例则分别演示盘口/Tick 成交订阅(OrderBookReceived/TickTradeReceived)与订单注册/撤单(ITransactionProvider 全家桶),其说明见 Samples/01_Basic/README.md。

    小结

    StockSharp.BusinessEntities 以极小的依赖面(仅 Messages + Ecng 两个包)承载了 S# 平台的全部交易领域概念:

    • 实体层:Exchange/ExchangeBoard(静态实例 + 反射枚举)、Security(带取值校验的交易规则)、Portfolio : Position(账户即持仓)、Order(全生命周期 + 延迟统计)、MyTrade(成交 + 归因统计)、Candle 家族(K 线,现建议迁移到消息体系);
    • 接口层:IConnector 聚合 9 个 Provider 角色与断线恢复事件,ISubscriptionProvider 统一数据分发,ITransactionProvider 以 bool? 三态支撑能力探测与降级;
    • 扩展层:EntitiesExtensions 提供 pip 换算、价格收缩、智能重注册与实体↔消息双向映射;
    • 工程层面:csproj 经 common_target_net.props 统一管理多目标框架与 XML 文档生成。

    理解这一层之后,阅读 Algo/Connector.cs、Fix.Core/MessageConverter.cs(消息→实体/报文转换)乃至上层 Strategy(Algo.Strategies)时,都能以这些实体与接口为锚点快速定位行为语义。

    赞

    分享

    • 金融科技
    • 后端
    • 即时通讯

    【免费下载链接】StockSharp

    Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options).

    项目地址:
    https://gitcode.com/gh_mirrors/st/StockSharp

    点击查看 免费下载

    上一篇:
    戴森球计划工厂蓝图库:5000+精选设计助你打造完美星际工厂

    下一篇:
    10个React Native性能优化技巧:从卡顿到丝滑的终极指南

    创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

    赞(0)
    未经允许不得转载:171主机测评 » StockSharp.BusinessEntities 深度解析:交易领域模型与 Provider 接口体系
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址