PositionManager стратегии
Atom Ответить
30.06.2011


Объясните, что изменяет число позиций в 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.

Теги:


Спасибо:




23 Ответов
Alexander

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


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

Mikhail Sukhov

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


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

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

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


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

hobo

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


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

hobo

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


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

Вот лог выхода из позиции, равной 1, когда сбился подсчет. Ничего необычного в логе я лично не вижуBlink
Позиций(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

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


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

hobo

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


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

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


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

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


Во втором - ничего, все верно, если учитывать, что подсчет позиции уже сбился к этому времени и весь этот кусок лога показывает на 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

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


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

А к этому моменту опять было 0.


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

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

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

hobo

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


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

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

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


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

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

hobo

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


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

hobo

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


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

Один ордер (Done, Accepted) есть в ордерах, сделка тоже случилась, PositionManager показывает 0.
Автор топика
Спасибо:

Alexander

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


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



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

hobo

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


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

PS: да, это демка
Автор топика
Спасибо:

Alexander

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


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

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

hobo

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


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

Alexander

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


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


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

Alex Ander

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


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

Обработчик события 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

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


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, как по умолчанию, то позиция будет считаться именно так - по моим сделкам, а не по сделкам. И именно так, как написано у вас в обработчике.
Спасибо: Alex Ander

President

Фотография
Благотворитель
Дата: 25.07.2011
Ответить


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-менеджер периодически ошибаются.


ввиду баги описанной мной тут
https://stocksharp.ru/fo...s--sobytiie-NewMyTrades/
данный код может иногда подвести - у меня тоже месяц не было проблем а потом - бац и "выстрелило"
т.о. вопрос как 100% правильно узнать текущую позицию остается открытым
Спасибо:

Alexander

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


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-менеджер периодически ошибаются.


ввиду баги описанной мной тут
https://stocksharp.ru/fo...s--sobytiie-NewMyTrades/
данный код может иногда подвести - у меня тоже месяц не было проблем а потом - бац и "выстрелило"
т.о. вопрос как 100% правильно узнать текущую позицию остается открытым



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

President

Фотография
Благотворитель
Дата: 25.07.2011
Ответить


Alexander Перейти

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

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


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

loading
clippy