пятница, 19 февраля 2010 г.

Stock# 1.7

Внимание! Обновил дистрибутив (0:53 MSK).

Вышла новая версия - 1.7 (качаем-с). В прошлый раз (последний пункт) я написал, что следующий релиз будет иметь версию 2.0. Но, по мере работы над этой версией я все больше убеждался - нет, слишком много изменений за раз. Много изменений - больше времени на тестирование. Больше времени на тестирование - затягивание с релизом. Затягивание с релизом - затягивание с релизом.

И так, что появилось в этой версии под номером 1.7:

1. Для QuikTrader расширил DDE метаданные. По просту говоря, теперь для экспорта требуется больше колонок, чем раньше. Изменению подверглись существующие таблицы Инструменты (добавил объемы для лучших бидов и офферов), Стоп-Заявки (добавил колонки, относящиеся к Тейк-Профит - Стоп-Лосс). Убрал из таблицы Мои Сделки колонку Операция, так как она оказалось больше не нужной. Подробнее, я написал в документации разделе Настройка Quik, а так же традиционно приложил файл info.wnd.

2. Ввел поддержку конфигурирования DDE метаданных. S# очень ревностно относится к порядку колонок и заголовку таблиц. При конфигурировании используется класс DdeTable, который позволяет переопределить первоначальные настройки. О причине жесткого определения настроек DDE, и о том, как воспользоваться механизмом конфигурирования я написал в документации в разделе Модификация стандартных таблиц, и показал в примере SampleDdeMetadata.

3. Добавил поля Security.MarginBuy (ГО покупателя), Security.MarginSell (ГО продавца), Security.ExpiryDate (дата экспирации деривативов), Security.SettlementDate (дата выплаты по инструменту), Security.MinStepPrice (стоимость шага цены), а также, Trade.OrderDirection (направление заявки, которая удовлетворила первую заявку). Эти поля по умочланию не экспортируются. Причина - не доступны в режимах только ММВБ или только РТС. Но, как раз в примере SampleDdeMetadata, я показал, как включать эти поля.

4. Очень важное, хотя и незначительное изменение. Я поменял логику смены состояния для заявок Order.State. Раньше, после того, как происходила регистрация, состояние заявки была равное None до тех пор, пока не приходило событие новых данных по DDE из таблицы Заявки, и оно менялось на Active (или сразу на Matched). Это я сделал для того, чтобы можно было в программе отслеживать ошибочное поведение Квик сервера (http://quik.ru/forum/import/41268/). Но по мере использования S# для разработки я понял, что ждать не всегда нужно - теряется скорость, и, что самое главное, необходимо делать проверки на состояние заявки, загромождая тем самым код с торговой логикой. Теперь, после того как заявка быдет зарегистрирована, ее статус сразу меняется на Active, и уже изменяется только тогда, когда придет изменение по DDE. Так что, делайте минимальную задержку, если у вас идет непрерывная регистрация-снятие. Для тех, у кого нет такого, получат бенефит в виде мгновенно правильного значения.

5. По аналогии с менеджерами проскальзывания и P&L добавил менеджер позиции. Аналогично, менеджер разделяется на:

a. TraderPositionManager - расчет позиции по всему шлюзу.
b. SecurityPositionManager - расчет позиции по конкретному инструменту.
c. AccountPositionManager - расчет позиции по конкретному счету.
d. StrategyPositionManager - расчет позиции по конкретной стратегии.

6. Для менеджеров позиции, проскальзывания и P&L добавил менахизм первоначального определения состояния (например, когда робот перезапустился, нужно четко определить, в каком состоянии была приостановлена торговля, и с чего нужно начинать). Минус - пока не сделал для менеджеров по Strategy. Для них особая логика (при получении ранее добавленных сделок или заявок нельзя однозначно сказать, к какой стратегии относятся эти данные). Но в планы, конечно же, добавил, так как это очень необходимая вещь для Strategy. Думаю, в следующем релизе.

7. Как понятно из пункта 1, я сделал поддержку всех типов стоп-заявок Квика. От меня как то ускользнул тот факт, что Квик добавил новый тип заявки Тейк-Профит и Стоп-Лимит, в котором было произведено достаточное количество изменений для предыдущих стоп-заявок. Теперь S# снова поддерживает Квик полностью, что касается стоп-заявок. Обновленный пример Sample, где находятся исходники по работе со стоп-заявками, лежит в дистрибутиве.

8. Реализовывая предыдущий пункт я все больше начал понимать, что понятие стоп-заявка - вещь сугубо абстрактная. Да, всем понятно, например, что такое стоп-лосс, но когда дело доходит до конкретного терминала, выясняется, что заявки-то формируются по разному: разный набор критериев и способов реализации. Все эти размышления привели меня к тому, что я переименовал класс Condition в StopCondition и сделал его
абстрактным. Для Квика я реализовал отдельный класс QuikStopCondition, где поместил все его параметры стоп-заявок.

9. Добавил свойство QuikStopCondition.Type, отвечающее за тип стоп-заявки. Раньше, сам S# определял по входящей заявке, что перед ним (например, стоп-лимит или тейк-профит). Идея бы интересная, но и только. Это внесло ряд путаницы, в том числе и с моей стороны. Приходилось даже несколько раз лезть в документацию, чтобы уточнить как правильно создавать нужную стоп-заявку. Теперь все явно, ручками, и будет предельно ясно видно из кода робота, что регистрируется.

10. К поддержке обычных стоп-заявок в S# добавились и стоп-заявки "по исполнению". Эта такая особая разновидность стоп-заявок, которые отслеживают баланс в активной заявке, и при изменении регистрируют другую заявку.

11. Добавил еще одну щепоточку ООП в S#. Теперь у заявок нет свойства Order.DerivedOrderId, а есть Order.DerivedOrder, и, соответственно, убрал за ненадобностью метод ITrader.GetDerivedOrder. Аналогично проделал и с QuikStopCondition, где так же есть связи на другие заявки. Незачем использовать идентификаторы, если можно использовать сразу объеты.

12. Столкнувшись c проблемой RTS Standard (http://groups.google.ru/group/stocksharp/msg/f1acbc74bf045a1e), и с тем, что ребята из Квик не всегда могут ответить, что и как работает (http://quik.ru/forum/import/51046/), я решил осуществить превентивные меры. А именно, добавил событие QuikTrader.FormatTransactionString, которое вызывается перед отправкой транзакции в Квик (на регистрицию и снятие). Теперь, если у Квика есть какая-та тайная инструкция на экзотические инструменты, можно в любой момент отредактировать строку перед отправкой. Главное, напишите на форум, чтобы поделиться знаниями.

13. ITrader.MarketTimeOffset - смещение локального времени от биржи. Специально для тех, у кого локальное время отличается от московского. Написал в документации, как работать.

14. Раньше, при попытке подключиться к Квику, у которого была отключена поддержка Внешних Транзакций, S# выдавал ошибку Квика, что по указанному пути не найден терминал. Естественно, это неправильно. Теперь, S# определяет наличие Квика в указанной директории, и в случае ошибки подключения, рапортует уже своим сообщением, что не включены Внешние Транзакции.

15. Добавил класс Currency. Как понятно из названия, это валюта. Опсание этого класса, а также, как переводить из одной валюты в другую, я поместил в документацию и показал в примере SampleCurrency.

16. Добавил сущноcть Portfolio. Пока не поддерживается ничем, но нужна для мега релиза - 2.0.

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