Market Vectors / Financial One

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

4856

Пишем робота. Шаг 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)
Оставить комментарий
Отправить
Новые статьи
  • Российский нефтегазовый сектор в 2026 году: готов ли к геополитическому давлению? Дайджест Fomag
    Андрей Адауров 18.02.2026 13:35
    15

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


    more

  • На мировых рынках продолжается глобальный рост на фоне праздников в Азии
    Максим Абрамов, аналитик ФГ «Финам» 18.02.2026 12:57
    96

    В среду, 18 февраля, на мировых рынках сохраняется позитивная динамика. Американские фондовые индексы по итогам предыдущих торгов показали позитивную динамику. Японский и австралийский рынки демонстрируют рост. Биржи материкового Китая, Гонконга и Южной Кореи закрыты в связи с празднованием Нового года по лунному календарю. Европейские рынки также торгуются в плюсе.more

  • Прибыль ДОМ.РФ в 2025 году выросла на 35%
    Владимир Чернов, аналитик Freedom Finance Global 18.02.2026 12:45
    88

    ДОМ.РФ по итогам 2025 года показал один из самых сильных финансовых результатов среди публичных компаний. Чистая прибыль компании по МСФО выросла на 35% год к году (г/г), до 88,8 млрд руб., рентабельность капитала достигла 21,6%, а активы увеличились на 15% г/г и превысили 6,4 трлн руб. Этот результат был обусловлен повышением процентных и комиссионных доходов, а также масштабированием ипотечного и инфраструктурного бизнеса при контролируемом уровне риска.more

  • Почему растут акции золотодобывающих компаний и есть ли в этом риск? Дайджест Fomag
    Ксения Малышева 18.02.2026 11:55
    127

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