Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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));
		}
Exemple #4
0
        /// <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)));
        }
Exemple #8
0
        /// <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);
        }
Exemple #10
0
        /// <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)));
        }
Exemple #13
0
        /// <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);
        }
Exemple #14
0
 protected abstract IMarketRule Init(IMarketRule rule);
Exemple #15
0
 protected override IMarketRule Init(IMarketRule rule)
 {
     return(rule.Do(arg => Activate(arg)));
 }
Exemple #16
0
 void IMarketRuleContainer.ActivateRule(IMarketRule rule, Func <bool> process)
 {
     this.ActiveRule(rule, process);
 }
Exemple #17
0
        /// <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);
        }