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
Cuando se inicia la estrategia, registra inmediatamente que el módulo de monitoreo se ha inicializado y captura el estado actual del conector.
Un temporizador en segundo plano verifica la bandera Connector.IsConnected cada CheckIntervalSeconds (predeterminado: 1 segundo).
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).
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;
}
}
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 ParabolicSar
from StockSharp.Algo.Strategies import Strategy
class is_connected_strategy(Strategy):
def __init__(self):
super(is_connected_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(60)))
self._acceleration = self.Param("Acceleration", 0.01)
self._acceleration_max = self.Param("AccelerationMax", 0.1)
self._prev_sar = 0.0
self._prev_close = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def Acceleration(self):
return self._acceleration.Value
@Acceleration.setter
def Acceleration(self, value):
self._acceleration.Value = value
@property
def AccelerationMax(self):
return self._acceleration_max.Value
@AccelerationMax.setter
def AccelerationMax(self, value):
self._acceleration_max.Value = value
def OnReseted(self):
super(is_connected_strategy, self).OnReseted()
self._prev_sar = 0.0
self._prev_close = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(is_connected_strategy, self).OnStarted2(time)
self._prev_sar = 0.0
self._prev_close = 0.0
self._has_prev = False
sar = ParabolicSar()
sar.Acceleration = self.Acceleration
sar.AccelerationMax = self.AccelerationMax
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(sar, self._process_candle).Start()
def _process_candle(self, candle, sar_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
sar_val = float(sar_value)
if self._has_prev:
if self._prev_close <= self._prev_sar and close > sar_val and self.Position <= 0:
self.BuyMarket()
elif self._prev_close >= self._prev_sar and close < sar_val and self.Position >= 0:
self.SellMarket()
self._prev_close = close
self._prev_sar = sar_val
self._has_prev = True
def CreateClone(self):
return is_connected_strategy()