пятница, 31 декабря 2010 г.

С наступающим 2011 годом!

Хочу всех поздравить с наступающим новым годов. Желаю в новом году успехов, как в личном плане, так и в работе.

Уходящий год привнес для S# уже много бенефитов (писал на дне рождении). В декабре увеличился поток пользователей, что я могу связать с конкурсом ЛЧИ 2010 (тысячи процентов за 3 месяца не дают спокойно уснуть ;-)  ).

В следующем году, а именно в самом начале, я планирую выпустить версию S# 3.0. Данный релиз будет содержать тестирование на истории (и не только, но подробности позднее). Во-первых, это даст возможность создавать роботы автономно, без использования специальных программ бэк тестинга. Во-вторых, с учетом шлюза для Плазы, это позволит автоматически получить преимущества даже перед теми участниками, которые вошли в TOP 20 нынешнего ЛЧИ. Серьезные аргументы для тех, кто еще не перешел на S#? ;-)


Еще раз всех поздравляю с наступающими праздниками и желаю удачи в новом году!

понедельник, 27 декабря 2010 г.

Plaza - совместная разработка

Публикую в блоге ссылку на свое сообщение на форуме http://stocksharp.com/forum/default.aspx?g=posts&t=514 для тех, кто еще не видел.

Вкратце, я предлагаю совместно сделать PlazaTrader (а-ля QuikTrader) для удобного и правильного создания роботов под Плазу. Тем, кому это требуется, меня поймут. На данный момент список участников составляет 14 человек. Если из них хотя бы 4 начнут кодировать, уже хорошо =) В этом году по понятным причинам уже не начнем, так что к середине января будем больше проговаривать и прописывать нюансы, чем реальное что-то делать. И да, если найдется желающий на роль координатора - будет просто супер.

Свежие головы и мускулистые пальцы - велкам!

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

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

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

вторник, 28 сентября 2010 г.

Форум Stock#

С утра сделал рассылку с приглашением всем участникам группы Stock# о появлении собственного форума. Форум доступен по адресу http://stocksharp.com/forum/ и ссылка на главной странице сайта ведет уже на данный адрес. Новым пользователям придется регистрироваться самостоятельно.

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

Отказаться от Google группы решил по ряду причин.

Во-первых, полное отсутствие какого-либо форматирования. Google группы созданы для переписки по email, поэтому там plain text. А для обсуждения программирования роботов нужно и форматирование кода, и текста, и оформление ссылок.

Во-вторых, нет никакой возможности к сообщениям добавлять картинки (например, скрины ошибок).

В-третьих, что для меня стало полной неожиданностью качество сервиса. Google Groups явно меньше стандарта 24x7. От такой громадной компании уж никак не ожидал такого.

В-четвертых, какие-то глюки с русскими кодировками. Это вообще ниже всякой критики.

В-пятых, пока писал это сообщений получил от Google предупреждение. Правильно делаю, что перехожу =)

Новый форум постарается все исправить и сделать лучше. Всем приятного пользования.

вторник, 21 сентября 2010 г.

Quik2Quant 1.0 beta release!

Полнофункциональный адаптер, обеспечивающий абсолютную интеграцию ИТС QUIK и последней версии передовой программы квантового анализа OpenQuant 2.9.7. Такая связка позволяет обеспечить полный комплекс решений на фондовом рынке, включая, но не ограничиваясь:
  • тестирование торговых стратегий на исторических данных;
  • реализацию любых в том числе самых изощренных торговых стратегий;
  • мгновенное получение любой необходимой информации из ИТС QUIK;
  • накопление и хранение информации о состоянии стаканов, котировок и сделок по множеству инструментов в режиме реального времени;
  • исполнение ваших стратегий в режиме реального времени;
  • отсутствие задержек в выставлении/снятии заявок;
  • контроль текущей позиции, изменения позиции, частичного исполнения, снятия заявки, качества исполнения;
  • … 
Интеграция OpenQuant и QUIK основана на событийной модели рынка и обеспечивает возможности быстрого создания и изменения торговых роботов, работу на любом таймфрейме и инструменте.
Решение, в настоящее время, не имеет аналогов на российском рынке и предоставляет неоспоримые преимущества создателям механических торговых систем высокого уровня.

Главное окно программы выглядит следующим образом:

В этом окне мы можем получить любую необходимую рыночую информацию из терминала QUIK. Однако самую большую ценность представляют иные возможности OpenQuant, которые делают его практически универсальным продуктом для создания роботов. Итак
1. График сделок по SRZ0 (1min) - встроенная стратегия SMA Crossover:

2. Ордера по стратегии и результаты их исполнения:

3. Контроль состояния счета в режиме он-лайн:

И это еще малая толика всех возможностей OpenQuant и QUIK. Более подробно с программой и предлагаемыми решениями можно ознакомиться тут & там
Посмотреть обучающее видео, чтобы узнать еще больше можно тут
Поинтересоваться как начать использовать продукт можно здесь.

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

S# исполнился один год

Неожиданно подкралась особенная для меня дата - 18 сентября. Ровно год назад стартовал проект под названием S#. Правда, тогда он еще не назывался таким звучным для .NET именем. Но отсчет предпочитаю вести именно с этой даты.

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

И так, S# уже год как гордо шагает по России. Уже год, но все же находятся трейдеры, которые уверяют - проект завтра умрет, и его страшно использовать. Другие уверяют наоборот - следующий релиз станет коммерческим, поэтому начинают изобретать свой велосипед. Господа, так куда мне двигаться? =)

Вопрос, конечно же, риторический. Потому что на него я знаю четкие ответы. Более того, уже сейчас есть параллельно нескольких проектов (увы, пока не в публике), которые в скором времени еще более подстегнут интерес перейти на S# как можно быстрее. Потому что S# - не на сегодня и не на завтра. Он на российском рынке надолго. И в каждой новой версией будет предлагать все больше и больше возможностей.

Как я недавно заметил на СтокПортале, роботоводы - это некий элитарный клуб трейдеров среди обычных частников. В него всех подряд с улицы не пускают. Система безопасности проста - сложность в построении роботов. Можешь написать робота - проходи. Не можешь - извини =)

И уважающий себя роботовод писал для себя собственное решение на базе какого-то API. И у него было преимущество перед тем трейдером, кто не мог себе позволить такое решение.

С появлением S# эта картина стала меняться. Начинающие роботоводы автоматически получают технологические преимущества, которых не было у их предшественников. Далее, кто решил остаться на своих решениях, с новой версией S# теряют свой первоначальный отрыв. И тот самый элитарный клуб становится доступным практически всем, кто прилагает усилия в разработке роботов.

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

понедельник, 13 сентября 2010 г.

Сравнение TOP5 API для роботов.

Наконец, выпустил новый релиз S#, и настало время для написания беллетристики. Я уже писал подобные заметки о том, для чего нужен робот, чем он может пригодится вообще. Теперь я решил написать о том, какой API лучше выбрать для робота. Заметьте, именно для тех, кто пишет (+ собрался писать) на API, а не использует ТА программы. О последних и так достаточно написано и без меня.

Я сознательно не пишу данный пост для тех, кто программирует на S#. А для тех, кто любит самостоятельно вникнуть в проблемы системного программирования (именно системного, потому что разбираться, скажем, с TRANS2QUIK.dll это вовсе не программирование робота, как многие думают =) ). Конечно, мне до сих пор не понятно, как людям не жаль своего времени, но я хочу поделиться и с ними своим опытом работы (пусть даже с готовым решением).

И так, сравнение будет производиться между следующими API:
  1. Quik API
  2. SmartCOM
  3. Alfa Direct
  4. Alor COM
  5. Plaza2
.... и по следующим категориям:
  1. Сложность освоения
  2. Полнота данных
  3. Поддержка
  4. Распространенность
  5. Уровень документации
  6. Стабильность и ошибки
Все нижеописанное - мое личное мнение, основанное на использовании всех этих продуктов. Подчеркиваю, я не являюсь сторонником какой-то одной из API, и старался сделать вывод независимым.

И так, сначала опишу вкратце основные черты каждой из API.
  1. Quik API. По определению - это trans2quik.dll. По факту, это еще и собственный DDE сервер. Все потому, что обратная связь через API практически отсутствует. Приходится делать ну очень много работы. Поддержка отвечает стабильно, по плану. Документация сносная.
  2. SmartCOM. Ребята стараются, делают, но пока все плохо. Плохо в плане стабильности. Документация лучше, чем у Квика, да и использование много проще. Но вот данных - просто не достаточно. Если писать робота, нужно использовать внешние источники. Поддержка - самая лучшая.
  3. Alfa Direct. Похож на SmartCOM, только работает значительно стабильнее. Но. Поддержка отсутствует вообще как таковая. Я бы сказал, на любителей.
  4. Alor COM. Разобраться очень сложно. Пожалуй, сложнее только Plaza2. Документация нормальная (при таком запутанном API это большой плюс). Поддержка еле живая. Летом ее не было вообще.
  5. Plaza2. Такое же запутанное API как у Alor, только еще плюс к тому, что через данный API нужно посылать еще и специальные сообщения. Количество параметров компилятором не ограничивается, поэтому получается некий квест с разбором документаций (а их читать надо сразу как минимум две). Думаю, если нет хотя бы пару лет в программировании, можно даже в эту сторону не смотреть. Поддержка хорошая.

Получившаяся итоговая таблица (отмечал как с школе советских времен - от 1 до 5):

Quik SmartCOM Alfa Direct Alor COM Plaza2
Сложность освоения45321
Полнота данных51445
Поддержка45124
Распространенность53221
Уровень документации35432
Стабильность и ошибки41335
Итог2520171618

Я не удивлен полученным двум лидерам. Они вечно дышат друг другу в спину. Но и какого-то явного отрыва от других API не видно. Рынок постоянно будет модернизироваться, брокера предлагать все больше своих услуг, и все эти цифры будут стремиться к одному общему числу.

Вместо заключения хочу отметить, что в этой таблице все-таки нужно смотреть не на итоговые значение, а как конкретные цифры. Скажем, Alfa победила Alor. Но, если вы новичок, то из-за пункта "поддержка" вам путь заказан. Или другой вариант. Вы, наоборот, профи. Тогда при всей своей усредненности можно попробовать и Plaza2. Или, если взять мой жизненный пример, я не смог написать один из своих роботов на SmartCOM, потому что по нему невозможно было получить необходимые данные по опционным контрактам.

Дерзайте!

пятница, 3 сентября 2010 г.

Stock# 2.4

Вышла внеочередная версия S#. Внеочередная, потому, что перескочили 2.3, и в новость выходит 2.4. Получилось это в следствии непрерывных фидбеков и баг реквестов, за что отдельное спасибо Alexander и Tauler. Не успела зарелизиться версия 2.3, как поступили дополнительный запросы, и пришлось переделывать сразу на 2.4.

Очень хорошо, что поступает такое количество отзывов. Потому как это сильно помогает улучшать S#, делая его и быстрее и стабильнее. Тем более, что основная черта S# от тех технологий, что он оборачивает в себя (напомню, это и Trans2Quik.api и DDE и SmartCOM), это быстрая реакция. Согласитесь, на рынке ПО для трейдинга не так много подобных библиотек для роботов, которые развиваются такими же темпами, как S#.

Но у быстрого развития есть и обратная медаль - это ошибки, которые могут возникнуть (и возникают) при разработке. Поэтому, этот релиз посвящен именно стабильности S#, а не функциональному расширению. Все как в трейдинге, есть импульс, и есть коррекция. Сегодня у нас коррекция.

Поэтому, традиционный список изменений начинается именно с устраненных ошибок.
  1. Улучшена производительность StrategyLogger (который теперь называется FileStrategyLogger) и исправлена ошибка с параллельной записью в файл разными стратегиями.
    Огромная благодарность Иванову Андрею, который далее в топике расписал все особенности работы с файлами. Можно смело утверждать, что в S# завелся профи. Жаль, появляется только по ночам =).
  2. Переделан экспорт портфелей. Теперь информация о счетах берется не из таблиц с позициями, а напрямую из Quik в разделе управление счетами. Это предотвратило ошибку, когда при отсутствии позиций не экспортировалась информация по портфелям.
  3. Исправлена ошибка с необновлением нетокорых параметров Security. Теперь Security обновляется всегда.
  4. Исправлена ошибка при регистрации заявки через MultiTrader
  5. Исправлена ошибка в методе Strategy.CancelActiveOrders.
  6. Исправлена ошибка в определении времени задержки заявки (TraderHelper.GetLatency).
  7.  Исправлена ошибка в получении времени биржи через Quik при отсутствии соединения.
  8. Исправлена ошибка, когда исполненная заявка на время возврашалась в активное состояние.
  9. Исправлена ошибка в обработке стратегий, превыщающее количество потоков в StrategyManager.
  10. Исправлена ошибка, когда для исполненной заявки менялся баланс. Кстати, очень интересная ошибка, потому как она тянется своими корнями к некорректной передаче данных Quik. Когда он извещает о том, что заявка исполнена, но в то же самое время баланс отличен от 0. Поэтому, в QuikTrader была введена специальная проверка такой ситуации.
  11. Исправлена ошибка в дублировании тиков, получаемых через MultiTrader.Trades.
  12. Исправлена ошибка в ExcelStrategyReport при генерации отчета под Office 2010 (сейчас генерация файлов происходит без использования Excel API).

И, конечно же, есть и нововведения, которые привели к отдельной версии, а не фиксу 2.3.
  1. S# и его примеры переведены на VS 2010. Пока не осуществлен переход на .NET 4.0 по причине не совсем стабильной работы SmartCOM под этой новой версий .NET. Но использовать новое все равно необходимо. Да и скачивать бесплатную среду разработки VS 2008 Express теперь стало проблематичнее. Везде предлагают VS 2010 Exress.
  2. Удалено свойство Order.Account. Все, теперь оно в прошлом. И необходимо использовать Order.Portfolio.
  3. В QuikTrader реализованы методы RegisterTrades и UnRegisterTrades. Эти методы служат для фильтрации потока тиков по инструментам. Проблема в том, что Quik не дает программно управлять этим потоком. Поэтому, данные методы напрямую в Quik-е меняют фильтр инструментов. Сама по себе операция смены инструмента очень тяжелая, и Quik "просыпается" не быстро. Так что, настоятельно рекомендуется менять фильтр перед запуском торговых стратегий. Дополнительно, данные методы по-умолчанию не работают (ничего не делают). Чтобы они начали функционировать, необходимо включить флаг QuikTrader.EnableFiltering. Это специальная защита для тех ситуаций, если кто-то уже в своем роботе вызывал данные методы (например, сделал вызов и забыл про него).
  4. Добавлен метод TraderHelper.GetAveragePrice для вычисления средневзвешанной цены исполнения заявки как просили здесь.
  5. Как уже упомянуто выше, StrategyLogger стал базовым абстрактным классом, и вся его логика работы с текстовым файлом перенесена в FileStrategyLogger. По умомчанию, класс создает синхронизированный текстовый поток TextWriter. Если его скорости будет недостаточно, можно передавать не синхронизированный поток через конструктор FileStrategyLogger(TextWriter). Но это чревато ошибками вида.
  6. Добавлен GuiStrategyLogger, который записывает сообщения от стратегии в специальный класс LogWindow. Может работать в двух режимах: писать все сообщения в одно окно или создавать на каждую стратегию по отдельному LogWindow. Подробнее, в обновленной документации по логированию.
  7. Метод Strategy.Process сделан невидимым из вне, чтобы не было желания его вызвать.
  8. Убран у многих методов TraderHelper аргумент ITrader. Теперь передаваемых параметров стало меньше, и, значит, удобнее использовать.
  9. Метод StrategyLogger.WriteMessage сделан виртуальным, чтобы его можно было перегружать своей реализацией. Например, сейчас в файл не пишется информация о типе сообщения (StrategyErrorStates). Если вдруг кому-нибудь это потребуется, всегда будет возможность это сделать.
  10. Добавлен виртуальный метод StrategyReport.FormatTime для переопределения формата времени в отчетах.
  11. Добавлен адрес демо сервера SmartCOM - SmartAddresses.Demo.
  12. Для предыдущего пункта добавлен специальный визуальный контрол SmartAddressComboBox для выбора сервера. Он уже используется в примерах. Вот как выглядит теперь SmartSample:
  13. SmartTrader.RegisterPortfolio теперь вызывается автоматически при появлении в системе портфеля.
  14. Добавлена дополнительная проверка на Security.MinStepSize в метод TraderHelper.ShrinkPrice, чтобы предотвратить ситуацию, аналогичную этой.
  15. Добавлен метод QuikTrader.Initialize, который инициализирует соединение с окном Quik, чтобы позволить работать с экспорт DDE без подключения к серверу торгов. Такое соединение позволяет манипулировать Quik-ом, запуская, к примеру, экспорт DDE.
  16. Переделан метод QuikTrader.ReRegisterOrder, чтобы стало возможным перерегистрировать заявки на ММВБ через снятие и новую регистрацию.
  17. Переделано событие ITrader.QuotesChanged, чтобы он передавал коллекцию стаканов. Для аналогии с другими событиями, а так же для будущих систем, передающие потоком данные сразу по нескольким стаканам.
  18. Добавлены два события MarketDepth.UpdatingStarted и MarketDepth.UpdatingFinished для определения, когда стакан начал обновляться, и когда закончил. Имеет смысл использовать в работе с SmartTrader, так как там стакан обновляется построчно.  
Вот так, исправлена дюжина ошибок и 18 нововведений.

четверг, 29 июля 2010 г.

Stock# 2.2.1

Вышло обновление версии 2.2 до 2.2.1. В него вошли критические исправления работы стратегий, об ошибках которых писалось в группе после выхода 2.2.

В 2.2 было исправлено достаточно много в алгоритмическом части S#. Из-за этого могли случиться ошибки, и они случились. Хорошая новость, в 2.3 будут изменения в ширь, так что такого сложного перехода как на 2.2 ожидаться не должно.

Качаем, проверяем, сообщаем.

вторник, 27 июля 2010 г.

Standart vs Plaza II

Честно признаюсь не знаю как называется подключение которое использовалось ранее, поэтому обозвал просто -  Standart.
Два видео ниже сняты с интервалом в одну минуту. В первом случае квик подключался через обычный сервер брокера, во втором через Плазу. Разница, как говорится, видна невооруженным глазом.
Standart

Plaza II

понедельник, 26 июля 2010 г.

Stock# 2.2

Не успел пройти и месяц с предыдущего релиза, как выходит новый. На этот раз основные изменения коснулись очень интересной части S# - алгоритмы, стратегии и все, что с ними связано. Традиционный список фич я решил сгруппировать по областям для упрощения их запоминания.


Стратегии:

  1. Добавил событийную модель для стратегий. Уж больно часто начал возникать вопрос на форумах, как не проверять по интервалу определенные значения в теле стратегии, а подписаться на события изменений. В добавок в моих проектах я осознал, что такая модель предоставила бы сокращения кода и сделала бы его понятнее... Вообщем, прошу всех встречать - ActionStrategy. Подробнее в документации.
  2. Добавил тейк-профит и стоп-лосс стратегии. Фактически, кросс-платформенные стоп заявки, не зависящие от торгового терминала. Плюс, в стоп-лосс добавил опцию слежения. Что характерно, все эти вещи я сделал на базе котирования, что еще раз доказывает мощный потенциал подобной стратегии (жаль, судя по форуму, никто не пошел дальше ее простой функции - выставить по рынку). Подробнее в документации.
  3. Переделал документацию в разделе Торговые алгоритмы. Очень много поменялось, читайте.
  4. Дочерние стратегии сделал параллельными (при указании опции IsParallel). Также, добавил BatchStrategy, которая указывает критерий завершения стратегий. Подробнее в документации.
  5. Новая концепция - конструктор у стратегий должен быть без параметров. Две причины. Первая, когда создается дочерняя стратегия выглядит несколько странно указывать у нее инструмент и порфтель. Они в любом случае должны быть как у родительской стратегии. Вторая причина. Я добавил в StrategyManager методы Load и Save, которые теперь умеют сохранять и восстанавливать стратегии из xml файла. А восстанавливать из файла можно только стратегии без параметров в конструкторе.
  6. StrategyManager теперь в конструкторе принимает ITrader, отслеживая его события соединения и потери связи (ошибочно или планово). В случае потери связи StrategyManager больше не вызывает Strategy.OnProcess до тех пор, пока не придет событие ITrader.Connected.
  7. В Strategy.ReRegisterOrder добавил параметр getNewVolume для логического единообразия с getNewPrice.
  8. Добавил методы Strategy.CancelActiveOrders и Strategy.ClosePosition. Использовать рекомендуется в случаях остановки стратегии.
  9. Котирование теперь учитывает значение Strategy.Volume. Так что, теперь можно котировать большие объемы, не боясь "собрать" стакан.
  10. Появилось свойство QuotingStrategy.MaxReRegisterCount, которое ограничивает котирование на максимальное количество изменений заявки. Если он превышен, то стратегия останавливается.
  11. Strategy теперь поддерживает стоп-заявки.
  12. У Strategy появились новые события: NewStopOrder, OrderChanged, StopOrderChanged,
    OrderFailed, StopOrderFailed. Из-за появления данных событий я скрыл от использования многие виртуальные методы.
  13. Все свойства дочерних стратегий котирования сделал доступных для записи, как просили здесь.

Свечки:

  1. Добавил событие CandleManager.CandlesFinished, которое однозначно означает конец формирования свечки. Не нужно больше шаманить в коде и дожидаться самому окончанию свечек.
  2. Ввел понятие CandleFactory. Во-первых, теперь все стандартные свечки реализуют подобную фабрику. Во-вторых, появилось понятие "нестандартная" свечка. Тоесть, если понадобилась какая-то своя реализация (например, кресты-нули или кластер), то можно реализовать свой CandleFactory, и начать получать свои типы свечек.
  3. Для свечек добавил методы распознования паттернов: цвет, надгробье, стрекоза, молот и многое другое.
  4. Добавил TraderHelper.GetCandleTime для получения времени текущей TimeFrameCandle.

SmartCOM:

  1. SmartTrader , наконец-то, подружил с ReConnectionManager. Фу, насколько же не стабилен этот SmartCOM! Постоянно приходится вставлять экзотический код. Хорошо, что в SmartTrader, чтобы не портил красоту кода в роботе.
  2. Из-за предыдущего пункта добавил ReConnectionManager.IsReStartExport. Потому как в случае с переподключением к SmartCOM экспорт так же необходимо запускать.
  3. Добавил SmartTrader.RegisterRealTimeCandles. Отличается от SmartTrader.RegisterCandles тем, что возвращает не только исторические свечки, но и real-time свечки. И причем последние приходят постоянно по окончанию тайм-фрейма (тоесть, нет необходимости обращатся за ними на сервер из кода робота). Подробнее.

Quik:
  1. Изменил Verifier так, что он теперь может проверять правильность настроек таблиц в зависимости от торговой площадки, с которой идет работа. Поддерживаются РТС, ММВБ и ММВБ Срочный рынок.
  2. Для QuikTrader реализовал возможность перезапуска только активных DDE потоков. Например, когда в программе экспортируются все таблицы + дополнительно несколько стаканов. QuikTrader.ReStartExport сможет отследить экспорт для запущенных стаканов, и перезапустит их на равне со стандартными таблицами. Такое поведение справедливо и для ситуации, когда экспорт запущен только по нескольким таблицам (например, по таблице инструментов и заявок). Перезапуск экспорта запустит только эти несколько таблиц, не трогая другие (стоп заявки, сделки и т.д.).
  3. Появилась возможность посмотреть строку транзакции по ее номеру или по самой заявке. Это удобно для отладки, когда нужно посмотреть, какая транзакция был ассоциирована с заявкой, и детально углубиться в решение проблемы.
Общее:
  1. 1. Добавил новое состояние для заявок - Failed. Заявка переходит в этой состояние, когда произошла какая-то ошибка при ее регистрации (в роботе, в шлюзе или не приняла биржа). Собственно, это как раз те заявки, которые приходят в событиях OrdersFailed и StopOrdersFailed. Подробнее, о состояниях заявок.
  2. Order.Account объявлен как устаревшим. Он все еще используется для обратной совместимости, но надо уже переходить на Order.Portfolio. Причина отмены Account банальна - не объектно-ориентированно. Как следствие, можно засунуть в счет все, что угодно.
  3. Из-за предыдущего пункта изменился и ITrader.CancelOrders, который раньше принимал номер счета.
  4. Из-за устаревания Account были переименованы и переделаны следующие менеджеры:

  5. Добавил новый менеджер PositionPnLManager
  6. Переименовал свойства у базовых классов менеджеров в интуитивно понятные (нет больше Value или TotalValue, есть PnL и Position). Учтите при компилировании проектов.
  7. Добавил методы ITrader.GetOrders(Portfolio) и ITrader.GetMyTrades(Portfolio).
  8. TraderHelper.IsTradeTime теперь учитывает и дни недели. В субботу и воскресенье выдает, что время вне торгового диапазона.
  9. Добавил TraderHelper.GetPosition(ITrader trader, Portfolio portfolio), который возврашает целое число, означающее позицию по всему портфелю.
  10. Убрал QuikTrader.IsFullDdeExport. Теперь таблицы с позициями обязательны всегда (фактически, предыдущее введение этого свойства было сделано специально для облегчения миграции).
  11. Добавил TraderHelper.GetRealizedVolume для получения реализованного объема по заявке.
  12. Переименовал SyncTrader и SyncCandleManager в GuiTrader и GuiCandleManager.
  13. Удалил класс TraderManager. Даже не знаю, зачем его вообще вводил.
  14. Обсуждения несостоявшейся баги привело к тому, что я исправил IncrementTransactionIdGenerator (CurrentTransactionId по умолчанию равно количеству миллисекунд с начала дня) и MillisecondTransactionIdGenerator (разница в миллисекундах теперь учитывается не с начала дня, а с момента создания генератора).
  15. Как просили здесь добавил генерацию события при изменении ExntensionInfo (для всех сущностей, а не только для Security, о чем там говорилось).

Баги:

  1. MarketQuotingStrategy не передает управление?
  2. Стоп заявки, Срок 'До отмены', тип DateTime

Продведем итог. 13 + 4 + 3 + 3 + 15 = 38 новых фич. Рекорд.

воскресенье, 25 июля 2010 г.

Марафон трейдера Дмитрия Барановского

Прочитал заметку создателя портала 2stocks.ru (бывший stockportal.ru) Барановский Дмитрий.

Заметка интересная, хотя жизненные истории таких людей всегда интересно читать. Некоторые моменты, конечно, не совсем правильны на мой взгляд. Но, что самое для меня главное было написано - это заключение. Дмитрий решил податься в роботоводы. Из заметки это видится как внезапное решение. И, я думаю, это не совсем так. Все же был какой-то длинный путь, чтобы точно прийти к моменту создания робота. Например, советники, индикаторы и т.д. Потому что, если решение было молниеносно... Чтож, я уже писал достаточно про негативные стороны торговых роботов. А пока можно только поздравить с правильным, на мой взгляд, решением трейдера такого уровня.

понедельник, 12 июля 2010 г.

Язык программирования для роботов

Прислали мне ссылки - http://www.quik.ru/forum/expert/57093/57093/ и http://quik.ru/forum/expert/57323/57323/. Прочитал, местами было интересно.

Я уже писал до этого о целесообразности в роботах вообще.
Теперь напишу, какой язык бы я выбрал вообще.

Понятно, что для себя я этот вопрос решил давно. Но для тех, кто только начинает разработку роботов, могу дать совет:

  1. Если давно используете какую-то систему Тех Анализа, то продолжайте писать на том языке, что там присутствует.
  2. Если решили написать робота в виде отдельной программы, выбирайте тот, что популярнее для алго трейдинга. А понять, какой именно язык самый-самый на российском рынке очень просто - по поддержке от вендоров. Возьмем китов: Quik, ИТ Инвест, Алор, Альфа Директ и NetInvestor:

    • Quik - для TRANS2QUIK.dll имеет два примера: один на C#, другой на C++.
    • ИТ Инвест - для SmartCOM имеет один пример на C#, документация так же написана с применением этого языка.
    • Алор - для Алор Трейд с COM объектами имеет один пример на C++, другой на C#.
    • Альфа Директ - для API имеет один пример на C#, один на Dephi, один на C++. Документация на C++, C#, VB, Delphi.
    • NetInvestor - для NIAPI имеет два примера: один на C#, другой на C++. Руководство пользователя - на C#.

    Итого (один бал за документацию, один за пример):

    • C# - 8 = 1 + 2 + 1 + 2 + 2
    • C++ - 5 = 1 + 1 + 2 + 1
    • Dephi - 2 = 2
    • VB - 1


Теперь о быстроте C++, которая была упомянута в тех ссылках. Как правильно заметили в той переписке, быстрота необходима для High Frequency Trading. Ни один из выше приведенных вендоров не дает такую пропускную способность, которые бы удовлетворяла подобному типу роботостроения. Дополнительно, это масштаб крупных игроков, которые могут позволить не только прямой доступ к бирже, но так же хостинг своих серверов на биржевых площадках. Для частников, в скорости С++ не даст никаких преимуществ. Минусов, особенной не для программистов (а трейдеры не занимаются программирование углубленно), очень много. И сложность языка, и чувствительность к ошибкам, и сложность в отладке и поиске ошибок... Море. Я писал на этом языке. Ничуть не огорчен, что ушел от разработки на С++. А как показывает тенденция софтверных гигантов, от C++ отказываются все больше и больше компаний.

К чему ведет популярность? Популярность ведет к тому, что данный язык становиться основным для разработки, под него увеличивается комьюнити, появляются решения сторонних разработчиков... Вообщем, бенефитов много.

А теперь вопрос, как же на западе? А на западе все давно решено: WealthLab, QuantDevelop, OpenQuant, RightEdge - все они поддерживают C#.

Остались вопросы с тем, какой язык необходимо выбирать?

вторник, 6 июля 2010 г.

Вольные разработчики

На форумах ИТ Инвест, где недавно поменялся движок, я получил статус Вольного Разработчика - http://www.itinvest.ru/forum/index.php?showuser=37693. Приятно видеть отметку. Но если задуматься о смысле, то получается следущее: Волен - хочу - делаю новую версию, не хочу - не делаю. А это не так. Сейчас уже ощущается некое бремя ответственности, которое не позволяет расслабиться.

Кстати, насчет нового движка форума. Первое впечатление не очень, уж больно все блекло и глаза напрягаются. Но прогресс на лицо, и это не может не радовать. Ребятам надо развивать веб сервисы. Это очень модно и повышает автоматизацию бизнес процессов.

понедельник, 5 июля 2010 г.

Stock# 2.1

И так, вышла новая версия - Stock# 2.1. Это не просто фикс предыдущей версии 2.0.1, а значительное расширение функциональности, как можно судить по списку ниже. Но обо все по-порядку.

Фичи:
  1. Я решил полностью пересмотреть подход с экспортом произвольных таблиц. В ранних версиях принцип работы строился на использовании события ProcessWellKnownDdeData, через которое в программу поступали массивы данных, представляющие собой строчки таблиц. Теперь, через специальное преобразование данных QuikTrader сам отдает готовые бизнес объекты. Вся магия заключается в методе QuikTrader.AddCustomTableMapping и событие QuikTrader.ProcessCustomTable. Подробнее в документации. В качестве демонстрации приведу два куска кода. Сверху новый подход, снизу старый. Решение задачи одно и тоже - экспорт портфеля:


    this.Trader.AddCustomTableMapping(typeof(CustomPortfolio));
    
    this.Trader.ProcessCustomTables += (type, objects) =>
    {
      // нас интересует только CustomPortfolio
      if (type == typeof(CustomPortfolio))
        _portfolioWindow.Portfolios.AddRange(objects.Cast());
    };
    
    
    this.Trader.ProcessUnknownDdeData += (name, rows) =>
    {
      // узнаем, что пришедшие данные отвечают за портфель
      if (string.Compare(name, "portfolio", true) == 0)
      {
        foreach (var row in rows)
        {
          var client = (string)row[0];
          var portfolio = _portfolioWindow.Portfolios.FirstOrDefault(p => p.Client == client);
    
          if (portfolio == null)
          {
            portfolio = new Portfolio { Client = client };
            _portfolioWindow.Portfolios.Add(portfolio);
          }
    
          portfolio.Shorts = (double)row[1];
          portfolio.Longs = (double)row[2];
          portfolio.Collateral = (double)row[3];
          portfolio.Margin = (double)row[4];
          portfolio.Money = (double)row[5];
          portfolio.PnL = (double)row[6];
        }
      }
    }
    


    Результат, как говорится, не лицо.

  2. Переделал и ProcessWellKnownDdeDataa. Теперь вообще не нужно использовать данное событие. Достаточно лишь расширить таблицу в Quik и задать необходимые колонки в коде. Все будет экспортироваться само. Подробное описание.

  3. По следам этого топика переделал процесс обработки данных. Теперь, если на какой-то строчке таблицы происходит затык (например, как часто это бывает, появился инструмент, у которого отсутствует что-то необходимое), то это не приводит к остановке всего экспорта. Вместо этого такая строчка просто пропускается, а ошибка выводится через ProcessDataError.

  4. Для предыдущего пункта добавил DdeSecurityColumns.LastTradeVolume2.

  5. Внимание! Колонка DdeSecurityColumns.LastChangeTime по умолчанию выключена для экспорта. Это важное изменения я сделал из-за двух причин. Первая, не все торгую на нескольких рынках одновременно. Вторая, из-за пункта 4 (для единообразия, если кто-то торгует на нескольких рынках, то он должен включать для себя необходимые колонки). Так что, теперь колонка с временем последней сделки только одна (по-умолчанию).

  6. В дистрибутиве теперь идут три файла настроек Quik: info_rts.wnd, info_micex.wnd и info_rts_micex.wnd (совмещает первое и второе). Названия говорят сами за себя. Подробнее, об этом я написал в переделанной документации.

  7. Теперь QuikTrader умеет экспортировать позиции (Position). Ранее это был внутренний класс для SmartTrader. Теперь и для Quik. Соответственно, добавил и функционал для работы с позициями - ITrader.Positions, ITrader.NewPositions и Trader.PositionsChanged. Подробнее, как включать экспорт по позициям, описал в документации.

  8. Делая предыдущий пункт, я дополнительно реализовал экспорт портфелей и для QuikTrader. Сам по себе экспорт данных не идет (для этого все также нужно делать экспорт самостоятельно, как я показал в примере SampleDdeCustomTable), но сама сущность с номером счета создается и выводится через ITrader.NewPortfolios.

  9. Для Position и для Portfolio создал методы расчета PnL TraderHelper.GetPnL.

  10. Дополнительно, для удобства получения позиций добавил возможность получать их по инструменту или портфелю через метод ITrader.GetPositions.

  11. Убрал событие MarketDepth.Changed и заменил его двумя: MarketDepth.QuotesChanged, которое показывает, какие именно котировки внутри стакана изменились, и MarketDepth.DepthChanged, которое говорит об изменении глубины стакана.

  12. Добавил возможность сохранять и загружать настройки таблиц через методы DdeTable.Save и DdeTable.Load. Это удобно в тех случаях, если программа распространяется среди пользователей.

  13. Внедрил код получения времени сервера как написали здесь. В принципе, теперь необходимость для QuikTrader в MarketTimeOffset отпала. Спасибо HaMMeR-у!

  14. Сделал возможность менять у уже созданного QuikTrader путь к Quik - QuikTrader.Path. Аналогично сделал и для SmartTrader с Address, Login и Password. Одно но. Перед изменениями необходимо сделать Disconnect(если было произведено соединение). Иначе, будет выбрасываться исключение.

  15. Добавил интерфейс IExtendableEntity, в которое есть только одной свойство ExtensionInfo. Сделал это для удобства работы в написании универсального кода, который работает с любой торговой сущностью.

  16. Для SmartTrader добавил специальное перечисление - Extensions. Это ключ, по которому можно получить специфичную для SmartCOM данные из ExtensionInfo.

  17. Опять по DDE. Теперь название категорий (в Quik это называется Рабочая книга) указывается такое же, как и DdeTable.Caption.

  18. Наконец-то доделал обещанное - сделал котирование по асинхронному режиму QuikTrader.IsAsyncMode (http://stockmarketdotnet.blogspot.com/2010/03/stock-18.html пункт 1). Автоматически, эта вещь заработала и для SmartTrader, потому что он умеет работать только в асинхронном режиме. Ура!

  19. Убрал метод Strategy.AddOrder и изменил логику регистрации заявок из стратегий. Теперь регистрировать заявки необходимо через метод Strategy.RegisterOrder, который автоматически после успешного принятия заявки биржей добавляет ее в стратегию. Собственно, в такому случае Strategy.AddOrder стал рудиментом, что и привело к его исчезновению. Замену заявок так же нужно производить через новый метод Strategy.ReRegisterOrder. Собственно, новое котирование как раз и основанно на этих новых методах.

  20. TraderHelper.ReRegisterOrder теперь исчез - перекочевал в Strategy.ReRegisterOrder.

  21. Сделал возможность работать с Currency как с обычными числами. Тоесть, можно складывать, вычитать, умножать и делить.

  22. Добавил в Order поле Portfolio. Пока это как опциональное поле. Но в дальнейшем планирую его сделать обязательным к заполнению, которое заменит собой поле Account (и, надеюсь, строковое представление счета исчезнет навсегда из S#).

  23. В документации добавил страницу с примерами. Показывает, какие вообще есть примеры, и что они делают (цель их обучения).

  24. Специально запрятал в самый конец, чтобы меньше сил на протесты осталось =). Переделал состояние заявок. Понятно, что изменение значительное (пожалуй, самое часто использующееся свойство). Но прогресс должен быть, и рудименты должны исправляться. Иначе библиотека зарастет архаизмами... Есть только три свойства - None, Active и Done. Все. Именно они однозначно говорят о состоянии заявки, жива или нет. Если нужно узнать, исполнена или отклонена, то пункт 25.

  25. Для отслеживания того, полностью ли исполнена заявка, или частично, или вообще не исполнена надо вызывать методы TraderHelper.IsMatched, TraderHelper.IsFilledPartially и TraderHelper.IsFilledEmpty соответственно. Если нужно узнать, отменена ли была заявка, то нужно вызывать метод TraderHelper.IsCanceled. С учетом пункта 24 у нас вместо прежних 4-ех состояний (напомню, было None, Active, Matched и Cancelled) теперь есть комбинации. Намного информативнее.


И, конечно же, фиксы:

  1. DDE экспорт не запускается, если открыта другая закладка с развернутым графиком во весь экран.

  2. Исправил старую "добрую" ошибку с запуском экспорта. Иногда он не запускался с первого раза. Причина - окно с запуском DDE в Quik не всегда быстро появляется. Теперь гарантированно дожидается появление данного окна. Экспорт стартует чуть дольше, зато гарантированно работает.

  3. Пофиксил в MarketDepth неправильный порядок вывода котировок.

  4. Исправил ошибку с отсутствием регистрации новой заявки в котировании.

  5. В том же топике, что и в пункте 4 была проблема с буферизацией вывода логов через StrategyLogger. Буферизацию убрал - теперь все выводится сразу.

  6. Снятие группу заявок в асинронном режиме не всегда работает.


Итого, 25 нововведений и 6 фиксов. Неплохо, неплохо.