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

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

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

Правила управления объемом позиции. Объем позиции будет изменяться в зависимости от состояния условного торгового счета. Объем позиции будет увеличиваться при увеличении торгового счета и уменьшатся при уменьшении его.

Для нашей торговой системы будем использовать исторические данные цен фьючерса на нефть марки Brent за три месяца.

Рассмотрим подробнее работу с объемом позиции. Первоначальный размер торгового счета будет равняться 100000 руб. на каждые 10000 руб. будет приходиться один фьючерсный контракт. Первоначальный объем позиции будет составлять: 100000/10000 = 10, т.е. 10 контрактов. Если торговый счет увеличится и будет равняться 110000 руб. то объем позиции будет равен 11 контрактов. Если торговый счет будет больше 110000 руб. но меньше 120000 руб. то объем позиции останется равен 11 контрактов и только после того как размер торгового счета станет равен или более 120000 руб. тогда мы увеличим объем до 12 контрактов. Суть в следующем, при расчете объема позиции мы отбрасываем дробную часть. Точно таким же образом считается объем позиции при уменьшении торгового счета, например, если счет станет равным 92000 руб. тогда 92000/10000 = 9,2 отбросив дробную часть числа, получим 9 контрактов.

Рассматриваемая торговая система достаточно проста, но после составления полного кода скрипта у нас получится шаблон, на основе которого можно будет составлять гораздо более сложные торговые системы для тестирования.

Приступим. Для начала нам необходимы исторические данные, на которых мы будем тестировать систему. Исторические данные фьючерса на нефть марки Brent мы будем брать с сайта компании “Финам” www.finam.ru. Уточню, мы будем использовать фьючерсы, торгуемые на “Московской бирже” на Срочном рынке “ФОРТС”. Обратите внимание фьючерсы на нефть марки Brent экспирируются ежемесячно.

В этом примере будут использоваться следующие исторические данные:

— BR-8.17(BRQ7) с 01.07.2017 по 31.07.2017
— BR-9.17(BRU7) с 01.08.2017 по 31.08.2017
— BR-10.17(BRV7) с 01.09.2017 по 30.09.2017

Перейдя по ссылке ниже, Вы попадаете на сайт компании “Финам” в раздел “Экспорт котировок”.

https://www.finam.ru/profile/mosbirzha-fyuchersy/br-8-17-brq7/export/?market=17&em=465382&code=BRQ7&apply=0&df=1&mf=8&yf=2017&from=01.09.2017&dt=30&mt=8&yt=2017&to=30.09.2017&p=2&f=BRQ7_170901_170930&e=.txt&cn=BRQ7&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=5

В экспорте котировок на сайте “Финам” много котировок разных финансовых инструментов. Необходимо найти нужный инструмент и настроить наиболее подходящий формат файла. Ниже представлен скриншот экрана с настройками экспорта.

Скачайте исторические данные с сайта «Финам«. Если Вы получили коды скриптов с этого сайта, то файлы с историческими данными находятся в папке со скриптами под именами BR1.txt, BR2.txt, BR3.txt. Получить коды скриптов и исторические данные.

И так, данные есть. Теперь необходимо преобразовать формат записи данных в скаченных файлах, для того чтобы язык Lua смог прочитать файл. Как преобразовывать файлы в читаемый формат для языка Lua мы рассматривали в разделе “11. Запись и чтение файла”. Формат файла с историческими данными должен иметь следующий вид.

Столбец 1 – Дата;
Столбец 2 – Время;
Столбец 3 – Цена открытия свечи;
Столбец 4 – Цена максимума свечи;
Столбец 5 – Цена минимума свечи;
Столбец 6 – Цена закрытия свечи;
Столбец 7 – Номер файла по порядку.

С первыми шестью столбцами вопросов быть не должно, а вот столбец 7 рассмотрим чуть подробнее. Первый по порядку файл это BR-8.17(BRQ7) с 01.08.2017 по 31.08.2017 второй соответственно BR-9.17(BRU7) с 01.09.2017 по 30.09.2017 и третий BR-10.17(BRV7) с 01.10.2017 по 31.10.2017. В первом файле столбец 7 будет иметь цифру 1 на протяжении всех строк, второй будет иметь цифру 2 и третий 3. Этот столбец 7 нам необходим для закрытия позиции в последнюю минуту торгов фьючерса. Файлы должны выглядеть следующим образом.

Файлы сохраним под именами BR1, BR2, BR3 соответственно. Такие имена необходимы для использования в скрипте. В скрипте мы пропишем цикл, который будет последовательно открывать файлы. При первой итерации скрипт откроет BR1 при второй итерации BR2 и при третьей BR3. Такой принцип именования файлов предоставляет возможность открывать большое количество файлов, используя лишь несколько строк кода.

Данные, на которых будет производиться тестирование торговой системы, готовы. Теперь мы можем приступить к написанию скрипта. Создадим новый скрипт с именем «018 Тестирование на исторических данных.lua».

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

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