Открыть на GitHub

Стратегия Histo Scalper

Обзор

Histo Scalper Strategy — перенос советника HistoScalperEA v1.0 на платформу StockSharp. Алгоритм объединяет восемь гистограммных индикаторов (ADX, ATR, полосы Боллинджера, Bulls/Bears Power, CCI, MACD, RSI и Stochastic). Сделка открывается только тогда, когда все включённые фильтры показывают одно направление, и хотя бы один из них демонстрировал противоположный сигнал на предыдущей свече. Тем самым сохраняется оригинальная двухсвечная логика подтверждения и снижается число входов в боковике.

Формирование сигналов

  1. ADX — сравнение +DI и −DI, при необходимости направление можно инвертировать.
  2. ATR — сравнение текущего ATR с SMA-базой; измеряется процентное отклонение. Для покупок требуется превышение AtrPositiveThreshold, для продаж — падение ниже AtrNegativeThreshold.
  3. Полосы Боллинджера — требование пробоя верхней или нижней полосы закрытием свечи.
  4. Bulls/Bears Power — Bulls Power используется для покупок, модуль Bears Power — для продаж.
  5. CCI — реагирует на вход цены в зоны перепроданности/перекупленности.
  6. MACD — анализирует гистограмму (расстояние между MACD и сигнальной линией).
  7. RSI — классические уровни 30/70 (по умолчанию).
  8. Stochastic — значения линии %K сравниваются с границами диапазона.

Если хотя бы один активный фильтр выдаёт нейтральное значение, обработка текущей свечи прекращается. Сигналы предыдущих свечей сохраняются для контроля условия «предыдущая свеча противоположна».

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

  • Объём сделок задаётся параметром TradeVolume.
  • Параметр AllowPyramiding разрешает наращивать позицию при поступлении новых сигналов в том же направлении.
  • TakeProfitPoints и StopLossPoints (в шагах цены) сразу устанавливаются через методы SetTakeProfit и SetStopLoss.
  • Параметры UseTimeFilter, SessionStart, SessionEnd позволяют ограничить торговлю временным окном в течение суток.

Параметры

Параметр Описание
TradeVolume Базовый объём сделки.
AllowPyramiding Разрешение на пирамидинг.
CloseOnOppositeSignal Закрытие позиции при смене суммарного сигнала.
UseTimeFilter, SessionStart, SessionEnd Торговый интервал по времени.
UseTakeProfit, TakeProfitPoints Настройки тейк-профита в шагах цены.
UseStopLoss, StopLossPoints Настройки стоп-лосса в шагах цены.
UseIndicator1UseIndicator8 Включение отдельных фильтров.
ModeIndicatorX Прямой или инвертированный режим работы фильтра.
Остальные параметры Периоды и пороги, повторяющие настройки исходного советника.

Отличия от версии MQL

  • Удалены управление «корзиной» ордеров, звуковые уведомления и сеточная логика.
  • Автоматический расчёт лота, безубыток и трейлинг-стоп не реализованы — вместо этого используйте стандартные стопы и тейк-профит.
  • Проверка спреда и обработка брокерских особенностей не перенесены.

Рекомендации по использованию

  1. Перед запуском установите Security и Portfolio стратегии.
  2. Настройте тип свечи (CandleType) под нужный таймфрейм.
  3. Подберите пороги индикаторов под волатильность инструмента.
  4. Во время оптимизации отключайте часть фильтров, чтобы сократить количество параметров.
  5. Используйте AllowPyramiding и CloseOnOppositeSignal для контроля экспозиции на быстрых рынках.
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// Multi-indicator scalping strategy combining MACD, RSI, and CCI filters.
/// Buys when all indicators agree on bullish signal. Sells on bearish agreement.
/// </summary>
public class HistoScalperStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<int> _cciPeriod;

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

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

	public int CciPeriod
	{
		get => _cciPeriod.Value;
		set => _cciPeriod.Value = value;
	}

	public HistoScalperStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

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

		_cciPeriod = Param(nameof(CciPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("CCI Period", "CCI period", "Indicators");
	}

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

		var macd = new MovingAverageConvergenceDivergence();
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var cci = new CommodityChannelIndex { Length = CciPeriod };

		decimal? prevMacd = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(macd, rsi, cci, (candle, macdLine, rsiVal, cciVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (prevMacd.HasValue)
				{
					if (prevMacd.Value <= 0 && macdLine > 0 && rsiVal < 70m && cciVal > -100m && Position <= 0)
						BuyMarket();
					else if (prevMacd.Value >= 0 && macdLine < 0 && rsiVal > 30m && cciVal < 100m && Position >= 0)
						SellMarket();
				}

				prevMacd = macdLine;
			})
			.Start();

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