Открыть на GitHub

Стратегия Caudate X Period Candle TM Plus

Общее описание

Стратегия повторяет логику советника Caudate X Period Candle TM Plus. Для каждой свечи вычисляются сглаженные значения открытия, максимума, минимума и закрытия выбранным типом скользящей средней. На основе сглаженного диапазона Donchian стратегия присваивает завершённой свече один из шести цветовых кодов, характеризующих положение тела внутри диапазона. Коды 0/1 (бычий нижний хвост) открывают длинные позиции, коды 5/6 (медвежий верхний хвост) открывают короткие, противоположные группы закрывают уже открытые сделки.

Правила торговли

  1. Подписаться на свечи указанного таймфрейма и сгладить каждую компоненту OHLC выбранной средней.
  2. Рассчитать максимум и минимум сглаженных экстремумов за Donchian Period, затем расширить диапазон так, чтобы он всегда содержал сглажённые открытие и закрытие.
  3. Определить цвет свечи:
    • 0/1 – тело возле верхней границы диапазона (нижний хвост).
    • 2/4 – тело в центре диапазона.
    • 5/6 – тело возле нижней границы диапазона (верхний хвост).
  4. Использовать цвет бара со смещением Signal Bar (по умолчанию 1, то есть предыдущая завершённая свеча).
  5. Открывать позиции, если цвет относится к группе входа и противоположная позиция отсутствует.
  6. Закрывать позиции при попадании цвета в группу выхода либо по истечении максимального времени удержания.
  7. При ненулевых дистанциях стоп-лосса и тейк-профита стратегия вызывает StartProtection, формируя защитные заявки.

Параметры

Параметр Описание
Candle Type Таймфрейм, по которому рассчитываются сигналы.
Donchian Period Длина окна для сглаженного диапазона максимумов и минимумов.
Signal Bar На сколько баров сдвигается оценка цвета (0 — текущая свеча).
Smoothing Method Тип сглаживания OHLC (SMA, EMA, SMMA, LWMA, аппроксимация Jurik JJMA, Kaufman AMA).
MA Length Длина фильтра сглаживания.
MA Phase Зарезервировано для совместимости с JJMA (в текущей реализации не используется).
Enable Long/Short Entries Разрешение на открытие длинных/коротких позиций.
Enable Long/Short Exits Разрешение на закрытие длинных/коротких позиций по сигналу.
Enable Time Exit Включение ограничения по времени удержания.
Time Exit (minutes) Максимальное время удержания позиции в минутах.
Stop Loss (points) Расстояние стоп-лосса в шагах цены.
Take Profit (points) Расстояние тейк-профита в шагах цены.

Примечания

  • Значение Signal Bar = 1 совпадает с поведением оригинального советника и использует последнюю завершённую свечу.
  • При ненулевых стопах/целях StartProtection рассчитывает абсолютные цены с учётом Security.PriceStep.
  • Параметр MA Phase сохранён для совместимости, но не влияет на стандартные реализации скользящих сред StockSharp.
  • Базовый объём заявок задаётся через свойство Strategy.Volume; перед открытием новой позиции стратегия закрывает противоположную.
using System;
using System.Collections.Generic;

using Ecng.Common;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Caudate X Period Candle TM Plus strategy (simplified). Detects candle body/tail
/// patterns using ATR-based filtering and EMA trend direction.
/// </summary>
public class CaudateXPeriodCandleTmPlusStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _atrLength;
	private readonly StrategyParam<int> _emaLength;

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public int AtrLength
	{
		get => _atrLength.Value;
		set => _atrLength.Value = value;
	}

	public int EmaLength
	{
		get => _emaLength.Value;
		set => _emaLength.Value = value;
	}

	public CaudateXPeriodCandleTmPlusStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
			.SetDisplay("Candle Type", "Candles", "General");

		_atrLength = Param(nameof(AtrLength), 14)
			.SetGreaterThanZero()
			.SetDisplay("ATR Length", "ATR period", "Indicators");

		_emaLength = Param(nameof(EmaLength), 20)
			.SetGreaterThanZero()
			.SetDisplay("EMA Length", "Trend EMA period", "Indicators");
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var atr = new AverageTrueRange { Length = AtrLength };
		var ema = new ExponentialMovingAverage { Length = EmaLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(atr, ema, (ICandleMessage candle, decimal atrValue, decimal emaValue) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (atrValue <= 0)
					return;

				var close = candle.ClosePrice;
				var body = Math.Abs(close - candle.OpenPrice);

				// Strong body candle in the trend direction.
				if (body > atrValue * 0.75m)
				{
					if (close > candle.OpenPrice && close > emaValue && Position <= 0)
						BuyMarket();
					else if (close < candle.OpenPrice && close < emaValue && Position >= 0)
						SellMarket();
				}
			})
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, ema);
			DrawOwnTrades(area);
		}
	}
}