Для изменения размера нажмите или перетащите
Использование правил
  • Создание правила на условие регистрации заявки:

    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 = OrderDirections.Buy,
        };
    
        order
            .WhenRegistered()
            .Do(() => trader.AddInfoLog("Заявка успешно зарегистрирована"))
            .Once()
            .Apply(this);
    
        // регистрация заявки
        trader.RegisterOrder(order);
    }

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

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

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

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

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

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

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

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

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

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

    C#
    MarketRuleHelper
        .Or(new IMarketRule[] {Trader.WhenIntervalElapsed(_holdTimeToOpen), _series.WhenCandlesStarted()})
        .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(priceMore), Security.WhenLastTradePriceLess(priceLess)})
        .Do(() => this.AddInfoLog(string.Format("Цена последней сделки находится в диапазоне от {0} до {1}", priceMore, priceLess)))
        .Apply(this);
    Примечание Примечание

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

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

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