Алексей Ван <o-s-a.net>
Алексей Ван <o-s-a.net> личный блог
18 августа 2014, 18:47

Обзор подключения к торгам через Api SmartCom и Quik

    Ты программист и выбираешь Api для подключения к бирже!? Это статья для тебя… В ней я опишу свой скромный опыт написания ботов с подключением через SmartCom  и Quik. Опишу проблемы, которые возникают при подключении, и попробую сформулировать своё отношение к одному и второму способу.
Обзор подключения к торгам через Api SmartCom и Quik
    Господа. Я работаю по старинке и пишу свои приводы, не пользуясь универсальными Api  вроде StockSharp или TsLab. Поэтому любителям этих ваших модных Платных_Закрытых_Библиотеко_Каракасов просьба идти мимо. И мне это не предлагать!
     Поскольку статья получилась довольно ядовитая, сначала опишу хорошие стороны одного и второго
Api.
    Хорошо 

     Главная положительная черта QuikApi  это надёжность. Единожды настроенное подключение TRANS2QUIK.dll не отсохнет и не повиснет. С DDEнемного сложнее, но если правильно принимать и обрабатывать потоки, соединение также стабильно.
    SmartCom хорош в плане простого и понятного интерфейса, человеко — ориентированностью, а также высокой скоростью выставления заявок (но тут всё не просто).
    QuikApi
 
    Собственно к Quik нет полноценного Api  для подключения. Т.е. не существует волшебной (открытой и бесплатной) штуки, подключив которую к своему проекту, можно было бы выкачивать из Quik данные и тут же отправлять через неё заявки.
    Вместо этого есть следующая связка :
Обзор подключения к торгам через Api SmartCom и Quik
 
 
Рис.1. DDE + TRANS2QUIK.dll + Qple + over9000Table = Quik Api
 
    Т.е. чтобы начать отдавать комисс со скоростью несколько раз в секунду потребуется:
  1. Поднять в своей программе DDE сервер
  2. Разобраться со встроенным в Quik языком Qple, чтобы можно было создавать (ну или хотя бы редактировать) скрипты по конвертации свечных массивов в таблицы.
  3. Скрупулёзно, со слезами, создать эти 5 — 10 таблиц, данные из которых  понадобятся твоему роботу. Вывести их и принять у себя в роботе.
  4. Прикрутить TRANS2QUIK.dll к своему проекту, и научиться подавать заявки, через этот мерзкопакостный интефейс.
 
    Quik не удобен и на его изучение и реализацию придётся потратить очень много времени. На сайте разработчиков отсутствуют живые, и простые примеры с открытым кодом на которых начинающие программисты могли бы писать своих роботов. Библиотека TRANS2QUIK морально устарела лет 10 назад и хромает описание. Поддержка отсутствует. Всё сводиться к «Мы записали вашу просьбу» и «Смотрите мануал».
 
    Отсутствуют некоторые типы ордеров. Стоп-рынок например. Если сработал стоп, зачем парится с лимитками? Всё плохо и надо крыть по любой цене. Счас напишут что надо связными заявками пользоваться. Хорошо. Только нахрена эти сложности? Там и так чтобы первую заявку отправить неделю надо колдовать.
 
    Ещё год назад в ARQA на сайте и демо доступ не выдавали. Похоже договорились через откаты  каким-то чудом со всеми брокерами России и думают что развиваться в сторону конечного потребителя (трейдера) вообще не нужно. Что ощущается во всём. 
    Кроме того Quikне очень технологичен и уступает в скорости вообще всем... 
 
 
SmartCom 3.0
   
     1. У них есть инструкция! Красочная и понятная. Никакой неопределённости и плясок с бубнами*. Берём библиотеку, цепляем к проекту и всё*! Подключение* готово*!
 
    2.     У них на сайте есть живой пример! Т.е. небольшая программа на C#, в которой доступно показано как пользоваться теми или иными штуками из библиотеки. Для начинающего программиста это вообще мечта, попробовать просто пришить свою логику к готовому приводу. И судя по обсуждениям на форуме продукта, многие так и делают.
 
    Конечно же, после своих не простых отношений с Quik, я был очень доволен SmartCom, когда начал с ним знакомство. Идея хороша, как и попытка её преподнести. Вот как это должно было выглядеть:
 Обзор подключения к торгам через Api SmartCom и Quik
 
Рис.2. Простой ApiSmartCom
 
    1. Очень быстро выяснилось что занимать потоки приходящие с сервера больше чем на несколько секунд нельзя, т.к. это вызывает падение местного сервера
    2. Потоки уходящие с запросами могут вообще не возвратиться и в дальнейшем при попытке их вызвать всё опять падает
 
     Ну и ладно, выходим из положения:
 
 Обзор подключения к торгам через Api SmartCom и Quik
Рис.3. ApiSmartCom
 
    3. Далее просто пошли не контролируемые потери связи. Читаем на форумах. Ни с того, ни с сего, сервер может потеряться от 2 до 10 раз в день. Пишут что это плата за скорость… Хорошо.
    4. Далее выясняем… Не после всех потерей соединений можно восстановить связь с сервером. Нужно делать возможность полностью перегрузить Локальный сервер, переподписать все события и проч...
    Делаем поток, следящий за соединением, ничего особенного:
Обзор подключения к торгам через Api SmartCom и Quik
 
Рис.4. Пример простейшей схемы в DiagramDesigner
далее...
5.     Заявки могут испаряться при передаче их серверу вообще без обратной связи. При этом сервер может, как уже быть мёртвым в этот момент, так и в обычном состояние при смерти. Надо делать потоки Эскорты каждой заявке, которые будут следить через определённое время, что произошло, дошла ли заявка, пришёл ли какой либо отклик или нет, что с потоком, который нёс заявку.
6.    Сервер, не смотря на то, что пишет, что есть Connectможет уже умереть в это время и любое действие вызывает исключение. Включая AccessViolationException. Поэтому надо каждый вызов сервера делать левым потоком, с возможностью при перехвате исключения из любого места, или если какой-то поток перестал отвечать, уничтожать локальный сервер СмартКом и создать новый.
7.    Сервер может отваливаться по частям. В любой момент могут отсохнуть: 
Данные стакана
Тики
Данные об изменившихся заявках
Выгрузка свечей
и т.д.
    Всё это может случиться как по отдельности, так и всё сразу.
 
    В общем-то, все проблемы решаемы и каждая в отдельности не такая уж и страшная, но вот только Нахера это нужно?
Обзор подключения к торгам через Api SmartCom и Quik
 
Рис.5. Невероятно упрощённая обёртка глючного ApiSmartCom
 
    8. По ночам из SmartComиногда продолжают поступать свечи, в виде пустых интервалов! Я плакал...
    9. Тестовый доступ к SmartComотличается от реального!!! На тестовом сервере заявки периодически не проходят и отвергаются системой с объяснением: «Нельзя открывать разнонаправленные позиции с одного счёта»(ну или чёт похожее). И!!! Иногда заявка сначала отвергается системой, причём приходит подтверждение о том, что она отвергнута штатно (Systemcancel), а затем (О ЧУДО!), через какое-то время (от нескольких секунд, до нескольких минут), заявка всё же проходит. Что в купе, а особенно последнее, не даёт нормально оттестировать SmartComшлюз в своём роботе на демо счёте. И приходиться допиливать подключение уже на реальном счёте.
    10. Наличие во многих местах различных проверок сказывается на конечной скорости выставления заявок и приёма данных. Делая не возможным (либо не надёжным) реализацию скоростных стратегий через данный тип подключения.
    11. За это (SmartCom) ещё и заплатить придётся. 600 рублей в месяц.
 
    Из всех проблем описанных выше очевидно, что SmartComне очень не надёжен. Хорошая такая, бэта версия, библиотеки для подключения к бирже. Не больше. Вот торгует у меня робот, вроде всё давно оттестировано, и автоматически, и в боевых условиях, и на учебном счету и реальном… А я всё равно просыпаюсь по ночам и бегу посмотреть, как у него дела и не случилось ли новых косяков в шлюзе. Которых, по всей видимости, и сосчитать не получиться.
 
 
    Резюме:
 
    Конечно же, и первый и второй способ подключения к бирже одинаково хороши.
 
    Но с Quikтут понятно. Старичка начали делать в нулевых и серьёзных претензий к разработчикам сложно предъявлять (постебать только остаётся). Делали из того что было и так, как это было заведено в то время, через… у. Ну а что касается SmartCom, но это конечно полное разочарование. Ну как можно оставить столько багов в клиентской части, и напрочь забыть об оповещении о ошибках? БЛДЖАД!!! Ну, Вы хоть исключений в него добавьте, чтобы было понятно, что с ним происходит!
 
    Для htp торговли ни один из представленных способов подключения к торгам не подходит. Хоть SmartComи имеет хорошие показатели скорости выставления заявок (смотри ссылки ниже), то, что он несколько раз в день 100% падает и начинает глючить, для скоростных роботов может быть смертельно опасно.
   
    Что же выбрать из этих отечественныхчудо гуано платформ?
 
    Для уверенных в себе программистов SmartCom. Когда все исключительные ситуации выловлены, потоки изолированы, ордера сопровождены и любое неповиновение сервера, тут же вызывает его расстрел, а через секунду всё работает как надо, то работа со SmartComначинает приносить радость.
 
    Для тех, кто не в состоянии проконтролировать параллельную работу 20 потоков, однозначно Quik. Несмотря на свою топорность, он весьма не требователен и очень стабилен. Что на первых порах гораздо важнее скорости. Хотя тут следует джва раза подумать. В том, что SmartCom через пару версий станет стабильным, у меня сомнений нет, а вот в том, что Quikстанет быстрее и понятнее, очень большие...
 
    Ссылки:
quik.ru/сайтQuik
quik.ru/forum/ideas/7039/7039/ — один из эпичных срачей на форуме разработчиков, в котором юзеры, одурев от наглости, с 2005 года (ДЕВЯТЬ ЛЕТ!!!) пытаются безрезультатно добиться добавления Трэйлинг стопа в терминал. При этом ребята из тех поддержки, с каменным лицом, тролят умоляющих пользователей. Почитайте. В этом весь Quik...
http://www.itinvest.ru/software/smartcom/ — nuffsaid
http://smart-lab.ru/company/stocksharp/blog/105916.php — сравнение скорости выставление заявок SmartCom, Quikи Plaza II
forum.moex.com/viewtopic.asp?t=25629 — тоже, что и сверху, интересны комментарии разработчиков. Видимо на SmartCom 3 возлагались большие надежды в области безопасности соединения. Не вышло...
41 Комментарий
  • Redline
    18 августа 2014, 19:17
    Я еще пробовал AD Api. Тоже довольно своеобразная штука.
    В результате, остановился на MT5. Предельно простая, красивая штука. Все очень четко, точно, быстро и надежно.
    Конечно, есть свои необычности, но сделать можно все что угодно. Если нужно соединить с внешним ПО, то к услугам DLL
    (32 и 64 bit), можно через MemoryMappedFiles, можно через Named Pipes. Все очень быстро и классно. Но по факту, от внешних приблуд отказался и все стал писать на MQL, т.к. язык простой и, самое главное, объектно-ориентированный.

    Минусы:
    — нет акций. Только фьючи
    — для очень скоростных роботов не подойдет, т.к. есть жестко прописанный лимит на 10(или 15, не помню) одновременно обрабатываемых транзакций.

    В остальном сплошные плюсы. Очень надежен(сам терминал).Тем кто создал эту программу — большой респект
  • Mr. Bean
    18 августа 2014, 20:05
    не в первый раз вижу как прогеры пользуют футурамную тему, откуда такая любовь?
  • quant_trader
    18 августа 2014, 20:07
    Квик конечно не фонтан. Но смартком это

    1. привязка к брокеру. К которому лично мне не хотелось бы привязываться. Т е если Вы перейдете из айти Вам придется все переписывать.

    2. из Вашего поста понял что смартком глючное гуано.

    Что же касается претензий к квику то:

    «Отсутствуют некоторые типы ордеров. Стоп-рынок например. Если сработал стоп, зачем парится с лимитками? Всё плохо и надо крыть по любой цене. Счас напишут что надо связными заявками пользоваться. Хорошо. Только нахрена эти сложности?»

    «пытаются безрезультатно добиться добавления Трэйлинг стопа в терминал»

    Биржа нативно не поддерживает такие заявки. Имхо они правы по обоим пунктам.

    А че не ТВС по DDE и парсить, некоторые к экспорту графиков цепляются даже?
      • quant_trader
        18 августа 2014, 20:58
        Алексей Ван, нормальное API есть, не для всех, погуглите quikapi.dll

        Что же касается ордеров то на западе брокер зачастую может сам исполнять/роутить ордера и потому на стороне брокера можно много чего сделать. В РФ же DMA. Скажем обработка трейлинг стопа который сработал в момент закрытия торгов нетривиальная задача.

        Клиенты которые будут жаловаться что их рыночный стоп нарисовал многодневный лоу и исполнился хз по какой цене тоже.
  • G_20
    18 августа 2014, 21:04
    TRANSAQ Connector неплохо сделан
  • ivan_petrov
    18 августа 2014, 22:58
    Несколько лет написал робота на C# для квик и с тех пор горя не знаю. Надежность — главное. Работает неделями, даже не смотрю на него. А смартком с такими глюками не вариант вообще.
  • Профиль удален
    19 августа 2014, 00:07
    «1. Очень быстро выяснилось что занимать потоки приходящие с сервера больше чем на несколько секунд нельзя, т.к. это вызывает падение местного сервера»

    Если вы их занимаете на несколько секунд, может вам лучше не писать биржевых роботов? :)
      • Профиль удален
        19 августа 2014, 09:36
        Алексей Ван, без обид, но в общем случае понимание тут вполне однозначное, и потоки маркетных данных блокировать мягко говоря не рекоммендуется :)
          • Профиль удален
            19 августа 2014, 14:49
            Алексей Ван, ну падать конечно по хорошему СмартКом не должен, но если вы подписались на данные, и потом занимаете поток их плучающий непонятно чем, то соответственно эти данные будут кешироваться или на сервере или на клиенте, и рано или поздно может произойти переполнение. Представьте себе, если сервер будет для всех криво написанных клиентов кешировать данные, а клиентов тысячи, и что тогда? По ссекрету скажу, что при сертификации той же Плазы 2 в предварительных вопросах выясняют как построено ваше приложение, не делает ли оно фигни вроде каких-то своих расчетов и отсылки приказов из потока получения маркетных данных и т.п.
              • professor facepalm
                19 августа 2014, 15:14
                Алексей Ван, «Поэтому и была написана эта статья. Для того чтобы люди не совершали ошибок.»

                Статья скорее вредная. Опытному не нужна — для новичка не понятная и содержащая советы, которым лучше не следовать.
                1) генерировать потоки на каждое отправляемое сообщение — плохой подход. Нужно либо создавать один поток с очередью, который занимается отправкой сообщений, либо при старте программы создавать пул потоков.
                2) смартком 3 поддердивает асинхронный режим. Т.е. потоки для отправки сообщений можно не использовать. Тем более что C# вроде как имеет неплохие возможности для работы с асинхронной моделью.
                  • professor facepalm
                    19 августа 2014, 15:43
                    Алексей Ван,

                    «Да только он имеет свойство исчезать на стороне сервера и выдавать исключения при запросе»

                    Исключения можно обрабатывать.

                    «Это на кого рассчитано? Я поржал»

                    Что так рассмешило?
                      • professor facepalm
                        19 августа 2014, 16:50
                        Алексей Ван, я не думал, что ты потоки создаешь только потому, что стандартными средствами обрабатывать исключения не хочешь. Знал бы, про пул потоков ничего бы не написал.
          • Профиль удален
            19 августа 2014, 14:55
            Алексей Ван, вам кстати спасибо за исследование. Я со СмартКОМом 3-им не работал, но много работал с версиями с 1-й по 2.2 включительно. Так вот баги там конечно были, но в настоязщее время в версии 2.2 меня не устраивают периодические дисконнекты, которые чаще случаются при высокой торговой активности, а также порой падает сам сервис SmartCOM, что уже гораздо критичнее чем потеря связи. Других проблем у меня нет.
            • SergeyEgorov
              19 августа 2014, 19:40
              jest_trader, Существует проверенный механизм перезапуска упавшего второго смарткома. :-)
              • Профиль удален
                19 августа 2014, 22:01
                SergeyEgorov, ну могу предположить, что надо ловить эксепшен вроде «The RPC server is unavailable» и тогда программно перестартовать сервис СмартКОМа, так?
                • SergeyEgorov
                  20 августа 2014, 12:12
                  jest_trader, Программный рестарт сервиса смарткома не поможет ибо в роботе так и останется ссылка на дохлый COM объект. На самом деле сервис сам перезапустится, хотя нет, вру, не перезапуститься. В общем надо сначала программно отписаться от всех данных, отвязаться от всех событий, затем избавиться от ссылки на дохлого смарткома в роботе, только затем перезапустить программно сервис смарткома, и уж потом заново выполнить инициализацию экземпляра объекта StServerClass, заново связать все обработчики, подключиться и подписаться на все события… :-)
                  • Профиль удален
                    20 августа 2014, 12:47
                    SergeyEgorov, спасибо. При дисконнекте я от всего отписываюсь и на все переподписываюсь, а вот от ссылки на дохлый смартком пока не избавляюсь, соответственно в случае падения самого сервиса у меня фатально все останавлиявается пока не перезапущу руками.
                    • SergeyEgorov
                      20 августа 2014, 12:58
                      jest_trader, там еще есть тонкость в программном перезапуске дохлого сервиса смарткома. У робота должны быть права на перезапуск сервисов. У меня где-то даже есть pdf-ка с описанием как такие права давать. Ну и архитектурно получается очень интересное решение, ссылка на stServerClass ведь используется много где в роботе, получается всем, кто ее использует надо эту ссылку новую выдать после рестарта. У меня в адаптере это было реализовано через связку шаблонов Singleton и Observer. Все нормально работало кстати. Код можно посмотреть, если снять с git репозитория исходники и откатиться до момента перед коммитом, который поименован как «Replaced smartcom2 with smartcom3».
                    • SergeyEgorov
                      20 августа 2014, 12:58
                      jest_trader, а вообще я считал что вторым смарткомом уже никто не торгует…
                      • Профиль удален
                        20 августа 2014, 13:16
                        SergeyEgorov, да я просто года полтора ничего не менял — все работает, зачем что-то менять? :)
                        Вот сейчас может буду переделывать и тогда буду использовать третий.
  • П М
    19 августа 2014, 07:55
    Вместо DDE можно использовать простенький скрипт на Lua + библиотеку LuaFFI и на их базе организовать Named Pipe сервер, который например будет передавать стакан или свечку с графика. Вот и весь Api, который как выше писали, братья из Arqa Technologies не могут выдать уже 10 лет. Lua — это ключ и это прорыв. Спасибо им за это.
    В случае named pipe не надо будет, например при экспирации фьючерса всё перенастраивать, т.к. сервер может принимать код фьючерса от клиента. DDE в этом плане плох, т.к. он делает только однонаправленный обмен.
    Но это конечно если вы пишете на чём-то более серьёзном чем Excel
  • ignat
    19 августа 2014, 10:10
    Смартком 3.0 пользую уже почти полтора года. Никаких каждодневных разрывов связи не наблюдаю. Они бывают, но крайне редко — отнюдь не каждый день — и почти всегда сопровождаются сообщением в терминале, при этом можно переключиться на резервный сервер. Вероятно, у автора топика проблемы с провайдером.
    Потерянные заявки были осенью прошлого года, но это быстро починили. Большинство заявок улетают в рынок за 7-20мс.
    На найденные баги саппорт реагирует быстро, баги действительно были на момент выпуска смартком3 в паблик, но сейчас их не осталось. Хотя, когда разработчики реализуют некоторые пожелания, то смартком3 станет еще удобнее.
    Мое личное мнение — отличное, бесплатное и очень быстрое апи без ограничений по количеству транзакций.
    Плата 600 рублей списывается в начале месяца, но потом возвращается за счет комиссий, то есть при оплате комиссий на сумму 600 рублей смартком3 становится бесплатен.
  • SergeyEgorov
    19 августа 2014, 11:06
    Мне нравится Смартком. И второй нравился, и третий нравится. В сравнении с окостыливанием (DDE, trans2quik) вкруговую Квика для организации автоматической торговли, Смартком само совершенство и предел мечтаний. На мой взгляд автор статьи посетовал лишь на то, что промышленный продукт, на звание которого претендует Смартком, должен был бы иметь промышленное же качество во всем. С другой стороны возникает сравнительный вопрос к тем, кто эксплуатировал какие-нибудь западные API, ну например Interactive Brokers. Как оно у них работает? Идеально?
    • Slepoy
      19 августа 2014, 11:10
      SergeyEgorov, да забудте все про ДДЕ и trans2quik. Так никто уже не робит. Квик по надежности и стабильности на голову выше Смарткома.
      www.qscalp.ru/quik6
      stocksharp.com/forum/yaf_postst4801_Novyi-konniektor-k-Kviku-na-LUA.aspx
      • SergeyEgorov
        19 августа 2014, 11:58
        Slepoy, Ну таки и что лучше работает? QScalp-овый коннектор или AmiSharp? Если я правильно понимаю и в первом и во втором случае у нас возникает скриптовая прослойка, исполняющаяся на Quik?
        • Slepoy
          19 августа 2014, 12:38
          SergeyEgorov, Я не сравнивал эти коннекторы QScalp и AmiSharp. Но сравнивал коннектор ЛУА и ДДЕ. И вывод тут однозначный: ЛУА быстрее и удобней и менее глючней встроенного в Квик ДДЕ + API. Среда исполнения ЛУА встроенна в Квик, также как и медленный Кьюпайл. Вот топик — как писать роботов прямо в квике smart-lab.ru/blog/199387.php
      • ignat
        19 августа 2014, 11:58
        Slepoy, как быстро квик забрасывает заявки в рынок? За какое количество мс приходит номер ордера и статус ордера от биржи?
        • Slepoy
          19 августа 2014, 12:39
          ignat, медленей Смарткома — это факт. Причем в разы (((. По скорости Квик полностью обсирается )))
          vimeo.com/61039475
    • ignat
      19 августа 2014, 11:56
      SergeyEgorov, Я юзал апи от интерактива пару лет назад — показалось каменным веком )
      Возможность использовать его сразу на с# вообще не была на тот момент документирована, как сейчас — не знаю. В интернете было немало самописных костылей для использования апи интерактива через с#, однако, как оказалось, эта связка работает и без левых костылей. Документация неполная, некоторые вещи пришлось искать методом тыка и случайных догадок — например, что пробелов в спецификации опционов должно быть не один, а два )))
      Да и вообще, на мой взгляд, несмотря на более развитый мир трейдинга у буржуев, сложилось впечатление, что для частного трейдера там все гораздо хуже, чем на нашем рынке — апи примитивнейшие и далеко не у каждого брокера. Несомненно, объемы и количество инструментов на забугорье гораздо выше, чем у нас. Однако комиссии, масса правил по марже, которые отличаются у всех брокеров, не всегда прозрачное направление заявок со стороны брокера создают впечатление хаоса.
      Идеального брокера с расположением в сша, удобным апи с возможностью отправки ордеров на 3-4 ноги одним ордером, с разумной комиссией и с правильными требованиями по марже пока я не нашел.
      • SergeyEgorov
        19 августа 2014, 19:46
        ignat, Сейчас у интерактива по меньшей мере в документации www.interactivebrokers.com/en/software/api/api.htm все красиво. Си шарп, Джава, Си плюс плюс, тьюториалы какие-то. Насколько там все адекватно объясняется не знаю, не читал сильно. Ну и насколько сам API органичен вот что хотелось бы в первом приближении понять. Десять томов документацию в наше время кто угодно может наваять, а вот чтобы ее еще можно было читать и применять не засыпая каждые три минуты, тут вот уже талант нужен.
      • SergeyEgorov
        19 августа 2014, 19:49
        ignat, Ну и главный вопрос про интерактив. Их API соединяется напрямую с их серверами, или опять же связка а-ля Квик, коннектимся к терминалу, и через него имеем удовольствие торговать?
        • ignat
          19 августа 2014, 21:21
          SergeyEgorov, через их терминал или шлюз. В доку добавили сишарп, а на главной так и не указали )
          Сам апи прост, попробуйте и сразу поймете.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн