Делаю нового робота: новая торговая идея, подбор инструментов, теоритическая проверка, реализация робота, проверка идеи практикой. Получился Pip 1, который накачал 17% за неделю в состоянии полуготовности.
Небольшое отступление: Про блог
В предыдущих записях этого блога я пробовал писать очень кратко и наоборот, разбивать разработку на несколько записей по факту работы или дописывать в одну статью по несколько дней, в общем —экспериментировал. Блог при этом является лишь производной от деятельности.
Я выявил наиболее удобную для себя комбинацию: в одном цикле разработке начинать с идеи и доводить ее до конкретной реализации. Если текущая идея является перспективной (то есть получившаяся реализация требует небольшой и вполне конкретной доработки), то завершать ее в другой раз, если сразу не получилось, но есть планы доработки, тогда делаю не больше двух подходов, в попытке улучшить базовый алгоритм.
Также, поскольку я пишу для себя, я не буду тратить время на описание тех фактов, которые и так знаю. Также не буду тратить время на описание этапов разработки, которое занимает больше сил, чем сама эта разработка. Просто и интересно, а что не интересно или сложно теперь оставляю за кадром.
Торговая идея
Мне нужен трендовый робот. Когда тренд только начинает формироваться попасть в него сложно, также, как и выйти вовремя. Однако, во время всякого тренда есть коррекции, это и стоит использовать.
Вход в рынок: Одним индикатором отловить наличие тренда, другим отслеживать ситуацию коррекции и в каждой новой коррекции наращивать позицию по направлению движения тренда.
Выход из рынка: Закрываться по стопу, который перемещается по сигналам какого-то опаздывающего трендового индикатора, вроде скользящей средней с большим периодом.
Сильным местом идеи является избежание необходимости предугадывать будущее движение, мы действуем в рамках уже подтвержденного тренда, выделяя из него наиболее прибыльный момент.
Слабым местом идеи является открытие позиции в переломе тренда. Последняя позиция в тренде, вероятно, будет всегда убыточной (откат зашел далеко и тренд переломился).
В одной из вариаций (при накоплении позиций) можно избежать этого, объединяя открываемые позиции в пределах одного тренда в пул, то есть последняя открытая сдвинет общий пул вверх, и хотя, технически, она будет убыточной, при закрытии пула будет получаться плюс (за исключением 1 позиции в тренде).
Если закрывать без накопления то 1 позиция на тренд (последняя) будет убыточной, после серии прибыльных позиций, что приемлемо при равном объеме позиций.
Не стоит пытаться избавиться от слабого места: если пропустить первую коррекцию для открытия позиции, то проблема сдвинется, поскольку имеет место тренд всего с двумя коррекциями. Перенос открытия — как подсказывает математика, это расходящийся ряд — смысла не имеет.
Качества слабого и сильного места подтверждают фундаментальную верность базовой идеи. Тренды есть, внутри них проходит множество коррекций — должно быть прибыльно, если правильно подобрать индикаторы для открытия позиций.
Базовая стратегия
Для начала подберу комбинацию из индикаторов, которые помогут:
- Отследить наличие тренда
- Определить откаты внутри тренда
- Вести стоп-ордера
Концептуальные идеи по теме:
- использовать небольшой таймфрейм (не хочу отслеживать месячные тренды, нужны дни в позициях как максимум) — возьму M15;
- умеренный риск-менеджмент — небольшой таймфрейм уже этому способствует, но никаких исправлений позиций (это, в прочем, как обычно), малые объемы позиций (на случай накопления ордеров);
- Дополнительная идея для входа: последняя убыточная позиция это тоже сигнал о переломе тренда;
- стоит поискать такой торговый инструмент, где тренды будут более выраженные и желательно частые
От чего зависит прибыльность:
- Определение тренда — нужно наверняка покинуть флэт
- Правильно найти точку входа — самая глубокая точка отката
- Вовремя закрыть позицию — позицию при возвращении в тренд или пул при переломе тренда.
Инструменты стратегии
Для определения тренда лучше всего использовать какой-то простой и понятный инструмент, который содержит таймфрейм построения или чтобы было можно получать данные с таймфрейма кратно увеличивая параметры индикатора.
Претенденты на определение тренда: MA и производные (SAR, MACD)
Для того, чтобы определить точку входа — откат внутри тренда — стоит взять индикаторы импульса или момента перекупленности/перепроданности.
Претенденты на определение точки входа: Stoch, Momentum и прочие
Определение точки выхода — перелом тренда — фактически не требуется, если трейлить стоп-ордер позиции (или пула позиций) по индикатору, которым определяется тренд.
Проверка теории на графике
Для определения тренда на рынке, после некоторых поисков, я решил взять индикатор TrendEnvelopes:
Индикатор размещает торговые полосы выше и ниже ценового уровня выбранного нами инструмента. Берется скользящая средняя (MA) от цены и рассчитывается верхний и нижний конверт, путем смещения кривой на определенное расстояние выше цены.
Теперь, когда базовый тренд определен, надо получить точку входа. Ищу дальше... Для определения точки входа я взял индикатор AROON:
Aroon Up (желтая линия) рассчитывается на основе времени, в течение которого конкретная ценная бумага или индекс достиг недавнего максимума. И наоборот, Aroon Down (пунктир) - это показатель времени, прошедшего с недавнего минимума. Оба индикатора строятся в виде линий в диапазоне от нуля до 100.
С помощью этого индикатора можно отследить момент, когда меняется инициатива на рынке. Когда Up пересекает Down — быки перехватывают инициативу, при обратном пересечении — медведи.
Суммируя: Учитывая, что наличие тренда определяется с помощью TrendEnvelopes, при смене тенденции на Aroon в сторону тренда мы можем судить о завершении коррекции — точке входа по стратегии.
Точками выхода будут служить уровни TrendEnvelopes, которые, в общем, позволяют «вести» позиции. Еще, важное замечание, сначала попробую вариант с пулом позиций — буду вести их стоп-ордера, без закрытия.
Торговый алгоритм
Коротко выпишу функциональную часть алгоритма робота, поскольку ни разу не выносил эту часть работы в блог:
Расчеты (при открытии нового бара):
Получаем значение TrendEnvelopes с текущего [0] и с прошлого [1] баров;
Получаем значение Aroon Up и Down с текущего [0] и с прошлого [1] баров;
* предусмотреть заранее: возможно потребуется дополнительное сравнение значений TrendEnvelopes (прошлое и новое), это поможет фильтровать флеты
Сигнал на покупку:
Если Bid [0] > TrendEnvelopes [0] (цена выше линии тренда)
и Aroon Up [1] < Aroon Down [1] (рынок был медвежий)
и Aroon Up [0] > Aroon Down [0] (рынок стал бычий)
тогда, BUY (... SL = TrendEnvelopes [0] ...) — открываем покупку
Сигнал на продажу:
Если Bid [0] < TrendEnvelopes [0] (цена ниже линии тренда)
и Aroon Up [1] > Aroon Down [1] (рынок был бычий)
и Aroon Up [0] < Aroon Down [0] (рынок стал медвежий)
тогда, SELL (... SL = TrendEnvelopes [0] ...) — открываем продажу
Ведение ордеров (при открытии нового бара):
В цикле считываем очередной открытый ордер и в каждой итерации:
Если покупка {
если Bid [0] > TrendEnvelopes [0] и SL_price < TrendEnvelopes [0],
тогда SL = TrendEnvelopes [0] }
Если продажа {
если Bid [0] < TrendEnvelopes [0] и SL_price > TrendEnvelopes [0],
тогда SL = TrendEnvelopes [0] }
* предусмотреть заранее: возможно потребуется закрытие при возникновении перескока TrendEnvelopes на противоположную сторону, это должно быть более прибыльно
Из идеи в Робота
Осталось превратить теорию в практику, протестировать на ошибки, и можно будет проверить результативность стратегии. Разобью на 2 очень неравноценных по объему работы этапа:
1. Создание всего каркаса робота. Здесь же реализую фундамент для работы с ордерами.
Пока будет открытие позиций по TrendEnvelopes (по факту перехода от верхнего конверта к нижнему — продажа; наоборот — покупка) и выставление (перемещение) стоп-ордера по значению TrendEnvelopes.
2. Добавление Aroon и открытие позиций по сигналам стратегии.
Pip 1: Первая реализация
И так, после некоторых мучений, я реализовал первую часть робота, провел отладку и базовое тестирование. Выглядит очень прикольно:
На данном этапе робот на каждом новом баре (пока нет точки входа) открывает по позиции согласно положению TrendEnvelopes и трейлит стоп-ордер при изменении значения TE.
Любопытно, что даже в такой версии Робот прошел тест в плюс:
Ну конечно, требуется дальнейшая доработка, а именно включение подтверждения точки входа на тренде по индикатору Aroon.
Pip 2: Полная версия
Поскольку самую сложную часть работы я уже проделал, написав всю систему робота, осталось добавить точку входа — фильтрацию по индикатору Aron.
Фильтрация однозначно удалась :)
И результаты теста приличные. Но что-то точек входа маловато, в расчетах получалось больше. Проверю на ценовом графике:
Да, действительно, срабатывают не все сигналы. Технически (судя по остальным сигналам) все сделано правильно, но проверю еще раз.
Проверил, технически ошибок нет, значит надо смотреть медленно тестирование.
*спустя полчаса*
Ирония: я переживал, что индикатор TrendEnvelopes во время построения будет все время перескакивать из верхнего конверта в нижний, и проверил это заранее, но Aroon на наличие такой особенности проверять не стал, так как счел, что он использует периоды. Напрасно.
Дело в том, что Aroon часто меняет сигнал по мере формирования тренда, что означает что необходимо или отслеживать по тикам, а они генерируются в тестере и предпочитаю не полагаться на такие данные, или поменять индикатор для определения точки входа.
Итоги
Концептуально идея Пипа оказалась очень правильно и подобранный трендовый индикатор справляется отлично (Pip_1), однако индикатор, который должен давать точку входа меня подвел (Pip_2), придется заменить этот инструмент.
В следующий раз поищу какой индикатор сможет дать мне точку коррекции тренда и реализую эту идею в виде Пипа 3.