Пару месяцев назад завершил одну интересную программу, которая самостоятельно ищёт прибыльные свечные паттерны . Решил было спрятать под подушкой, но недавно передумал. Пока доделывал, появилось несколько HFT идей. Буду заниматься ими, а эту подарю миру.
Программу не выложу, но про идею расскажу подробно. Берите, реализуйте, кто может. Буду только рад. Удалось обнаружить такое огромное количество паттернов, что на всех программистов хватит.
Plan:
- Что такое свечной паттерн;
- Алгоритм поиска паттернов;
- Подводные камни;
- Оптимизация, многопоточность;
- Альтернативы.
1 Что такое свечной паттерн
Ответ на этот вопрос намного проще, чем может показаться на первый взгляд. Однако даже здесь, засилье шарлатанов, научных фриков и Форекс разводил, породили антинаучное двоемыслие. Поэтому, во избежание СПЕЦИАЛЬНО ДЛЯ срача определения будет два.
Определение1: Это несколько свечей, идущих подряд, с помощью которых, на основе ВЕРЫ в «Японца» или «независимого» «аналитика» впервые описавшего формацию, можно прогнозировать движение. Пример:
Определение2: Несколько подряд идущих свечей, с помощью которых, на основе СТАТИСТИКИ изменений цены после их появления, можно прогнозировать движение. Пример:
Оба эти определения имеют право на существования), однако мне ближе второй вариант. И программу поиска именно таких паттернов попытаюсь описать ниже.
2 Алгоритм поиска паттернов
Общие требования к программисту:
- Любой ООП язык;
- Любой UI к нему;
- Структуры и алгоритмы;
- Многопоточность;
- OOP;
- OOD.
Входящие переменные:
- Длинна искомых паттернов;
- Время выхода из сделки;
- Коэффициент расширения;
- Исторические данные. Свечи.
Выводим соответствующие настройки на интерфейс. Вот как это выглядит у меня:
Синими крестиками обозначены не обязательные элементы.
Далее необходимо скачать в память массив каких-то свечек. Предварительно разработать для них соответствующие классы и структуры.
Как работать с массивом:
Допустим что мы ищем паттерны длинной 3 и с выходом через две минуты.
1. Берём первые три свечи и сохраняем их в шаблон:
2. Подставляем с самого начала массива поочерёдно по одной свечке и ищем похожую формацию:
3. Как только находим её, записываем close последней свечи найденной формации и close(или соответствующие open) свечи через время выхода, в нашем случае через две минуты. Для сохранения данных о паттерне не плохо сделать отдельный класс для хранения отчётов, в котором будут храниться сделки по паттерну и подробная статистика этих сделок:
4. Когда исходный массив данных во время сравнения заканчивается, сохраняем отчёт об исследованном паттерне в файл и берём из исходного массива следующие три свечи в качестве шаблона:
Хранение свечей Шаблона и Что такое «Коэффициент расширения»:
Значение Open первой свечи шаблона берём за 0%, а все значения шаблона далее, сохраняем как приращения к этому значению. Соответственно, во время сравнения шаблона со свечами из исторических данных, для начала надо перевести сравниваемый участок в вид приращения, а затем сравнивать.
Кроме того, 100% совпадений свечек, тем более их комбинаций почти не бывает и чтобы регулировать узнаваемость паттернов, свеча шаблона хранится не в виде OHLC, а в виде приращения OLow OHigh HLow HHigh LLow LHigh CLow CHigh. Т.е. для каждого значения свечи, используется две переменные, означающие диапазон возможных значений:
Во время сравнения шаблона со свечами из исторических данных, проверяем, входят ли значения OHLC, преобразованные в приращение, истории в диапазоны шаблона. И радуемся жизни.
3 Подводные камни
1. Регулировка коэффициента расширения, является инструментом злостной переоптимизации.
2. Вход и выход на Close/Open свечек. Как и вообще тестирование на свечках, в реале выдаст прибыль много меньше, чем во время тестирования.
4 Оптимизация алгоритма, многопоточность
Для ускорения процесса тестирования паттернов, можно создать отдельный массив bool такой же длинной, как и массив со свечками. Далее по номерам отмечать уже пройденные и Найденные паттерны, чтобы в дальнейшем не брать в качестве шаблона уже пройденные и идентифицированные комбинации. Данный подход ускорил скорость прохода в 4 — 5 раз.
Для тех, кто не боится потоков:
Класс с логикой разделяем на две части, Static(общую для класса) и собственно объёкт. Ну, или если ваш язык не поддерживает такие конструкции, то просто выносим раздачу номеров индекса начала шаблона из логики поиска паттернов в другой класс.
Общая часть должна отвечать за раздачу номера в массиве свечек, с которого начинается шаблон, для текущего исследования. А объект с логикой поиска паттернов в истории, должен при инициализации создавать свой рабочий поток, при надобности запрашивая номер в массиве для начала шаблона в своей static части. Здесь ещё придётся сделать один для всех потокобезопасный способ сохранения отчёта в файл. Данный подход ускоряет процесс поиска паттернов кратно созданным объектам для поиска паттернов, но не более max ядер процессора. У меня в 3 раза. Т.к. одно из 4ёх ядер оставляю для Windows.
После обхода всех вариантов свечных формаций в массиве, естественно необходимо отфильтровать паттерны и выбрать лучшие. У меня для этого есть другая программа, но это уж совсем другая история…
Свечная модель: Две чёрных вороны и один белый самурай рассматривают молот
5 Альтернатива
Можно пойти с другой стороны, и динамически рассчитывать вероятность движения, в момент непосредственно торгов. Т.е. проверять последние полученные из терминала (файла при тестировании) свечи на истории и не парится с поиском прибыльных формаций заранее.
Проблемы этого подхода
1. Прогон одной формации минуток за один год истории у меня занимает около двух сек. При загрузке одного ядра 100%. Из этого следует:
- Агрессивной торговли на минутках сделать не получится. Т.к. надо одновременно искать множество вариантов паттернов, как по длине, так и по времени выхода.
- И на пяти минутках, если просматривать множество паттернов на нескольких годах будет задержка в несколько секунд.
2. Сложность перехода из такого варианта торговли и тестирования на таймфрейм ниже минутки. Т.е. для того чтобы тестировать движения внутри минуты, в первом подходе можно просто схлопнуть тики в свечи по 5, 10, 15… секунд и работать с этими свечами как и с часовыми, а во втором подходе это просто не возможно, т.к. длинна свечи в некоторых случаях будет по времени совпадать с временем тестирования.