Открыть на GitHub

Стратегия Previous Candle Breakdown

Previous Candle Breakdown отслеживает максимум и минимум последней закрытой свечи выбранного таймфрейма (по умолчанию 4 часа). Как только текущая свеча пробивает эти уровни с учётом заданного отступа, стратегия открывает сделку на пробой. Дополнительный фильтр из двух скользящих средних позволяет торговать только по направлению тренда, а комбинированные выходы (стоп-лосс, тейк-профит и трейлинг-стоп в пипсах) управляют риском после входа.

Основные особенности

  • Использует старший таймфрейм для определения ключевых уровней. Все сигналы строятся на максимуме и минимуме последней завершённой свечи.
  • Поддерживает четыре типа скользящих средних (SMA, EMA, Smoothed, WMA) и отдельные сдвиги для быстрой и медленной линий. Если обе длины больше нуля, фильтр требует, чтобы быстрая MA была выше/ниже медленной перед открытием лонга/шорта.
  • Конвертирует пипсы (отступ, стоп-лосс, тейк-профит, параметры трейлинга) в ценовые единицы с учётом настроек инструмента. Для инструментов с 3 или 5 знаками после запятой пипс равен 10 шагам цены, как в оригинальном советнике.
  • Позволяет задавать объём фиксированно либо рассчитывать его от процента капитала в зависимости от размера стоп-лосса.
  • Ограничивает максимальное количество позиций в каждом направлении и может закрыть все сделки при достижении заданной плавающей прибыли.
  • Логика трейлинг-стопа повторяет MQL5-версию: чтобы подтянуть стоп, цена должна пройти расстояние TrailingStop + TrailingStep, после чего стоп переносится дискретными шагами.

Параметры

Параметр Описание
CandleType Таймфрейм для расчёта предыдущей свечи (по умолчанию 4 часа).
IndentPips Отступ в пипсах от максимума/минимума для подтверждения пробоя.
FastPeriod / SlowPeriod Периоды скользящих средних. Значение 0 отключает фильтр.
FastShift / SlowShift Горизонтальный сдвиг (в барах) каждой скользящей средней.
MaType Тип скользящей средней (Simple, Exponential, Smoothed, Weighted).
StopLossPips Размер защитного стоп-лосса в пипсах (0 отключает).
TakeProfitPips Размер тейк-профита в пипсах (0 отключает).
TrailingStopPips Дистанция трейлинг-стопа. Требует положительного TrailingStepPips.
TrailingStepPips Минимальное улучшение цены перед переносом трейлинг-стопа.
OrderVolume Фиксированный объём сделки. Если 0, объём рассчитывается по риску.
RiskPercent Процент капитала под риск на сделку при OrderVolume = 0 (нужен ненулевой стоп).
MaxPositions Максимальное число входов в одном направлении.
ProfitClose Закрывает все позиции при достижении указанной плавающей прибыли (в валюте счёта).

Логика работы

  1. После закрытия свечи CandleType сохраняются её максимум и минимум.
  2. На каждом обновлении текущей свечи:
    • При активном фильтре проверяются условия по скользящим средним; при нехватке истории вход не выполняется.
    • Рассчитываются уровни пробоя: максимум + отступ и минимум − отступ.
    • Если текущая свеча пробивает верхний уровень, открывается лонг (с учётом фильтра, лимита позиций и запрета повторных входов в ту же свечу).
    • Если цена пробивает нижний уровень, открывается шорт по тем же правилам.
  3. После входа устанавливаются запомненные уровни стоп-лосса и тейк-профита (если включены). При достижении уровня позиция закрывается рыночной заявкой.
  4. Трейлинг-стоп активируется, когда цена проходит расстояние TrailingStop + TrailingStep от средней цены входа. Каждый следующий перенос требует ещё одного полного шага TrailingStepPips.
  5. Плавающая прибыль рассчитывается от средней цены входа. Если она достигает ProfitClose, стратегия немедленно ликвидирует все позиции.
  6. При рисковом управлении размер позиции определяется через PriceStep и StepPrice инструмента. Объём не превышает лимит MaxPositions.

Примечания

  • Чтобы отключить трейлинг-стоп, установите TrailingStopPips = 0. При включении трейлинга необходимо задать TrailingStepPips > 0.
  • Для предотвращения повторных входов в одной и той же свече сохраняются временные метки последнего сигнала.
  • Если у инструмента отсутствуют PriceStep или StepPrice, расчёт объёма по риску невозможен. Укажите OrderVolume, чтобы стратегия открывала сделки.
  • Комментарии в исходном коде написаны на английском языке согласно требованиям проекта.

Файлы

  • CS/PreviousCandleBreakdownStrategy.cs — реализация стратегии на C#.

Python-версия умышленно не добавлялась.

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>
/// Previous candle breakdown strategy (simplified).
/// Enters when price breaks above/below the previous candle's high/low.
/// </summary>
public class PreviousCandleBreakdownStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;

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

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

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

		decimal prevHigh = 0, prevLow = 0;
		bool hasPrev = false;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind((ICandleMessage candle) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!hasPrev)
				{
					prevHigh = candle.HighPrice;
					prevLow = candle.LowPrice;
					hasPrev = true;
					return;
				}

				if (!IsFormedAndOnlineAndAllowTrading())
				{
					prevHigh = candle.HighPrice;
					prevLow = candle.LowPrice;
					return;
				}

				// Breakout above previous high
				if (candle.ClosePrice > prevHigh && Position <= 0)
				{
					BuyMarket();
				}
				// Breakdown below previous low
				else if (candle.ClosePrice < prevLow && Position >= 0)
				{
					SellMarket();
				}

				prevHigh = candle.HighPrice;
				prevLow = candle.LowPrice;
			})
			.Start();

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