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

Использование правил

  • Создание правила на условие регистрации заявки:

    C#
    private void btnBuy_Click(object sender, RoutedEventArgs e)
    {
       var order = new Order
       { 
           Portfolio = Portfolio.SelectedPortfolio,
           Price = _instr1.BestAsk.Price,
           Security = _instr1,
           Volume = 1,
           Direction = Sides.Buy,
       };
    
       order
           .WhenRegistered(Connector)
           .Do(() => Connector.AddInfoLog("Заявка успешно зарегистрирована"))
           .Once()
           .Apply(this);
    
    
        // регистрация заявки
       Connector.RegisterOrder(order);
    }

    Теперь, когда сработает событие (заявка будет зарегистрирована на бирже), указанное через метод IMarketRuleDo действие будет вызвано.

    В конце формирования правила вызывается метод MarketRuleHelperApply. До тех пор, пока метод не будет вызван для правила - оно неактивно (обработчик в IMarketRuleDo не будет вызываться).

  • Создание правил внутри стратегии:

    C#
    class FirstStrategy : Strategy
    {
        ...
    
        protected override void OnStarting()
        {
            _series
                .WhenCandlesFinished()
                .Do(FinishCandle)
                .Apply(this);
    
            Security
                .WhenNewTrade(trader)
                .Do(NewTrade)
                .Apply(this);
    
            base.OnStarting();
        }
    
        ...
    }
  • Удаление ненужных правил.

    У IMarketRule есть Token - токен правила, с которым он ассоциирован. Например, для правила WhenCanceled токеном будет являться заявка.

    Когда сработало правило успешной отмены заявки, то лучше удалить все остальные правила, связанные с этой заявкой:

    C#
    var order = this.CreateOrder(direction, (decimal) Security.GetCurrentPrice(direction), Volume);
    
    var ruleCanceled = order.WhenCanceled(Connector);
    
    ruleCanceled
        .Do(() =>
        {
            this.AddInfoLog("Заявка успешно отменена");
    
            // удаление всех правил связанных с order
            Rules.RemoveRulesByToken(ruleCanceled, (IMarketRule) ruleCanceled.Token);
        })
        .Once()
        .Apply(this);
    
    order
        .WhenRegistered(Connector)
        .Do(() => this.AddInfoLog("Заявка успешно зарегистрирована"))
        .Once()
        .Apply(this);
    
    order
        .WhenRegisterFailed(Connector)
        .Do(() => this.AddInfoLog("Заявка не принята биржей"))
        .Once()
        .Apply(this);
    
    order
        .WhenMatched(Connector)
        .Do(() => this.AddInfoLog("Заявка полностью исполнена"))
        .Once()
        .Apply(this);
    
    // регистрирация заявки
    RegisterOrder(order);
  • Oбъединение правил по условию Or / And.

    Когда выйдет время ИЛИ закроется свеча:

    C#
    CandleSeries _series;
    TimeSpan _holdTimeToOpen = TimeSpan.FromMilliseconds(5000);
    
    ...
    
    Trader
        .WhenIntervalElapsed(_holdTimeToOpen)
        .Or(__candleManager.WhenCandlesStarted(_series))
        .Do(() => this.AddInfoLog("Свеча закрыта или вышло время"))
        .Once()
        .Apply(this);

    Или такой формат записи:

    C#
    MarketRuleHelper
        .Or(new IMarketRule[] {Trader.WhenIntervalElapsed(_holdTimeToOpen), _candleManager.WhenCandlesStarted(_series)})
        .Do(() => this.AddInfoLog("Свеча закрыта или вышло время"))
        .Once()
        .Apply(this);

    Когда цена последней сделки будет выше 135000 И ниже 140000:

    C#
    var priceMore = new Unit(135000m, UnitTypes.Limit);
    var priceLess = new Unit(140000m, UnitTypes.Limit);
    
    MarketRuleHelper
        .And(new IMarketRule[] {Security.WhenLastTradePriceMore(Connector, Connector, priceMore), Security.WhenLastTradePriceLess(Connector, Connector, priceLess)})
        .Do(() => this.AddInfoLog(string.Format("Цена последней сделки находится в диапазоне от {0} до {1}", priceMore, priceLess)))
        .Apply(this);
    Примечание Примечание

    Обработчик в IMarketRuleDo вызовется после того, как сработает последнее правило добавленное через And.

  • Периодичность работы правила - Until:

    C#
    bool flag = false;
    
    ...
    
    Security
        .WhenNewTrade(Connector)
        .Do(() =>
                {
                    if(условие) flag = true;
                })
        .Until(() => flag)            
        .Apply(this);