Для изменения размера нажмите или перетащите
Правило

В S# для IMarketRule уже есть ряд предопределенных условий и действий для наиболее распространенных сценариев. Ниже представлены сгруппированные по торговым объектам списки условий класса MarketRuleHelper:

Для Security

Для MarketDepth

Для Order

Для Portfolio

Для Position

Для IPnLManager

Для Candle

Для Strategy

Для IConnector

Аналогично условиям есть и предопределенные действия:

Если требуется создать свое уникальное правило (на какое-то событие, которое не предусмотрено стандартно), необходимо создать свой класс-наследник MarketRuleTToken, TArg, который будет работать с необходимым условием. Ниже приведена реализация метода WhenMoneyMore:

C#
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.PortfoliosChanged += OnPortfoliosChanged;
    }

    private void OnPortfoliosChanged(IEnumerable<Portfolio> portfolios)
    {
        if (portfolios.Contains(_portfolio) && _changed(_portfolio))
            Activate(_portfolio);
    }

    protected override void DisposeManaged()
    {
        _connector.PortfoliosChanged -= OnPortfoliosChanged;
        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 = "Увеличение денег портфеля {0} выше {1}".Put(portfolio, finishMoney)
    };
}

Правило PortfolioRule подписывается на событие IConnectorPortfoliosChanged и, как только оно вызывается, то проверяется условие на превышение текущего уровня денежных средств в портфеле выше определенного лимита. Если условие возвращает true, то активируется правило через метод MarketRuleTToken, TArgActivate.