Правила на новый трейд у Conditional ордера
Atom Ответить
20.08.2021


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

в коде этого метода написан такой код:
https://github.com/Stock...go/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/Stock...uleHelper_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);

2. Стектрейс
Код

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 таже самая ошибка



Спасибо:




4 Ответов
Юрий Басангов

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


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

Sava

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


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

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

Sava

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


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


Еще нашел в документации следующую информацию про Conditional ордера.
В дальнейшем, если требуется работа с заявкой (например, отменить ее или изменить), то необходимо использовать именно этот объект Order.
https://doc.stocksharp.r...2-b5c1-d57cb5af1b6d.htm

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

Sava

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


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


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

loading
clippy