2. Торговый робот Lbot 2.1
Руководство пользователя — 2 —
1. Назначение и условия применения
Торговый робот «Lbot» (далее "программа") предназначен для автоматизации
выполнения торговых операций на фондовом рынке. Программа выполняет операции купли-
продажи заданной ценной бумаги на фондовом рынке путем выставления лимитированных
биржевых заявок. Данные операции выполняются в соответствии с алгоритмом торговой
стратегии, задаваемой из файла настроек.
Также есть возможность управления позициями путем нажатий соответствующих кнопок.
Торговый робот «Lbot» представляет собой скрипт на языке Lua для торгового терминала QUIK.
Системные требования:
Подсистема Минимальные требования
Процессор Pentium4 2 GHz или более мощный
Оперативная память Не менее 1 Gb (рекомендуется 4 Gb)
Жесткий диск Не менее 2 Gb свободного дискового
пространства после установки всего
программного обеспечения
Операционная система Windows 2000 / 2003 / XP / Vista / 2008
/ Windows7 / Windows8
Биржевой терминал QUIK версии 6.9 или более поздней;
Основные функциональные возможности:
Автоматическая торговля;
Ручная торговля;
Протоколирование всех действий.
2. Предостережение.
Торговый робот «Lbot» позволяет выполнять торговые операции автоматически по
заданным стратегиям и (или) путем нажатия одной кнопки и без подтверждения. Перед его
использованием, пожалуйста, изучите данное руководство и убедитесь в том, что вы
понимаете логику работы программы. Рекомендуется первое знакомство с программой
производить на учебном брокерском счете.
Автор программы не несет ответственности за возможные убытки или упущенную выгоду
возникшие в результате использования или невозможности использования данного скрипта.
3. Торговый робот Lbot 2.1
Руководство пользователя — 3 —
3. Загрузка и настройка программы в QUIK
3.1. Загрузка программы.
Запустите терминал QUIK. В меню Таблицы выберите пункт Lua –> Доступные скрипты,
далее необходимо добавить, а затем запустить скрипт LUA в торговом терминале QUIK.
Рис.1
Рис.2
4. Торговый робот Lbot 2.1
Руководство пользователя — 4 —
3.2. Настройка индикаторов.
В QUIK должны быть открыты следующие таблицы:
1. Текущая таблица параметров;
2. Позиции по клиентским счетам (фьючерсы).
Необходимо на график QUIK добавить график соответствующего индикатора или цены и
присвоить ему идентификатор из поля Идентификатор.
Последовательность действий для фьючерса SRU4.
1. На открытом графике цены (баров) кликнете правой клавишей мыши и выберите:
Параметры графика —> SRU4 [Price].
2. В появившемся окне Настройки SRU4 [Price] перейдите на вкладку Дополнительно и в поле
Идентификатор укажите уникальное имя SRU4 [Price] на латинице из настроек сектора по
бумаге [Sberbank], например, SR_Price, как показано на рисунке ниже.
3. Нажмите Сохранить.
Рис.3
Последовательность действий для индикатора Moving Average.
1. На открытом графике цены (баров) кликнете правой клавишей мыши и выберите:
Добавить график (Индикатор).
2. В появившемся окне найдите Moving Average и нажмите Да.
3. Измените параметры индикатора на вкладках Общие и Параметры или оставьте их равными
значениям по умолчанию.
4. На вкладке Дополнительно в поле Идентификатор укажите уникальное имя на латинице из
настроек сектора по бумаге [Sberbank], например, maSR01.
5. Нажмите Сохранить.
5. Торговый робот Lbot 2.1
Руководство пользователя — 5 —
4. Описание интерфейса.
4.1. Состояние робота
Для контроля за роботом служит таблица “LBOT”, создаваемая в QUIK. Если все
настройки корректны, в строке «Статус» столбца «LogTxt» будет написано «Робот работает» на
зеленом фоне. Иначе - в этой строке появится надпись «Err:» с перечислением ошибок и ячейка
«LogTxt» окрасится в красный цвет.
Рис.4
Ячейка «LastPos» по инструменту окрасится в зеленый цвет при длинной позиции и в красный
цвет при короткой позиции.
Если произошло изменение цены последней сделки к предыдущей, то ячейка «Last» окрасится
красным при уменьшении и зеленым при увеличении.
Возможные ошибки:
Run – не нажата кнопка запуска «Start»;
Timeframe – ошибка определения тайм-фрейма графика с соответствующим идентификатором.
Возможно несоответствие наименования идентификатора индикатора или цены с настройками;
Connect – отсутствует связь QUIK-а с брокером;
Depo – сумма гарантийного обеспечения по инструментам из настройки превышает значение
суммы в рублях, на которую разрешено роботу торговать;
Status – торги по бумаге приостановлены;
Account - торговый счет в настройках не совпадает со счетом из таблицы «Позиции по
клиентским счетам (фьючерсы)».
Всё происходящее будет транслироваться в файл протокола log log_ yyyy.MM.dd.csv с
соответствующей датой и во вкладку «Протокол» окна программы «Lbot».
Пример файла протокола:
10:02:43,266; -----------------------------------------------------------
10:02:43,329; Start, frequrncy: 0.2 сек.
10:02:43,641; [SRU4]; t = 15 мин; avPrice = 7460; OpenSlippage = 20; WorkSize = 3; StopLoss = 50; ТЧП = 3
10:02:43,860; [GZU4]; t = 1 мин; OpenSlippage = 20; WorkSize = 4; StopLoss = 70; ТЧП = 0
10:02:44,047; [RIU4]; t = 5 мин; avPrice = 120000; OpenSlippage = 200; WorkSize = 2; StopLoss = 400; ТЧП = -2
10:03:18,313; Связь с брокером установлена.
10:03:23,454; [SRU4]; статус: "торгуется"
10:03:23,547; [GZU4]; статус: "торгуется"
10:03:23,563; [RIU4]; статус: "торгуется"
10:03:53,329; [RIU4]; 05 Активирован тейк-профит SHORT, tp0=119580
10:04:07,141; [RIU4]; Скольжение вниз, tp0 = 119580 -> 119570
10:04:17,235; [RIU4]; Скольжение вниз, tp0 = 119570 -> 119560
6. Торговый робот Lbot 2.1
Руководство пользователя — 6 —
10:07:17,938; [RIU4]; Скольжение вниз, tp0 = 119560 -> 119550
10:07:30,922; [RIU4]; Скольжение вниз, tp0 = 119550 -> 119540
10:07:39,719; [RIU4]; Скольжение вниз, tp0 = 119540 -> 119520
10:08:12,563; [GZU4]; 01 OpenLong; cross(Close, gpKeltner.2) => return 12922 >12933.55 <=> return 12948 >12934.04
10:08:13,016; [GZU4]; 02 Есть заявка: buyS = 12968 x 4, id= 100812437
10:08:13,235; [GZU4]; 04 OnTransReply, OpenLong, Заявка, с биржевым номером 2419767151, успешно
зарегистрирована., R =100812437, trans_id= 100812437
10:08:13,641; [GZU4]; 03 исполнена заявка "ПОКУПКА", 4 x 12948, QUIK: 0, робот: 4
10:08:16,500; [GZU4]; 01 STOP_Long; вход = 12948; текЦена = 12811; StopLoss = 70; вход = 12948
10:08:16,594; [GZU4]; 02 Есть заявка: sellS = 12791 x 4, id= 100816375
10:08:17,016; [GZU4]; 03 исполнена заявка "ПРОДАЖА", 3 x 12811, QUIK: 4, робот: 0
10:08:17,094; [GZU4]; 04 OnTransReply, CloseLongStop, Заявка, с биржевым номером 2419767262, успешно
зарегистрирована., R =100816375, trans_id= 100816375
10:08:23,579; [RIU4]; Скольжение вниз, tp0 = 119520 -> 119510
10:08:34,422; [RIU4]; Скольжение вниз, tp0 = 119510 -> 119500
……………………………………………………………………………………………………
10:20:44,656; [RIU4]; Скольжение вниз, tp0 = 119180 -> 119170
10:20:56,468; [RIU4]; Скольжение вниз, tp0 = 119170 -> 119160
10:21:04,437; [RIU4]; Скольжение вниз, tp0 = 119160 -> 119140
10:22:13,046; [GZU4]; 01 OpenLong; cross(Close, gpKeltner.2) => return 12855 >12862.59 <=> return 12860 >12856.89
10:22:13,062; [GZU4]; 02 Есть заявка: buyS = 12880 x 4, id= 102213092
10:22:13,265; [GZU4]; 04 OnTransReply, OpenLong, Заявка, с биржевым номером 2419794625, успешно
зарегистрирована., R =102213092, trans_id= 102213092
10:22:13,515; [GZU4]; 03 исполнена заявка "ПОКУПКА", 4 x 12860, QUIK: 0, робот: 4
10:22:15,952; [GZU4]; 01 CloseLong; {Close} < {Low, 3-1} => (12844 < 12847), 01oth; urgentSell
10:22:15,968; [GZU4]; 02 Есть заявка: sellS = 12824 x 4, id= 102215827
10:22:16,390; [GZU4]; 03 исполнена заявка "ПРОДАЖА", 4 x 12844, QUIK: 4, робот: 0
10:22:16,452; [GZU4]; 04 OnTransReply, CloseLong, Заявка, с биржевым номером 2419794735, успешно
зарегистрирована., R =102215827, trans_id= 102215827
10:29:08,624; [GZU4]; 01 OpenShort; cross(gpKeltner.1, Close) => return 12918.88 >12920 <=> return 12911.08 >12871
10:29:08,640; [GZU4]; 02 Есть заявка: sellS = 12849 x 4, id= 102908498
10:29:08,843; [GZU4]; 04 OnTransReply, OpenShort, Заявка, с биржевым номером 2419807935, успешно
зарегистрирована., R =102908498, trans_id= 102908498
10:29:09,046; [GZU4]; 03 исполнена заявка "ПРОДАЖА", 4 x 12869, QUIK: 0, робот: -4
10:31:48,957; [RIU4]; 01 Short TakeProfit
10:31:48,972; [RIU4]; 02 Есть заявка: buyS = 119540 x 2, id= 103148815
10:31:49,175; [RIU4]; 04 OnTransReply, CloseShortTP, Заявка, с биржевым номером 2419811269, успешно
зарегистрирована., R =103148815, trans_id= 103148815
10:31:49,816; [RIU4]; 03 исполнена заявка "ПОКУПКА", 2 x 119340, QUIK: -2, робот: 0
10:35:46,394; [GZU4]; 01 CloseShort; {Close} > {High, 3-1} => (12881 > 12876), 01oth; urgentBuy
10:35:46,425; [GZU4]; 02 Есть заявка: buyS = 12904 x 4, id= 103546284
10:35:46,847; [GZU4]; 03 исполнена заявка "ПОКУПКА", 3 x 12887, QUIK: -4, робот: 0
10:35:46,925; [GZU4]; 04 OnTransReply, CloseShort, Заявка, с биржевым номером 2419817982, успешно
зарегистрирована., R =103546284, trans_id= 103546284
10:36:44,191; [GZU4]; 01 OpenShort; cross(gpKeltner.1, Close) => return 12884.85 >12887 <=> return 12880.07 >12854
10:36:44,191; [GZU4]; 02 Есть заявка: sellS = 12834 x 4, id= 103644049
10:36:44,488; [GZU4]; 03 исполнена заявка "ПРОДАЖА", 4 x 12852.75, QUIK: 0, робот: -4
10:36:44,503; [GZU4]; 04 OnTransReply, OpenShort, Заявка, с биржевым номером 2419819820, успешно
зарегистрирована., R =103644049, trans_id= 103644049
10:38:14,269; [SRU4]; 01 CloseLong; cross(maSR01, High, 1) => return 7463.0947303591 >7484 <=> return
7459.2757842873 >7450, 01c, and {Close} > {Close,2} => ( and 7447 > 7445); urgentSell
10:38:14,441; [SRU4]; 02 Есть заявка: sellS = 7421 x 3, id= 103814299
10:38:14,691; [SRU4]; 04 OnTransReply, CloseLong, Заявка, с биржевым номером 2419822678, успешно
зарегистрирована., R =103814299, trans_id= 103814299
10:38:15,613; [SRU4]; 03 исполнена заявка "ПРОДАЖА", 3 x 7441, QUIK: 3, робот: 0
10:41:33,519; [GZU4]; 01 CloseShort; {Close} > {High, 3-1} => (12876 > 12870), 01oth; urgentBuy
10:41:33,535; [GZU4]; 02 Есть заявка: buyS = 12897 x 4, id= 104133393
10:41:33,957; [GZU4]; 03 исполнена заявка "ПОКУПКА", 1 x 12877, QUIK: -4, робот: 0
10:41:34,019; [GZU4]; 04 OnTransReply, CloseShort, Заявка, с биржевым номером 2419828525, успешно
зарегистрирована., R =104133393, trans_id= 104133393
7. Торговый робот Lbot 2.1
Руководство пользователя — 7 —
4.2. Окно программы «Lbot».
Окно программы, общий вид которого представлен на рисунке ниже, поделено на семь частей:
1. Комбинированный список - выбор бумаги;
2. Область пуска-останова работы программы;
3. Область отображения параметров торгуемой бумаги;
4. Область отображения состояния автоторговли (On/Off) и текущей чистой позиции;
5. Область ручного управления позициями;
6. Область вкладок - Протокол;
6.1. Область вкладок – Правила автоторговли;
6.2. Область вкладок – общая конфигурация;
7. Статусная строка.
Рис.6
Рис.5 Рис.7
3
5
2
6
7
4
1
6.1
6.2
8. Торговый робот Lbot 2.1
Руководство пользователя — 8 —
4.3. Ручное управления позициями.
Поле / Кнопка Описание
Цена Цена заявки
Кол-во Количество лотов заявки
Шаги Число шагов цены
Купить Транзакция создания заявки на покупку с количеством «Кол-во» и
ценой «Цена»
По рынку Транзакция создания рыночной заявки на покупку с количеством
«Кол-во» (для ФОРТС с максимальной ценой)
Бид + Транзакция создания заявки на покупку с количеством «Кол-во» и
ценой равной сумме цены лучшей покупки и произведению «Шаги» и
шага цены:
Цена = лучший Бид + Шаги * Шаг цены
Продать Транзакция создания заявки на продажу с количеством «Кол-во» и
ценой «Цена»
По рынку Транзакция создания рыночной заявки на продажу с количеством
«Кол-во» (для ФОРТС с минимальной ценой)
Оффер – Транзакция создания заявки на продажу с количеством «Кол-во» и
ценой равной разности цены лучшей продажи и произведению
«Шаги» и шага цены:
Цена = лучший Оффер – Шаги * Шаг цены
Снять заявки Транзакция снятия всех активных заявок по инструменту
Закрыть все Транзакция создания заявки закрытия позиции с рыночной ценой
Важно: при ручной торговле по инструменту режим автоторговли по
ней следует отключить (т.е. перевести в режим ‘Off’):
4
9. Торговый робот Lbot 2.1
Руководство пользователя — 9 —
5. Описание конфигурации.
Конфигурация робота – обычный ini-файл.
Данные, находящиеся без заголовка раздела, относятся к роботу в целом:
FREQUENCY — Частота мониторинга рынка в миллисекундах;
Account — торговый счет;
PositionSize — сумма, на которую робот может торговать (в рублях);
xy — {top, left, width, height} - расположение и размер окна робота;
Заголовки разделов заключены в квадратные скобки «[ ]» и содержат параметры и правила
торговли по одной бумаге. Шрифт может быть кириллическим. Количество разделов (и
инструментов - неограниченно). Например [Sberbank]:
WorkSize — рабочий объем, в штуках;
Security —код бумаги, код класса и идентификатор бумаги на графике (например, SRU4,
SPBFUT, SR_Price);
OpenSlippage — проскальзывание при выставлении заявок, в шагах;
autoBot — {Y/N} –включать/не включать автоторговлю при нажатии кнопки “Start”;
OpenLong — правило входа в длинную позицию, например:
{Close, 1} > { High,2} — выставить лимитированную заявку на покупку при условии, что цена
'close' предыдущей полной свечи превысила 'high' предшествующего ей бара;
CloseLong — правило закрытия длинной позиции, например:
cross(maSR01, High, 1) and {Close} > {Close,2} — выставить лимитированную заявку на
продажу при условии, что индикатор maSR01 пересекает 'High' на предыдущей 'полной'
свече и при этом текущая цена превысила 'Close' бара №2 слева;
OpenShort — правило открытия короткой позиции, например:
{Close, 1} < {Low, 5-2} —цена 'close' предыдущей 'полной' свечи принизила 'low' 5-2 баров;
CloseShort — правило закрытия короткой позиции, например:
{Close } > {High, 5-1} —текущая цена превысила 'high' 5-1 баров;
StopLoss = 50 — правило закрытия позиции по стоп-лоссу (в пунктах);
TakeProfit = 50, 30, 5 — правило закрытия позиции по тэйк-профиту: стоп-цена, отступ,
защитный спрэд (в пунктах). Если тэйк-профит активирован (т.е. цена дошла до стоп-цены и
отклонения в пределах отступа) то, при завершении торговой сессии, её значение будет
перенесено на следующий сеанс.
Следует учитывать, что индикатор может вернуть одно или несколько чисел, в
зависимости от количества линий, отображаемых на графике. Робот отличает линии по
номерам, например Bollinger Bands с идентификатором ‘bb’: ‘bb.0’ – средняя линия, ‘bb.1’ –
верхняя, ‘bb.0’ – нижняя линия.
Порядок следования параметров и правил может быть любым.
При наличии правила OpenLong и отсутствии правила OpenShort (или в том случае, когда
эта строка закомментирована) робот торгует только от покупки. Верно и обратное: при наличии
OpenShort и отсутствии OpenLong торговля идет только от продажи.
При наличии правила OpenLong и (или) OpenShort обязательно должно быть правило
закрытия позиции:
а) CloseLong и (или) CloseShort;
б) StopLoss и TakeProfit;
в) CloseLong и (или) CloseShort совместно со StopLoss и TakeProfit.
10. Торговый робот Lbot 2.1
Руководство пользователя — 10 —
Пример настройки робота на один инструмент:
;-------------------------------------------------------------------------------
FREQUENCY = 200 // Частота мониторинга рынка в миллисекундах;
account = SPBFUT01ххх // торговый счет;
PositionSize = 31000 // сумма, на которую робот может торговать (в рублях);
xy = 0, 450, 780, 160 // {top, left, width, height} - расположение и размер окна робота;
;-------------------------------------------------------------------------------
[Sberbank] // заголовок раздела;
;-------------------------------------------------------------------------------
Security = SRU4, SPBFUT, SR_Price // код бумаги, код класса, идентификатор;
WorkSize = 3 // рабочее количество (лоты);
OpenSlippage = 20 // допустимое проскальзывание на сделке (в пунктах);
autoBot = Y // включить автоторговлю при загрузке робота;
OpenLong = {Close, 1} > {High, 2} // цена 'close' предыдущей 'полной' свечи превысила 'high'
//предшествующего ей бара;
CloseLong = cross(maSR01, High, 1) and {Close} > {Close,2}
// индикатор maSR01 пересекает 'High' на предыдущей 'полной' свече
// и при этом текущая цена превысила 'Close' бара №2 слева, начиная с текущей нулевой свечи;
OpenShort = {Close, 1} < {Low, 5-2} // цена 'close' предыдущей свечи принизила 'low' 5-2 баров;
CloseShort = {Close} > {High, 5-1} // текущая цена свеча превысила 'high' 5-1 баров;
StopLoss = 50 // ограничение величины убытков (в пунктах);
TakeProfit = 50, 30, 5 // тэйк-профит: стоп-цена, отступ, защитный спрэд (в пунктах);
;-------------------------------------------------------------------------------
6. Техническая поддержка
Для получения технической поддержки по данному программному обеспечению
следует использовать следующие контакты:
E-Mail: hismatullin.h@gmail.com
Skype: hismatullin.h
В случае возникновения какой-либо проблемы для наиболее быстрого и полного ее
решения следует предоставить разработчику следующую информацию:
Подробное описание проблемы и полные тексты сообщений об ошибках (если есть);
Скриншот терминала на момент возникновения проблемы, включающий
изображение таблицы заявок и сделок, а так же график цены рабочего инструмента;
Файл протокола log log_ yyyy.MM.dd.csv этого торгового дня.