Market Vectors / Financial One

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

6355

[Евгений Ерошкин]

Скачать коды к Шагу 4

В предыдущих номерах журнала мы создали все необходимые «запчасти» для построения торгового робота. Теперь соберем все элементы системы в единый «организм» и протестируем его работу.

Окончание.

Предыдущие материалы в F&О №8–9,10,11 за 2011 год. Опубликованные в статьях коды программы на языке Qpile можно скачать на странице журнала: www.fomag.ru.

Как было отмечено в F&O №8–9 за 2011 год, наш робот реализует стратегию торговли в канале, но заранее заданный статичный канал остается актуальным для работы в течение очень короткого отрезка времени, особенно при высокой волатильности. Поэтому, как и было задумано, сделаем его динамическим, то есть уровни покупки/продажи будут рассчитываться в каждом цикле. При этом в качестве отправной точки используем значение технического индикатора «скользящая средняя»: исходя из этого уровня будем определять верхнюю и нижнюю границы канала.

График

Для этого будем обращаться к графику «скользящая средняя» (Moving Average) для получения текущих значений. Воспользуемся оператором GET_CANDLE_EX, который позволяет считывать значения технических индикаторов. При этом можно использовать текущее время, которое автоматически округляется до времени текущей свечи, что упрощает процесс обращения к графическим индикаторам. Для удобства и унификации частей торгового робота чтение значений графиков реализуем в виде отдельной функции, но для начала зададим Moving Average на нашем ценовом графике и присвоим ему идентификатор SRZ1_EMA (см. рис. 1). Скользящую среднюю построим на минутках со следующими характеристиками: 20 периодов, экспоненциальный метод расчета.

Рис. 1 Присваиваем идентификатор «скользящей средней»

Eroshkin1.png

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

EMA=SecCode&"_EMA" '

Название графика

Код функции чтения текущих значений индикатора приведен в справке.

Аргументом для этой функции будет имя графика (EMA), а выходным параметром - массив типа «коллекция», который содержит: в ячейке под номером 0 время текущей свечи, а в ячейках под номерами 1,2,3 и так далее значения линий графиков. В рассматриваемом примере технический индикатор «скользящая средняя» представляет собой одну линию, поэтому используется только ячейка под номером 1. Но есть индикаторы, состоящие из нескольких линий (ADX, MACD), в этом случае значения последних будут последовательно записываться в ячейки 1,2,3 и так далее. В теле программы обращение к функции осуществляется следующим образом:

' Получаем значение

скользящей средней

GRAFF = GRAF (EMA)

EmaExp =0+ GET_

COLLECTION_

ITEM(GRAFF,1)

В результате обращения переменная EmaExp будет содержать текущее значение «скользящей средней». Если график отсутствует или его имя не совпадает с переменной EMA, EmaExp равно 0, то есть наши уровни также окажутся нулевыми, а это приведет к ошибочным сигналам, так как цена спроса всегда будет больше 0. Также функция может возвращать нулевые значения в моменты формирования новой свечи. Многие технические индикаторы рассчитываются на основе уровней свечи (OPEN, HIGH, LOW, CLOSE), в том числе и «скользящая средняя», и мы можем наблюдать ситуацию, когда время новой свечи уже стало отсчитываться (например, 15 часов 10 минут и 03 секунды), но при этом не было проведено ни одной сделки. Поэтому новая свеча не начала формироваться (свечи рассчитываются на основе сделок), и в этот промежуток времени – от начала отсчета новой свечи до первой сделки – мы получим нулевое значение «скользящей средней».

Кроме того, при чтении значений технических индикаторов необходимо обращать внимание на текущее время. Дело в том, что в связке «терминал-сервер-биржа» присутствует три времени: компьютера, на котором установлен QUIK, сервера, к которому подключен терминал, и самой биржи. В идеале время на них должно совпадать, однако на практике это не всегда так. Время компьютера может существенно отличаться от серверного, поэтому важно, какое из них мы используем для обращения к графикам. Из-за разницы между ними можно получить значения разных свечей. Например, при расхождении в 5 секунд – 15ч10м03с и 15ч09м58с – для минутного графика имеем в первом случае свечу 151000, а во втором – 150900. Причем, если первой еще не существует, получим нулевое значение. В представленной выше функции для чтения значений графиков используется серверное время, однако в любом случае целесообразно минимизировать расхождение между компьютером и сервером. Это можно сделать, настроив синхронизацию часов компьютера с каким-либо NTP-сервером. Очевидно, когда мы получаем нулевое значение графика, производить расчеты нельзя, поэтому сделаем проверку значения индикатора на отличие от нуля.

' Проверяем на отличие

от 0

IF EmaExp = 0

SET_ROW_COLOR_EX

(1, "RGB(255,128,0)",

"DEFAULT_COLOR",

"RGB(0,0,255)",

"RGB(0,0,255)")

RETURN

ELSE

SET_ROW_COLOR_EX

(1, "DEFAULT_COLOR",

"DEFAULT_COLOR",

"DEFAULT_COLOR","DEFAULT_

COLOR")

END IF

Если значение равно 0, программа переходит к следующему циклу, при этом строка в таблице подсвечивается красным цветом, генерируя сигнал о том, что с графиком что-то не так.

Sh4Sp1.jpg

Стратегия

Когда значение «скользящей средней» получено, рассчитываем уровни покупки/продажи:

' Рассчитываем уровни

канала

LowLevel = EmaExp*(1-

Width/200)

HiLevel =

EmaExp*(1+Width/200)

При этом «ширину» канала будем задавать в процентах (переменная Width) от EmaExp. Величину защитного стоп-ордера также определяем в процентах от «ширины» канала (wStopLoss, см. F&O №11, 2011).

Width = 0.8 ' Ширина

канала в %

wStopLoss = Width*0.3 '

Ширина стоп-лосса – 30%

от канала

Далее сравниваем лучшие цены спроса/предложения с рассчитанными уровняуми и при выполнении условий осуществляем покупку/продажу. Соответствующий код программы приведен в справке.

Продажа контрактов происходит при выполнении нескольких условий (для покупки условия будут симметричными):

· Баланс по инструменту (nContract) больше или равен 0;

· Цена спроса (PriceBid) больше или равна расчетной цене верхнего уровня (HiLevel);

· Отсутствуют активные заявки по данному инструменту (FlagOrder=0).

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

Sh4Sp3.jpg

Результаты

Фактически мы имеем стратегию торговли по индикатору Envelope (конверт), только уровни рассчитываются самостоятельно, а не определяются исходя из графика. Пример работы робота представлен на Рисунке 2.

Рис. 2 Технический индикатор Envelope и сделки робота

Eroshkin2.png

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

· Временной интервал графика;

· Количество периодов и метод расчета «скользящей средней»;

· Период расчета алгоритма;

· Ширина (Width) канала (конверта);

· Глубина стоп-лосса (wStopLoss);

· Количество торгуемых контрактов (Unit);

· Величина проскальзывания (Slip).

Оперируя этими параметрами, можно варьировать работу робота в широких пределах – от единичных сделок в месяц до нескольких сотен в день (если ширину канала сделать очень узкой и минимизировать период расчета Moving Average). В рассмотренном примере мы использовали минутный график, экспоненциальную «скользящую среднюю» с периодом расчета 20, при этом ширина канала составляла 0,8%. Очевидно, что с увеличением временного интервала графика и количества периодов канал надо расширять, поскольку, чем больший промежуток времени мы рассматриваем, тем в более широком диапазоне движется цена. В любом случае подбор оптимальных параметров целесообразно проводить с помощью программ технического анализа на исторических данных (MetaStock, Omega и тому подобные).

LOG-файл

Как было отмечено ранее (F&O №10, 11, 2011), наш робот все свои активные действия записывает в LOG-файл (фрагмент представлен в справке). Используя сделанные записи, можно проанализировать работу программы.

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

Sh4Sp4.jpg

Заключение

Итак, мы создали полноценного торгового робота – программу, которая самостоятельно принимает решения об открытии позиций, выставляет заявки и отслеживает их исполнение. Если посмотреть на конечный код (полный код можно найти на сайте журнала www.fomag.ru), нетрудно заметить, что львиную долю занимают служебные функции, которые с успехом можно использовать при написании других торговых автоматов. Сама же стратегия занимает лишь около 10% кода.

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

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

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

Sh4Sp2.jpg





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

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