← Zurück

PositionManager стратегии

Объясните, что изменяет число позиций в PositionManager стратегии?

Я использую стратегию на основе TimeFrameStrategy и столкнулся с такой ситуацией:

Изначально позиций не было, затем стратегия выставила заявку, она выполнилась. Однако, PositionManager.Position остался равным 0. Объем сделок по TargetOrder base.Trader.MyTrades.Where(mt => mt.Order == TargetOrder).Sum(tr => tr.Trade.Volume) был равен не 0 (судя по логу из NewMyTrades).

Даже несколько минут спустя после сделки PositionManager.Position так и оставался равным 0.

S# 3.2.1.

War dieses Thema hilfreich?

Thema teilen

Kommentare (23)

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

Alexander
Alexander

Проблема известна, занимаемся.

Mikhail Sukhov
Mikhail Sukhov

hobo: Объясните, что изменяет число позиций в PositionManager стратегии?

Я использую стратегию на основе TimeFrameStrategy и столкнулся с такой ситуацией:

Изначально позиций не было, затем стратегия выставила заявку, она выполнилась. Однако, PositionManager.Position остался равным 0.

А стратегия выводит событие NewMyTrades + OrdersChanged? StrategyPositionManager рассчитывает по 2-ум типам данных позицию. По-умолчанию, через баланс заявок.

hobo
hobo Autor

Вывожу только NewMyTrades. Понятно, значит было что-то не так с заявками и в NewMyTrades мне ничего не увидеть. Повывожу-ка я OrdersChanged, может еще раз проявится подобное, а пока свой подсчет позиции буду использовать.

hobo
hobo Autor

Сегодня опять повторился неправильный подсчет.

Вот лог выхода из позиции, равной 1, когда сбился подсчет. Ничего необычного в логе я лично не вижу😳 Позиций(orig) - это base.PositionManager.Position По сделкам - мой подсчет внутри OnNewTrades

SBLSS 12.07.2011 12:28:54.455 SL зарегистрировали ордер 4365160817
SBLSS 12.07.2011 12:28:54.688 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=1. order.Direction=Sell. order.ID=4365160817. order.Status=Accepted. order.State=Done
SBLSS 12.07.2011 12:28:54.688 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=1. order.Direction=Sell. order.ID=4365160817. order.Status=Accepted. order.State=Done
SBLSS 12.07.2011 12:28:54.689 OnNewMyTrades. 1ая_часть_лога_по_OnNewMyTrades
SBLSS 12.07.2011 12:28:54.689 OnNewMyTrades. 1ая_часть_лога_по_OnNewMyTrades
SBLSS 12.07.2011 12:28:54.689 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=0. order.Direction=Sell. order.ID=4365160817. order.Status=Accepted. order.State=Done
SBLSS 12.07.2011 12:28:54.689 OnNewMyTrades. 2ая_часть_лога_по_OnNewMyTrades
SBLSS 12.07.2011 12:28:54.689 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=0. order.Direction=Sell. order.ID=4365160817. order.Status=Accepted. order.State=Done
Alexander
Alexander

Тут разница 1мс, покажите лог хотя бы через 100мс.

hobo
hobo Autor

100 мс вперед? Я бы рад показать хоть 100 секунд, но я - не скальпер и после этого куска несколько минут в логе просто ничего нет, ни строчки. Плюс я не вывожу в каждой итерации позицию в лог.

Вот следующий вход и выход, уже со сбившимся подсчетом.

SBLSS 12.07.2011 12:37:09.578 Зарегистрировали ордер, id = 4365407898
SBLSS 12.07.2011 12:37:09.994 OnOrdersChanged. Сейчас позиций(orig)=2, по сделкам=0. order.Direction=Buy. order.ID=4365407898. order.Status=Accepted. order.State=Done
SBLSS 12.07.2011 12:37:09.994 OnOrdersChanged. Сейчас позиций(orig)=2, по сделкам=0. order.Direction=Buy. order.ID=4365407898. order.Status=Accepted. order.State=Done
SBLSS 12.07.2011 12:37:09.994 OnOrdersChanged. Сейчас позиций(orig)=2, по сделкам=0. order.Direction=Buy. order.ID=4365407898. order.Status=Accepted. order.State=Done
SBLSS 12.07.2011 12:37:10.082 OnNewMyTrades. Сейчас позиций=1
SBLSS 12.07.2011 12:37:10.083 OnNewMyTrades. Произошла сделка 349859601. Исходный ордер 4365407898 с направлением Buy
SBLSS 12.07.2011 12:37:10.083 OnNewMyTrades. 
SBLSS 12.07.2011 12:37:11.237 SL от сделки 349859601
SBLSS 12.07.2011 12:37:14.434 SL зарегистрировали ордер 4365410450
SBLSS 12.07.2011 12:37:14.644 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=1. order.Direction=Sell. order.ID=4365410450. order.Status=Accepted. order.State=Done
SBLSS 12.07.2011 12:37:14.644 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=1. order.Direction=Sell. order.ID=4365410450. order.Status=Accepted. order.State=Done
SBLSS 12.07.2011 12:37:14.645 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=1. order.Direction=Sell. order.ID=4365410450. order.Status=Accepted. order.State=Done
SBLSS 12.07.2011 12:37:14.661 OnNewMyTrades. Сейчас позиций=0
SBLSS 12.07.2011 12:37:14.661 OnNewMyTrades. Произошла сделка 349860428. Исходный ордер 4365410450 с направлением Sell
SBLSS 12.07.2011 12:37:14.661 OnNewMyTrades. 

Строчки "OnNewMyTrades. Сейчас позиций=<>" выводятся сразу после собственного пересчета позиции по сделкам.

Если скажете что можно информативного выводить, я готов.

Alexander
Alexander

hobo: 100 мс вперед? Я бы рад показать хоть 100 секунд, но я - не скальпер и после этого куска несколько минут в логе просто ничего нет, ни строчки. Плюс я не вывожу в каждой итерации позицию в лог.

Вот следующий вход и выход, уже со сбившимся подсчетом.

SBLSS 12.07.2011 12:37:09.578 Зарегистрировали ордер, id = 4365407898 SBLSS 12.07.2011 12:37:09.994 OnOrdersChanged. Сейчас позиций(orig)=2, по сделкам=0. order.Direction=Buy. order.ID=4365407898. order.Status=Accepted. order.State=Done SBLSS 12.07.2011 12:37:09.994 OnOrdersChanged. Сейчас позиций(orig)=2, по сделкам=0. order.Direction=Buy. order.ID=4365407898. order.Status=Accepted. order.State=Done SBLSS 12.07.2011 12:37:09.994 OnOrdersChanged. Сейчас позиций(orig)=2, по сделкам=0. order.Direction=Buy. order.ID=4365407898. order.Status=Accepted. order.State=Done SBLSS 12.07.2011 12:37:10.082 OnNewMyTrades. Сейчас позиций=1 SBLSS 12.07.2011 12:37:10.083 OnNewMyTrades. Произошла сделка 349859601. Исходный ордер 4365407898 с направлением Buy SBLSS 12.07.2011 12:37:10.083 OnNewMyTrades. SBLSS 12.07.2011 12:37:11.237 SL от сделки 349859601 SBLSS 12.07.2011 12:37:14.434 SL зарегистрировали ордер 4365410450 SBLSS 12.07.2011 12:37:14.644 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=1. order.Direction=Sell. order.ID=4365410450. order.Status=Accepted. order.State=Done SBLSS 12.07.2011 12:37:14.644 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=1. order.Direction=Sell. order.ID=4365410450. order.Status=Accepted. order.State=Done SBLSS 12.07.2011 12:37:14.645 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=1. order.Direction=Sell. order.ID=4365410450. order.Status=Accepted. order.State=Done SBLSS 12.07.2011 12:37:14.661 OnNewMyTrades. Сейчас позиций=0 SBLSS 12.07.2011 12:37:14.661 OnNewMyTrades. Произошла сделка 349860428. Исходный ордер 4365410450 с направлением Sell SBLSS 12.07.2011 12:37:14.661 OnNewMyTrades.

> Строчки "OnNewMyTrades. Сейчас позиций=<>" выводятся сразу после собственного пересчета позиции по сделкам.
> 
> Если скажете что можно информативного выводить, я готов.

Не понял где ошибка.

PositionManager меняет позицию по событию Strategy.OrderChanged.
Вы тоже подписываетесь на это событие.

Событие поступает - срабатывает ваш обработчик. Вы берёте старую, не пересчитанную позицию, выводите.
Далее это событие поступает в PositionManager. Он пересчитывает, меняет.

Следующий вывод, где есть данные от PositionManager - в 12:37:14.644 - "Сейчас позиций(orig)=1", что верно.


Или я не так понял ваш вывод?
hobo
hobo Autor

Во втором - ничего, все верно, если учитывать, что подсчет позиции уже сбился к этому времени и весь этот кусок лога показывает на 1 позицию больше, чем было на самом деле.

12.07.2011 12:37:00.000 - Исходное состояние, стратегия вне рынка. Позиций фактически было 0. 12.07.2011 12:37:09.994 - "Сейчас позиций(orig)=2" - вот такой ситуации не было. PositionManager должен показывать 1 (ну пусть даже 0, если что-то еще не сработало, но никак не 2).

Следующий вывод, где есть данные от PositionManager - в 12:37:14.644 - "Сейчас позиций(orig)=1", что верно. А к этому моменту опять было 0.

Alexander
Alexander

Следующий вывод, где есть данные от PositionManager - в 12:37:14.644 - "Сейчас позиций(orig)=1", что верно. А к этому моменту опять было 0.

Так у вас по сделкам тоже 1 подсчитано.

подпишитесь на Strategy.OrderChanged, покажите что выводится в этом событии - какая заявка и как меняется.

Сейчас лучше 3.2.5 использовать, было несколько фиксов в стратегиях.

hobo
hobo Autor

Я смотрю, что "информативные" у меня логи, если я даже вас запутал 😀

Alexander: Так у вас по сделкам тоже 1 подсчитано. SBLSS 12.07.2011 12:37:14.645 OnOrdersChanged. Сейчас позиций(orig)=1, по сделкам=1. - вот здесь "1 по сделкам" потому что OnNewMyTrades еще не вызвался и позиция не пересчитана пока. SBLSS 12.07.2011 12:37:14.661 OnNewMyTrades. Сейчас позиций=0 - Вот тут уже пересчитана

Alexander: подпишитесь на Strategy.OrderChanged, покажите что выводится в этом событии - какая заявка и как меняется.

Я это собственно и сделал, когда Михаил спросил, "А выводит ли?".

DoLog(
"OnOrdersChanged. Сейчас позиций(orig)=" + base.PositionManager.Position +
", по сделкам=" + base_PositionManager_Position +
". order.Direction=" + order.Direction +
". order.ID=" + order.Id +
". order.Status=" + order.Status +
". order.State=" + order.State
);

Заявка, правда, или не меняется или 3-4 раза одно и тоже выводится в лог.

Alexander
Alexander

В 3.2.5 ошибка остаётся?

Попробуйте перегрузить стратегию и создавать свой StrategyPositionManager, формируя его не по Order, а по Trades (там флаг есть для конструктора).

hobo
hobo Autor

Я 3.2.1 использую, пересадить робота сегодня же не готов, надо потестироваться будет. Я как перейду на старшую версию, понаблюдаю и сообщу. Но подобный сбой - событие редкое, сказать что-то определенное смогу не скоро.

hobo
hobo Autor

Тестирую 3.2.5. - вообще что-то неведомое происходит и не только с менеджером позиций. Вот такую штуку я вижу в NewMyTrades и позднее, повторялось сие неоднократно. Один ордер (Done, Accepted) есть в ордерах, сделка тоже случилась, PositionManager показывает 0.

Alexander
Alexander

hobo: Тестирую 3.2.5. - вообще что-то неведомое происходит и не только с менеджером позиций. Вот такую штуку я вижу в NewMyTrades и позднее, повторялось сие неоднократно.

А что не так с MyTrade? Куда смотреть? Время? Да, сегодня торгов нет. Может у вас какая-нибудь демка?

hobo
hobo Autor

Если сказать просто, то проблема осталась в 3.2.5, вернее даже усилилась. Если подробнее, то с MyTrade все так. А как сочетается исполненный ордер и наличие сделки в PositionManager(зеленым выделил) с отсутствием позиции в Position (красным)? PS: да, это демка

Alexander
Alexander

Ну хорошо что неведомое происходит только с менеджером позиций и ничем более :)

Где брэйкпоинт стоит?

hobo
hobo Autor

Неведомое - что такая штука происходит почти при каждом запуске стратегии. И еще RegisterQuotes то ли ждать приходится долго, то ли он вообще не каждый раз запускается - не разобрался еще, я даже QuotesChanged теперь жду (раньше такой необходимости не было никогда). Ну это так, отступление "о неведомом". Конкретно этот в NewMyTrades, через несколько интервалов стратегии в OnProcess было тоже самое.

Alexander
Alexander

hobo: И еще RegisterQuotes то ли ждать приходится долго, то ли он вообще не каждый раз запускается - не разобрался еще, я даже QuotesChanged теперь жду (раньше такой необходимости не было никогда). Ну это так, отступление "о неведомом".

Подтвердится - создайте новую тему и подробно опишите.

Alex Ander
Alex Ander

Часто происходит ошибка с расчетом позиции и профита Например, сделка совершается, а позиция остается нулевой Я добавил в стратегию свой расчет позиции и профита:

Обработчик события NewMyTrades:

protected void MyStrategy_NewMyTrades(IEnumerable<MyTrade> myTrades)
        {
            CashPayed += myTrades.Sum(t => t.Trade.Price * t.Trade.Volume * (t.Order.Direction == OrderDirections.Buy ? -1 : 1));
            MyPosition -= myTrades.Sum(t => t.Trade.Volume * (t.Order.Direction == OrderDirections.Buy ? -1 : 1));
        }

CashPayed - баланс денежных средств (при покупке вычитается, при продаже прибавляется) MyPosition - текущая позиция по стратегии (при покупке прибавляется, при продаже вычитается) Ну а профит|убыток в моменте = (CashPayed + Security.LastTrade.Price * MyPosition) За время тестирования ошибок не было ни одной, а стандартный менеджер позиций и PnL-менеджер периодически ошибаются.

Alexander
Alexander

Alex Ander: Часто происходит ошибка с расчетом позиции и профита Например, сделка совершается, а позиция остается нулевой Я добавил в стратегию свой расчет позиции и профита:

Обработчик события NewMyTrades:

protected void MyStrategy_NewMyTrades(IEnumerable<MyTrade> myTrades) { CashPayed += myTrades.Sum(t => t.Trade.Price * t.Trade.Volume * (t.Order.Direction == OrderDirections.Buy ? -1 : 1)); MyPosition -= myTrades.Sum(t => t.Trade.Volume * (t.Order.Direction == OrderDirections.Buy ? -1 : 1)); }

> CashPayed - баланс денежных средств (при покупке вычитается, при продаже прибавляется)
> MyPosition - текущая позиция по стратегии (при покупке прибавляется, при продаже вычитается)
> Ну а профит|убыток в моменте = (CashPayed + Security.LastTrade.Price * MyPosition)
> За время тестирования ошибок не было ни одной, а стандартный менеджер позиций и PnL-менеджер периодически ошибаются.


Если переопределить дефолтный PositionManager в стратегии, использовать StrategyPositionManager(strategy, **false**) а не true, как по умолчанию, то позиция будет считаться именно так - по моим сделкам, а не по сделкам. И именно так, как написано у вас в обработчике.
President
President

Alex Ander: Часто происходит ошибка с расчетом позиции и профита Например, сделка совершается, а позиция остается нулевой Я добавил в стратегию свой расчет позиции и профита:

Обработчик события NewMyTrades:

protected void MyStrategy_NewMyTrades(IEnumerable<MyTrade> myTrades) { CashPayed += myTrades.Sum(t => t.Trade.Price * t.Trade.Volume * (t.Order.Direction == OrderDirections.Buy ? -1 : 1)); MyPosition -= myTrades.Sum(t => t.Trade.Volume * (t.Order.Direction == OrderDirections.Buy ? -1 : 1)); }

> CashPayed - баланс денежных средств (при покупке вычитается, при продаже прибавляется)
> MyPosition - текущая позиция по стратегии (при покупке прибавляется, при продаже вычитается)
> Ну а профит|убыток в моменте = (CashPayed + Security.LastTrade.Price * MyPosition)
> За время тестирования ошибок не было ни одной, а стандартный менеджер позиций и PnL-менеджер периодически ошибаются.

ввиду баги описанной мной тут
http://stocksharp.com/forum/1764/Zhiest--s-NewMyTrades------nie-vyzvalos--sobytiie-NewMyTrades/
данный код может иногда подвести - у меня тоже месяц не было проблем а потом - бац и "выстрелило"
т.о. вопрос как 100% правильно узнать текущую позицию остается открытым
Alexander
Alexander

President:

Alex Ander: Часто происходит ошибка с расчетом позиции и профита Например, сделка совершается, а позиция остается нулевой Я добавил в стратегию свой расчет позиции и профита:

Обработчик события NewMyTrades:

protected void MyStrategy_NewMyTrades(IEnumerable<MyTrade> myTrades) { CashPayed += myTrades.Sum(t => t.Trade.Price * t.Trade.Volume * (t.Order.Direction == OrderDirections.Buy ? -1 : 1)); MyPosition -= myTrades.Sum(t => t.Trade.Volume * (t.Order.Direction == OrderDirections.Buy ? -1 : 1)); }

> > CashPayed - баланс денежных средств (при покупке вычитается, при продаже прибавляется)
> > MyPosition - текущая позиция по стратегии (при покупке прибавляется, при продаже вычитается)
> > Ну а профит|убыток в моменте = (CashPayed + Security.LastTrade.Price * MyPosition)
> > За время тестирования ошибок не было ни одной, а стандартный менеджер позиций и PnL-менеджер периодически ошибаются.
> 
> ввиду баги описанной мной тут
> http://stocksharp.com/forum/1764/Zhiest--s-NewMyTrades------nie-vyzvalos--sobytiie-NewMyTrades/
> данный код может иногда подвести - у меня тоже месяц не было проблем а потом - бац и "выстрелило"
> т.о. вопрос как 100% правильно узнать текущую позицию остается открытым


Все проблемы которые вы там описываете - это при тестировании.
В реальных торгах данный код за 1.5 года меня не подводил пока. :)
President
President

Alexander: Все проблемы которые вы там описываете - это при тестировании. В реальных торгах данный код за 1.5 года меня не подводил пока. :) у меня на реальных торгах NewMyTrade не вызвался! (хотя до этого месяц все работало корректно)