И так, очередной релиз - 2.5. Его можно охарактеризовать одной фразой - чистка. Чистка кода, улучшение и исправление функциональности, расширение возможностей. И так, по порядку.
Quik
- Появился класс QuikTerminal. Представляет собой обертку над кодом, работающим с окном Quik. Фактически вся магия по манипуляции с окнами Quik-а сосредоточена именно в нем. Подробнее, в разделе Управление окном Quik.
- QuikTrader.RegisterQuotes теперь автоматически открывает окно со стаканом, если оно не было до этого открыто. Фидбек поступил еще со времен группы, и, замечу, очень полезная вещь получилось.
- Думаю, уже многие благополучно забыли, для чего было введено Order.TransactionId. Впервые оно появилось в S# 1.8 и было предназначено для идентификации заявок в асинхронном режиме. Теперь, когда по прошествии такого времени уже у всех присутствует колонка с номером транзакции в таблице заявок, эта идентификация становится единой - и для синхронного режима и для асинхронного. Заявки, создаваемые "руками" по прежнему поддерживаются и обрабатываются.
- Из-за появления QuikTerminal удалил QuikFinder.
- Добавил раздел Включение и выключение Quik где показано, как можно запускать и выключать Quik. И более того, как автоматически производить вход через логин-пароль. Я уже поместил на рабочий стол иконку с быстрым запуском Quik. Главное, храните пароль шифрованно в коде. Можно использовать для этого Ecng.Security. Но вероятность получить трояна, который будет из такой программы вытаскивать секреты, ничтожна мала.
- Появилось событие QuikTrader.PreProcessDdeData, которое вызывается при получении по DDE новых данных прежде, чем QuikTrader начинает обрабатывать их.
- Сделал возможность обрабатывать произвольные DDE таблицы одним типом данных.
- Добавил возможность проверять, запущен ли экспорт DDE для необходимой таблицы. Делается через методы QuikTrminal.IsDdeStarted.
- Если идет попытка подключится к Quik, который в свою очередь не подключен к торгам, то выводится предупреждение через ConnectionError.
- Для экзотических инструментов (и бирж) добавил свойство QuikTrader.SecurityClassInfo, где по классу инструмента (ключ) задаются его тип и биржа. Реквест изначально пришел по РТС Стандарту, но его экзотикой уже сложно назвать.
SmartCOM
Тут изменение всего одно, но какое! Перевел на SmartCOM 2.0. Он сейчас пока в стадии бета, но работает уже лучше, чем релиз предыдущей версии. Будем надеяться, что парни из ИТ Инвест продолжат тенденцию.
Стратегии
- Говорящий синтаксис для стратегий, построенных на событиях. Просто приведу код:
// если цена лучшего бида превысила 1600 то открыть позицию на 2 контракта When(lkoh.BestBidPriceMore((Unit)1600)). Do(this.OpenPosition(2));
И как бы он выглядил без нового синтаксиса:
if (lkoh.BestBid.Price > 1600) base.ChildStrategies.Add(new MarketQuotingStrategy(CreateOrder(OrderDirections.Buy, 2, 1600))) return true;
Прогресс на лицо.
- В связи с предыдущим пунктом значительно расширил основные условия и действия. Полный список у классов ActionStrategyConditionHelper и ActionStrategyActionHelper.
- MarketQuotingStrategy теперь наследуется от BestByPriceQuotingStrategy. Преимущество BestByPriceQuotingStrategy в том, что он позволяет задавать максимальные размер колебания лучшей цены относительно котируемой заявки. Это предотвращает частые перестановки заявки (например, когда лучшая цена ушла всего лишь на пипс). Теперь и MarketQuotingStrategy обладает данной опцией, что повышает его полезность.
- Свойство Strategy.Trades теперь называется Strategy.MyTrades.
- Добавил методы Strategy.BuyAt и Strategy.SellAt для короткой записи создания заявок. Подчеркиваю, после создания заявки ее нужно зарегистрировать через Strategy.RegisterOrder.
- Добавил тип SecurityBasket, который из себя представляет корзину инструментов. Сам SecurityBasket отнаследован от Security для того, чтобы его можно было передавать в Strategy. Теперь парные стратегии (или стратегии, где создается индекс из инструментов) стало удобнее писать на S#.
- Для визуального контроля работы стратегий сделал StrategiesMonitorWindow, который позволяет просматривать наглядно работу стратегий, особенно вложенных. Подробнее в разделе Мониторинг работы, а так же скриншот:
- Добавил новые логгеры - EmailStrategyLogger, SoundStrategyLogger, SmsStrategyLogger, DebugStrategyLogger, ConsoleStrategyLogger. Особенно интересны три: звуковой, емейл и смс (работает, через Google Calendar). Подробнее, в расширенной документации.
- Сделал фильтрацию сообщения для логгеров - StrategyLogger.Filters. Например, что того, чтобы проигрывать звук только при сообщениях об ошибке.
- Strategy.ChildStrategies теперь имеет свой тип IStrategyChildStrategyList, у которого есть событие на добавление и удаление дочерней стратегии.
- ConditionStrategy переименовал в ProtectiveStrategy как более подходящее по названию.
- Изменил названия у некоторых методов класса QuotingStrategy.
- Появился метод Strategy.OnChildStopped, который вызывается при остановке дочерней стратегии.
Алгоритмы
- Произошла реструктуризация сборки Algo. Я сгруппировал функциональность в отдельные папки. Все, что связанно со стратегиями, теперь находится в Algo.Strategies, cвечки - Algo.Candles и т.д. Как начнете писать код, все сами увидите.
- Расширил Unit, чтобы через него можно было задавать значения ввиде пунктов и пипсов. Выглядит следующим образом:
var total = 10.Points(riz0) + 3.Percents();
Довольно наглядное представление трейдинговой арифметики. Подробнее, в разделе Арифметические операции. - События CandleManager.NewCandles и CandleManager.CandlesChanged изменили свою сигнатуру. C IEnumerable работать привычнее, чем с MultiDictionary.
- Метод TraderHelper.GetCandleBounds теперь учитывает время биржи, как писали об этом.
- Для создания разреженного стакана теперь необходимо вызывать метод TraderHelper.Rare. Раньше метод назывался Invert.
- Добавил метод TraderHelper.GroupByPriceRange для группировки стакана по ценовым уровням. Подробнее, в разделе Стакан: разреженный и сгрупированный.
- BaseTrader перекочевал из BusinessEntities в Algo.
- ReConnectionManager находится теперь внутри BaseTrader. Теперь, при использовании MultiTrader перезапуск соединения происходит для конкретного шлюза, а не для всего MultiTrader.
- Появилось свойство BaseTrader.ReConnectingSettings, через которое можно задавать настройки контроля соединения: количество попыток установить соединение, длительность ожидания при подключении и отключении и т.д. Подробнее в обновленном разделе Переподключение.
- Метод TraderHelper.ShrinkPrice чуть изменил свою работу. Теперь он автоматически определяет, до какого уровня цены нужно округлять (в большую сторону или меньшую), а так же принимает дополнительный параметр rule, через который можно явно задать вид округления.
- Новый метод TraderHelper.GetTheoreticalTrades, через который осуществляется анализ ликвидности в стакане.
Общее
- Улучшил сериализацию всех торговых сущностей. Фактически, теперь все можно записать в файл (или другое хранилище) и считать обратно. Поддерживается и WCF сериализация, и Binary, и Xml, и даже родная, Ecng.Serialization.
- Удалил WrapperTrader как рудимент.
- Обновил графическую библиотеку amCharts до версии 1.3.1. Стало чуть быстрее и исчезли глюки, которые я скрывал до этого в классе ChartControl.
- Переименовал ChartControl.CreateChartGraph в ChartControl.CreateTrend.
- Добавил свойство LogWindow.TimeFormat, через которое можно задавать формат вывода времени лог записи.
- Появился отдельный компонент LogControl, который можно использовать в своем окне робота.
- Удалил сборку AlgoEntities.
- Добавил свойство MarketDepth.Trader, чтобы знать, через какой шлюз получен стакан. Особенно удобно в случае работы с MultiTrader.
- Добавил информацию о тестовой бирже Exchange.Test. Ее можно использовать при работе с демо счетами, которые работают практически в круглосуточном режиме.
- Добавил PortfolioComboBox для выбора портфеля из списка.
- Добавил возможность клонирования стакана через MarkerDepth.Clone.
Исправленные баги
- Вошли все исправления из промежуточной версии.
- StartExport, StartDDE, IsExportRunnin.
- Бага с MarketTime.
- QuikTrader.ProcessWellKnownDdeData передает пустой Dictionary.
- Strategy.NewStopOrder не вызывается.
- Ошибка при сериализации Exchange.
- При загрузке стратегий из xml происходит ошибка.
Всем приятного перехода на новую версию. Для новых пользователей успехов в написании роботов.
Исправление _функциональности_ класс =)
ОтветитьУдалитьQuikTerminal хорошая штука.
В примере использования два раза объявляются переменные логина и пароля.
После заявления «Если я это сделаю, то следующий реквест будет - "Запустить Квик если
он не запущен" =)» я уж было подумал, что этот класс появится нескоро =)
http://stocksharp.com/doc/help/html/e0f9d08e-5dba-4d5d-9248-4d37eba61b22.htm
Форум для обсуждения вопросов - http://groups.google.ru/group/stocksharp .
Форум переехал, адрес остался.
По логике, свечи должны были бы быть в неймспейсе Ecng.Trading.Algo.Candles (а не в Ecng.Trading.BusinessEntities), единообразно со стратегиями и остальным в Ecng.Trading.Algo.*. Я свечами не пользовался, но мне кажется, что их использование без Ecng.Trading.Algo.Candles не осуществляется и они не похожи на бизнес-сущности.
Ещё бы на главной "функционалом" заменить на "функциональностью".
ОтветитьУдалитьИ можно из логотуре S# сделать иконку для размещения на сайте.
Ссылка на пример использования терминала, чтобы не искать:
http://stocksharp.com/doc/help/html/52cb16e3-0ff0-4e82-8ad5-73a2e6e918a1.htm
Спасибо, поправил. Насчет лого не понял. Сайт уже имеет favicon.
ОтветитьУдалитьНасчет свечек. Я бы с рабостю перенес, вот только компилироваться перестанет очень многое. А так я и сам ощутил не раз на своих роботах, что паттерны лучше все же в Алго делать.
ОтветитьУдалитьКак подразгребусь с текущими наполеоновскими планами, сразу перенесу. Честнопионерское.