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


Добрый день,

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

"{ Параметр \"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

Фотография
Автор статей Программист Трейдер
Дата: 28.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 больше не активна.


Метод вызова


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

Фотография
Автор статей Программист Трейдер
Дата: 26.02.2013
Ответить


VassilSanych Перейти
Решение (локальное)
Работает


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


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

loading
clippy