Заметка

Практическая реализация робота в связке Quik+Amibroker

  3  

В данной статье я хочу рассказать о вариантах создания роботов для связки самого популярного терминала Quik и Amibroker, а также остановиться на своей реализации данной задачи.

Вкратце, существуют всего 3 варианта создать робота для Quik'а:

  1. Полностью запрограммировать на встроенном в Quik языке QPILE. Основной минус данного подхода – функциональные ограничения языка, невозможность закодировать сложного робота. Обычно на нем пишут какие-то отдельные модули типа выставления и слежения за заявками, а сигналы реализуются в отдельной библиотеке или программе тех анализа.
  2. Использовать импорт транзакций через tri/tro-файлы. Обмен заявками и их статусом осуществляется через текстовые файлы специального формата. Минус – быстродействие.
  3. Использовать встроенное API. По функционалу близко к пункту 2, но быстрее.

Существенный недостаток пунктов 2 и 3 – невозможность проконтролировать исполнение отправленной заявки, так как доступна только информация о ее регистрации на бирже. Для целей контроля приходит на помощь DDE-эспорт таблиц из Quik'a в Excel или самописный DDE-сервер для последующей обработки роботом.

По поводу скорости исполнения заявок. Задержка данных на связке Биржа-Quik составляет порядка 1с (во всяком случае у меня), еще где-то 0.5с уходит на экспорт из Quik в Amibroker. Плюс рабочий цикл робота. В итоге в лучшем случае заявка будет зарегистрирована через 3с с момента поступления сигнала. HFT-стратегию тут точно не реализуешь. Остальные – легко.

Теперь о функционале текущей реализации робота:

  1. Робот оперирует данными в виде свечей-баров. Все сигналы поступают на закрытии последней свечи, исполнение – на открытии следующей. Это исключает возможность пропадания сигнала на формирующейся свече, когда сигнал может появляться и пропадать. Если же сигнал не пропадает, есть возможность подправить робота, чтобы он работал не по открытию, а закрытию свечи – в таком случае он отправит заявку в момент получения сигнала на формирующейся свече.
  2. Отправка заявок в Quik. Осуществляется через tri/tro файлы. На одной свече возможна отправка одной заявки одного направления. Заявки Buy и Cover считаются разными направлениями, то есть переворотные стратегии робот отработает корректно. Если ваша система совершает несколько сделок на 1 свече, значит можете ее выкинуть в помойку, так как бектест такой системы не будет соответствовать реальности: внутри свечи на истории никогда не известно, как себя вел инструмент и, следовательно, неизвестно в какой последовательности были исполнены сделки. Если же система заглядывает на меньший таймфрейм для решения этой проблемы, то и робота следует запускать на меньшем базовом таймфрейме и соответственно подправлять систему.
  3. Слежение за исполнением заявок, периодический сдвиг заявок. Робот следит за последней брошенной заявкой, считывая специально сформированную таблицу заявок, экспортированную из Quik'a в Excel. Если на текущей свече заявка не исполняется, или исполняется частично, робот передвигает заявку на следующей свече по цене открытия с учетом оставшихся лотов.
  4. Обо всех действиях по отправке/исполнения/сдвига заявок робот уведомляет по почте.

1.     Настройка Quik

Создать файлы trans.tri и trans.tro (Блокнот в помощь). Важное замечание – в конце каждой недели очищать оба этих файла, закрыв предварительно Quik. Дело в том, что все заявки роботом идентифицируются по дню недели, времени свечи, направлению заявки и номеру системы. Робот перед отправкой транзакции в файл считывает его и, если обнаружит строку с таким же идентификатором заявки, посчитает ее дублем и проигнорирует сигнал.

В разделе Торговля -> Импорт транзакций из файла активировать считывания транзакций, как показано на рисунке с учетом путей до этих файлов:

Минимальное время, которое можно настроить в Quik для считывания транзакций из файла – 0.1с

Создать таблицу заявок следующего формата: 2 столбец — номер транзакции, 7 — номер заявки, 8 — остаток заявки, 9 — статус исполнения. Остальные столбцы по вкусу. К примеру, так:

Запустить DDE-сервер (в моем случае Excel) и открыть в нем файл stats.xls. Он состоит из 2х листов:

Orders-лист – сюда экспортируется таблица заявок из Quik'a для дальнейшей обработки роботом. Если тут пусто, значит экспорт не работает по какой-то причине (даже не спрашивайте меня почему).

Stats-лист – это информация для робота, чтобы он не забыл состояние последней заявке. Тут ничего трогать нельзя, так как иначе возможна порча формата ячеек, что приведет к неработоспособности робота. Смотреть можно.

Далее правой кнопкой мыши на эту таблицу -> Вывод через DDE сервер – настроить DDE-эспорт заявок в stats.xls согласно рисунку:

Нажать кнопки «Начать вывод», а затем «Вывести сейчас» и убедиться, что экспорт таблицы работает.

2.     Настройка Amibroker

Настройки бектестера оставляем какие обычно используем для системы, основной упор сделав на General->Periodicity.

Для настройки уведомлений зайти в Preferences->Alerts и сделать, как показано на рисунке:

2.1 Настройка робота

Открываем в редакторе Ами код robot.afl и начинаем его править под себя:

Account – Ваш аккаунт на бирже

Client – код клиента

FileTri – полный путь до tri-файла

FileTro – полный путь до tro-файла

FileExcel – полный путь до stats.xls

Tick_Size – минимальный шаг цены торгуемого инструмента.

Classcode – код класса инструмента

Seccode – код самого инструмента

TimeFrame – рабочий таймфрейм робота в секундах. Если будет отличаться от настроенного в бектестере, робот работать не будет.

spreadOrder – заложенное проскальзывание. Робот будет кидать лимитники, которые будут отличаться от системных цен на размер проскальзывания в худшую сторону. Нужно для повышения вероятности исполнения заявки. Можно поставить 0 или число кратное Tick_Size.

Account_RUB – объем средств, выделенных роботу (можно забить, если размер лота статичен и не просчитывается в коде системы)

USD_RUB – курс бакса (аналогично предыдущему пункту, если торгуем рублевым инструментом)

Account_Pips – величина депо в пунктах (опять забить если торгуем не ФОРТС)

Lots – размер торгуемой позиции. Можно тут прописать или прописывать в коде системы (рекомендуется)

Далее пролистываем аж на 366 строку, видим секцию кода системы. Там для примера прописана система, входящая на закрытии свечей выше/ниже скользящей средней. Не рекомендуется для торговли в реале. Итак, что должно быть в этой секции:

  1. Код системы: генерация сигналов и расчет размера позиций для входа/выхода.
  2. Все стандартные массивы Buy/Sell/Short/Cover должны быть заменены на BuySys1/SellSys1/ShortSys1/CoverSys1. Для динамического определения числа торгуемых  лотов используем переменную Lots.
  3. В начале кода обязательно наличие строчек

if(DebugMode != 1)

      positionLoad();       

В конце кода обязательно наличие строчек

BuySys1 = Ref(BuySys1, -1);     

SellSys1 = Ref(SellSys1, -1);                                                    

ShortSys1 = Ref(ShortSys1, -1);                                                             

CoverSys1 = Ref(CoverSys1, -1);            

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

Чего быть не должно в коде системы:

  1. Графические секции, рисование индюков
  2. Комментарии
  3. Прочий мусор

Все это только замедляет работу робота.

Далее можно промотать в самый низ и настроить столбцы, которые будет выводить робот в своей работе как индикаторы своего состояния. В данном примере он выводит следующие столбцы:

Ticker – рабочий инструмент

Position Dir – направление позиции робота на данный момент (Long/Short/Out of Market)

Last Order Lots – число торгуемых лотов в последней сделке

Robot Perfomance – время работы одного цикла робота в миллисекундах. Код робота запускается по умолчанию раз в секунду и этот столбец нужен для контроля над быстродействием системы. Если время больше 1 секунды, то вероятны пропуски данных при экспорте из терминала в Ами. Рекомендуется устанавливать робота на отдельный компьютер или виртуальную машину с соответствующим быстродействием.

2.2 Запуск робота.

Открыть окно Automatic Analysis, ввести такие настройки (считая, что Backtester Settings уже настроены как надо):

Apply to current symbol

Run every 1sec

Range – n last quotations, n = 1

Нажать кнопку Explore

3. Проверка работы робота

Есть возможность отключить в роботе ведение заявок, оставив только функционал отправки заявок в tri-файл. Это позволяет без запуска Квика и DDE-сервера, только используя Amibroker в режиме bar replay на истории проверить правильность записи заявок роботом – цена, направление и прочее.

Для этого в начале кода робота надо переменную DebugMode выставить в 1.

Полезные ссылки

http://amisite.ru/phpBB2/viewtopic.php?t=1107 – обсуждение данного робота. Все вопросы/пожелания по работе робота можно писать сюда.

http://www.amisite.ru/afl/exp/0002.htm — вариант робота через API от Олега (000). На форуме есть длиннющая ветка с обсуждением.

Ну и просто http://www.amisite.ru – замечательный сайт, посвященный Амиброкеру.

Прикрепленные файлы

·   robot.rar

·   stats.rar

Комментарии

spitfire — 13 ноября 2012 г.

Файлы робота и экселя будут чуть позже - должны пройти модерацию и антивирус :)

0 +

Николай Камынин — 14 ноября 2012 г.

Добрый день,spitfire
Несколько замечаний.
1) Кроме указанных Вами трех способов есть и другие.
Например, тот, который использую сам (об этом я уже писал на сайте).
Это реализация отправки и контроля исполнения на QPILE.
В этом случае не нужен DDE,Excel, tri b tro файлы.
Т е реализация гораздо проще и надежнее.
2) При таком простом алгоритме робота нет смысла использовать Амиброкер.
Робот полностью можно реализовать на QPILE в QUIK.
И он будет гораздо быстрее и надежнее работать.

1 +

spitfire — 14 ноября 2012 г.

Николай, здравствуйте! По пунктам, так сказать.
1) Это я написал в статье, если бы Вы писали внимательней - "Обычно на нем пишут какие-то отдельные модули типа выставления и слежения за заявками, а сигналы реализуются в отдельной библиотеке или программе тех анализа." Согласен, что это будет проще, если вы знакомы с Qpile - я нет и он мне не интересен. Единственные сбои которые были за год работы такого робота - это сбои Квика, поэтому реализовывать в нем какую-либо часть логики робота нет особого желания.
2) Ну а Вы что хотели? Чтобы я туда засунул систему, которая реально деньги зарабатывает? Та система прописана в роботе исключительно для целей наглядности. В системную секцию можно любую (почти) систему прописать, возможно с некоторыми исправлениями (из-за ограничений 1 сделка на бар)
3) С удовольствием поглядел бы на Вашу реализацию модуля ведения заявок на Купайле.

0 +

Николай Камынин — 14 ноября 2012 г.

spitfire,
благодарю за ответ.

0 +

s_mike — 20 ноября 2012 г.

spitfire

Взгляните - готовые двусторонний адаптер quik-ambroker без экселей
http://www.bot4sale.ru/blog-menu/amisharp-menu/amisharp-list/203-amisharp-what-is-this.html

0 +

spitfire — 20 ноября 2012 г.

s_mike, Интересная поделка, смутило только в описании установки "Некоторые антивирусные программы классифицируют AmiSharp как вирус (и тому есть основания)".Судя по настройке и установке это самописный DDE-сервер, замена Excel'я. Я использую Excel - меня он устраивает.

0 +

s_mike — 20 ноября 2012 г.

spitfire,

В "поделке" для удобства пользователя используется механизм (само)запуска с тем, чтобы не было необходимости каждый раз делать это руками. Амишарп (сам) запускается равно тогда, когда в нем есть необходимость, и выгружается, когда необходимость в нем отпадает. Антивирусы такую активность отслеживают и реагируют на нее. Лаборатории антивирусов, имеющих распространение в России/Украине и т.п. к , амишарпу претензий не имеют (в базах).

Этот механизм (само)запуска можно и не использовать. В принципе, можно не использовать и "самописный DDE сервер", да и все остальное. В этом случае остается вариант несамописного экселя, заявок tri/tro, стирания руками чего-то в конце каждой недели, лишь одного сигнала для каждой свечи и остальных приятных вещей, наличие которых и свидетельствует о "правильности" сделанного.

Вне связи с предыдущим.
""
Если ваша система совершает несколько сделок на 1 свече, значит можете ее выкинуть в помойку, так как бектест такой системы не будет соответствовать реальности: внутри свечи на истории никогда не известно, как себя вел инструмент и, следовательно, неизвестно в какой последовательности были исполнены сделки.
""
Это неверное утверждение. Вот Вам пример. На достаточно ликвидном инструменте мы входим по открытию свечи и выходим по достижении определённой прибыли, которая достигнута в течение этой же свечи. Бектест без проблем разберется с этой ситуацией.

вот вам второй пример: хеджирование позиций рабочего инструмента другим инструментом. В этом алгоритме ВСЕГДА на одной свече будет более одной заявки и нет никаких поводов отправлять такую стратегию в помойку.

Одним словом, впереди у Вас очень много интересного, развивайте.

0 +

spitfire — 20 ноября 2012 г.

s_mike, Это Ваша программа? Пардон если обидело слово "поделка", тут я не корректно высказался. Каждый использует/делает тот функционал который его устраивает.
Насчет несколько сделок на 1 свече. Это Вы не правы. Для Вашего же примера: стоп у такого варианта есть внутри свечи? Что если на этой свече будет достигнут и стоп и профит? Как тогда бектестер разберется с данной ситуацией? Я хочу сказать что в общем случае требуется переход на меньший таймфрейм чтобы выяснить последовательность сделок на 1 свече.
Второй пример некорректен, так как имеются в виду одновременные сделки на разных инструментах, когда я говорил про 1 инструмент и 1 свечу.
Да, спасибо за пожелания, каждый день работаю над этим :)

0 +

s_mike — 20 ноября 2012 г.

spitfire,

Давайте не будем утомлять Читателей форума занудной эквилибристикой.

Понятно, что к каждому алгоритму нужно подходить с нежностью и терпением. И практически в каждом случае есть варианты правильного подхода.

Если на одной свече есть вариант закрытия по прибыли и по убытку - очевидно, что для моделирования нужно выбирать заведомо проигрышный вариант. То есть в первую очередь проверять условие убытка, а потом уже условие взятия прибыли. В этом случае при работе внутри свечи мы в бекстесте получим заведомо худшие результаты, чем те, которые могут быть в действительности. И если даже этих условиях стратегия покажет прибыль - можно смело ее реализовывать - в действительности результаты будут лучше (в отличие от всего того, что здесь было многоразово описано - 500, 1500, мульён процентов годовых)

Если хотите, я с удовольствием поделюсь с Вами уже готовым инструментом. Возможно, это сэкономит вам время и силы. А у Вас появятся идеи.

Если желания нет - удачи Вам в Ваших экспериментах.

1 +

spitfire — 21 ноября 2012 г.

s_mike, соглашусь про выбор заранее худшего варианта, это возможное решение.
Готовый инструмент всегда готов и хочу потрогать, с размером моей хотелки может сравниться только моя жадность :)

0 +

s_mike — 21 ноября 2012 г.

На текущий момент слоны бесплатны

0 +

nfxzhzh — 22 ноября 2012 г.

s_mike, давно с интересом слежу. Слонов всем раздают или озвучьте ценник?

Мне интересно можно ли реализовать для портфеля небыстрых систем риск менеджмент через Ваш адаптер. В Квике собрать все что надо в одну Купайл таблицу, отправить по DDE в Амишарп и в скрипте спокойно контролировать, задав обновление по таймеру.

Идея для программиста вероятно забавная но учитывая многопоточность Амиброкера по моему интересная.

0 +

s_mike — 22 ноября 2012 г.

nfxzhzh,
Мы со Стивеном Кингом )))))))) раздаём нетленку всем желающим. И даже если впоследствии у кого-то появится желание узнать реквизиты для благодарности - и это пожелание также никогда не остаётся без внимания. )))

0 +

s_mike — 23 ноября 2012 г.

Что касается рискменеджмерта для небыстрых систем. С одной стороны амиброкер (и соотвественно скрипт с амишарпом) могут легко обрабатывать каждый тик, если это требуется, поэтому быстродействие таких роботов ограничено лишь скоростью подачи информации в амиброкер. Исполнение не слишком сложных скриптов занимает единицы-десятки миллискунд - здесь амишарп вне конкуренции среди иных подобных программ. С другой - не очень понятна необходимость все написать в qpile и потом куда-то экспортировать. Почему бы на купайле и не завершить весь процесс в таком случае? Вся идея, описанная в начальном посте как раз в том и заключается, чтобы избавиться от рутины написания алгоритма на qpile, а использовать все богатство возможностей программы теханализа, тем самым резко сократить затраты на программирование. Может, сразу все написать внутри амиброкера или того же wealth-lab/metastock? амишарп и с ними работать будет (и подход автора начальной статьи тоже вроде как должен, если слегка его подправить)

0 +

nfxzhzh — 23 ноября 2012 г.

s_mike, риск менеджмент обычно не требует реакции на каждый тик, достаточно раз в несколько секунд (или даже десятков секунд)
проверять.

При алготорговле нам надо контролировать
1. открытые позиции, причем не только робота а вообще все по макс лимитам
2. любую торговую активность, детектируя подозрительные операции
3. всякие служебные вещи (коннект квика, датафид итд.)
и при каких то несостыковках алертировать и возможно останавливать робота.

Зачем тут нужен купайл? Чтобы минимизировать число экспортируемых из Квика таблиц т е DDE обменов. Когда у нас 5 квиков от разных брокеров то имеет смысл сначала ужать максимум в одну таблицу в Купайл портфеле а потом слать ее по DDE в сервер контроля.

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

Пока решил вопрос написанием собственной утилиты на VB6 где читаются текстовые файлы которые пишут купайл портфели из каждого Квика и роботы. Смейтесь, да, но оно работает :)

Поэтому мне стало интересно а что если написать весь контроль в виде скрипта Амиброкера (функцию добавить в чарт или вообще завести отдельный чарт с редким таймерным пересчетом). Таблицы принимать по DDE, остается только прикрутить сокеты ну или всякие сложные дела оставить на VB.

Ну а сами алгоритмы при этом в Амиброкере крутятся. Кстати прошу тапками не кидать, статья полезная и все такое, но ИМХО по серьезному надо паковать все роботы в один скрипт на инструмент. С единой позицией и прочим.

0 +

s_mike — 20 ноября 2012 г.

P.S. Полностью согласен с оценкой полезности ресурса amisite.ru. Рекомендую - сам на начальном этапе его прочитал полностью.

0 +

Otokar — 13 февраля 2013 г.

Автору сайта - Зарегистрировался, у меня номер телефона +380 и тд, - не катит.

0 +

vj0R — 1 июля 2014 г.

Как скачать приатаченные файлы?? SMS не приходит!

1 +

orekton — 1 июля 2014 г.

vj0R, смс отключил временно, качайте

0 +

Написать комментарий

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

Написать администратору