SmartQuant Discussion

Automated Quantitative Strategy Development, SmartQuant Product Discussion and Technical Support Forums
It is currently Wed Oct 28, 2020 7:56 am

All times are UTC + 3 hours




Post new topic Reply to topic  [ 22 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: Wed Dec 05, 2012 4:41 pm 
Offline

Joined: Sat Mar 19, 2011 7:38 pm
Posts: 27
Попался неприятный момент.
При обращении к 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() оно тоже выскакивает, но как-то не всегда.


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 4:47 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Ну да, позиция или есть, или не есть. Можно использовать HasPosition для проверки.


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 4:54 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Что касается удобства, то вопрос двоякий. С одной стороны при написании стратегии бывает удобно всегда иметь объект Position, а не null. C Qty = 0 для отсутствующих позиций. С другой стороны удобно иметь список позиций в портфеле, соответствующий реально открытым позициям, а не пробегать по тысяче объектов Position, среди который одна реальная с ненулевым Qty.


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 5:07 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Кстати про exception вопрос тоже не такой простой, как кажется. В некоторых случая, особенно в случае работающий стратегии, я бы не хотел, чтобы у меня все упало или выскакивали какие-либо окошки (особенно на удаленном сервере) при некритичном (для стратегии) exception.

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


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 5:08 pm 
Offline

Joined: Sat Mar 19, 2011 7:38 pm
Posts: 27
Ну да, про большие портфели не подумал.
С другой стороны в портфеле так же можно сравнить с нулём позицию...

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

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

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


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 5:11 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Ну да, HasPosition это Qty == 0 .

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


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 5:14 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Запоминайте Qty и будет вам счастье. В опенквантовской модели стратегии, то есть когда заводится инстанс стратегии на инструмент, в позиции вообще ничего нет информативного, кроме Qty.


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 5:48 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
В смысле HasPosition это if (Position != null)


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 6:41 pm 
Offline

Joined: Sat Mar 19, 2011 7:38 pm
Posts: 27
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 цикл в сценарии, а напрямую.

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


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 6:50 pm 
Offline

Joined: Sat Mar 19, 2011 7:38 pm
Posts: 27
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 - как-то привязался я к ним ;)


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 6:54 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Пост хороший, длинный. Много буков. Но в конце вы повторили ровно то, что я предложил.

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


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 6:57 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Нету позиций с Qty = 0. Потому что при Qty == 0 нет позиции. А нет позиции - это Position == null.


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 7:04 pm 
Offline

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

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

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


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 7:06 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Тут как бы сложно что-то к этому добавить. Такова парадигма. И мы однозначно не будем ее менять в опенкванте. Но мы с удовольствием учтем здравые идеи при разработке нового фреймворка. По крайней мере в новом фреймворке позиция уже складывается из partial fills и появилось HasPosition(qty).


Top
 Profile  
 
PostPosted: Wed Dec 05, 2012 7:09 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Звучит оно может и классно. Но не факт, что реализация будет однозначно классная. Как вы правильно заметили, исключения бывают и такие и сякие, и от этого то появляются окошки, то все молча падает, а то и вовсе молча не падает. С try catch и OnException может быть такая же ситуация.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 22 posts ]  Go to page 1, 2  Next

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group