【免费下载链接】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
}
从源码结构看,这段示例把本文讲解的机制串成了一条完整链路:
同目录下的 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),仅供参考


