В данной статье мы рассмотрим робота, который анализирует кластерный график и на основании этой информации совершает торговые операции.
Распишем вкратце техническое задание. В кластерном анализе присутствуют такие понятия, как толкающие и тормозящие бары (свечи). Если смотреть на примере бычьих свечей, «толкающий» – тот бар, максимальный объем которого расположен в нижней части свечи, в идеале в нижней тени. «Тормозящий» бар тот, максимальный объем которого расположен в верхней части свечи, в идеале в верхней тени. Наш робот будет открывать длинную позицию при возникновении толкающего бычьего кластера и закрывать ее при возникновении толкающего медвежьего кластера. Для бычьего бара в качестве максимального возьмем объем продаж, для медвежьего – объем покупок.
Для примера вид толкающей бычей свечи:
Рис. 1. Толкающая растущая свеча.
Вид толкающей медвежьей свечи:
Рис. 2. Толкающая падающая свеча.
Также бот будет отслеживать 10 последних кластеров, чтобы выбрать среди них тот, который содержит секцию с максимальным суммарным объемом.
Начнем с рассмотрения полей данных, которые потребуются для работы:
- Параметр, задающий минимальный набранный секцией объем, чтобы кластер считался толкающим или тормозящим.
- Параметр объема для входа в позицию.
- Количество последних кластеров, среди которых нужно найти секцию с максимальным суммарным объемом.
- Вкладка для построения кластерного графика.
- Простая вкладка, через которую будет вестись торговля.
Переходим к конструктору бота:
- Создаем параметр для сигнального объема.
- Создаем параметр для торгового объема.
- Создаем параметр для количества кластеров, по которым ведется поиск секции с максимальным суммарным объемом.
- Создаем вкладку для кластеров.
- У кластерной вкладки подписываемся на событие появления нового кластера с максимальным объемом покупок.
- Создаем простую вкладку для торговли.
- У простой вкладки подписываемся на событие завершения свечи.
Далее разберем вспомогательные методы, которые выступают в роли фильтров.
Метод PriceUpperMaxSumVolumeCluster проверяет, превысила ли цена инструмента цену кластера с максимальным суммарным объемом за последние 10 баров (настраиваемый параметр).
- Берем последние 10 кластеров вкладки и находим среди них тот, который содержит секцию с максимальным суммарным объемом.
- Сравниваем последнюю цену по бумаге с ценой секции, содержащей максимальный объем. Если цена превысила это значение, метод возвращает истину.
- Иначе метод возвращает ложь, что запрещает открытие позиций по этой цене.
Метод IsPushingClaster проверяет, является ли бар толкающим.
- Для открытия позиции нам нужны только растущие свечи, поэтому, если бар падающий, возвращается ложь.
- Из кластера получаем секцию с максимальным объемом рыночных продаж.
- Если цена секции выше цены открытия бара, выходим, так как нам нужно, чтобы нужный объем прошел в нижней тени свечи.
- Если объем линии меньше, чем задаваемый параметром, так же выходим.
- Если же все условия выполняются, значит этот бар является толкающим.
Метод IsBrakingClaster определяет, является ли бар тормозящим.
- Сигналом на выход может служить только кластер падающего бара, поэтом если свеча растущая, возвращается ложь.
- Из кластера получаем секцию с максимальным объемом рыночных покупок. Большое количество рыночных покупок в одном уровне увеличивает вероятность того, что там находился большой объем лимитных продавцов.
- Если цена данной линии меньше цены открытия свечи, возвращается ложь, так как нам нужно, чтобы искомый объем находился в верхней тени бара.
- Если объем линии меньше, чем задаваемый параметром, так же выходим.
- Если же все условия выполняются, значит этот бар является тормозящим.
Метод TabClusterMaxBuyClusterChangeEvent является обработчиком события MaxBuyClusterChangeEvent. Возникновение этого события говорит о появлении секции с объемом рыночных покупок, который превышает объемы всех других секций на кластерном графике. Это может свидетельствовать о появлении крупного лимитного продавца, поэтому мы должны закрыть позицию при наличии.
Переходим к рассмотрению метода TabToTradeCandleFinishedEvent, который является точкой входа в торговую логику робота:
- Из списка всех свечей сохраняем ссылку на последнюю.
- Из списка всех кластеров получаем тот, который является профилем данной свечи.
- Далее проверяем условия для открытия позиции. Если нет открытых позиций, бар является толкающим, и цена инструмента выше цены секции с максимальным суммарным объемом за последние n свечей, открываем длинную позицию.
- Если позиция имеется, и текущий бар является тормозящим, закрываем позицию.
Код данного робота находится по ссылке.
Комментарии