← Назад

Не работает размещение ордеров по исполнению

Добрый день,

Пытаюсь создать тейк профит и стоп лосс по исполнению заявки и получаю следующую ошибку в сообщениях

"{ Параметр "IS_ACTIVE_IN_TIME" для транзакции "Стоп-заявка" типа "ACTIVATED_BY_ORDER_TAKE_PROFIT_AND_STOP_LIMIT_ORDER" не поддерживается.\n,Код ошибки Failed Сообщение Параметр "IS_ACTIVE_IN_TIME" для транзакции "Стоп-заявка" типа "ACTIVATED_BY_ORDER_TAKE_PROFIT_AND_STOP_LIMIT_ORDER" не поддерживается.\n}"

При этом, выставление и обнуление ActiveTime результата не приносит. Создание заявки взято из примеров. Квик 6.02.0.39, S# 4.1.6


private Order CreateTakeProfitAndStopLimit(Portfolio portfolio, Security security, int quantity, decimal stopLossActivationPrice, decimal stopLossExecutionPrice, decimal takeProfitPrice)
        {
            return new Order
            {
                Type = OrderTypes.Conditional,
                Volume = quantity,
                Price = stopLossExecutionPrice,
                Security = security,
                //ExpiryDate = null,
                Portfolio = portfolio,
                ExpiryDate = DateTime.MaxValue,
                StopCondition = new QuikStopCondition
                {
                    Type = QuikStopConditionTypes.TakeProfitStopLimit,
                    StopPrice = takeProfitPrice,
                    StopLimitPrice = stopLossActivationPrice,
                    Offset = new Unit(0),
                    Spread = new Unit(0),
                    ActiveTime = null,
                },
            };
        }

Основной метод


                var stopLimit = CreateTakeProfitAndStopLimit(portfolio, FindSecurityByCode(instr.Symbol), quantity, stopLossActivationPrice, stopLossExecutionPrice, takeProfitPrice);
                var condition = (QuikStopCondition)stopLimit.StopCondition;


                m_trader.RegisterOrder(order);
                Thread.Sleep(5 * 1000);
                condition.ConditionOrder = order;
                m_trader.RegisterOrder(stopLimit);

Это тестовый пример и конечно понятен workaround в виде самостоятельного контроля заявок по исполнению основной, но в плане стаблильности работы проще сразу разместить заявку на сервере брокера.

Если убрать из кода связь с основной заявкой, то ордер прекрасно размещается.

Комментарии (4)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Mikhail Sukhov
Mikhail Sukhov
  1. На 4.1.7 воспроизводиться?
  2. Можно ли проблему воспроизвести на Sample и что именно нужно сделать в этом примере (какие параметры к заполнению были переданы для стоп-заявки)?
VassilSanych
VassilSanych

Такая же беда для нынешних библиотек из исходников:

2013/02/26 17:21:37.219|       |SS_RIH3@RTS_SPBFUT00066|Регистрация новой Conditional (0x267FA0) заявки на Buy с ценой 152400 и объемом 1. 
2013/02/26 17:21:37.263|Error  |QuikManager|Ошибка регистрации заявки: StockSharp.Quik.ApiException: Код ошибки Failed Сообщение  Параметр "IS_ACTIVE_IN_TIME" для транзакции "Стоп-заявка" типа "ACTIVATED_BY_ORDER_TAKE_PROFIT_AND_STOP_LIMIT_ORDER" не поддерживается.

2013/02/26 17:21:37.264|       |StrategyManager|Status:Started, PnL:0, Slippage:0, Position:0, Latency:00:00:00.5006902, ErrorState
2013/02/26 17:21:37.264|Error  |SS_RIH3@RTS_SPBFUT00066|Заявка 62088285 (0x267FA0) не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение  Параметр "IS_ACTIVE_IN_TIME" для транзакции "Стоп-заявка" типа "ACTIVATED_BY_ORDER_TAKE_PROFIT_AND_STOP_LIMIT_ORDER" не поддерживается.
.
2013/02/26 17:21:37.267|       |SS_RIH3@RTS_SPBFUT00066|Заявка 62088285 больше не активна.

Метод вызова

var takeProfitOrder = OrderHelper.CreateConditionTakeProfitAndStopLimit(
				ruleOrder, 
				ruleOrder.Price + (ruleOrder.Direction == OrderDirections.Buy ? 100 : -100),
				ruleOrder.Price - (ruleOrder.Direction == OrderDirections.Buy ? 100 : -100), 
				20, 
				10);
			RegisterOrder(takeProfitOrder);
		public Order CreateTakeProfitAndStopLimit(
			Security security,
			OrderDirections direction,
			decimal quantity,
			decimal stopPrice,
			decimal stopLimitPrice,
			decimal offset,
			decimal spread)
		{
			var price = direction == OrderDirections.Buy
										? stopPrice - spread - offset
										: stopPrice + spread + offset;
			return new Order
			{
				Type = OrderTypes.Conditional,
				Volume = quantity,
				Security = security,
				Direction = direction,
				Price = price,
				//ExpiryDate = ExpirationDate.Value,
				Condition = new QuikOrderCondition
				{
					Type = QuikOrderConditionTypes.TakeProfitStopLimit,
					StopPrice = stopPrice,
					StopLimitPrice = stopLimitPrice,
					Offset = offset,
					Spread = spread,
					ActiveTime = null,
				},
			};
		}
		public Order CreateConditionTakeProfitAndStopLimit(
			Order conditionOrder,
			decimal stopPrice,
			decimal stopLimitPrice,
			decimal offset,
			decimal spread)
		{
			var stopLimit = CreateTakeProfitAndStopLimit(
				conditionOrder.Security,
				conditionOrder.Direction == OrderDirections.Buy ? OrderDirections.Sell : OrderDirections.Buy,
				conditionOrder.Volume,
				stopPrice,
				stopLimitPrice,
				offset,
				spread);
			var condition = (QuikOrderCondition)stopLimit.Condition;
			condition.ConditionOrder = conditionOrder;
			condition.ConditionOrderPartiallyMatched = true; // PartiallyMatched.IsChecked;
			condition.ConditionOrderUseMatchedBalance = true;// UseMatchedBalance.IsChecked;
			return stopLimit;
		}

ActiveTime = null должно устанавливать Transaction.SetActiveInTime(false). Но похоже, каким-то образом этого не происходит или сам этот механизм работает не правильно.

VassilSanych
VassilSanych

Решение (локальное) TransactionHelper.cs

							if (condition.ActiveTime != null)
							{
								transaction
									.SetIsActiveInTime(true)
									.SetActiveFrom(condition.ActiveTime.Min)
									.SetActiveTo(condition.ActiveTime.Max);
							}
							else
								transaction.RemoveInstruction(Transaction.IsActiveInTime);
								//transaction.SetIsActiveInTime(false);

Работает

Mikhail Sukhov
Mikhail Sukhov

VassilSanych: Решение (локальное) Работает

Оно неправильно, но спасибо за наводку. Поправим.