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
Cuando se inicia la estrategia, almacena el estado actual del conector y, opcionalmente, registra el estado inicial.
Un System.Threading.Timer llama periódicamente a un controlador interno que compara el indicador de conexión actual con el valor anterior.
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).
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.
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);
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import SimpleMovingAverage
from StockSharp.Algo.Strategies import Strategy
class connect_disconnect_sound_alert_strategy(Strategy):
"""
SMA crossover strategy. Buys when fast SMA crosses above slow SMA.
"""
def __init__(self):
super(connect_disconnect_sound_alert_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._fast_period = self.Param("FastPeriod", 10) \
.SetDisplay("Fast SMA", "Fast SMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 30) \
.SetDisplay("Slow SMA", "Slow SMA period", "Indicators")
self._prev_fast = 0.0
self._prev_slow = 0.0
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(connect_disconnect_sound_alert_strategy, self).OnReseted()
self._prev_fast = 0.0
self._prev_slow = 0.0
def OnStarted2(self, time):
super(connect_disconnect_sound_alert_strategy, self).OnStarted2(time)
fast = SimpleMovingAverage()
fast.Length = self._fast_period.Value
slow = SimpleMovingAverage()
slow.Length = self._slow_period.Value
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(fast, slow, self.on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def on_process(self, candle, fast_val, slow_val):
if candle.State != CandleStates.Finished:
return
if self._prev_fast != 0.0 and self._prev_slow != 0.0:
cross_up = self._prev_fast <= self._prev_slow and fast_val > slow_val
cross_down = self._prev_fast >= self._prev_slow and fast_val < slow_val
if cross_up and self.Position <= 0:
self.BuyMarket()
elif cross_down and self.Position >= 0:
self.SellMarket()
self._prev_fast = fast_val
self._prev_slow = slow_val
def CreateClone(self):
return connect_disconnect_sound_alert_strategy()