среда, 8 декабря 2010 г.

Stock# 2.6.2

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

Нововведения:
  1. Добавил метод TraderHelper.Join для соединения разреженного стакана и исходного.
  2. Переименовал метод GroupByPriceRange в TraderHelper.Group.
Исправления:
  1. При защите заявки с двух сторон возникает NullReferenceException при котировании.
  2. Order.Status по умолчанию SentToServer.

суббота, 27 ноября 2010 г.

Stock# 2.6

Выкладываю новую версию. Скорее всего, это последняя в этом году. В связи с большим временем, для следующей версии постараюсь сделать максимальное количество новых фич. А пока - 2.6.

Нововведения:
  1. Появился интерфейс ICandleSource, через который можно переопределять источник тиковых сделок. Например, когда считываются исторические сделки из файла или из базы данных. Теперь такие сделки можно автоматически комбинировать во все свечки, которые поддерживаются S# (или собственные, которые создаются с помощью CandleFactory).
  2. Добавил интерфейс ICandleManager для создания своих собственных менеджеров свечек (например, когда они вообще не создаются, а напрямую подгружаются из ранее сохраненного места).
  3. GuiTrader и GuiCandleManager перенес в Xaml сборку.
  4. Обновил документацию о дочерних стратегиях, в связи с упоминанием, а так же о стратегиях тейк-профит и стоп-лосс, как об этом говорили тут.
  5. Уменьшил время ожидания в QuikTerminal.Launch, а так же сделал это время настраиваемым.
  6. Сделал возможность изменять Strategy.Interval после регистрации стратегии.
  7. ClientCode теперь можно задавать на уровне заявки.

Исправления:
  1. Ошибка метода GetTrades Quik.
  2. Неверная свеча из CandleManager.

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

Почему лучше готовое, чем свое

Прислали мне ссылку на платформу собственного изобретения. Отвечу честно приславшему, в детали не вдавался, потому что там прогресса как такового практически нет. Но сразу вспомнилась картинка (cорри за мат, но из песни слов не выкинешь):


Или роботы, или своя платформа. Я уже сам стал замечать, какое сильное влияение оказал на мое личное время S#.

четверг, 11 ноября 2010 г.

Stock# 2.5.2

Обновление версии 2.5. Исправлены следующие баги:
  1. Не вызываются события заявок и стоп заявок в синхроннмо режиме QuikTrader.
  2. Вернуть в StrategyMonitorWindow корневой уровень.
Первая ошибка критическая, поэтому рекомендуется обновиться как можно быстрее.

Список изменений:
  1. События ITrader.OrdersFailed и ITrader.StopOrdersFailed теперь передают коллекцию OrderFail.
  2. Strategy.OnProcess теперь возвращается тип StrategyProcessResults. Я уже стал сам подзабывать, в каком случае true и false что именно обозначает. Со StrategyProcessResults эта проблема отпала.
  3. Обновил список SmartCOM адресов в класса SmartAddresses в соответствии с данной новостью.
  4. Strategy.TotalWorkingTime расчитывается сразу, а не после остановки стратегии.
  5. Verifier теперь проверят и настройки DDE.

суббота, 6 ноября 2010 г.

Stock# 2.5.1

Обновление предыдущего резиза до версии 2.5.1. Исправил ошибки, о которых писали на форуме, плюс те, которые нашел сам. Параллельно добавил ряд новых фич, с которых и начну:

Нововведения:
  1. QuikTerminal теперь умеет работать с выключенным Quik-ом. Через свойство QuikTerminal.IsLaunched определяется, запущен ли процесс или пока еще нет.
  2. Добавил метод TraderHelper.Invert, который "переворачивает" направление заявки. Например, такой код:
    if (order.Direction == OrderDirections.Buy)
        return OrderDirections.Sell
    else
        return OrderDirections.Buy;
    теперь можно написать как
    return order.Direction.Invert();
  3. QuikTrader.ClientCode теперь имеет значение по умолчанию "S#", а не три икса.
  4. Добавил в отчеты вывод средневзвешенной цены заявки TraderHelper.GetAveragePrice.
  5. Отчеты теперь выводят информацию о стоп-заявках.
  6. ExcelStrategyReport выводит состояние заявки, и признал ее выполненности (снята, удовлетворена).
  7. Как верно заметил Alexander Strategy.TotalWorkingTime выводит неправильное значение. Вернее оно правильно, но означает реальное время обработки компьютером (= процессором). Я переделал это поведение, и теперь Strategy.TotalWorkingTime выводит  сумму временных отрезков между запуском и остановкой стратегии. А предыдущее вычисление теперь выводится в Strategy.TotalCPUTime.
  8. Добавил событие MarketDepth.QuoteOutOfDepth для нотификации робота о том, что необходимо расширить глубину стакана через свойство MarketDepth.MaxDepth.
  9. SmartTrader теперь обновляет Quote.Volume для Security.BestBid и Security.BestAsk, если по инструменту идет экспорт стакана. Напомню, сам SmartCOM транслирует почему-то не сами объемы для лучшего бида и оффера, а сумму объемов в стакане, что является, конечно, очень неудобным поведением.
  10. В классе QuikTerminal изменил название метода GetDdeSettingsResult на GetTableSettings.
  11. Измененный QuikTerminal.GetTableSettings теперь умеет проверять настройки стаканов, что автоматически расширило возможности Verifier.
Исправления:
  1. Strategy.NewMyTrade не вызывается, если информация о заявке пришла раньше, чем изменение стоп-заявки.
  2. StrategiesMonitorWindow. Не видно название выделенных стратегий.
  3. SharpZipLib отсутствует.
  4. Ошибка «Access is denied» для чужого Quik.
  5. Генерация отчётов (Excel) не сохраняет файл.
  6. Неправильное проскальзывание для заявки, кинутой глубоко в рынок.
  7. Неагрегированный стакан в SmartTrader приводит к ошибке.

пятница, 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 происходит ошибка.

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