Открыть на GitHub

Стратегия FullDump BB RSI

Многоэтапная система на основе полос Боллинджера и RSI, портированная из советника MT5 «FullDump». Алгоритм ищет истощение импульса, подтверждает возврат к среднему через полосы Боллинджера и входит в сделку только после возвращения цены к средней линии. Управление позициями повторяет оригинал: фиксированные стоп-лосс/тейк-профит с добавочным отступом и перевод стопа в безубыток при повторном касании противоположной полосы.

Обзор

  • Рынки: Любые ликвидные инструменты, где доступны полосы Боллинджера и RSI.
  • Таймфрейм: Настраиваемый тип свечей (по умолчанию 15 минут).
  • Направление: Лонг и шорт.
  • Тип заявок: Рыночные ордера с заранее рассчитанной защитой.
  • Идея: Отработка возврата цены к средней линии после выхода за пределы полос Боллинджера.

Логика входа

  1. RSI (Шаг 1)
    • Для лонга нужно, чтобы хотя бы одно значение RSI за последние N свечей опустилось ниже 30.
    • Для шорта необходимо, чтобы хотя бы одно значение RSI за тот же период поднялось выше 70.
  2. Полосы Боллинджера (Шаг 2)
    • Лонг: текущая цена закрытия должна быть ниже либо равна любой из недавних нижних полос.
    • Шорт: текущая цена закрытия должна быть выше либо равна любой из недавних верхних полос.
  3. Возврат к средней (Шаг 3)
    • Лонг активируется только после закрытия свечи выше средней полосы.
    • Шорт возможен при закрытии ниже средней полосы.
  4. Исполнение
    • При выполнении условий и отсутствии позиции в нужную сторону отправляется рыночная заявка указанного объёма.

Управление рисками

  • Стоп-лосс: Для лонга размещается под минимальным минимумом за период Depth минус отступ; для шорта — над максимальным максимумом плюс отступ.
  • Тейк-профит: Устанавливается на текущую противоположную полосу Боллинджера плюс тот же отступ.
  • Перевод в безубыток: При достижении противоположной полосы стоп переносится на цену входа.
  • Выход: Позиция закрывается при пробое стопа/тейка или при смене направления сигнала, что позволяет стратегии переворачиваться.

Параметры

Имя Описание Значение по умолчанию Примечания
BandsPeriod Период расчёта полос Боллинджера. 20 Оптимизируется (10 → 40 шаг 1).
RsiPeriod Период усреднения RSI. 14 Оптимизируется (7 → 21 шаг 1).
Depth Количество свечей, используемых в проверках. 6 Оптимизируется (3 → 12 шаг 1).
IndentInPoints Отступ в шагах цены для стопа и тейка. 10 Оптимизируется (5 → 30 шаг 5).
OrderVolume Объём сделки в лотах. 1 Используется для входов и выходов.
CandleType Тип свечей, по которым ведутся расчёты. 15-минутные свечи Позволяет адаптировать горизонт торговли.

Теги и особенности

  • Категория: Возврат к среднему, волатильностные каналы.
  • Индикаторы: Bollinger Bands, Relative Strength Index.
  • Стопы: Жёсткий стоп, жёсткий тейк, перевод в безубыток.
  • Сложность: Средняя (многоступенчатые условия и хранение состояния).
  • Автоматизация: Полностью автоматические входы и выходы.
  • Оптимальные условия: Боковые рынки, где колебания вокруг средней полосы встречаются чаще.

Примечания

  • Отступ масштабируется на шаг цены инструмента, что соответствует пипсовой логике советника MT5.
  • Очереди последних значений индикаторов позволяют точно воспроизвести проверки «Depth» из исходника.
  • Для корректной работы необходимо наличие достаточной истории свечей, чтобы индикаторы успели сформироваться.
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>
/// FullDump BB RSI strategy (simplified). Uses RSI oversold/overbought
/// with EMA trend filter for mean reversion entries.
/// </summary>
public class FullDumpBbRsiStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<int> _emaPeriod;

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

	public int RsiPeriod
	{
		get => _rsiPeriod.Value;
		set => _rsiPeriod.Value = value;
	}

	public int EmaPeriod
	{
		get => _emaPeriod.Value;
		set => _emaPeriod.Value = value;
	}

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

		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Period", "RSI averaging period", "Indicators");

		_emaPeriod = Param(nameof(EmaPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("EMA Period", "Trend filter EMA", "Indicators");
	}

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

		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var ema = new ExponentialMovingAverage { Length = EmaPeriod };

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

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var close = candle.ClosePrice;

				// RSI oversold => buy
				if (rsiValue < 25m && Position <= 0)
					BuyMarket();
				// RSI overbought => sell
				else if (rsiValue > 75m && Position >= 0)
					SellMarket();
				// Trend following on EMA cross
				else if (close > emaValue && rsiValue > 60m && rsiValue < 70m && Position <= 0)
					BuyMarket();
				else if (close < emaValue && rsiValue < 40m && rsiValue > 30m && Position >= 0)
					SellMarket();
			})
			.Start();

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