Открыть на GitHub

Стратегия Binario

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

Binario — это система пробоя с отложенными стоп-заявками. Она строит два скользящих среднего по максимумам и минимумам свечей и размещает симметричные стоп-заявки, когда цена находится внутри канала. Для каждой заявки заранее вычисляются уровни стоп-лосса и тейк-профита, как в исходном советнике MetaTrader 5. Перенос на StockSharp использует высокоуровневые подписки на свечи и Level-1 котировки для оценки текущего спреда.

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

  1. Рассчитываются две скользящие: верхняя по High, нижняя по Low выбранного таймфрейма.
  2. Если текущая закрывающая цена находится между скользящими:
    • Выставляется buy stop выше верхней средней на величину спреда и параметра DifferencePips.
    • Выставляется sell stop ниже нижней средней на ту же величину.
  3. Для каждой заявки запоминаются уровни стоп-лосса и тейк-профита, полученные из значений скользящих и параметров в пунктах.
  4. При срабатывании заявки противоположная удаляется, а для открытой позиции размещаются защитные стоп-лосс и тейк-профит.
  5. Трейлинг-стоп подтягивается, когда цена проходит не менее TrailingStopPips + TrailingStepPips пунктов в сторону профита, повторяя ступенчатое поведение MQL-версии.
  6. При смене направления позиции старые защитные заявки отменяются, чтобы избежать конфликтов.

Параметры

  • CandleType — таймфрейм свечей.
  • MaPeriod — период обеих скользящих средних.
  • MaShift — горизонтальный сдвиг скользящих в барах (0 соответствует исходному советнику).
  • HighMaMethod / LowMaMethod — методы сглаживания (SMA, EMA, SMMA, WMA, LWMA).
  • PointValue — абсолютное значение одного пункта для инструмента (0.0001 для большинства форекс-пар, 0.01 для пар с JPY и т.п.).
  • DifferencePips — отступ между скользящей и заявкой в пунктах.
  • TakeProfitPips — размер тейк-профита в пунктах.
  • TrailingStopPips — расстояние трейлинг-стопа; значение 0 отключает подтяжку.
  • TrailingStepPips — минимальное дополнительное движение в пунктах перед очередной подтяжкой стопа.
  • Volume — базовый объем из класса Strategy; при развороте к объему добавляется абсолютное значение текущей позиции.

Параметры, заданные в пунктах, переводятся в абсолютные цены через PointValue, что полностью повторяет формулу Point * digits_adjust в MT5.

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

  • Новые buy stop/ sell stop размещаются только если по соответствующему направлению нет открытой позиции.
  • После входа немедленно выставляются защитные стоп-лосс и тейк-профит, а неиспользованный стоп-вход отменяется.
  • При развороте позиции старые защитные заявки снимаются до регистрации новых.

Трейлинг-стоп

  • Для лонга: при прибыли более TrailingStopPips + TrailingStepPips пунктов стоп переносится на Close - TrailingStopPips, если новое значение ближе к цене минимум на TrailingStepPips.
  • Для шорта: при падении на ту же величину стоп переносится на Close + TrailingStopPips, также с проверкой шага.
  • В качестве аналога PriceCurrent() используется цена закрытия последней свечи.

Требуемые данные

  • Свечи выбранного таймфрейма.
  • Level-1 котировки (лучшие Bid/Ask) для расчета спреда; при отсутствии данных используется минимальный шаг цены инструмента или PointValue.

Отличия от MT5-версии

  • Управление объемом ведется через свойство Volume; режим расчета Lots/Risk не поддерживается.
  • При изменении трейлинг-стопа защитные заявки переоформляются, так как в StockSharp нельзя модифицировать цену уже выставленного стопа.
  • Цена исполнения берется из заданной цены заявки; при необходимости подстройте PointValue и параметры в пунктах под спецификацию брокера.
  • Расчеты выполняются на закрытых свечах, что эквивалентно режиму «новый бар» в MT5.

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

  1. Установите PointValue согласно тик-сайзу инструмента.
  2. Подберите методы и период скользящих для соответствия оригинальному шаблону.
  3. Настройте отступ, тейк-профит и параметры трейлинг-стопа в пунктах.
  4. Убедитесь, что подключены Level-1 данные для корректной оценки спреда.
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>
/// Binario strategy (simplified). Uses two EMAs as channel and trades breakouts.
/// </summary>
public class BinarioStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _maPeriod;

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

	public int MaPeriod
	{
		get => _maPeriod.Value;
		set => _maPeriod.Value = value;
	}

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

		_maPeriod = Param(nameof(MaPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("MA Period", "Moving average length", "Indicators");
	}

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

		var highest = new Highest { Length = MaPeriod };
		var lowest = new Lowest { Length = MaPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(highest, lowest, (ICandleMessage candle, decimal highValue, decimal lowValue) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var close = candle.ClosePrice;
				var mid = (highValue + lowValue) / 2m;
				var channelPadding = (highValue - lowValue) * 0.1m;

				// Buy on breakout above channel midpoint
				if (close > mid + channelPadding && Position <= 0)
				{
					BuyMarket();
				}
				// Sell on breakout below channel midpoint
				else if (close < mid - channelPadding && Position >= 0)
				{
					SellMarket();
				}
			})
			.Start();

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