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

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


Добрый день,

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

"{ Параметр "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 в виде самостоятельного контроля заявок по исполнению основной, но в плане стаблильности работы проще сразу разместить заявку на сервере брокера.

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


Теги:


Спасибо:


Mikhail Sukhov

Фотография
Дата: 29.01.2013
Ответить


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

VassilSanych

Фотография
Дата: 26.02.2013
Ответить


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

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

Фотография
Дата: 26.02.2013
Ответить


Решение (локальное) 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

Фотография
Дата: 27.02.2013
Ответить


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

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

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy