Открыть на GitHub

Стратегия Alexav SpeedUp M1

Обзор

Alexav SpeedUp M1 — прямой порт экспертного советника MetaTrader 4 «Alexav_SpeedUp_M1». Стратегия анализирует тела закрывшихся внутридневных свечей и сразу же открывает рыночную позицию, если размер тела превышает заданный порог. После входа включается классическое сопровождение позиции: устанавливаются стоп-лосс, тейк-профит и плавающий стоп в стиле MetaTrader.

Для конверсии использован высокоуровневый API StockSharp. Свечи поступают через SubscribeCandles, данные best bid/ask для трейлинга — через level1 подписку, защитные приказы выставляются стандартными методами BuyStop, SellStop, BuyLimit и SellLimit. Дополнительные индикаторы или сложные вычисления не требуются.

Генерация сигналов

  1. Обрабатывается каждая завершённая свеча выбранного таймфрейма.
  2. Если свеча закрылась выше открытия и разница превышает параметр Body Threshold, стратегия открывает (или переворачивает в) длинную позицию по рынку.
  3. Если свеча закрылась ниже открытия на ту же величину, открывается (или переворачивается в) короткая позиция.
  4. Наличие встречной позиции учитывается автоматически: объём рыночного ордера увеличивается так, чтобы закрыть старый объём и при необходимости открыть новую позицию в нужном направлении.

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

  • Начальный стоп-лосс: при увеличении позиции немедленно регистрируется защитный стоп на заданное число пунктов ниже (для лонга) или выше (для шорта) цены входа.
  • Тейк-профит: на соответствующем удалении выставляется лимитный приказ на фиксацию прибыли.
  • Трейлинг-стоп: по данным level1 отслеживается текущая прибыль. Как только она превышает расстояние трейлинга, стоп-ордер переносится ближе к цене, сохраняя заданный зазор и не откатываясь назад.
  • Все защитные приказы отменяются, когда позиция становится нулевой.

Логика сохранена максимально близко к оригинальному советнику: никаких дополнительных фильтров или ограничений сверх MQL-версии не добавлено.

Параметры

Название Описание
Lot Size Базовый торговый объём в лотах для рыночных ордеров. При развороте добавляется объём, необходимый для закрытия встречной позиции.
Take Profit (points) Расстояние от цены входа до тейк-профита в пунктах MetaTrader (преобразуется через шаг цены инструмента).
Initial Stop (points) Расстояние от цены входа до первичного стоп-лосса в пунктах.
Trailing Stop (points) Размер шага плавающего стопа. Значение 0 отключает трейлинг.
Body Threshold Минимальная разница между ценами открытия и закрытия свечи, при превышении которой совершается сделка.
Candle Type Тип свечей (таймфрейм), используемый для анализа. По умолчанию соответствует минутному графику оригинала.

Рекомендации по применению

  • Убедитесь, что инструмент предоставляет корректный PriceStep. При его отсутствии стратегия трактует «пункты» как абсолютное ценовое смещение.
  • Для работы трейлинга необходимы данные level1 (лучшие bid/ask). Если доступны только свечи, перенос стопа выполняться не будет.
  • Стратегия ориентирована на внутридневную торговлю и, как и исходный советник, совершает не более одной сделки по каждой свече.
using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Alexav SpeedUp M1 Body strategy.
/// Trades based on large candle body breakouts.
/// Buys after a large bullish candle, sells after a large bearish candle.
/// Uses ATR to define "large" body threshold.
/// </summary>
public class AlexavSpeedUpM1BodyBreakStrategy : Strategy
{
	private readonly StrategyParam<int> _atrPeriod;
	private readonly StrategyParam<decimal> _bodyMultiplier;
	private readonly StrategyParam<DataType> _candleType;

	public int AtrPeriod { get => _atrPeriod.Value; set => _atrPeriod.Value = value; }
	public decimal BodyMultiplier { get => _bodyMultiplier.Value; set => _bodyMultiplier.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public AlexavSpeedUpM1BodyBreakStrategy()
	{
		_atrPeriod = Param(nameof(AtrPeriod), 14)
			.SetDisplay("ATR Period", "ATR period for body threshold", "Indicators");

		_bodyMultiplier = Param(nameof(BodyMultiplier), 1.0m)
			.SetDisplay("Body Multiplier", "Body must exceed ATR * multiplier", "Indicators");

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

	/// <inheritdoc />
	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
	{
		return [(Security, CandleType)];
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
	}

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

		var atr = new AverageTrueRange { Length = AtrPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(atr, ProcessCandle)
			.Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal atrValue)
	{
		if (candle.State != CandleStates.Finished)
			return;

		var body = candle.ClosePrice - candle.OpenPrice;
		var absBody = Math.Abs(body);
		var threshold = atrValue * BodyMultiplier;

		if (absBody < threshold)
			return;

		// Large bullish candle - buy
		if (body > 0 && Position <= 0)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		// Large bearish candle - sell
		else if (body < 0 && Position >= 0)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}
	}
}