Ver en GitHub

Estrategia Está Conectada

Resumen

  • Fuente: Convertido del script MetaTrader 5 IsConnected.mq5 (carpeta MQL/35056).
  • Propósito: Supervisa continuamente el estado del conector e informa las transiciones en línea/fuera de línea con marcas de tiempo y duraciones de tiempo de actividad/inactividad.
  • Tipo: Estrategia de servicios públicos centrada en el monitoreo de la infraestructura en lugar de la ejecución de órdenes.

Comportamiento

  1. Cuando se inicia la estrategia, registra inmediatamente que el módulo de monitoreo se ha inicializado y captura el estado actual del conector.
  2. Un temporizador en segundo plano verifica la bandera Connector.IsConnected cada CheckIntervalSeconds (predeterminado: 1 segundo).
  3. Cuando el estado cambia, la estrategia:
    • Almacena el momento de transición usando la estrategia CurrentTime.
    • Registra el nuevo estado (Online o Offline).
    • Informa cuánto duró el estado anterior (tiempo en línea antes de una desconexión o tiempo fuera de línea antes de la reconexión).
  4. Cuando la estrategia se detiene, cancela el temporizador y registra el último estado conocido para que el operador sepa si la conexión estaba activa o inactiva en el momento del cierre.

Parámetros

Nombre Tipo Predeterminado Descripción
CheckIntervalSeconds int 1 Intervalo (en segundos) entre comprobaciones de conexión sucesivas. Debe ser mayor que cero.

Detalles de registro

  • Todos los mensajes están escritos con LogInfo en inglés para coincidir con la implementación de MetaTrader que se basó en declaraciones Print.
  • Los intervalos de tiempo tienen formato utilizando una cultura invariante e incluyen marcas de tiempo de inicio y el tiempo transcurrido en el estado anterior.

Diferencias vs guión original

  • El bucle de espera ocupado de MQL5 se reemplaza con un temporizador administrado que no bloquea el subproceso de estrategia.
  • En lugar de imprimir líneas de estado duplicadas, la versión StockSharp informa cambios de estado estructurados junto con métricas de tiempo de actividad/tiempo de inactividad.
  • La conversión maneja la eliminación elegante deteniendo el temporizador tanto en OnStopped como en OnReseted.
namespace StockSharp.Samples.Strategies;

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

/// <summary>
/// IsConnected strategy: Parabolic SAR trend following.
/// Buys when close above SAR, sells when close below SAR.
/// </summary>
public class IsConnectedStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<decimal> _acceleration;
	private readonly StrategyParam<decimal> _accelerationMax;

	private decimal _prevSar;
	private decimal _prevClose;
	private bool _hasPrev;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public decimal Acceleration { get => _acceleration.Value; set => _acceleration.Value = value; }
	public decimal AccelerationMax { get => _accelerationMax.Value; set => _accelerationMax.Value = value; }

	public IsConnectedStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_acceleration = Param(nameof(Acceleration), 0.01m)
			.SetDisplay("Acceleration", "SAR acceleration factor", "Indicators");
		_accelerationMax = Param(nameof(AccelerationMax), 0.1m)
			.SetDisplay("Acceleration Max", "SAR max acceleration", "Indicators");
	}

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

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevSar = 0;
		_prevClose = 0;
		_hasPrev = false;
		var sar = new ParabolicSar { Acceleration = Acceleration, AccelerationMax = AccelerationMax };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(sar, ProcessCandle).Start();
	}

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

		if (_hasPrev)
		{
			if (_prevClose <= _prevSar && candle.ClosePrice > sarValue && Position <= 0)
				BuyMarket();
			else if (_prevClose >= _prevSar && candle.ClosePrice < sarValue && Position >= 0)
				SellMarket();
		}

		_prevClose = candle.ClosePrice;
		_prevSar = sarValue;
		_hasPrev = true;
	}
}