Открыть на GitHub

Стратегия Gridder EA (порт с MQL4)

Обзор

Оригинальный GridderEA — это мультивалютный сеточный советник для MetaTrader 4. Порт StockSharp сохраняет ключевые идеи — прогрессивный шаг, адаптивный объём, целевые значения по корзине и аварийный хедж — но работает с одним инструментом, выбранным в настройках стратегии. Стратегия подписывается на заданный тип свечей, обрабатывает только закрытые бары и открывает усредняющие сделки при удалении цены от последнего контрольного уровня на заданное количество пунктов.

Логика торговли

  1. Развитие сетки. Базовый шаг в пунктах определяет минимальный сдвиг цены перед размещением новой сделки. Для последующих ордеров шаг может увеличиваться геометрически или экспоненциально, чтобы растягивать сетку на волатильном рынке.
  2. Изменение объёма. Первый ордер открывается базовым объёмом. Далее объём умножается на коэффициент согласно выбранному режиму (статический, геометрический или экспоненциальный).
  3. Цели по корзине. Нереализованная прибыль и убыток рассчитываются в деньгах за счёт разницы цены каждой позиции и стоимости шага цены инструмента. При достижении цели по прибыли на лот стратегия закрывает все сделки. Аналогично цель по убытку на лот позволяет быстро остановить сетку.
  4. Аварийный режим. Когда число ордеров с одной стороны достигает порогового значения, стратегия при необходимости отправляет хеджирующую сделку объёмом, равным доле от суммарного объёма. Это воспроизводит режим Emergency Mode из MQL и помогает ограничить просадку.
  5. Защита позиций. В методе OnStarted вызывается StartProtection(), чтобы базовая стратегия следила за внешними изменениями позиции и синхронизировалась с биржей.

Реализация на StockSharp не использует тяжёлые коллекции и полностью повторяет логику работы по закрытым барам.

Параметры

Параметр Описание
Initial Volume Объём первой сделки сетки.
Volume Multiplier Множитель объёма для следующих ордеров в геометрическом и экспоненциальном режимах.
Grid Step (pips) Базовое расстояние между усредняющими входами в пунктах.
Step Multiplier Коэффициент роста шага сетки для геометрического и экспоненциального режимов.
Target Profit / Lot Цель по нереализованной прибыли на каждый лот. Достижение значения закрывает все сделки.
Target Loss / Lot Допустимый убыток на лот. При превышении все позиции закрываются.
Max Orders Per Side Максимальное число усреднений в одну сторону. Значение 0 снимает ограничение.
Allow Long / Allow Short Включение или отключение длинной и короткой ноги сетки.
Step Mode Режим изменения шага: статический, геометрический или экспоненциальный.
Lot Mode Режим изменения объёма: статический, геометрический или экспоненциальный.
Use Emergency Mode Активация аварийного хеджа при чрезмерной просадке.
Emergency Trigger Количество ордеров, после которого запускается аварийный режим.
Hedge Volume Factor Доля суммарного объёма, используемая для хеджирующей сделки.
Candle Type Тип свечей, по которым строится логика сетки.

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

  • Порт работает с одним инструментом. Для торговли несколькими парами запустите несколько экземпляров стратегии, как это делалось в MetaTrader.
  • Графические панели и оформление из MT4 не переносятся. Для визуализации используйте стандартные области графиков StockSharp.
  • Предустановленные профили money-management и частичные закрытия сведены к единой логике прибыли/убытка по корзине.

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

  1. Настройте тип свечей, объём и шаг сетки через параметры конструктора или UI.
  2. Запускайте стратегию после подключения инструмента к реальной или тестовой площадке — подписка на свечи выполняется автоматически.
  3. Контролируйте параметры аварийного режима, чтобы подобрать баланс между скоростью восстановления и просадкой.
  4. Комбинируйте стратегию с защитными механизмами StockSharp (ограничения по портфелю, стоп-ауты и т.д.).

Пример аварийного хеджа

Если открыто пять усредняющих покупок, а триггер равен пяти, при коэффициенте хеджа 0.5 стратегия немедленно отправит рыночную продажу объёмом в половину общей длинной позиции. Это повторяет механику блокировки корзины из MQL и позволяет переждать откат.

Подсказки по оптимизации

  • Оптимизируйте Grid Step (pips) и Volume Multiplier совместно: при малом шаге стоит снижать множитель объёма.
  • Значение Target Profit / Lot удобно для переноса долларовых целей MetaTrader в экосистему StockSharp.
  • Параметры Emergency Trigger и Hedge Volume Factor подбирайте под волатильность инструмента — чем рынок резче, тем раньше лучше включать хедж.

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

  • Перед запуском на реальном счёте протестируйте стратегию в симуляторе.
  • Учитывайте минимальный шаг объёма у брокера, чтобы округление не приводило к отказу биржи.
  • Настройте дополнительные стоп-правила, ограничивающие максимальный убыток в длительных трендах.
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Gridder EA strategy: BB mean reversion grid concept.
/// Buys when close < lower BB. Sells when close > upper BB.
/// </summary>
public class GridderEaStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _bbPeriod;

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

	public int BbPeriod
	{
		get => _bbPeriod.Value;
		set => _bbPeriod.Value = value;
	}

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

		_bbPeriod = Param(nameof(BbPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("BB Period", "Bollinger Bands period", "Indicators");
	}

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

		var bb = new BollingerBands { Length = BbPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.BindEx(bb, ProcessCandle)
			.Start();

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

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

		if (!IsFormedAndOnlineAndAllowTrading())
			return;

		var bbv = (BollingerBandsValue)bbVal;
		if (bbv.UpBand is not decimal upper ||
			bbv.LowBand is not decimal lower)
			return;

		var close = candle.ClosePrice;

		if (close < lower && Position <= 0)
		{
			BuyMarket();
		}
		else if (close > upper && Position >= 0)
		{
			SellMarket();
		}
	}
}