Ver en GitHub

Conectar Desconectar Estrategia de alerta sonora

Descripción general

La Estrategia de alerta de sonido de conexión y desconexión monitorea continuamente el estado de conexión del conector de estrategia y registra cada transición entre los estados en línea y fuera de línea. El experto original de MQL5 reproducía archivos de audio cuando el terminal MetaTrader estaba conectado o desconectado. Esta conversión de C# mantiene la lógica central (detección de cambios de conexión) y expone enlaces que permiten que el tiempo de ejecución StockSharp registre eventos y duraciones. La estrategia se puede utilizar como un perro guardián ligero que informa al operador sobre problemas de conectividad sin realizar ningún pedido.

Características clave

  • Sondea periódicamente el estado del conector utilizando un intervalo configurable.
  • Detecta eventos de conexión y desconexión y escribe entradas de registro detalladas.
  • Registra cuánto tiempo permaneció el terminal en línea o fuera de línea (opcional).
  • Omite los sonidos de notificación en la primera verificación para reflejar el comportamiento de MQL.

Parámetros

Nombre Predeterminado Descripción
CheckIntervalSeconds 1 Número de segundos entre comprobaciones del estado del conector. Debe ser mayor que cero.
LogDurations true Cuando está habilitada, la estrategia registra el período de tiempo que la conexión permaneció en línea o fuera de línea después de cada transición.

Todos los parámetros están expuestos a través de StrategyParam<T> para que puedan modificarse desde la interfaz de usuario o durante la optimización.

Cómo funciona

  1. Cuando se inicia la estrategia, almacena el estado actual del conector y, opcionalmente, registra el estado inicial.
  2. Un System.Threading.Timer llama periódicamente a un controlador interno que compara el indicador de conexión actual con el valor anterior.
  3. Si el estado cambió, la estrategia registra la transición. La primera notificación está marcada como "inicial" y no representa una alerta sonora real (que coincide con la lógica del asesor experto original).
  4. Los registros de duración opcionales muestran cuánto duró el estado anterior, lo que ayuda al operador a evaluar la estabilidad de la conexión.
  5. El temporizador se elimina automáticamente cuando la estrategia se detiene o se reinicia.

Notas de uso

  • Adjunte la estrategia a cualquier terminal StockSharp habilitado para conector. No interactúa con datos de mercado ni realiza pedidos.
  • Mantenga el intervalo de sondeo predeterminado para un monitoreo casi en tiempo real. Aumente el valor si solo necesita actualizaciones generales.
  • La estrategia utiliza el subsistema de registro StockSharp (LogInfo). Configure detectores de registros o paneles para ver las notificaciones.
  • Para agregar alertas de sonido reales, conecte un servicio de notificación en su aplicación host y reproduzca audio cuando lleguen los mensajes de registro.

Consideraciones de seguridad

  • La estrategia valida el intervalo de sondeo y genera una excepción si no es positivo.
  • Las devoluciones de llamadas del temporizador utilizan la estrategia CurrentTime para garantizar marcas de tiempo consistentes incluso cuando se utiliza la reproducción de datos históricos.
  • Todos los recursos se liberan al detener/reiniciar para evitar temporizadores en segundo plano después de que se desactiva la estrategia.
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Connection alert strategy with SMA crossover trading.
/// Buys when fast SMA crosses above slow SMA, sells on cross below.
/// </summary>
public class ConnectDisconnectSoundAlertStrategy : 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 ConnectDisconnectSoundAlertStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).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 OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var fast = new SimpleMovingAverage { Length = FastPeriod };
		var slow = new SimpleMovingAverage { 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)
				{
					var crossUp = prevFast.Value <= prevSlow.Value && fastVal > slowVal;
					var crossDown = prevFast.Value >= prevSlow.Value && fastVal < slowVal;

					if (crossUp && Position <= 0)
						BuyMarket();
					else if (crossDown && 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);
		}
	}
}