Открыть на GitHub

FiveMinutesScalpingEA v1.1 (порт на StockSharp)

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

FiveMinutesScalpingEaV11Strategy — это порт советника MetaTrader 4 5MinutesScalpingEA v1.1 на высокоуровневый API StockSharp. Стратегия сохраняет исходную идею: сочетание двух Hull Moving Average, импульсного индикатора Fisher, детектора пробоя по ATR и трендового фильтра. Алгоритм рассчитан на работу на пятиминутных свечах и анализирует только закрытые бары.

Торговля ведётся по одному инструменту и одной позиции: либо лонг, либо шорт, либо отсутствие позиции. Защитные ордера моделируются внутри стратегии путём контроля максимумов и минимумов свечей.

Набор индикаторов

Компонент Реализация в StockSharp Назначение
i1 Hull MA HullMovingAverage с периодом Period1 (30 по умолчанию) Быстрый фильтр направления тренда по наклону Hull.
i2 Hull MA HullMovingAverage с периодом Period2 (50 по умолчанию) Дополнительное подтверждение тренда; оба Hull должны совпадать (в нормальном режиме).
i3 Fisher FisherTransform с периодом Period3 Импульсный осциллятор: положительные значения поддерживают покупки, отрицательные — продажи.
i4 ATR-пробой AverageTrueRange с периодом Period4 + сравнение трёх свечей Фиксирует сильные пробои, когда максимум/минимум текущей свечи значительно превышает два предыдущих.
i5 Fisher тренда FisherTransform с периодом Period5 Сглаженный трендовый фильтр, аналог гистограммы из оригинального советника.

История значений каждого индикатора сохраняется так, чтобы можно было обратиться к значению на IndicatorShift свечей назад — полностью повторяя параметр IndicatorsShift из MQL4. Каждый фильтр можно отключить через соответствующий параметр UseIndicatorX.

Логика входов

  1. Открывается подписка на свечи типа CandleType (по умолчанию M5).
  2. После закрытия очередной свечи обновляются все индикаторы. Как только достаточно истории, стратегия анализирует свечу, находящуюся на IndicatorShift баров позади.
  3. Нормальный режим (SignalMode = Normal):
    • Покупка возможна, если все активные фильтры показывают бычье состояние (наклон Hull вверх, Fisher > 0, пробой ATR вверх, трендовый Fisher > 0).
    • Продажа выполняется при зеркальном условии (наклон Hull вниз, Fisher < 0, пробой вниз, трендовый Fisher < 0).
  4. Режим Reverse меняет трактовку сигналов на противоположную.
  5. При появлении нового сигнала обновляется флаг _lastSignal. Если включён CloseOnSignal, противоположная позиция закрывается прежде чем открыть новую.
  6. Параметр UseTimeFilter ограничивает торговлю временем суток — логика совпадает с оригинальным советником (обработка диапазона [StartHour, EndHour), включая переход через полуночь).

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

  • Стоп-лосс / тейк-профит — выставляются на фиксированном расстоянии (StopLossPips, TakeProfitPips) от цены входа и проверяются на каждой свече.
  • Трейлинг-стоп — при включении UseTrailingStop ведётся плавающий максимум/минимум. После движения цены минимум на TrailingStepPips стоп подтягивается на расстояние TrailingStopPips от текущего экстремума.
  • Перевод в безубыток — при включении UseBreakEven и прохождении цены BreakEvenPips + BreakEvenAfterPips стоп переносится на уровень BreakEvenPips от точки входа.
  • Все выходы выполняются рыночными ордерами (SellMarket / BuyMarket), закрывающими полный объём позиции.

Параметры

Параметр Значение по умолчанию Описание
CandleType M5 Таймфрейм сигналов.
IndicatorShift 1 На сколько закрытых свечей сдвигается анализ индикаторов.
SignalMode Normal Нормальная или инвертированная интерпретация сигналов.
UseIndicator1..UseIndicator5 true Включение каждого фильтра по отдельности.
Period1..Period5 30, 50, 10, 14, 18 Периоды Hull, Fisher и ATR.
PriceMode3 HighLow Параметр совместимости с MQL4. В текущем порте Fisher использует стандартную цену свечи.
CloseOnSignal false Закрывать противоположную позицию перед открытием новой.
UseTimeFilter, StartHour, EndHour false, 0, 0 Ограничение торговли по времени.
UseTakeProfit, TakeProfitPips true, 10 Настройки тейк-профита.
UseStopLoss, StopLossPips true, 10 Настройки стоп-лосса.
UseTrailingStop, TrailingStopPips, TrailingStepPips false, 1, 1 Параметры трейлинг-стопа.
UseBreakEven, BreakEvenPips, BreakEvenAfterPips false, 4, 2 Параметры перевода в безубыток.
TradeVolume 0.01 Объём рыночных ордеров.

Отличия от оригинала

  • Групповые закрытия (UseBasketClose, CloseInProfit, CloseInLoss) не реализованы: стратегия работает с одной нетто-позицией.
  • Автоматический расчёт лота и контроль спрэда отсутствуют; объём задаётся вручную параметром TradeVolume.
  • Параметр выбора цены для Fisher оставлен ради совместимости, но индикатор StockSharp использует стандартную цену свечи. Для альтернативных ценовых источников потребуется расширить индикатор.
  • Управление рисками выполняется на закрытых свечах, что соответствует поведению исходного советника при IndicatorsShift >= 1.

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

  1. Используйте ликвидные инструменты с минимальным спредом (изначально советник ориентирован на EUR/USD M5).
  2. Настраивайте TradeVolume в соответствии с управлением капиталом.
  3. Подбирайте периоды индикаторов и набор фильтров под собственный стиль торговли.
  4. При необходимости включайте фильтр по времени для исключения малоликвидных сессий.
  5. Перед запуском на реальных данных протестируйте стратегию в тестере StockSharp.
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// 5 Minutes Scalping EA V11 strategy: WMA crossover scalper.
/// Buys when fast WMA crosses above slow WMA. Sells on cross below.
/// </summary>
public class FiveMinutesScalpingEaV11Strategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;

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

	public int FastPeriod
	{
		get => _fastPeriod.Value;
		set => _fastPeriod.Value = value;
	}

	public int SlowPeriod
	{
		get => _slowPeriod.Value;
		set => _slowPeriod.Value = value;
	}

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

		_fastPeriod = Param(nameof(FastPeriod), 6)
			.SetGreaterThanZero()
			.SetDisplay("Fast WMA", "Fast WMA period", "Indicators");

		_slowPeriod = Param(nameof(SlowPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("Slow WMA", "Slow WMA period", "Indicators");
	}

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

		var fast = new WeightedMovingAverage { Length = FastPeriod };
		var slow = new WeightedMovingAverage { Length = SlowPeriod };

		decimal? prevFast = null;
		decimal? prevSlow = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fast, slow, (candle, fastVal, slowVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (prevFast.HasValue && prevSlow.HasValue)
				{
					if (prevFast.Value <= prevSlow.Value && fastVal > slowVal && Position <= 0)
						BuyMarket();
					else if (prevFast.Value >= prevSlow.Value && fastVal < slowVal && Position >= 0)
						SellMarket();
				}

				prevFast = fastVal;
				prevSlow = slowVal;
			})
			.Start();

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