Ver en GitHub

Estrategia SLTP de Ronz Auto

Descripción general

La Estrategia Ronz Auto SLTP es un puerto C# directo de la utilidad MetaTrader 5 Ronz Auto SLTP. Actúa como un administrador comercial que asigna automáticamente niveles protectores de stop-loss y take-profit, aplica bloqueo de ganancias y activa reglas de seguimiento para cada posición abierta. La conversión se basa en StockSharp API de alto nivel y admite tanto la supervisión de toda la cuenta como la implementación de un solo símbolo.

Capacidades clave:

  • Aplique protección del lado del servidor o virtual (del lado del cliente) según el indicador UseServerStops.
  • Establezca distancias iniciales de stop-loss y take-profit utilizando mediciones de pips estilo MetaTrader.
  • Bloquee una cantidad fija de ganancias después de que la operación alcance un umbral configurable.
  • Ejecute tres variaciones de trailing stop (clásico, distancia de paso, paso a paso) reflejando el asesor original.
  • Supervise todos los valores de la cartera conectada o restrinja la gestión únicamente al valor de la estrategia.
  • Emita notificaciones de registro opcionales cada vez que una parada virtual o una toma de ganancias cierre una posición.

Parámetros

Parámetro Predeterminado Descripción
ManageAllSecurities true Supervise cada posición abierta en la cartera. Desactívelo para gestionar solo la seguridad de la estrategia.
TakeProfitPips 550 Distancia en MetaTrader pips agregada al precio de entrada para el objetivo de obtención de ganancias (incluida la distancia mínima de parada del corredor).
StopLossPips 350 Distancia en MetaTrader pips restada del precio de entrada para el nivel de stop-loss (incluida la distancia mínima de stop del corredor).
UseServerStops true Cuando esté habilitado, envíe órdenes stop y limit al corredor. Cuando está desactivado, cierre posiciones prácticamente una vez que se alcancen los umbrales.
EnableLockProfit true Habilite la lógica de bloqueo de ganancias que mueve el stop por encima o por debajo del precio de entrada después de alcanzar un umbral.
LockProfitAfterPips 100 Beneficio (en pips) que se debe lograr antes de que la lógica de bloqueo se active. Establezca en cero para omitir la etapa de bloqueo y el seguimiento inmediatamente.
ProfitLockPips 60 Beneficio conservado una vez que se activa la cerradura. La parada se mueve al precio de entrada más/menos esta distancia.
TrailingStopMode Classic Algoritmo de seguimiento utilizado después del umbral de bloqueo. Opciones: None, Classic, StepDistance, StepByStep.
TrailingStopPips 50 Distancia de seguimiento en pips. Actúa como amortiguador principal para los modos de seguimiento clásico y basado en pasos.
TrailingStepPips 10 Incremento utilizado por los modos de seguimiento basados en pasos. Ignorado por la variante trasera clásica.
EnableAlerts false Cuando sea verdadero, escriba mensajes de registro cada vez que una parada virtual o una toma de ganancias cierren una orden.

Detalles de comportamiento

  1. Protección inicial

    • Cuando se detecta una nueva posición, la estrategia calcula objetivos de stop-loss y take-profit en relación con el precio de entrada.
    • Las distancias de parada mínimas definidas por el corredor se respetan leyendo los campos de nivel de parada/congelación de las actualizaciones de Nivel 1 y ampliando las distancias solicitadas si es necesario.
  2. Bloqueo de ganancias

    • Una vez que la ganancia actual supera LockProfitAfterPips, el stop se eleva (o se reduce en el caso de posiciones cortas) para bloquear ProfitLockPips de ganancias.
    • Si el bloqueo está deshabilitado, la estrategia omite esta etapa y espera las condiciones finales.
  3. Paradas finales

    • Classic: mantiene una distancia fija (TrailingStopPips) al precio actual.
    • StepDistance: reduce la distancia en TrailingStepPips una vez que el precio se ha movido lo suficientemente favorable, coincidiendo estrechamente con la implementación de MetaTrader "paso a mantener distancia".
    • StepByStep: empuja el stop hacia adelante en incrementos discretos de TrailingStepPips una vez que el precio ha avanzado la distancia de seguimiento configurada.
    • El seguimiento comienza inmediatamente cuando LockProfitAfterPips es cero. De lo contrario, se activa una vez que la ganancia excede LockProfitAfterPips + TrailingStopPips.
  4. Modo Virtual

    • Cuando UseServerStops es falso, la estrategia no registra ninguna orden stop/limit. En cambio, cierra la posición abierta mediante órdenes de mercado tan pronto como se supera el límite de pérdidas o la toma de ganancias calculados.
    • Se pueden habilitar alertas para documentar estos cierres virtuales en el registro.
  5. Soporte de seguridad múltiple

    • Con ManageAllSecurities = true, la estrategia se suscribe a datos de Nivel 1 para cada valor que tenga una posición abierta en la cartera seleccionada.
    • Cada valor mantiene su propio estado de parada, obtención de ganancias y seguimiento para que las operaciones largas y cortas se supervisen de forma independiente.

Consejos de uso

  • Adjunte la estrategia a una cartera y, opcionalmente, asigne un valor predeterminado cuando solo un instrumento necesite supervisión.
  • Asegúrese de que los datos de Nivel 1 (mejor oferta/demanda) estén disponibles para cada símbolo administrado para que los cálculos de pips sigan siendo precisos.
  • Revise las restricciones del nivel de parada del corredor: la estrategia ya amplía las distancias solicitadas, pero el centro de negociación aún puede rechazar configuraciones extremadamente estrictas.
  • El modo virtual es útil en corredores que no admiten órdenes de protección o durante escenarios de backtesting.

Diferencias con el experto original

  • StockSharp agrega posiciones por valor, mientras que MetaTrader el modo de cobertura rastrea tickets individuales. Por tanto, el puerto gestiona la posición neta por instrumento.
  • La funcionalidad de orden de prueba del script MQ5 (abrir operaciones ficticias en el probador) se omitió intencionalmente.
  • Las alertas se envían a través del subsistema de registro StockSharp en lugar de ventanas emergentes en pantalla.
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// Ronz Auto SLTP strategy: SMA crossover with ATR-based risk management.
/// Buys when fast SMA crosses above slow SMA, sells on cross below.
/// </summary>
public class RonzAutoSltpStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;

	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 RonzAutoSltpStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_fastPeriod = Param(nameof(FastPeriod), 10)
			.SetGreaterThanZero()
			.SetDisplay("Fast SMA", "Fast SMA period", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 30)
			.SetGreaterThanZero()
			.SetDisplay("Slow SMA", "Slow SMA period", "Indicators");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = 0;
		_prevSlow = 0;
		_hasPrev = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevFast = 0;
		_prevSlow = 0;
		_hasPrev = false;
		var fast = new ExponentialMovingAverage { Length = FastPeriod };
		var slow = new ExponentialMovingAverage { Length = SlowPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, ProcessCandle).Start();
	}

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

		if (_hasPrev)
		{
			if (_prevFast <= _prevSlow && fastValue > slowValue && Position <= 0)
				BuyMarket();
			else if (_prevFast >= _prevSlow && fastValue < slowValue && Position >= 0)
				SellMarket();
		}
		else
		{
			if (fastValue > slowValue && Position <= 0)
				BuyMarket();
			else if (fastValue < slowValue && Position >= 0)
				SellMarket();
		}

		_prevFast = fastValue;
		_prevSlow = slowValue;
		_hasPrev = true;
	}
}