Прибыльная торговая система: программирование
В этой публикации мы затронем не только теоретические аспекты создания прибыльной торговой системы, но и рассмотрим такой технический момент, как написание конкретной торговой системы на языке программирования C# для платформы ATAS.
Простыми словами мы расскажем, как поэтапно создать собственную торговую систему и проверить ее на исторических данных с помощью ATAS.
Читайте далее:
- Что такое торговая система?
- Какая должна быть торговая система?
- Шаги построения собственной торговой системы.
- Запуск в работу новой торговой системы.
Данная публикация может стать вашей отправной точкой в увлекательный мир программирования торговых систем. Даже если у вас отсутствует опыт написания программ, то следуя нашим рекомендациям ниже, вы в будущем сможете самостоятельно разрабатывать торговые системы и роботов при помощи аналитической платформы ATAS.
Такое направление является эффективным благодаря большому количеству уже написанных программных модулей в системе ATAS, которые позволяют работать с биржевыми данными — получать объемы, использовать встроенные индикаторы, распознавать графические паттерны и пр.
Введение
Если вы еще не читали наши публикации, которые делают небольшую экскурсию в систему алгоритмической торговли, то рекомендуем вам с ними ознакомиться по ссылкам ниже:
Что такое торговая система?
Торговая система — это свод правил, описывающих действия на бирже.
Например, если вы открываете свою позицию исключительно от уровня, там где цена ранее “нарисовала” high или low, можно с уверенностью сказать, что вы используете торговую систему. Причем если система успешная, то прилежное выполнение ее правил обеспечит рост торгового капитала.
Этих правил и принципов может быть сколь угодно (желательно — не усложнять), важно не количество, а качество правил. И четкое их соблюдение.
Если торговая система имеет четкие правила без оценочных человеческих суждений — она может превратиться в торгового робота.
Рождение торговой системы
Как и человек, который сразу после рождения не умеет ходить и говорить, так и прибыльная торговая система не рождается сразу прибыльной.
Прежде чем торговая система начнет наращивать счет, она проходит несколько обязательных этапов, которые можно оформить следующим списком:
- идея торговой системы;
- написание программного кода торговой системы;
- проверка на истории;
- проверка на текущих котировках;
- внесение необходимых доработок;
- реализация в окончательном варианте.
На самом деле, понятия торговая система и алгоритмическая торговля берут начало в разных плоскостях, но когда они воплощаются в жизнь, то разница между ними аннулируется.
Все дело в том, что идея торговой системы может появиться в голове трейдера, но без реальной проверки рынком оценить ее “гениальность” еще невозможно.
Например (см. картинку ниже), если вы несколько дней подряд фиксируете удачную отработку вашей идеи, то может показаться, что вы нашли грааль (1), но для прибыльной торговой системы этого совсем недостаточно. Биржевой рынок — очень перманентная среда, которая постоянно претерпевает изменения. Поэтому на длительной временной дистанции прибыль может превратиться в убыток (2).
Это означает, что любая идея, какой бы хорошей она ни казалась на бумаге, требует тщательной проверки для начала на исторических данных, а впоследствии — на данных реального времени.
Проверка торговой системы
А теперь поговорим про то, каким образом проводить проверку своей торговой системы.
Если вы очень упорный и целеустремленный человек, то вы можете проанализировать каждый день в течение нескольких месяцев, честно записывая все результаты в блокнот или электронную таблицу, а в конце сделать итоговый расчет.
Если же вам не хватает терпения (времени и сил), вы можете самостоятельно написать программу или пригласить специалиста, который напишет вам программу.
Преимущества второго способа очевидны:
- программа выполнит за пару секунд работу, на которую вам придется потратить неделю;
- в программу можно вносить коррективы, вводить и менять различные коэффициенты, что позволит не только проверять эффективность работы торговой системы, но и выбирать наиболее оптимальные соотношения коэффициентов, находить зависимости и закономерности.
- в программу можно внедрить нейросети, которые сами найдут наилучшие соотношения всех коэффициентов и рассчитают оптимальные алгоритмы.
Если торговая система покажет на истории хороший результат (с учетом брокерских и биржевых комиссий), то тогда по этой системе нужно делать торгового робота, который будет самостоятельно открывать сделки на бирже, ставить тейк и стопы.
Преимущества алгоритмической торговли очевидны:
- торговый робот никогда не устает;
- у торгового робота отсутствуют эмоции, которые очень часто мешают трейдеру;
- торговый робот никогда не нарушает риск-менеджмент и мани-менеджмент.
Итак, мы утвердились в целесообразности перевода торговой системы в программный код.
Далее рассмотрим практические рекомендации по тому, как это сделать.
Шаги построения собственной торговой системы.
Платформа ATAS имеет в арсенале множество индикаторов, которые позволяют визуально отслеживать паттерны и зависимости в поведении цены.
Наблюдая за ними, у вас наверняка появятся идеи торговой системы.
Простейший пример. Вы часто можете замечать, как цена реагирует на уровень, сформированный повышенным объемом, или на линии, сформированные скользящими средними (на графике ниже).
Тут представлена динамика цены фьючерса на индекс S&P500 за 2019-2020 годы с дневным таймфреймом. Каждый раз, когда график приближается к двухсотой скользящей средней, индекс выкупают, и цена продолжает расти. Линия SMA200 выступает как бы уровнем поддержки и не позволяет рынку обвалиться. Для того, чтобы пробить уровень SMA200, потребовалось событие, которое нам с вами известно, как пандемия из-за распространения коронавируса.
Очень вероятно, что если бы этого события не случилось в истории человечества, то рынок продолжил бы свой рост.
Почему же мы видим такую закономерность? Все дело в том, что современные биржи заполнены торговыми роботами, которые настроены на определенные паттерны и зависимости. И чем чаще те или иные зависимости себя проявляют, тем с большей вероятностью можно предполагать, что эти зависимости используются торговыми роботами.
Допустим, крупные фонды используют SMA200 для выкупа ценных бумаг, это создает потенциал обратного движения на волне крупных покупок.
В одной из публикаций мы уже рассматривали, как определить точку входа на бирже. Там мы описывали алгоритм принятия торговых решений на основании индикаторов Delta и Open Interest.
Возьмем за основу идею поиска точек входа на основании индикатора Delta. Теперь нам необходимо создать модуль, который проверит эффективность нашей идеи на различных биржевых инструментах.
Наша первая задача заключается в сборе статистики на основании исторических данных и сохранения результатов в файл для дальнейшего использования. Задача решается в несколько шагов.
Создаем программный модуль для сбора статистики
Поскольку торговая аналитическая платформа ATAS написана на языке программирования C#, мы будем и дальше использовать данный язык для написания собственного модуля статистики. Все дополнительные модули можно подключать в основную программу с использованием динамических библиотек dll.
Для написания собственной библиотеки нам потребуется любая версия Visual Studio, которую можно скачать и установить бесплатно с сайта разработчика.
В особенности установки программы Visual Studio мы вдаваться не будем, отметим только то, что на данную тему вы можете самостоятельно найти множество материалов, видеоуроков и учебников.
В среде программирования необходимо создать новый проект: Библиотека классов Net.Framework.
Задать ему имя, которое мы будем использовать в дальнейшем, например — Statistic. При выборе версии платформы необходимо выбирать не ниже чем .Net Framework 4.6.
Далее необходимо в проект загрузить специальную библиотеку от ATAS, которая называется ATAS.Indicators.dll — файл находится в корневой папке, в которую установлен ATAS.
Для этого в окне обозревателя решений кликаем правой кнопкой мыши по разделу “Ссылки” и выбираем “Добавить ссылку”.
Находим файл ATAS.Indicators.dll и добавляем ссылку на него в проект.
После того, как библиотека будет добавлена, мы увидим ее название в перечне ссылок.
Стартовый проект по умолчанию выглядит так:
Переименуем название главного класса и назовем его DeltaStatistic, добавим наследование методов и свойств от загруженной библиотеки ATAS.Indicators.dll. Для того, чтобы наследование прошло без ошибок, необходимо добавить директиву:
using ATAS.Indicators;
После этих манипуляций наш проект должен выглядеть следующим образом:
Пока что у нас не реализован абстрактный метод OnCalculate, поэтому среда разработки будет показывать ошибку под именем класса. Visual Studio в некоторых случаях предлагает ускоренную реализацию некоторых интерфейсов и абстрактных свойств, поэтому наводим курсор на выделенное красным цветом имя DeltaStatistic и выбираем предложенную средой реализацию абстрактных методов, после чего наш проект будет выглядеть следующим образом:
Теперь у нас в проекте появился новый метод OnCalculate, в котором обычно реализуется логика для индикаторов.
Удаляем из нового метода OnCalculate ненужный нам: throw new NotImplementedException().
Метод OnCalculate последовательно вызывается для каждого бара на истории и далее вызывается на каждом тике. Чтобы не перегружать компьютер ненужными расчетами, мы реализуем логику в другом методе, который называется OnInitialize. Этот метод вызывается один раз при инициализации графика или при обновлении графика. Поэтому после изменения коэффициентов потребуется сделать обновление графика, чтобы модель пересчитала результаты.
Поскольку мы будем использовать логгирование нашей статистики в главном окне ATAS, нам потребуется добавить ссылку на библиотеку Utils.Common.dll, которая также находится в главной папке с программой (аналогично тому, как мы делали это с библиотекой ATAS.Indicators.dll).
Программируем торговую систему
Приступаем к созданию программного кода, который ищет на графике значения индикатора Delta с аномальным объемом. Для этого мы рассчитаем средние значения для положительной и отрицательной дельты. После того как мы будем знать средние значения, мы сможем искать бары, в которых дельта имеет отклонение на заданный коэффициент.
В том случае, если значение дельты отклоняется на заданный коэффициент от среднего значения, мы считаем этот бар “контрольным”.
Для проверки работоспособности торговой системы мы введем несколько правил:
- если дельта отрицательная, бар нисходящий, следующие несколько баров ниже уровня закрытия контрольного бара — то уровень открытия бара считаем уровнем сопротивления;
- если дельта отрицательная, бар нисходящий, следующие несколько баров выше уровня закрытия контрольного бара — то уровень закрытия бара считаем уровнем поддержки.
Для положительной дельты будут действовать те же правила, но с обратной логикой.
Далее нам необходимо определиться с тем, какое количество баров после контрольного анализировать. Для этого мы установим коэффициент, который сможем менять при необходимости. Например, если предполагается работа на минутном таймфрейме, установим, что мы следим за 3 барами после контрольного.
Это необходимо для того, чтобы дать рынку возможность “определиться”, в каком направлении после контрольного бара будет развиваться основное движение. Часто бывает так, что после контрольного бара на некоторое время снижается волатильность, и, чтобы повысить эффективность работы алгоритма, нужно предусмотреть возможность пропускать такие участки.
Также нам потребуется еще один коэффициент — множитель. Алгоритм будет умножать среднее значение дельты на данный коэффициент и искать бары с дельтой, превышающей полученное значение. Найденные таким образом бары добавляются в коллекцию контрольных баров.
Введем в код два поля с именами:
- Multiplier (отвечает за значение коэффициента на который будет умножаться среднее значение дельты);
- Barcount (отвечает за количество баров, которое необходимо пропустить после контрольного бара).
Кроме этих коэффициентов нам потребуется еще два коэффициента, один из которых будет отвечать за размер тейк-профита, второй — за размер стоп-лосса.
Добавим в код два новых поля TP(takeprofit) и SL(stoploss).
Если вы заметили, в блоке set каждого из полей присутствует вызов метода RecalculateValues(), который пересчитывает все значения при изменении одного из свойств индикатора. В нашем случае вызов этого метода можно упразднить, так как мы используем наш алгоритм только во время инициализации графика. Если перенести весь код из метода OnOnitialize в метод OnCalculate, то вызов метода RecalculateValues следует оставить. Поэтому в представленном коде мы намеренно сохраним предложенную структуру блоков полей для тех случаев, если вы самостоятельно захотите перенести всю логику в метод OnCalculate.
Вся логика подсчета статистики заключается в последовательном переборе контрольных баров, построения уровней поддержки и сопротивления по high и low контрольных баров, имитации открытия сделок short и long от уровней, и проверка на результат открытых сделок. Все данные о прибыли и убытках записываются в специальную “коллекцию” внутри индикатора, а после окончания расчета они выводятся в виде сообщения в главном окне программы.
Поскольку целью этой статьи является не написание пособия по программированию, то основную часть посвященную кодингу мы опустим, иначе нам потребовалось бы в несколько раз увеличить текст данной публикации.
Для желающих изучить исходный код индикатора мы предоставляем его в открытый доступ всем желающим. Исходный программный код индикатора доступен для скачивания и ознакомления по ссылке:
Скомпилированный индикатор можно скачать по ссылке:
Для установки индикатора в платформу готовую библиотеку необходимо:
- Скачать dll файл, кликнуть на нем правой кнопкой мыши и нажать «Свойства».
- В свойствах необходимо разблокировать файл в нижней части открывшегося окна ( в зависимости от версии Windiws может быть кнопка или чекбокс, в который нужно установить галочку) и применить изменения.
- скопировать файл в папку: C:\Users\Username\Documents\ATAS\Indicators, после чего перезапустить программу ATAS.
Чтобы запустить модуль статистики, необходимо на любой график добавить индикатор из общего списка, который называется DeltaStatistic.
После добавления на график, необходимо выставить настройки параметров индикатора:
- множитель отвечает за то, во сколько раз отклонение от среднего значения дельты будет учитываться при расчете контрольных баров. Например, если среднее значение положительной дельты для всего графика составляет 500, то при значении множителя 2, контрольными станут те свечи, в которых дельта составляет значение более 1000. Аналогично рассчитываются контрольные свечи с отрицательной дельтой;
- количество баров отвечает за то, сколько баров индикатор должен пропустить, чтобы начать инициировать направление тренда как восходящее или нисходящее, что в свою очередь влияет на направления открытия сделки. Например, если для растущей контрольной свечи + пропускаемое количество баров наблюдается закрытие последующего бара выше, чем точка открытия контрольного бара, то уровень открытия контрольного бара становится уровнем поддержки, и система следит за тем, когда цена вновь протестирует уровень поддержки и считает, какой профит принесет такая сделка. Если сделка закрывается по takeprofit, то профит считается положительным, если сделка закрывается по stoploss, то профит считается отрицательным;
- takeprofit отвечает за то, какое количество пунктов считается прибылью при наступлении условия takeprofit;
- stoploss отвечает за то, какое количество пунктов считается прибылью при наступлении условия stoploss.
Программа последовательно считает каждый контрольный бар на предмет открытия сделки, наступления takeprofit или stoploss, собирает по каждой сделке статистику и выводит в главном окне программы итоговый результат, который мог быть получен при реальной торговле.
Из представленного рисунка мы видим, что модуль статистики говорит нам о том, что всего контрольных баров:
- с положительной дельтой 3;
- с отрицательной дельтой 157;
- профит по имитации сделок от положительной дельты — 100 пунктов;
- профит по имитации сделок от отрицательной дельты + 4500 пунктов;
- общая прибыль составила 4400 пунктов.
Таким образом, используя данные индикаторы мы можем собрать статистику абсолютно по любому финансовому инструменту, абсолютно на любом временном интервале.
А подбор таких параметров как stoploss и takeprofit позволяет найти оптимальные соотношения, чтобы наша торговая система была наиболее эффективной.
Напоминаем, что после смены параметров необходимо обновить график, чтобы задействовать индикатор. Если все настроено правильно, то индикатор в подтверждение своей работы нарисует уровни поддержки и сопротивления прямо на графике, а при необходимости данную функцию можно отключить в коде, перекомпилировав саму библиотеку.
Резюме
В заключение этой публикации мы хотели бы отметить:
- разработать прибыльную торговую систему возможно в том случае, если вы серьезно отнесетесь к данному вопросу;
- торговая система воплощенная в программный код будет быстрее и правильнее, нежели ручная торговая система, в которой используется ручка и бумага;
- торговая система может работать как на крупных временных интервалах, так и на мелких;
- платформа ATAS существенно облегчает разработку торговой системы делая работу программиста с историческими данными и встроенными индикаторами интуитивно понятной;
- после того, как собственная торговая система будет готова и покажет хороший результат на исторических данных, вы можете реализовать всю торговую логику в торговом роботе используя для этого платформу ATAS за счет встроенной системы отправки торговых приказов и контроля рисков.