Table of Contents

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

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

    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);
    }
    
    

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

    В конце формирования правила вызывается метод MarketRuleHelper.Apply(StockSharp.Algo.IMarketRule rule ). До тех пор, пока метод не будет вызван для правила - оно неактивно (обработчик в IMarketRule.Do(System.Action action ) не будет вызываться).

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

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

    У IMarketRule есть IMarketRule.Token - токен правила, с которым он ассоциирован. Например, для правила MarketRuleHelper.WhenCanceled(StockSharp.BusinessEntities.Order order, StockSharp.BusinessEntities.ITransactionProvider provider ) токеном будет являться заявка.

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

    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бъединение правил по условию MarketRuleHelper.Or(StockSharp.Algo.IMarketRule rule, StockSharp.Algo.IMarketRule[] rules ) / MarketRuleHelper.And(StockSharp.Algo.IMarketRule rule, StockSharp.Algo.IMarketRule[] rules ).

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

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

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

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

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

    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);
    
    
    Tip

    Обработчик в IMarketRule.Do(System.Action action ) вызовется после того, как сработает последнее правило добавленное через MarketRuleHelper.And(StockSharp.Algo.IMarketRule rule, StockSharp.Algo.IMarketRule[] rules ).

  • Периодичность работы правила - IMarketRule.Until(System.Func<System.Boolean> canFinish ):

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