четверг, 11 марта 2010 г.

Асинхронные заявки

Поделились со мною программой, которая четка показала - асинхронные заявки через Квик быстрее асихнронных заявок через .NET. Поясню, что значит последнее. Допустим, в программе необходимо заложить логику, которая бы мгновенно отправляла заявки на регистрацию, не дожидаясь подтверждения. Такое может потребоваться при написании привода, когда нужно максимально быстро послать запрос и возвратить пользователю управление (иначе GUI будет подтормаживать). Вот как это делается сейчас:
new Action(() => _trader.RegisterOrder(order)).BeginInvoke(null, null);

Довольно быстро. Но одному из пользователей S# потребовалась еще более быстрая скорость, и он попросил добавить поддержку асинхронных заявок в QuikTrader именно через механизм Quik API. Да не просто попросил, а аргументированно-программно доказал всю мою неправоту, прислав тестовую программу. Так как я раньше думал, что регистрация заявок через асинхронный механизм .NET имеет такую же скорость, что и через квиковский. Вот показатель разных способов:

1. Синхронный способ (QuikTrader.RegisterOrder) - 2-3 заявки в секунду.

2. Асинхронный способ .NET (Delegate.BeginInvoke) - 4-5 заявок в секунду.

3. Асинхронный способ Квик - 7-8 заявок в секунду.

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

пятница, 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.

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

пятница, 29 января 2010 г.

Stock# 1.6

Выложил новую версию, теперь уже под новым названием. Большое количество изменений и нововведений, что сделало это релиз самым долгим. Скачать дистрибутив. И так:

1. QuikTrader теперь поддерживает TRANS2QUIK 1.1. Для тех, кто в не в курсе - это такая версия, которая умеет мониторить состояние заявки и сделок по ней. Включить включил, а вот доступа из вне не дал. Причина в том, что тесты показали точно такую же скорость отклика, что и DDE (подозреваю, что схожий механизм). Соответственно, чтобы не поддерживать две режима, оставил включенным пока только старый. Багов меньше, возможностей больше.

2. Переименовал класс Task в Strategy как четко определяющее свое предназначение. Так же сделал его более умным. Сам набирает сделки, сам определяет позицию, проскальзывание (подробнее, пункт 6), прибыль-убыток (пункт 7). Разве что не кушает сам.

3. В документацию добавил топик, описывающий как из робота отслеживать состояние соединения и производить переподключение в случае потери соединения с Квиком. А также, добавил класс ReConnectionManager, который умеет автоматизировать работу с соединением. Пример использования в документации и примере Sample.

4. Вынес всю логику работы со свечками в отдельный класс CandleManager.

5. Добавил класс SyncTrader (и аналог для свечек - SyncCandleManager). Класс нужен для предотвращения ошибок меж потокового взаимодействия с визуальными контролами WPF (графическая библиотека в .NET). Рекомендуется при отсутствии большого опыта в создании графических программ на .NET. Подробнее, в документации.

6. Добавил класс BaseSlippageManager (это абстрактный класс, а его реализации - TraderSlippageManager, StrategySlippageManager, SecuritySlippageManager, AccountSlippageManager). Это, как нетрудно догадаться из названия, механизм для подсчета проскальзывания. Пример использования в документации и примере SampleSMA.

7. Так же, как и для проскальзывания из пункта 6, добавил менеджеров P&L (прибыли-убытка): TraderPnLManager, StrategyPnLManager, SecurityPnLManager, AccountPnLManager.

8. Добавил событие ITrader.SecuritiesChanged, сигнализирующее об изменении параметров инструментов.

9. Добавил событие ITrader.QuotesChanged, сигнализирующее об изменении стакана. Нужен для мониторинга низко ликвидных инструментов.

10. В самый последний момент добавил класс MarketDepth - стакан по русски. Прислали по почте, я его отрефакторил и вот он в составе библиотеки.

11. А также ряд других важных архитектурных изменений для следующего релиза, который обещает превратить Stock# в версию 2.0.

четверг, 28 января 2010 г.

Stock#

Все, теперь точно устаканился с названием проекта - оно будет Stock# или кратко, S# (и пусть длинное Ecng.Trading уйдет в небытие). Как раз в манере .NET, где любят называть как язык C# (F#, R# и т.д.). Теперь вот есть и S# (читать как эс шарп, а полное название Stock# как сток шарп). Как вам, язык .NET под биржу? Отхватил себе название, глаз радует. "Как корабль назовешь, так он и поплывет" (с) Врунгель.

Под это дело сразу же зарегистрировал сайт - stocksharp.com. Пока он недоступен для просмотра, но титульную страничку создам ASAP. С линками на документацию, последнюю версию, новостями (это будет данный блог) и форумом. Ах да, завел и форум. Вот его адрес - http://groups.google.ru/group/stocksharp. Теперь вопросы лучше задавать там. Хотелось бы, чтобы и другие проявляли активность. Вопросы, как правило, повторяются.

Вспоминаю сейчас тот период, когда создавал проект (первое название QuikWrapper). Естественно, я выбрал в качестве начинания программу Quik, потому она как была самая удобная для пользователей, так и остается. На днях пробовал SmartTrade. Жуть! Честное слово, я даже подумать не мог, как мы программеры не любим вас трейдеров. Убогий интерфейс, неинтуитивное управление. Единственное превосходство перед Quik - это наличие хорошего API. Для Quik его, как правило, и нет. Поэтому и существует (чуть не написал Ecng.Trading! пора привыкать) S#.

Затем, в процессе выпуска следующей версии QuikWrapper, библиотека так расширилась, что начали появляться наработки по алгоритмам (не зависящих от трейдерского ПО) и мне стало ясно направление - на Квике останавливаться нельзя. Да, Квик лучший, что есть на российском рынке. И да, не все это понимаю. Значит, будет расширяться. В .NET принято создавать иерархию из проекта. Название формируется как ИмяКомпании.Проект. И я решил переименовать QuikWrapper в Ecng.Trading. Но мне это название не понравилось изначально, спустя каких-то пару дней. Слишком сложно языком ворочать, произнося его. И вот, новое, надеюсь последнее, супер лаконичное, приятное слуху и языку; дамы и господа - S#.

среда, 20 января 2010 г.

O Stock# (Ecng.Trading)

Программная библиотека Stock# (старое название Ecng.Trading) предназначена для создания торговых роботов на платформе .NET с использованием программ Quik и SmartCOM. Скачать дистрибутив. Обсуждение ведется по адресу http://groups.google.ru/group/stocksharp.

Преимущества библиотеки:
  • Используется современная платформа .NET с мощным набором функциональности. Нет ограничения в кодировании, которые присутствуют в скриптовых языках.
  • Быстрое обработка алгоритма стратегий. Программа компилируется в машинные инструкции (что дает большой прирост в производительности). Нет синтетических секундных задержек при выполнении алгоритма. Основное ограничение практически всех встроенных языков в таких программах как WealthLab, AmiBroker и т.д.
  • Нет необходимости использовать дополнительное программное обеспечение. Библиотека полностью автономна от сторонних программ.
  • Возможность запуска нескольких сотен одновременно работающих алгоритмов по различным инструментам и тайм-фреймам (скорость зависит только от мощности компьютера, а не от ограничения внешней программы).
  • Возможность реализации скальперских стратегий, с тайм-фреймом менее секунды.

воскресенье, 17 января 2010 г.

Ecng.Trading 1.5

Обновление! Выложил обновленный архив Ecng.Trading_1.5.zip (18.01.2010 22.46 MSK)

Быстро пролетели новогодние выходные. Заметил за собой особенность – чем больше отдыхаешь, тем труднее потом начинать работать. Видимо, хорошего понемногу.

Выкладываю на всеобщее порицание очередную версию - Ecng.Trading 1.5. Качать традиционно отсюда.
Что нового:

  • Пожалуй, самое больше изменение (+нововведение) это появление полноценной документации, а не описание API, как было до этого. Документация включает абсолютно все, что умеет Ecng.Trading - как использовать, и как использовать лучше. Файл в архиве называется Ecng.Trading.chm. Плюс, к документации для наглядного изучения я сделал дополнительно два примера (к уже двум существующим). Первый – это реализация до боли знакомого алгоритма пересечения скользящих средних. Я показал, как можно создавать подобные алгоритмы с помощью Ecng.Trading. Второй пример более графический. Визуально показано, какие свечки поддерживает Ecng.Trading, и чем они отличаются.
  • В QuikTrader добавил поддержку экспорта дополнительных колонок для стандартных таблиц (Инструменты, Заявки и т.д.). Подробнее, в документации и в примере Sample.
  • Переделал структуру работы с механизмом торговых заданий – Task. Как использовать – опять же в документации.
  • Описал свое видение того, куда буду развивать проект.
  • И, конечно же, исправил ошибки.


Вот скриншоты из новых примеров:

Скользящие средние

Расширенный стакан

Свечки


Приятного роботописания!

воскресенье, 10 января 2010 г.

Excel4Net.Com - программирование на C# .NET под Excel

В поисках необычного в процессе серфинга по инету наткнулся на интересный проект: Excel4Net. Я уже писал ранее, как ведущие роботоводы разрабатывают свои прораммы в нынешнее время. И программирование под Excel меня не привело в восторг. После ознакомления с данным проектом, я решил пересмотреть свое мнение на Excel, причем в значительно лучшую сторону.

Excel - очень распространенная среда, и конкурентам (по крайней мере из российского сектора) до массовости Excel как пешком до Поднебеной. Тем не менее, повторю основные минусы Excel:
К этому стоит добавить еще то, что на Excel не так уж тривиально интегрироваться с торговой программой, что для предыдущего пункта делать вообще не нужно. Отдельно можно выделить стабильность - всего один поток, и если он зависнет, зависнут как другие скрипты, так и не будет возможности перезапустить алгоритм (а Excel еще не научился вытаскивать себя из болота за волосы как Мюнхаузен), или даже перезапустить соединение с торгующей программой.

Excel4Net позволяет как раз решить главный недостаток - интеграция. С использованием .NET у Excel появляется просто огромный потенциал в работе с другими программами. Например, библиотеку Ecng.Trading можно на раз-два-три начать использовать как раз из Excel. Это отчетливый сигнал тем, у кого торговые алгоритмы написаны на VBA, и их не устраивает стабильность и скорость. Excel4Net позволяет переписать ряд алгоритмов со скриптов на C# (или VB.NET, кому что нравится), что увеличит скорость в разы. Я переписал один свой макрос на C#, и у него прирост в производительности был равен 1600%. В 16 раз!. Вот здесь показано, как реализовать формулу Блэка-Шоулза.

После выпуска версии Ecng.Trading 1.5 (в текущий момент заканчиваю документацию, которой теперь будет много), обязательно сделаю что-нибудь торговое под Excel4Net. Такой проект трейдерам пройти мимо нельзя.