Правила на новый трейд у Conditional ордера

Правила на новый трейд у Conditional ордера
Atom
8/20/2021
SelfDeleted


Добрый день! Запускаю S# в режиме тестирования на истории. Создаю TakeProfit/StopLoss Conditional Order и подписываюсь на событие нового трейда. В момент исполнения правила возникает ошибка внутри S#: в методе TraderHelper.GetMatchedVolume вылетает ArgumentException("order").

в коде этого метода написан такой код: https://github.com/StockSharp/StockSharp/blob/master/Algo/TraderHelper.cs#L913


if (order.Type == OrderTypes.Conditional)
	throw new ArgumentException(nameof(order));

Почему нельзя у ConditionalOrder посчитать реализованный объем?

Судя по стектрейсу ошибки метод GetMatchedVolume вызывается при получении значения свойства AllTradesReceived в классе NewTradeOrderRule. Это намекает на то, что TakeProfit/StopLoss ордера не могут частично исполняться. Разве это верно?

Также, можно заметить закомментированный код с проверкой на ConditionalOrder в методе OnNewMyTrade в классе NewTradeOrderRule https://github.com/StockSharp/StockSharp/blob/master/Algo/MarketRuleHelper_Order.cs#L241 Может эту проверку забыли закомментировать в GetMatchedVolume?

Полезная инфа:

  1. Создание TakeProfit оредра для бэкстета:

//this == Strategy

var takeProfitOrder = this.CreateOrder(takeProfitDirection, activationPrice, volume);

var condition = new EmulationOrderCondition { IsTakeProfit = true };
var takeProfitCondition = (ITakeProfitOrderCondition)condition;

takeProfitCondition.IsTrailing = true;
takeProfitCondition.ActivationPrice = activationPrice;
takeProfitCondition.ClosePositionPrice = activationPrice;

takeProfitOrder.Condition = condition;
takeProfitOrder.Type = OrderTypes.Conditional;
takeProfitOrder.WhenNewTrade(this).Do(t => /*<code>*/).Apply(this);
RegisterOrder(takeProfitOrder);

  1. Стектрейс

System.ArgumentException: order
   at StockSharp.Algo.TraderHelper.GetMatchedVolume(Order order)
   at StockSharp.Algo.MarketRuleHelper.NewTradeOrderRule.get_AllTradesReceived()
   at StockSharp.Algo.MarketRuleHelper.NewTradeOrderRule.CheckOrderState()
   at StockSharp.Algo.MarketRuleHelper.OrderRule`1.CanFinish()
   at StockSharp.Algo.MarketRule`2.ProcessRuleVoid()
   at StockSharp.Algo.MarketRuleHelper.ActiveRule(IMarketRuleContainer container, IMarketRule rule, Func`1 process)
   at StockSharp.Algo.Strategies.Strategy.StockSharp.Algo.IMarketRuleContainer.ActivateRule(IMarketRule rule, Func`1 process)


Может я что-то не так делаю? Подскажите как исправить эту ошибку?

Upd: при использовании события order.WhenAllTrades таже самая ошибка




Thanks:


William B

Avatar
Date: 8/23/2021
Reply


Добрый день, в целом да, у ConditionalOrder нельзя посчитать реализованный объем, т.к. ConditionalOrder не имеет связанных сделок. Здесь заложена следующая логика, сначала ConditionalOrder просто висит в системе, потом когда наступают условия для его исполнения ConditionalOrder превращается в просто Order, который и инициирует сделку. Вам нужно отлавливать Order и уже у него считать исполненный объем.

Thanks:

SelfDeleted

Avatar
Date: 8/23/2021
Reply


Юрий Басангов: Добрый день, в целом да, у ConditionalOrder нельзя посчитать реализованный объем, т.к. ConditionalOrder не имеет связанных сделок. Здесь заложена следующая логика, сначала ConditionalOrder просто висит в системе, потом когда наступают условия для его исполнения ConditionalOrder превращается в просто Order, который и инициирует сделку. Вам нужно отлавливать Order и уже у него считать исполненный объем. Спасибо за объяснение. Как тогда правильно отлавливать момент, когда ConditionalOrder превращается в просто Order? Нашел событие OrderChanged, но не уверен что оно подходит. Мне важно отловить MyTrade для данного ордера, т.к. у меня на это завязана дальнейшая логика

Thanks:

SelfDeleted

Avatar
Date: 8/30/2021
Reply


Юрий Басангов: Добрый день, в целом да, у ConditionalOrder нельзя посчитать реализованный объем, т.к. ConditionalOrder не имеет связанных сделок. Здесь заложена следующая логика, сначала ConditionalOrder просто висит в системе, потом когда наступают условия для его исполнения ConditionalOrder превращается в просто Order, который и инициирует сделку. Вам нужно отлавливать Order и уже у него считать исполненный объем.

Еще нашел в документации следующую информацию про Conditional ордера. В дальнейшем, если требуется работа с заявкой (например, отменить ее или изменить), <u>то необходимо использовать именно этот объект Order.</u> https://doc.stocksharp.ru/html/2587051d-1e94-4fb2-b5c1-d57cb5af1b6d.htm

Разве из этого не следует, что я могу подписываться на события изначальной заявки (когда она еще Conditional и просто висит в системе)?

Thanks:

SelfDeleted

Avatar
Date: 8/30/2021
Reply


И еще вопрос: В режиме бэктеста нужно использовать именно EmulationOrderCondition? Я не увидел никаких использований этого класса в коде, связанным с бэктестом. Также я не нашел никакого кода, связанного с обработкой класса OrderCondition, от котогоро наследуется EmulationOrderCondition. Условные ордера вообще работают в режиме бэктеста?

Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy