独自ルールの作成
独自の一意なルール(標準では提供されていない任意のイベントに対するルール)を作成する必要がある場合は、前提条件を扱う派生 MarketRule<TToken,TArg> クラスを作成する必要があります。以下は MarketRuleHelper.WhenMoneyMore(StockSharp.BusinessEntities.Portfolio portfolio, StockSharp.BusinessEntities.IPortfolioProvider provider, StockSharp.Messages.Unit money ) メソッドの実装です。
private sealed class PortfolioRule : MarketRule<Portfolio, Portfolio>
{
private readonly Func<Portfolio, bool> _changed;
private readonly Portfolio _portfolio;
private readonly IConnector _connector;
public PortfolioRule(Portfolio portfolio, IConnector connector, Func<Portfolio, bool> changed) : base(portfolio)
{
if (portfolio == null)
throw new ArgumentNullException("portfolio");
if (changed == null)
throw new ArgumentNullException("changed");
_changed = changed;
_portfolio = portfolio;
_connector = connector;
_connector.PortfolioChanged += OnPortfolioChanged;
}
private void OnPortfolioChanged(Portfolio portfolio)
{
if ((portfolio==_portfolio) && _changed(_portfolio))
Activate(_portfolio);
}
protected override void DisposeManaged()
{
_connector.PortfolioChanged -= OnPortfolioChanged;
base.DisposeManaged();
}
}
public static MarketRule<Portfolio, Portfolio> WhenMoneyMore(this Portfolio portfolio, Unit money)
{
if (portfolio == null)
throw new ArgumentNullException("portfolio");
if (money == null)
throw new ArgumentNullException("money");
var finishMoney = money.Type == UnitTypes.Limit ? money : portfolio.CurrentValue + money;
return new PortfolioRule(portfolio, pf => pf.CurrentValue > finishMoney)
{
Name = "Money increase of portfolio {0} above {1}".Put(portfolio, finishMoney)
};
}
PortfolioRule ルールは IPortfolioProvider.PortfolioChanged イベントを購読し、このイベントが呼び出されると、ポートフォリオ内の現在の資金水準が指定された制限を超えているかどうかの条件が確認されます。条件が true を返した場合、ルールは MarketRule<TToken,TArg>.Activate メソッドを通じてアクティブ化されます。