SmartQuant Discussion
http://www.smartquant.com/forums/

Strategy.Position == null ?
http://www.smartquant.com/forums/viewtopic.php?f=65&t=10408
Page 1 of 2

Author:  valenock [ Wed Dec 05, 2012 4:41 pm ]
Post subject:  Strategy.Position == null ?

Попался неприятный момент.
При обращении к Strategy.Position в OnStrategyStop() выскочила null reference exception - стратегия тихо умерла.
Я надеюсь, что в следующей версии проблема с неприходящими exception будет всё-таки решена.

Однако, хотелось бы, чтобы .Position был всегда рабочим указателем, либо о том, что он может быть nullable можно было прочесть в документации.
Глубоко не залезал, возможно Position не создаётся пока по стратегии не прошли сделки - но я не проверял - пока обложил со всех сторон if(Strategy.Position == null ).
Не, н утерпел - проверил всё-таки - дело не сделках. Если в OnStrategyStop() :
Code:
if(this.Position == null)
         Console.WriteLine(" ====================================================================================== POSITION = NULL");

то при оптимизации стратегии код отработает несколько раз, скажем в 2% запусков, закономерность мне не установить. При запуске простым strategy.Run() оно тоже выскакивает, но как-то не всегда.

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 4:47 pm ]
Post subject:  Re: Strategy.Position == null ?

Ну да, позиция или есть, или не есть. Можно использовать HasPosition для проверки.

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 4:54 pm ]
Post subject:  Re: Strategy.Position == null ?

Что касается удобства, то вопрос двоякий. С одной стороны при написании стратегии бывает удобно всегда иметь объект Position, а не null. C Qty = 0 для отсутствующих позиций. С другой стороны удобно иметь список позиций в портфеле, соответствующий реально открытым позициям, а не пробегать по тысяче объектов Position, среди который одна реальная с ненулевым Qty.

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 5:07 pm ]
Post subject:  Re: Strategy.Position == null ?

Кстати про exception вопрос тоже не такой простой, как кажется. В некоторых случая, особенно в случае работающий стратегии, я бы не хотел, чтобы у меня все упало или выскакивали какие-либо окошки (особенно на удаленном сервере) при некритичном (для стратегии) exception.

В качестве бредовой идеи можно предложить раннер стратегии обернуть в try catch, а в стратегии сделать хендлер OnException(...), которое по дефолту ничего не валит, а просто пишет в консоль. При желании туда можно вставить хоть модальное, хоть немодальное окошко, хоть вызвать application exit.

Author:  valenock [ Wed Dec 05, 2012 5:08 pm ]
Post subject:  Re: Strategy.Position == null ?

Ну да, про большие портфели не подумал.
С другой стороны в портфеле так же можно сравнить с нулём позицию...

Про текущую реализацию не очень понял - HasPosition по сути полный аналог .Qty==0 ?
Вот у меня стратегия набила сделки какие-то, на момент OnStrategyStop() .Qty осталось 0 - получается, что вы обнуляете Strategy.Position и по HasPosition() вернёте мне False ?

Не очень понятен сам момент перехода - вроде была Position и пропала. А если я на неё reference сделал ? А если мне надо с предыдущей позицией сравнить в OnPositionChanged() ?

Да, пользуясь случаем - давно хотел спросить - нельзя в OnPositionChanged() что-то получать - новую позу, лучше старую позу, в идеале сразу обе. В OnOrderFilled() вы же Order FilledOrder выдаёте...

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 5:11 pm ]
Post subject:  Re: Strategy.Position == null ?

Ну да, HasPosition это Qty == 0 .

Как бы если у вас Qty == 0 , то нет у вас позиции. Была была, а сейчас нет :) Это и называется закрыть позицию...

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 5:14 pm ]
Post subject:  Re: Strategy.Position == null ?

Запоминайте Qty и будет вам счастье. В опенквантовской модели стратегии, то есть когда заводится инстанс стратегии на инструмент, в позиции вообще ничего нет информативного, кроме Qty.

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 5:48 pm ]
Post subject:  Re: Strategy.Position == null ?

В смысле HasPosition это if (Position != null)

Author:  valenock [ Wed Dec 05, 2012 6:41 pm ]
Post subject:  Re: Strategy.Position == null ?

Dr. Anton Fokin wrote:
Кстати про exception вопрос тоже не такой простой, как кажется. В некоторых случая, особенно в случае работающий стратегии, я бы не хотел, чтобы у меня все упало или выскакивали какие-либо окошки (особенно на удаленном сервере) при некритичном (для стратегии) exception.
Вопрос не простой - однозначно. Но есть вроде общие практики, как это сделать. И там "либо-либо" - либо падаем и в консоль пишем stacktrace - эдакий linux-style либо озадачиваем юзера окошком.
У вас сейчас не так и не эдак. Exceptions некотрые приходят, некоторые нет, некоторые в окошке, некоторые просто валят стратегию.

Вот конкретный пример с Position==null - стратегия могла бы месяцами работать без исключений, а потом втихоря упасть, OQ даже в логах ничего бы оставил.
Вот заходите вы к себе на сервачок - OQ работает, а стратегия в Live упала, ноги арбитражные уехали в разные стороны и т.д. И концов не найти - почему упала, даже когда упала не установить.

Про идеальный вариаент - когда исключения обрабатываются по-разному в Live и Simulation - я даже не говорю. Не нравятся окошки - пишите в логи хотя бы, но нужно ведь хоть что-то делать.
У меня свой watchdog - он умеет перезапустить OQ, в том числе, если тот вывалит какие-то окошки, в том числе на другом сервере, в другой ВМ и т.д. и т.п. Но ему тоже что-то нужно мониторить - окошки, логи, пиксели на экране в конце концов ...
Да и проблемы разработки и отладки стратегии он никак решить не может.

Quote:
В качестве бредовой идеи можно предложить раннер стратегии обернуть в try catch...
Да, конечно, это первое, что пришло в голову
Ну идея специфическая, вы сами это понимаете, к сожалению, она проблему не решает. Вот сделал я так - получаю Attempted to divide by zero в стратегии и вместо моего красивого немодального обработчика с окошком треугольной формы и портретом Путина выскакивает ваша модальная формочка с единственной кнопокой "Abort". А если бы это в оптимизации было ? Опять freeze by design

Я предложил своё решение - немодальное окошко или для начала хотя бы кнопочку "стоп оптимизации" в модальном.
Плюс хочется ясное, понятное полиси - ловите вы или не ловите исключения и как вы это делаете.
Могу еще попросить дать мне callback OnStrategyException() - если что я его сам переназначу на что-то нужное, причём отдельно на Simulation и отдельно в Live. Ещё могу попросить дать мне class Optimization() - чтобы я сам мог запускать-паузить оптимизацию, получил доступ к OptimizationParameter не через for цикл в сценарии, а напрямую.

Но, вообще, если уже пора что-то на Новый год себе просить - я готов - список-то немаленький будет ;)

Author:  valenock [ Wed Dec 05, 2012 6:50 pm ]
Post subject:  Re: Strategy.Position == null ?

Dr. Anton Fokin wrote:
В смысле HasPosition это if (Position != null)
Вот этот момент и не понятен.
Может быть Qty = 0 или не может в принципе ?
Когда позиция "умирает" ? Как только qty=0 или когда ?

Тут что-то неоднозначное, получается позиция может быть !=null но при этом Qty =0.
А зачем тогда она null вообще становится ? Зачем вообще этот state ввели ?
Если оставить её Qty=0, то будет одной проверкой меньше для доступа к полю, да и HasPosition() вроде как не нужен или будет return Qty!=0 ?

PS
Сохранять просто Qty не совсем решение - нужен ещё side и мне в позиции нужны Transactions - как-то привязался я к ним ;)

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 6:54 pm ]
Post subject:  Re: Strategy.Position == null ?

Пост хороший, длинный. Много буков. Но в конце вы повторили ровно то, что я предложил.

Мы оборачиваем весь внутренний пускатель стратегий в try catch и мы же ловим исключения, которые передаем в Strategy.OnException . Дальше делайте с этим что хотите.

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 6:57 pm ]
Post subject:  Re: Strategy.Position == null ?

Нету позиций с Qty = 0. Потому что при Qty == 0 нет позиции. А нет позиции - это Position == null.

Author:  valenock [ Wed Dec 05, 2012 7:04 pm ]
Post subject:  Re: Strategy.Position == null ?

Dr. Anton Fokin wrote:
Мы оборачиваем весь внутренний пускатель стратегий в try catch и мы же ловим исключения, которые передаем в Strategy.OnException . Дальше делайте с этим что хотите.

Да, звучит классно - из поста не понял что Мы==SmartQuant - ваш коллега предлагал это всё делать в пользовательском коде.

Про Position==null понял, не могу сказать, что это интуитивно понятно - но уж как есть - спасибо, что разъяснили

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 7:06 pm ]
Post subject:  Re: Strategy.Position == null ?

Тут как бы сложно что-то к этому добавить. Такова парадигма. И мы однозначно не будем ее менять в опенкванте. Но мы с удовольствием учтем здравые идеи при разработке нового фреймворка. По крайней мере в новом фреймворке позиция уже складывается из partial fills и появилось HasPosition(qty).

Author:  Dr. Anton Fokin [ Wed Dec 05, 2012 7:09 pm ]
Post subject:  Re: Strategy.Position == null ?

Звучит оно может и классно. Но не факт, что реализация будет однозначно классная. Как вы правильно заметили, исключения бывают и такие и сякие, и от этого то появляются окошки, то все молча падает, а то и вовсе молча не падает. С try catch и OnException может быть такая же ситуация.

Page 1 of 2 All times are UTC + 3 hours
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/