Market Vectors / Financial One

Пишем робота “по шагам”: Шаг 2

4586

Пишем робота. Шаг 2.

Robots ris 10.jpg[Евгений Ерошкин, частный инвестор]

F&O №10, 2011 Скачать коды к Шагу 2






Айзек Азимов в 1942 году сформулировал три главных закона для робота, которые направлены на защиту человека. Сегодня мы сформулируем некоторые «законы» и для торгового автомата, но они будут нацелены на защиту торгового счета.

Продолжение. Начало читайте в F&O №8–9, 2011.

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

Итак, наша программа (см. F&O №8–9, 2011, код можно скачать с сайта журнала http://fomag.ru/articles/write_the_robot_moves.php) уже выдает советы по покупке/продаже активов. Осталось снабдить ее функциями выставления заявок, и мы получим полноценного робота. Но торопиться не стоит. Если портфель загружен в Quik, он начинает работать с запуском самого терминала, а это не совсем корректно, поскольку программа может пытаться выставлять массу ошибочных заявок еще до того, как загрузятся все данные. Важно, чтобы робот начинал работу лишь тогда, когда Quik успел получить необходимую биржевую информацию. Кроме того, не будем забывать, что Quik обрабатывает все портфели последовательно, а не параллельно. То есть, если в одной из программ возникнет ошибка, она может остановить и все остальные портфели, что, в зависимости от алгоритма, может привести к прямым или косвенным убыткам. Это подчеркивает необходимость сохранения работоспособности робота в любой ситуации. Проанализировав различные ситуации, возникающие в процессе торговли, сформулируем некоторые правила, которых должен придерживаться наш робот:

1. Начало работы по заданному алгоритму необходимо осуществлять только при наличии соединения с сервером;

2. Расчет основной стратегии производится только при наличии актуальных данных;

3. Стратегия работает только в то время, когда идут торги по текущему инструменту;

4. Выставление заявок на покупку/продажу производится только при наличии необходимой суммы на счете для ее обеспечения;

5. Нельзя открывать новые позиции, если общая сумма на депозите ниже заданного уровня;

6. Робот постоянно находится в рабочем состоянии.

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

Торопиться не надо

Если программа не была остановлена перед закрытием терминала, она начинает работать сразу, как только загружается Quik. Однако в этот момент последний начинает загружать данные с сервера, и получается, что в первые секунды работы он еще не располагает актуальными данными о состоянии торгов и счета клиента. Поэтому будет не лишним, если мы сделаем искусственную задержку, то есть основной алгоритм начнет работать только через некоторое время после старта терминала. Самый простой способ реализовать это – сделать задержку в несколько секунд внутри самой программы. Поскольку все портфели, загруженные в Quik, обрабатываются последовательно, задержка в одном из них может сказаться и на остальных. Поэтому задержку целесообразно реализовать в виде пустых циклов. Такое решение не будет оказывать влияния на другие программы. Для этого в начале кода зададим две глобальные переменные (глобальная переменная сохраняет свое значение

между циклами). Одна будет определять количество пустых циклов, а другая – отсчитывать количество прошедших циклов:

NEW_GLOBAL ("Delay",10)

' Количество пустых

циклов

NEW_GLOBAL

("TIMER",0)

Далее в теле программы создадим условие:

IF TIMER <= Delay

TIMER = TIMER + 1

RETURN

END IF

Теперь наша программа не начнет расчет основного алгоритма, пока не пройдет 10 пустых циклов. Если период расчета портфеля равен одной секунде, задержка составит 10 секунд. Очевидно, что с увеличением периода расчета количество пустых циклов должно сокращаться. Вводя задержку, мы уменьшаем скорость реакции системы на происходящие изменения в этот момент, но это своего рода плата за отсутствие ошибочных сигналов.

Функция контроля ситуаций

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

Функции в Qpile могут иметь исходные аргументы и возвращать результат. Наша функция начальных аргументов иметь не будет. Результатом ее выполнения станет соответствующее название ошибки (ситуации), или, например, она будет возвращать «ОК», если все условия нормальной работы выполняются.

При написании функций желательно использовать имена переменных, которые не пересекаются с переменными в основной программе. Одинаковые переменные в теле основной программы и функции могут привести к их пересечению, а это может породить некорректные расчеты или «зацикливание». Последнее наиболее вероятно при вызове функции из цикла «FOR …FROM …TO….».

В нашем случае функция контроля вызывается из основного тела программы, а результат будет присваиваться переменной, значение которой мы будем выводить в таблицу:

ERR = Control()

IF ERR<>"OK"

DELETE_ALL_ITEMS()

output=CREATE_MAP()

output=SET_

VALUE(output,"TIME" ,

ERR)

ADD_ITEM(1,output)

RETURN

END IF

Сама функция для удобства восприятия будет располагаться в конце программы. Если функций много, их можно подключить через отдельный файл (см. Руководство пользователя Quik. Раздел 8).

Каждая функция оформляется следующим образом:

FUNC Control()

[Тело функции]

END FUNC

Функция контроля будет состоять из нескольких блоков, каждый из которых отвечает за определенную ошибку.

Отсутствие соединения с сервером. Для контроля коннекта существуетспециальный оператор IS_CONNECTED(), который возвращает «1», если соединение установлено:

IF IS_CONNECTED()<>1

Result = "ErrorConnection"

' Ошибка соединения с

сервером

TIMER=0

Return

ELSE

Result = "OK"

END IF

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

Время торговой сессии. Основная торговая сессияна FORTS начинается в10:00 и заканчивается в23:50 мск, при этом имеетсядва перерыва на клиринг:дневной длится с 14:00 до14:03, а вечерний – с 18:45до 19:00 мск (до 19:10 в дниэкспирации опционов).Следовательно, программа должна работать поалгоритму, только когдаидут реальные торги, а востальное время она находится в режиме ожидания.Фрагмент программногокода, который проверяеттекущее время, представлен в справочной информации к статье.

SP 10-1.jpg

Главное – вовремя остановиться. Умениеостановиться вовремя ине торговать, когда уже до-пущено много ошибок, может сберечь значительнуюсумму любому трейдеру.Наделим этой способностью и нашего робота.Если размер счета станетменьше заранее заданногоуровня (в качестве примера зададим минимальныйуровень в 50 тыс. рублей),программа не будет открывать новые позиции.Тем самым наш счет будетзастрахован от полногоопустошения в случаебольшого количества убыточных сделок. Фрагменткода, который приводит костановке открытия новыхпозиций при достиженииопределенной величиныпросадки счета, представлен в справочной информации к статье.

SP 10-2.jpg

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

Unit = 1 ‘ Количество

контрактов для одной

сделки

WARRANTY =0

+ GET_PARAM

(ClassCode,SecCode,

"BGONP") ' Размер

гарантийного обеспечения

IF AvailableMoney <

(2*WARRANTY*Unit) AND

nContract = 0

Result ="ErrorWarranty" '

Не хватает средств для ГО

Return

ELSE

Result = "OK"

END IF

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

ExpDays =0 + GET_

VALUE(GET_PARAM_EX

(ClassCode,SecCode,

"DAYS_TO_MAT_DATE"),

"PARAM_IMAGE")

IF ExpDays <= 2 AND

nContract = 0

Result ="ErrorEXP" ' До

исполнения менее 2-х дней

Return

ELSE

Result = "OK"

END IF

Все ходы записаны

Важным нюансом в роботорговле является контроль работы автомата. Трейдер должен видеть и понимать, что он делает, а для этого необходимо располагать всей историей его сделок. С этой целью мы будем документировать действия робота, чтобы в дальнейшем можно было проанализировать его алгоритм. Все активные действия программа будет записывать в log-файл. Для этого зададим имя последнего и укажем путь к нему:

File = "C:\

Qpile\”&Seccode&”_Robot.

log”

В приведенном выше примере файл будет размещен на диске «C:» в папке «Qpile», которую предварительно требуется создать. Или можно указать любую другую директорию. Имя файла будет начинаться с обозначения инструмента, в нашем случае оно будет иметь вид «SRZ1_Robot.log» (SRZ1 – код декабрьского фьючерса).

Пока наш робот не предпринимает активных действий, поэтому в файл будем записывать только сам факт начала работы. Это будет делаться единожды, при первом запуске программы. Чтобы запись делалась только один раз, создадим специальное условие:

NEW_GLOBAL

("FirstTime",1)

IF FirstTime = 1

WRITELN (File, SERVER_

TIME&" START")

FirstTime = 0

END IF

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

Итог

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

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

Продолжение - Шаг 3.

Понятия:

Айзек Азимов (Исаак Юдович Озимов, Isaac Asimov, 1920–1992) –американскийписатель-фантаст, биохимик, популяризаторнауки. Автороколо 500 книг, в основном художественных(в жанре научной фантастики) и научно-популярных. Некоторые термины из его произведений, например, «robotics»(робототехника), прочно вошлив английскийи другие языки.

log-файл – файл с записями о событиях в хронологическом порядке.

Цикл – разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. В более широком смысле это любая многократно исполняемая последовательность инструкций.

Директория (от англ.directory –«справочник»,«указатель»)– объект в файловой системе,упрощающийорганизацию файлов. Позже былвведен термин «папка» дляпредставленияобъектов файловой системыв графическомпользовательскоминтерфейсепо аналогиис офиснымипапками.

«Зацикливание» (в программировании) – состояниепрограммы, вошедшей в цикл, условиевыхода из которого никогда невыполняется (бесконечный цикл).





Вернуться в список новостей

Комментарии (0)
Оставить комментарий
Отправить
Новые статьи