Забыли пароль?

Зарегистрироваться на сайте

Отменить

Запрограммированная прибыль

Колодин Денис, Журнал D` (Д-штрих) №06 (66), 23 марта 2009 года

Как создать торговую систему в программе для технического анализа AmiBroker

Непросто встретить врача, который скажет: «С вашим здоровьем что-то не так!», или инженера, который рассуждает: «Мне кажется, эта модель автомобиля должна ездить». Но именно так думают множество трейдеров, и их тайные желания постоянно искажают их торговые методы. Как писал Роберт Прадо (*сноска 1: Роберт Прадо, «Разработка, тестирование, оптимизация торговых систем для биржевого трейдера»), подобная неопределенность характерна для незавершенной торговой идеи.

В предыдущем номере журнала D` (см. «Непроторе нный теханализ») мы описали вопросы установки, настройки и достоинства программы AmiBroker. В этой же статье я предлагаю вам способ оформить ваши торговые идеи в виде алгоритмов, которые, на мой взгляд, совсем несложно описать в программе на встроенном языке AmiBroker Formula Language (AFL). Программы на AFL создаются во встроенном редакторе Formula Editor (меню Analysis — Formula Editor).

Элементарная математика

Уведомления трейдеру

Вы можете задать воспроизведение звукового сигнала, запуск программы или отправку извещения по e-mail или SMS. Моя личная реализация работает с платными веб-сервисами и написана как дополнение к AmiBroker, но вы можете поступить проще.

Операторы сотовой связи предоставляют сервисы что-то вроде e-mail to MS, которые позволяют получать все письма с электронного почтового ящика как SMS-сообщения. Вы подключаете подобный сервис, получаете ящик вида 0123456789@operator.ru и указываете отправлять все извещения о покупке / продаже на эту почту (правда, вам понадобится еще ящик, с которого AmiBroker будет отправлять сообщения).

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

Начнем с основ. Любая программа состоит из переменных и действий над ними (операторов). Переменная служит для хранения данных и может содержать строку, число, массив чисел, то есть она должна иметь определенный тип и организацию. Значения переменным задаются с помощью оператора присваивания «=» (не путайте с равенством).

Например, вы можете написать:

x = 5;

Обратите внимание, что в конце строки стоит точка с запятой — это разделитель, который логически отделяет одно выражение от другого. После ввода формулы вам необходимо ее верифицировать, то есть проверить на соответствие синтаксису языка AFL, или, проще говоря, узнать, понимает ли компьютер то, что вы пытались написать. Для этого выберете в меню редактора Tools — Verify Syntax. Помните, что при отсутствии синтаксических ошибок ничто не убережет вас от логических изъянов.

В AmiBroker есть зарезервированные переменные, представляющие собой доступные ценовые данные за указанный период по определенному инструменту. Это переменные Open (цена открытия), High (максимум), Low (минимум), Close (цена закрытия), Volume (объем), OpenInt (открытый интерес), Avg (средняя цена). Например, массив Close содержит все цены закрытия. Самый первый элемент массива — это цена закрытия самой ранней торговой сессии из доступных, а последний — цена закрытия самых последних торгов. Иными словами, элементы упорядочены хронологически. Одно из преимуществ AFL — возможность выполнять арифметические операции над массивами без обращения к элементам по отдельности. Например, чтобы получить массив, значения которого соответствуют разности максимума и минимума каждой торговой сессии, достаточно записать High — Low. Это сильно упрощает написание программы.

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

Следующее, что необходимо знать, — это способ указания сигналов к покупке / продаже. Для этого также используются массивы: Buy (сигналы к покупке), Sell (сигналы к продаже), Short (сигналы к продаже без покрытия), Cover (сигналы к покрытию). Например, вы хотите покупать, когда сессия закрылась выше открытия, для этого нужно написать:

Buy = Close > Open;

Здесь использовался оператор сравнения, к которым относятся: > (больше), < (меньше), == (равно), >= (больше или равно), <= (меньше или равно), != (не равно). Для обращения к данным, сдвинутым на определенное количество торговых дней, используется функция Ref (массив, смещение). Например, вы хотите подавать сигнал к покупке, когда торги закрылись выше вчерашних цен, и сигнал к продаже, когда торги закрылись ниже вчерашнего минимума. Это можно описать так:

Buy = Close > Ref (Close, –1);

Sell = Close < Ref (Low, –1);

Следующей полезной функцией AFL является функция Cross (массив 1, массив 2), которая возвращает массив с логическими значениями, сигнализирующими о пересечении значений. Сигнал подается, когда значения первого массива больше второго. Например, вы хотите запрограммировать стратегию пересечения скользящих средних, построенных по ценам закрытия, с периодами 12 и 26:

Buy = Cross (MA(Close, 12), MA(Close, 26));

Sell = Cross (MA(Close, 26), MA(Close, 12));

Теперь посмотрим, какие сигналы подаст система. Для этого в меню выберем Tools — Send to Auto Analysis, после чего с этой формулой можно будет работать в анализаторе Auto Analysis.

Когда вы увидите окно анализатора (схема  1), имя файла с формулой уже будет указано в поле Formula File. В группе Apply to вы можете выбрать инструменты, над которыми будет проводиться анализ. Я пока буду работать с одним инструментом, для чего выберу Current Symbol. Вариант All ymbols будет анализировать все инструменты, а Use Filter позволит отбирать инструменты по определенным критериям.

Нажав кнопку Scan, вы увидите все сигналы к покупке и продаже акции, в моем случае — «Ростелекома». Если дважды щелкнуть по таблице, то на графике (схем а 2) появятся стрелки (*Сноска 2 Если на графике стрелки не отобразились, возможно, отключено их отображение. Для этого выберете во всплывающем меню графика пункт Parameters, затем на вкладке Axes & Grid появившегося окна укажите значение Yes для параметра Show Trading Arrows), которыми обозначены моменты пересечения скользящих средних. Режим сканирования предназначен только для принятия сигналов, в нем вы можете также получать извещения (Alerts). Для этого придется внести небольшое дополнение в код:

AlertIf (Buy, «», «Покупай!», 1);

AlertIf (Sell, «», «Продавай!», 2);

В этом примере используется функция AlertIf (сигналы, команда, сообщение, тип). Обратите внимание, что в качестве алертов я использую сигналы к покупке и продаже, полученные ранее. Но ничто не мешает вам в качестве сигнала использовать любое логическое выражение, например индекс относительной силы RSI(14) < 20. Команда позволяет указать действие при появлении сигнала.

Посмотрим, какие сигналы подаст мне система, для чего открою окно Alerts Output через главное меню View — Alert Output. В окне анализатора выберу All Quotations, затем еще раз нажму Scan, теперь в окне Alerts Output вы увидите рекомендации (схе ма 3).

Тестирование стратегии

Теперь рассмотрим тестирование стратегий (Backtest) — получение отчета о работе стратегии и построение кривой дохода для созданной стратегии. Просто нажмите кнопку Backtest. Вы запустили симулятор, который имитирует совершение сделок на виртуальном счете на прошлых ценовых данных. Внизу анализатора, в строке состояния, отображается результат, который бы вы получили, если следовали этой стратегии. Для подробного отчета нажмите Report (схема  4). Отчет содержит общий и годовой доход, величину просадки, среднюю прибыль в сделке и т. п. Однако только одного отчета, как правило, недостаточно, визуальная оценка кривой доходности также важна для понимания эффективности стратегии. Нажмите кнопку Equity. Под графиком цены отобразится кривая капитала (схе ма 5). Результат выглядит неплохо даже для столь простой стратегии, но как всегда важна дисциплина — ее сигналы нужно четко исполнять.

Другой полезной возможностью анализатора является исследование рынка. Смысл этой процедуры состоит в отборе инструментов по заданному критерию. Например, вы внутридневной трейдер и торгуете только теми акциями, индекс относительной силы (RSI) которых за предыдущую сессию держался в диапазоне от 40 до 60. Для этого в редакторе формул введем следующее:

Indicator = RSI(14);

Filter = Indicator > 40 AND Indicator < 60;

AddColumn (Indicator, «RSI»);

Здесь я сначала вычисляю RSI и сохраняю значения в переменную Indicator, которую ввел только для повторного использования, чтобы не вычислять индекс постоянно. Переменная Filter зарезервированная, ее назначение схоже с переменными Buy и ell. Она тоже представляет собой массив логических значений, которые соответствуют торговым сессиям. Выражение Indicator > 40 AND Indicator < 60 истинно (то есть равно 1), когда значения индикатора больше 40 и меньше 60. Вызов функции AddColumn (индикатор, название) обязателен. Эта функция выводит значения массива в колонку таблицы в окне анализатора. Массив может содержать любые данные, например цену закрытия торгов. Количество колонок также неограниченно. Я буду исследовать все доступные акции за последний торговый день. В группе Range выберу «n last days» (данные за n последних дней, по умолчанию выбрано All Quotation, то есть все доступные данные), а в поле n введу 1, то есть данные за последний день. Пора нажать Explore (не забудьте указать формулу, с которой работает анализатор). В итоге получим список (схема  6). С помощью этого алгоритма и переменной Filter также можно отбирать инструменты, по которым будут генерироваться сигналы.

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

Анализатор стратегий

Сигналы стратегии

Alert

Отчет по тестированию

График цены и Equity

Фильтрация бумаг


Мои портфели
Индикаторы
Индексы
MICEXINDEXCF2 047,42–0,4606.03
RTSI1 110,46+0,2006.03
Акции
GAZP134,60–0,1506.03
GMKN9 324–0,1306.03
LKOH3 079–0,2106.03
ROSN332,0–1,3406.03
SBER162,00–1,4606.03
VTBR0,06600,0006.03
Курсы валют
EUR68,21–0,3321.01
USD61,47–0,0721.01
EUR/USD1,09–0,5331.12
GBP/USD1,47–0,4331.12
USD/JPY120,17–0,2831.12
EURUSD_TOM1,060,0006.03
EUR_TODTOM0,02–0,0406.03
USD_TODTOM0,02–0,0306.03
Мировые рынки
Dow17 473,32–0,7431.12
FTSE6 242,32–0,5131.12
Nikkei 22519 033,71+0,2730.12
S&P 5002 049,94–0,6531.12
Золото1 059,98–0,1231.12
Нефть Brent37,6+3,1331.12