В данной статье мы рассмотрим робота, который анализирует кластерный график и на основании этой информации совершает торговые операции.
Распишем вкратце техническое задание. В кластерном анализе присутствует такие понятия как толкающие и тормозящие бары (свечи). Если смотреть на примере бычьих свечей, толкающий – тот бар, максимальный объем которого расположен в нижней части свечи, в идеале в нижней тени. Тормозящий бар тот, максимальный объем которого расположен в верхней части свечи, в идеале в верхней тени. Так вот наш бот будет открывать длинную позицию при возникновении толкающего бычьего кластера и закрывать ее при возникновении толкающего медвежьего кластера. Для бычьего бара в качестве максимального возьмем объем продаж, для медвежьего – объем покупок.
Для примера вид толкающей бычей свечи:

Рис. 1. Толкающая растущая свеча.
Вид толкающей медвежьей свечи:

Рис. 2. Толкающая падающая свеча.
Так же бот будет отслеживать 10 последних кластеров, чтобы выбрать среди них тот, который содержит секцию с максимальным суммарным объемом.
Начнем с рассмотрения полей данных, которые потребуются для работы:

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

- Создаем параметр для сигнального объема.
- Создаем параметр для торгового объема.
- Создаем параметр для количества кластеров, по которым ведется поиск секции с максимальным суммарным объемом.
- Создаем вкладку для кластеров.
- У кластерной вкладки подписываемся на событие появления нового кластера с максимальным объемом покупок.
- Создаем простую вкладку для торговли.
- У простой вкладки подписываемся на событие завершения свечи.
Далее разберем вспомогательные методы, которые выступают в роли фильтров.
Метод PriceUpperMaxSumVolumeCluster проверяет, превысила ли цена инструмента цену кластера с максимальным суммарным объемом за последние 10 баров (настраиваемый параметр).

- Берем последние 10 кластеров вкладки и находим среди них тот, который содержит секцию с максимальным суммарным объемом.
- Сравниваем последнюю цену по бумаге с ценой секции, содержащей максимальный объем. Если цена превысила это значение, метод возвращает истину.
- Иначе метод возвращает ложь, что запрещает открытие позиций по этой цене.
Метод IsPushingClaster проверяет, является ли бар толкающим.

- Для открытия позиции нам нужны только растущие свечи, поэтому если бар падающий, возвращается ложь.
- Из кластера получаем секцию с максимальным объемом рыночных продаж.
- Если цена секции выше цены открытия бара, выходим, так как нам нужно чтобы нужный объем прошел в нижней тени свечи.
- Если объем линии меньше, чем задаваемый параметром, так же выходим.
- Если же все условия выполняются, значит этот бар является толкающим.
Метод IsBrakingClaster определяет, является ли бар тормозящим.

- Сигналом на выход может служить только кластер падающего бара, поэтом если свеча растущая, возвращается ложь.
- Из кластера получаем секцию с максимальным объемом рыночных покупок. Большое количество рыночных покупок в одном уровне увеличивает вероятность того, что там находился большой объем лимитных продавцов.
- Если цена данной линии меньше цены открытия свечи, возвращается ложь, так как нам нужно чтобы искомый объем находился в верхней тени бара.
- Если объем линии меньше, чем задаваемый параметром, так же выходим.
- Если же все условия выполняются, значит этот бар является тормозящим.
Метод TabClusterMaxBuyClusterChangeEvent является обработчиком события MaxBuyClusterChangeEvent. Возникновение этого события говорит о появлении секция с объемом рыночных покупок, который превышает объемы всех других секция на кластерном графике. Это может свидетельствовать о появлении крупного лимитного продавца, поэтому мы должны закрыть позицию при наличии.

Ну и наконец переходим к рассмотрению метода TabToTradeCandleFinishedEvent, который является точкой входа в торговую логику робота:

- Из списка всех свечей сохраняем ссылку на последнюю.
- Из списка всех кластеров получаем тот, который является профилем данной свечи.
- Далее проверяем условия для открытия позиции, если нет открытых позиций, бар является толкающим и цена инструмента выше цены секции с максимальным суммарным объемом за последние n свечей, открываем длинную позицию.
- Если позиция имеется и текущий бар является тормозящим, закрываем позицию.
Код данного робота находится по ссылке.
Комментарии