/// <summary> /// To delete a rule. If a rule is executed at the time when this method is called, it will not be deleted. /// </summary> /// <param name="container">The rules container.</param> /// <param name="rule">Rule.</param> /// <param name="checkCanFinish">To check the possibility of rule suspension.</param> /// <returns><see langword="true" />, if a rule was successfully deleted, <see langword="false" />, if a rule cannot be currently deleted.</returns> public static bool TryRemoveRule(this IMarketRuleContainer container, IMarketRule rule, bool checkCanFinish = true) { if (container == null) { throw new ArgumentNullException(nameof(container)); } if (rule == null) { throw new ArgumentNullException(nameof(rule)); } var isRemoved = false; if ((!checkCanFinish && !rule.IsActive && rule.IsReady) || rule.CanFinish()) { container.Rules.Remove(rule); isRemoved = true; } if (isRemoved) { container.AddRuleLog(LogLevels.Debug, rule, LocalizedStrings.Str1084, rule); } return(isRemoved); }
/// <summary> /// To form a rule (include <see cref="IMarketRule.IsReady"/>). /// </summary> /// <param name="rule">Rule.</param> /// <returns>Rule.</returns> public static IMarketRule Apply(this IMarketRule rule) { if (rule == null) { throw new ArgumentNullException(nameof(rule)); } return(rule.Apply(DefaultRuleContainer)); }
/// <summary> /// To create an action, cancelling the order. /// </summary> /// <param name="rule">Rule.</param> /// <param name="order">The order to be cancelled.</param> /// <returns>Rule.</returns> public static IMarketRule Cancel(this IMarketRule rule, Order order) { if (rule == null) throw new ArgumentNullException(nameof(rule)); if (order == null) throw new ArgumentNullException(nameof(order)); return rule.Do(() => GetRuleStrategy(rule).CancelOrder(order)); }
/// <summary> /// To activate the rule. /// </summary> /// <param name="container">The rules container.</param> /// <param name="rule">Rule.</param> /// <param name="process">The handler.</param> public static void ActiveRule(this IMarketRuleContainer container, IMarketRule rule, Func <bool> process) { if (process == null) { throw new ArgumentNullException(nameof(process)); } container.AddRuleLog(LogLevels.Debug, rule, LocalizedStrings.Str1082); List <IMarketRule> removedRules = null; // mika // проверяем правило, так как оно могло быть удалено параллельным потоком if (!rule.IsReady) { return; } rule.IsActive = true; try { if (process()) { container.Rules.Remove(rule); removedRules = new List <IMarketRule> { rule }; } } finally { rule.IsActive = false; } if (removedRules == null) { return; } if (rule.ExclusiveRules.Count > 0) { foreach (var exclusiveRule in rule.ExclusiveRules.SyncGet(c => c.CopyAndClear())) { container.TryRemoveRule(exclusiveRule, false); removedRules.Add(exclusiveRule); } } foreach (var removedRule in removedRules) { container.AddRuleLog(LogLevels.Debug, removedRule, LocalizedStrings.Str1083); } }
private static Strategy GetRuleStrategy(IMarketRule rule) { if (rule == null) throw new ArgumentNullException(nameof(rule)); var strategy = rule.Container as Strategy; if (strategy == null) throw new ArgumentException(LocalizedStrings.Str1263Params.Put(rule.Name), nameof(rule)); return strategy; }
/// <summary> /// To create an action, re-registering the order. /// </summary> /// <param name="rule">Rule.</param> /// <param name="oldOrder">The order to be re-registered.</param> /// <param name="newOrder">Information about new order.</param> /// <returns>Rule.</returns> public static IMarketRule ReRegister(this IMarketRule rule, Order oldOrder, Order newOrder) { if (rule == null) throw new ArgumentNullException(nameof(rule)); if (oldOrder == null) throw new ArgumentNullException(nameof(oldOrder)); if (newOrder == null) throw new ArgumentNullException(nameof(newOrder)); return rule.Do(() => GetRuleStrategy(rule).ReRegisterOrder(oldOrder, newOrder)); }
/// <summary> /// Создать действие, отменяющее заявку. /// </summary> /// <param name="rule">Правило.</param> /// <param name="order">Заявка, которую необходимо отменить.</param> /// <returns>Правило.</returns> public static IMarketRule Cancel(this IMarketRule rule, Order order) { if (rule == null) { throw new ArgumentNullException("rule"); } if (order == null) { throw new ArgumentNullException("order"); } return(rule.Do(() => GetRuleStrategy(rule).CancelOrder(order))); }
/// <summary> /// To create an action, registering the order. /// </summary> /// <param name="rule">Rule.</param> /// <param name="order">The order to be registered.</param> /// <returns>Rule.</returns> public static IMarketRule Register(this IMarketRule rule, Order order) { if (rule == null) { throw new ArgumentNullException(nameof(rule)); } if (order == null) { throw new ArgumentNullException(nameof(order)); } return(rule.Do(() => GetRuleStrategy(rule).RegisterOrder(order))); }
private static Strategy GetRuleStrategy(IMarketRule rule) { if (rule == null) { throw new ArgumentNullException(nameof(rule)); } if (!(rule.Container is Strategy strategy)) { throw new ArgumentException(LocalizedStrings.Str1263Params.Put(rule.Name), nameof(rule)); } return(strategy); }
/// <summary> /// To form a rule (include <see cref="IMarketRule.IsReady"/>). /// </summary> /// <param name="rule">Rule.</param> /// <param name="container">The rules container.</param> /// <returns>Rule.</returns> public static IMarketRule Apply(this IMarketRule rule, IMarketRuleContainer container) { if (rule == null) { throw new ArgumentNullException(nameof(rule)); } if (container == null) { throw new ArgumentNullException(nameof(container)); } container.Rules.Add(rule); return(rule); }
private static Strategy GetRuleStrategy(IMarketRule rule) { if (rule == null) { throw new ArgumentNullException("rule"); } var strategy = rule.Container as Strategy; if (strategy == null) { throw new ArgumentException(LocalizedStrings.Str1263Params.Put(rule.Name), "rule"); } return(strategy); }
/// <summary> /// Создать действие, перерегистрирующее заявку. /// </summary> /// <param name="rule">Правило.</param> /// <param name="oldOrder">Заявка, которую необходимо перезарегистрировать.</param> /// <param name="newOrder">Информация о новой заявке.</param> /// <returns>Правило.</returns> public static IMarketRule ReRegister(this IMarketRule rule, Order oldOrder, Order newOrder) { if (rule == null) { throw new ArgumentNullException("rule"); } if (oldOrder == null) { throw new ArgumentNullException("oldOrder"); } if (newOrder == null) { throw new ArgumentNullException("newOrder"); } return(rule.Do(() => GetRuleStrategy(rule).ReRegisterOrder(oldOrder, newOrder))); }
/// <summary> /// To make rules mutually exclusive. /// </summary> /// <param name="rule1">First rule.</param> /// <param name="rule2">Second rule.</param> public static void Exclusive(this IMarketRule rule1, IMarketRule rule2) { if (rule1 == null) { throw new ArgumentNullException(nameof(rule1)); } if (rule2 == null) { throw new ArgumentNullException(nameof(rule2)); } if (rule1 == rule2) { throw new ArgumentException(LocalizedStrings.Str1085Params.Put(rule1), nameof(rule2)); } rule1.ExclusiveRules.Add(rule2); rule2.ExclusiveRules.Add(rule1); }
protected abstract IMarketRule Init(IMarketRule rule);
protected override IMarketRule Init(IMarketRule rule) { return(rule.Do(arg => Activate(arg))); }
void IMarketRuleContainer.ActivateRule(IMarketRule rule, Func <bool> process) { this.ActiveRule(rule, process); }
/// <summary> /// To delete the rule and all opposite rules. If the rule is executed at the time when this method is called, it will not be deleted. /// </summary> /// <param name="container">The rules container.</param> /// <param name="rule">Rule.</param> /// <returns><see langword="true" />, if rule was removed, otherwise, <see langword="false" />.</returns> public static bool TryRemoveWithExclusive(this IMarketRuleContainer container, IMarketRule rule) { if (container == null) { throw new ArgumentNullException(nameof(container)); } if (rule == null) { throw new ArgumentNullException(nameof(rule)); } if (container.TryRemoveRule(rule)) { if (rule.ExclusiveRules.Count > 0) { foreach (var exclusiveRule in rule.ExclusiveRules.SyncGet(c => c.CopyAndClear())) { container.TryRemoveRule(exclusiveRule, false); } } return(true); } return(false); }