пятница, 29 октября 2010 г.

Stock# 2.5

Обновление версии до 2.5.2.

И так, очередной релиз - 2.5. Его можно охарактеризовать одной фразой - чистка. Чистка кода, улучшение и исправление функциональности, расширение возможностей. И так, по порядку.


Quik

  1. Появился класс QuikTerminal. Представляет собой обертку над кодом, работающим с окном Quik. Фактически вся магия по манипуляции с окнами Quik-а сосредоточена именно в нем. Подробнее, в разделе Управление окном Quik.
  2. QuikTrader.RegisterQuotes теперь автоматически открывает окно со стаканом, если оно не было до этого открыто. Фидбек поступил еще со времен группы, и, замечу, очень полезная вещь получилось.
  3. Думаю, уже многие благополучно забыли, для чего было введено Order.TransactionId. Впервые оно появилось в S# 1.8 и было предназначено для идентификации заявок в асинхронном режиме. Теперь, когда по прошествии такого времени уже у всех присутствует колонка с номером транзакции в таблице заявок, эта идентификация становится единой - и для синхронного режима и для асинхронного. Заявки, создаваемые "руками" по прежнему поддерживаются и обрабатываются.
  4. Из-за появления QuikTerminal удалил QuikFinder.
  5. Добавил раздел Включение и выключение Quik где показано, как можно запускать и выключать Quik. И более того, как автоматически производить вход через логин-пароль. Я уже поместил на рабочий стол иконку с быстрым запуском Quik. Главное, храните пароль шифрованно в коде. Можно использовать для этого Ecng.Security. Но вероятность получить трояна, который будет из такой программы вытаскивать секреты, ничтожна мала.
  6. Появилось событие QuikTrader.PreProcessDdeData, которое вызывается при получении по DDE новых данных прежде, чем QuikTrader начинает обрабатывать их.
  7. Сделал возможность обрабатывать произвольные DDE таблицы одним типом данных.
  8. Добавил возможность проверять, запущен ли экспорт DDE для необходимой таблицы. Делается через методы QuikTrminal.IsDdeStarted.
  9. Если идет попытка подключится к Quik, который в свою очередь не подключен к торгам, то выводится предупреждение через ConnectionError.
  10. Для экзотических инструментов (и бирж) добавил свойство QuikTrader.SecurityClassInfo, где по классу инструмента (ключ) задаются его тип и биржа. Реквест изначально пришел по РТС Стандарту, но его экзотикой уже сложно назвать.


SmartCOM

Тут изменение всего одно, но какое! Перевел на SmartCOM 2.0. Он сейчас пока в стадии бета, но работает уже лучше, чем релиз предыдущей версии. Будем надеяться, что парни из ИТ Инвест продолжат тенденцию.


Стратегии

  1. Говорящий синтаксис для стратегий, построенных на событиях. Просто приведу код:
    // если цена лучшего бида превысила 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;
    
    Прогресс на лицо.
  2. В связи с предыдущим пунктом значительно расширил основные условия и действия. Полный список у классов ActionStrategyConditionHelper и ActionStrategyActionHelper.
  3. MarketQuotingStrategy теперь наследуется от BestByPriceQuotingStrategy. Преимущество BestByPriceQuotingStrategy в том, что он позволяет задавать максимальные размер колебания лучшей цены относительно котируемой заявки. Это предотвращает частые перестановки заявки (например, когда лучшая цена ушла всего лишь на пипс). Теперь и MarketQuotingStrategy обладает данной опцией, что повышает его полезность.
  4. Свойство Strategy.Trades теперь называется Strategy.MyTrades.
  5. Добавил методы Strategy.BuyAt и Strategy.SellAt для короткой записи создания заявок. Подчеркиваю, после создания заявки ее нужно зарегистрировать через Strategy.RegisterOrder.
  6. Добавил тип SecurityBasket, который из себя представляет корзину инструментов. Сам SecurityBasket отнаследован от Security для того, чтобы его можно было передавать в Strategy. Теперь парные стратегии (или стратегии, где создается индекс из инструментов) стало удобнее писать на S#.
  7. Для визуального контроля работы стратегий сделал StrategiesMonitorWindow, который позволяет просматривать наглядно работу стратегий, особенно вложенных. Подробнее в разделе Мониторинг работы, а так же скриншот:

  8. Добавил новые логгеры - EmailStrategyLogger, SoundStrategyLogger, SmsStrategyLogger, DebugStrategyLogger, ConsoleStrategyLogger. Особенно интересны три: звуковой, емейл и смс (работает, через Google Calendar). Подробнее, в расширенной документации.
  9. Сделал фильтрацию сообщения для логгеров - StrategyLogger.Filters. Например, что того, чтобы проигрывать звук только при сообщениях об ошибке.
  10. Strategy.ChildStrategies теперь имеет свой тип IStrategyChildStrategyList, у которого есть событие на добавление и удаление дочерней стратегии.
  11. ConditionStrategy переименовал в ProtectiveStrategy как более подходящее по названию.
  12. Изменил названия у некоторых методов класса QuotingStrategy.
  13. Появился метод Strategy.OnChildStopped, который вызывается при остановке дочерней стратегии.


Алгоритмы

  1. Произошла реструктуризация сборки Algo. Я сгруппировал функциональность в отдельные папки. Все, что связанно со стратегиями, теперь находится в Algo.Strategies, cвечки - Algo.Candles и т.д. Как начнете писать код, все сами увидите.
  2. Расширил Unit, чтобы через него можно было задавать значения ввиде пунктов и пипсов. Выглядит следующим образом:
    var total = 10.Points(riz0) + 3.Percents();
    Довольно наглядное представление трейдинговой арифметики. Подробнее, в разделе Арифметические операции.
  3. События CandleManager.NewCandles и CandleManager.CandlesChanged изменили свою сигнатуру. C IEnumerable работать привычнее, чем с MultiDictionary.
  4. Метод TraderHelper.GetCandleBounds теперь учитывает время биржи, как писали об этом.
  5. Для создания разреженного стакана теперь необходимо вызывать метод TraderHelper.Rare. Раньше метод назывался Invert.
  6. Добавил метод TraderHelper.GroupByPriceRange для группировки стакана по ценовым уровням. Подробнее, в разделе Стакан: разреженный и сгрупированный.
  7. BaseTrader перекочевал из BusinessEntities в Algo.
  8. ReConnectionManager находится теперь внутри BaseTrader. Теперь, при использовании MultiTrader перезапуск соединения происходит для конкретного шлюза, а не для всего MultiTrader.
  9. Появилось свойство BaseTrader.ReConnectingSettings, через которое можно задавать настройки контроля соединения: количество попыток установить соединение, длительность ожидания при подключении и отключении и т.д. Подробнее в обновленном разделе Переподключение.
  10. Метод TraderHelper.ShrinkPrice чуть изменил свою работу. Теперь он автоматически определяет, до какого уровня цены нужно округлять (в большую сторону или меньшую), а так же принимает дополнительный параметр rule, через который можно явно задать вид округления.
  11. Новый метод TraderHelper.GetTheoreticalTrades, через который осуществляется анализ ликвидности в стакане.


Общее

  1. Улучшил сериализацию всех торговых сущностей. Фактически, теперь все можно записать в файл (или другое хранилище) и считать обратно. Поддерживается и WCF сериализация, и Binary, и Xml, и даже родная, Ecng.Serialization.
  2. Удалил WrapperTrader как рудимент.
  3. Обновил графическую библиотеку amCharts до версии 1.3.1. Стало чуть быстрее и исчезли глюки, которые я скрывал до этого в классе ChartControl.
  4. Переименовал ChartControl.CreateChartGraph в ChartControl.CreateTrend.
  5. Добавил свойство LogWindow.TimeFormat, через которое можно задавать формат вывода времени лог записи.
  6. Появился отдельный компонент LogControl, который можно использовать в своем окне робота.
  7. Удалил сборку AlgoEntities.
  8. Добавил свойство MarketDepth.Trader, чтобы знать, через какой шлюз получен стакан. Особенно удобно в случае работы с MultiTrader.
  9. Добавил информацию о тестовой бирже Exchange.Test. Ее можно использовать при работе с демо счетами, которые работают практически в круглосуточном режиме.
  10. Добавил PortfolioComboBox для выбора портфеля из списка.
  11. Добавил возможность клонирования стакана через MarkerDepth.Clone.


Исправленные баги

  1. Вошли все исправления из промежуточной версии.
  2. StartExport, StartDDE, IsExportRunnin.
  3. Бага с MarketTime.
  4. QuikTrader.ProcessWellKnownDdeData передает пустой Dictionary.
  5. Strategy.NewStopOrder не вызывается.
  6. Ошибка при сериализации Exchange.
  7. При загрузке стратегий из xml происходит ошибка.

Всем приятного перехода на новую версию. Для новых пользователей успехов в написании роботов.

4 комментария:

  1. Исправление _функциональности_ класс =)

    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 не осуществляется и они не похожи на бизнес-сущности.

    ОтветитьУдалить
  2. Ещё бы на главной "функционалом" заменить на "функциональностью".

    И можно из логотуре S# сделать иконку для размещения на сайте.

    Ссылка на пример использования терминала, чтобы не искать:
    http://stocksharp.com/doc/help/html/52cb16e3-0ff0-4e82-8ad5-73a2e6e918a1.htm

    ОтветитьУдалить
  3. Спасибо, поправил. Насчет лого не понял. Сайт уже имеет favicon.

    ОтветитьУдалить
  4. Насчет свечек. Я бы с рабостю перенес, вот только компилироваться перестанет очень многое. А так я и сам ощутил не раз на своих роботах, что паттерны лучше все же в Алго делать.

    Как подразгребусь с текущими наполеоновскими планами, сразу перенесу. Честнопионерское.

    ОтветитьУдалить