← Zurück

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

Добрый день! Запускаю 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 таже самая ошибка

War dieses Thema hilfreich?

Thema teilen

Kommentare (4)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

William B
William B

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

SelfDeleted
SelfDeleted Autor

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

SelfDeleted
SelfDeleted Autor

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

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

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

SelfDeleted
SelfDeleted Autor

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