Правило
В S# для IMarketRule уже есть ряд предопределенных условий и действий для наиболее распространенных сценариев. Ниже представлены сгруппированные по торговым объектам списки условий класса MarketRuleHelper:
Для Security
- MarketRuleHelper.WhenChanged(StockSharp.BusinessEntities.Security security, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие изменения инструмента.
- MarketRuleHelper.WhenNewTrade(StockSharp.BusinessEntities.Security security, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие появления у инструмента новой сделки.
- MarketRuleHelper.WhenMarketDepthChanged(StockSharp.BusinessEntities.Security security, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие изменения стакана по инструменту.
- MarketRuleHelper.WhenBestBidPriceMore(StockSharp.BusinessEntities.Security security, StockSharp.BusinessEntities.IMarketDataProvider provider, StockSharp.Messages.Unit price ) - правило на событие повышения лучшего бида выше определенного уровня.
- MarketRuleHelper.WhenBestBidPriceLess(StockSharp.BusinessEntities.Security security, StockSharp.BusinessEntities.IMarketDataProvider provider, StockSharp.Messages.Unit price ) - правило на событие понижения лучшего бида ниже определенного уровня.
- MarketRuleHelper.WhenBestAskPriceMore(StockSharp.BusinessEntities.Security security, StockSharp.BusinessEntities.IMarketDataProvider provider, StockSharp.Messages.Unit price ) - правило на событие повышения лучшего оффера выше определенного уровня.
- MarketRuleHelper.WhenBestAskPriceLess(StockSharp.BusinessEntities.Security security, StockSharp.BusinessEntities.IMarketDataProvider provider, StockSharp.Messages.Unit price ) - правило на событие понижения лучшего оффера ниже определенного уровня.
- MarketRuleHelper.WhenLastTradePriceMore(StockSharp.BusinessEntities.Security security, StockSharp.BusinessEntities.IMarketDataProvider provider, StockSharp.Messages.Unit price ) - правило на событие повышения цены последней сделки выше определенного уровня.
- MarketRuleHelper.WhenLastTradePriceLess(StockSharp.BusinessEntities.Security security, StockSharp.BusinessEntities.IMarketDataProvider provider, StockSharp.Messages.Unit price ) - правило на событие понижения цены последней сделки ниже определенного уровня.
Для MarketDepth
- MarketRuleHelper.WhenChanged(StockSharp.BusinessEntities.MarketDepth depth, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие изменения стакана.
- MarketRuleHelper.WhenSpreadMore(StockSharp.BusinessEntities.MarketDepth depth, StockSharp.Messages.Unit price, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие повышения размера спреда стакана выше определенного уровня.
- MarketRuleHelper.WhenSpreadLess(StockSharp.BusinessEntities.MarketDepth depth, StockSharp.Messages.Unit price, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие понижения размера спреда стакана ниже определенного уровня.
- MarketRuleHelper.WhenBestBidPriceMore(StockSharp.BusinessEntities.MarketDepth depth, StockSharp.Messages.Unit price, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие повышения лучшего бида выше определенного уровня.
- MarketRuleHelper.WhenBestBidPriceLess(StockSharp.BusinessEntities.MarketDepth depth, StockSharp.Messages.Unit price, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие понижения лучшего бида ниже определенного уровня.
- MarketRuleHelper.WhenBestAskPriceMore(StockSharp.BusinessEntities.MarketDepth depth, StockSharp.Messages.Unit price, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие повышения лучшего оффера выше определенного уровня.
- MarketRuleHelper.WhenBestAskPriceLess(StockSharp.BusinessEntities.MarketDepth depth, StockSharp.Messages.Unit price, StockSharp.BusinessEntities.IMarketDataProvider provider ) - правило на событие понижения лучшего оффера ниже определенного уровня.
Для Order
- MarketRuleHelper.WhenRegistered(StockSharp.BusinessEntities.Order order, StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие успешной регистрации заявки на бирже.
- MarketRuleHelper.WhenPartiallyMatched(StockSharp.BusinessEntities.Order order, StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие частичного исполнения заявки.
- MarketRuleHelper.WhenRegisterFailed(StockSharp.BusinessEntities.Order order, StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие неудачной регистрации заявки на бирже.
- MarketRuleHelper.WhenCancelFailed(StockSharp.BusinessEntities.Order order, StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие неудачного снятия заявки на бирже.
- MarketRuleHelper.WhenCanceled(StockSharp.BusinessEntities.Order order, StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие отмены заявки.
- MarketRuleHelper.WhenMatched(StockSharp.BusinessEntities.Order order, StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие полного исполнения заявки.
- MarketRuleHelper.WhenChanged(StockSharp.BusinessEntities.Order order, StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие изменения заявки.
- MarketRuleHelper.WhenNewTrade(StockSharp.BusinessEntities.Order order, StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие появления сделки по заявке.
Для Portfolio
- MarketRuleHelper.WhenMoneyLess(StockSharp.BusinessEntities.Portfolio portfolio, StockSharp.BusinessEntities.IPortfolioProvider provider, StockSharp.Messages.Unit money ) - правило на событие уменьшения денег в портфеле ниже определенного уровня.
- MarketRuleHelper.WhenMoneyMore(StockSharp.BusinessEntities.Portfolio portfolio, StockSharp.BusinessEntities.IPortfolioProvider provider, StockSharp.Messages.Unit money ) - правило на событие увеличения денег в портфеле выше определенного уровня.
Для Position
- MarketRuleHelper.WhenLess(StockSharp.BusinessEntities.Position position, StockSharp.BusinessEntities.IPositionProvider provider, StockSharp.Messages.Unit value ) - правило на событие уменьшения позиции ниже определенного уровня.
- MarketRuleHelper.WhenMore(StockSharp.BusinessEntities.Position position, StockSharp.BusinessEntities.IPositionProvider provider, StockSharp.Messages.Unit value ) - правило на событие увеличения позиции выше определенного уровня.
- MarketRuleHelper.Changed(StockSharp.BusinessEntities.Position position, StockSharp.BusinessEntities.IPositionProvider provider ) - правило на событие изменения позиции.
Для IPnLManager
- StrategyHelper.WhenPnLLess(StockSharp.Algo.Strategies.Strategy strategy, StockSharp.Messages.Unit value ) - правило на событие уменьшения прибыли ниже определенного уровня.
- StrategyHelper.WhenPnLMore(StockSharp.Algo.Strategies.Strategy strategy, StockSharp.Messages.Unit value ) - правило на событие увеличения прибыли выше определенного уровня.
- StrategyHelper.WhenPositionChanged(StockSharp.Algo.Strategies.Strategy strategy ) - правило на событие изменения прибыли.
Для Candle
- MarketRuleHelper.WhenClosePriceMore(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.Candle candle, StockSharp.Messages.Unit price ) - правило на событие повышения цены закрытия свечи выше определенного уровня.
- MarketRuleHelper.WhenClosePriceLess(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.Candle candle, StockSharp.Messages.Unit price ) - правило на событие понижения цены закрытия свечи ниже определенного уровня.
- MarketRuleHelper.WhenTotalVolumeMore(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.Candle candle, StockSharp.Messages.Unit volume ) - правило на событие превышения общего объема свечи выше определенного уровня.
- MarketRuleHelper.WhenCurrentCandleTotalVolumeMore(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.CandleSeries series, StockSharp.Messages.Unit volume ) - правило на событие превышения общего объема текущей свечи выше определенного уровня.
- MarketRuleHelper.WhenCandlesStarted(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.CandleSeries series ) - правило на событие появления новых свечей.
- MarketRuleHelper.WhenCandlesChanged(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.CandleSeries series ) - правило на событие изменения свечей.
- MarketRuleHelper.WhenCandlesFinished(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.CandleSeries series ) - правило на событие окончания свечей.
- MarketRuleHelper.WhenChanged(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.Candle candle ) - правило на событие изменения свечи.
- MarketRuleHelper.WhenFinished(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.Candle candle ) - правило на событие окончания свечи.
- MarketRuleHelper.WhenPartiallyFinished(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.Candle candle, StockSharp.BusinessEntities.IConnector connector, System.Decimal percent ) - правило на событие частичного окончания свечи.
- MarketRuleHelper.WhenPartiallyFinishedCandles(StockSharp.Algo.Candles.ICandleManager candleManager, StockSharp.Algo.Candles.CandleSeries series, StockSharp.BusinessEntities.IConnector connector, System.Decimal percent ) - правило на событие частичного окончания свечей.
Для Strategy
- StrategyHelper.WhenNewMyTrade(StockSharp.Algo.Strategies.Strategy strategy ) - правило на событие появление новых сделок стратегии.
- StrategyHelper.WhenPositionChanged(StockSharp.Algo.Strategies.Strategy strategy ) - правило на событие изменения позиции у стратегии.
- StrategyHelper.WhenStarted(StockSharp.Algo.Strategies.Strategy strategy ) - правило на событие начала работы стратегии.
- StrategyHelper.WhenStopping(StockSharp.Algo.Strategies.Strategy strategy ) - правило на событие начала остановки работы стратегии.
- StrategyHelper.WhenStopped(StockSharp.Algo.Strategies.Strategy strategy ) - правило на событие полной остановки работы стратегии.
- StrategyHelper.WhenError(StockSharp.Algo.Strategies.Strategy strategy, System.Boolean processChildStrategyErrors ) - правило на событие ошибки стратегии.
- StrategyHelper.WhenWarning(StockSharp.Algo.Strategies.Strategy strategy ) - правило на событие предупреждения стратегии.
Для IConnector
- MarketRuleHelper.WhenIntervalElapsed(StockSharp.BusinessEntities.IConnector connector, System.TimeSpan interval ) - правило на событие изменения IConnector.MarketTimeChanged на значение, большее или равно параметру.
- MarketRuleHelper.WhenTimeCome(StockSharp.BusinessEntities.IConnector connector, System.DateTimeOffset[] times ) - правило, которое активизируется при наступлении точного времени.
- MarketRuleHelper.WhenNewMyTrade(StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие появление новой сделки.
- MarketRuleHelper.WhenNewOrder(StockSharp.BusinessEntities.ITransactionProvider provider ) - правило на событие появление новой заявки.
Аналогично условиям есть и предопределенные действия:
- StrategyHelper.Register(StockSharp.Algo.IMarketRule rule, StockSharp.BusinessEntities.Order order ) - действие, регистрирующее заявку.
- StrategyHelper.ReRegister(StockSharp.Algo.IMarketRule rule, StockSharp.BusinessEntities.Order oldOrder, StockSharp.BusinessEntities.Order newOrder ) - действие, перерегистрирующее заявку.
- StrategyHelper.Cancel(StockSharp.Algo.IMarketRule rule, StockSharp.BusinessEntities.Order order ) - действие, отменяющее заявку.
- Extensions.Protect(StockSharp.Algo.MarketRule<StockSharp.BusinessEntities.Order,StockSharp.BusinessEntities.MyTrade> rule, StockSharp.Messages.Unit takePriceDelta, StockSharp.Messages.Unit stopPriceDelta ) - действие, защищающее сделки одновременно стратегиями TakeProfitStrategy и StopLossStrategy.
Если требуется создать свое уникальное правило (на какое-то событие, которое не предусмотрено стандартно), необходимо создать свой класс-наследник 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 = "Увеличение денег портфеля {0} выше {1}".Put(portfolio, finishMoney)
};
}
Правило PortfolioRule подписывается на событие IPortfolioProvider.PortfolioChanged и, как только оно вызывается, то проверяется условие на превышение текущего уровня денежных средств в портфеле выше определенного лимита. Если условие возвращает true, то активируется правило через метод MarketRule<TToken,TArg>.Activate.