Составные свечные паттерны
Обзор
Класс ComplexCandlePattern позволяет создавать составные свечные паттерны, комбинируя несколько простых паттернов (ICandlePattern) в один. При распознавании составного паттерна каждый внутренний паттерн проверяется последовательно на своем участке свечей. Паттерн считается распознанным, только если все внутренние паттерны совпали.
ICandlePattern
Базовый интерфейс для всех свечных паттернов:
public interface ICandlePattern : IPersistable
{
// Название паттерна
string Name { get; }
// Количество свечей, необходимых для распознавания
int CandlesCount { get; }
// Проверить, распознается ли паттерн на переданных свечах
bool Recognize(ReadOnlySpan<ICandleMessage> candles);
}
Реестр CandlePatternRegistry содержит набор встроенных паттернов: Flat, White, Black, Hammer, BullishEngulfing, MorningStar, ThreeWhiteSoldiers и другие.
ComplexCandlePattern
Класс ComplexCandlePattern реализует ICandlePattern и объединяет несколько внутренних паттернов:
public class ComplexCandlePattern : ICandlePattern
{
// Создание пустого паттерна
public ComplexCandlePattern() { }
// Создание паттерна с именем и набором внутренних паттернов
public ComplexCandlePattern(string name, IEnumerable<ICandlePattern> inner);
// Название составного паттерна
public string Name { get; }
// Внутренние паттерны
public IEnumerable<ICandlePattern> Inner { get; }
// Общее количество свечей (сумма CandlesCount всех внутренних паттернов)
public int CandlesCount { get; }
}
При вызове Recognize массив свечей разбивается на последовательные участки в соответствии с CandlesCount каждого внутреннего паттерна. Если хотя бы один внутренний паттерн не совпал, метод возвращает false.
Пример создания составного паттерна
using StockSharp.Algo.Candles.Patterns;
// Создать составной паттерн: сначала медвежья свеча, затем бычье поглощение
var complex = new ComplexCandlePattern(
"Разворот вверх",
new ICandlePattern[]
{
CandlePatternRegistry.Black, // 1 свеча: медвежья
CandlePatternRegistry.BullishEngulfing, // 2 свечи: бычье поглощение
}
);
// Для распознавания нужно 3 свечи (1 + 2)
Console.WriteLine($"Необходимо свечей: {complex.CandlesCount}"); // 3
ICandlePatternProvider
Интерфейс ICandlePatternProvider управляет хранением и поиском паттернов:
public interface ICandlePatternProvider
{
// События создания, замены и удаления паттернов
event Action<ICandlePattern> PatternCreated;
event Action<ICandlePattern, ICandlePattern> PatternReplaced;
event Action<ICandlePattern> PatternDeleted;
// Инициализация хранилища
ValueTask InitAsync(CancellationToken cancellationToken);
// Все доступные паттерны
IEnumerable<ICandlePattern> Patterns { get; }
// Поиск паттерна по имени
bool TryFind(string name, out ICandlePattern pattern);
// Удалить паттерн
bool Remove(ICandlePattern pattern);
// Сохранить (создать или заменить) паттерн
void Save(ICandlePattern pattern);
}
Реализации
InMemoryCandlePatternProvider-- хранит паттерны в памяти. При инициализации загружает все встроенные паттерны изCandlePatternRegistry.All.CandlePatternFileStorage-- сохраняет пользовательские паттерны в файл (JSON). Встроенные паттерны изInMemoryCandlePatternProviderтакже доступны через этот провайдер.
Пример работы с ICandlePatternProvider
using StockSharp.Algo.Candles.Patterns;
using StockSharp.Configuration;
// Создать файловое хранилище паттернов
var executor = new ChannelExecutor();
var provider = new CandlePatternFileStorage(
Paths.FileSystem,
Paths.CandlePatternsFile,
executor
);
// Инициализация (загрузит встроенные + пользовательские паттерны из файла)
await provider.InitAsync(CancellationToken.None);
// Подписка на событие создания нового паттерна
provider.PatternCreated += pattern =>
{
Console.WriteLine($"Создан паттерн: {pattern.Name}");
};
// Создать и сохранить составной паттерн
var myPattern = new ComplexCandlePattern(
"Мой паттерн",
new ICandlePattern[]
{
CandlePatternRegistry.Hammer,
CandlePatternRegistry.White,
}
);
provider.Save(myPattern);
// Найти паттерн по имени
if (provider.TryFind("Мой паттерн", out var found))
{
Console.WriteLine($"Найден: {found.Name}, свечей: {found.CandlesCount}");
}
ExpressionCandlePattern
Для создания паттернов на основе формул используется ExpressionCandlePattern. Каждая свеча в паттерне описывается выражением CandleExpressionCondition, в котором доступны переменные:
| Переменная | Описание |
|---|---|
O |
Цена открытия |
H |
Максимальная цена |
L |
Минимальная цена |
C |
Цена закрытия |
V |
Объем |
B |
Тело свечи |
LEN |
Длина свечи |
BS |
Нижняя тень |
TS |
Верхняя тень |
Префикс p указывает на предыдущую свечу (pO, pC), pp -- на две свечи назад и т.д.
Все встроенные паттерны в CandlePatternRegistry построены именно через ExpressionCandlePattern.