Quelle: Konvertiert aus dem MetaTrader 5-Skript IsConnected.mq5 (Ordner MQL/35056).
Zweck: Überwacht kontinuierlich den Connector-Status und meldet Online-/Offline-Übergänge mit Zeitstempeln und Betriebs-/Ausfalldauern.
Typ: Die Versorgungsstrategie konzentriert sich eher auf die Überwachung der Infrastruktur als auf die Auftragsausführung.
Verhalten
Wenn die Strategie startet, protokolliert sie sofort, dass das Überwachungsmodul initialisiert wurde und erfasst den aktuellen Connector-Status.
Ein Hintergrund-Timer überprüft das Flag Connector.IsConnected alle CheckIntervalSeconds (Standard: 1 Sekunde).
Wenn sich der Zustand ändert, ist die Strategie:
Speichert den Zeitpunkt des Übergangs mithilfe der Strategie CurrentTime.
Protokolliert den neuen Status (Online oder Offline).
Meldet, wie lange der vorherige Zustand gedauert hat (Online-Zeit vor der Trennung oder Offline-Zeit vor der erneuten Verbindung).
Wenn die Strategie stoppt, bricht sie den Timer ab und protokolliert den letzten bekannten Status, sodass der Bediener weiß, ob die Verbindung beim Herunterfahren aktiv oder unterbrochen war.
Parameter
Name
Typ
Standard
Beschreibung
CheckIntervalSeconds
int
1
Intervall (in Sekunden) zwischen aufeinanderfolgenden Verbindungsprüfungen. Muss größer als Null sein.
Protokollierungsdetails
Alle Nachrichten werden mit LogInfo auf Englisch geschrieben, um der MetaTrader-Implementierung zu entsprechen, die auf Print-Anweisungen beruhte.
Zeitintervalle werden mithilfe der invarianten Kultur formatiert und umfassen sowohl Startzeitstempel als auch die im vorherigen Zustand verbrachte Zeit.
Unterschiede zum Originalskript
Die beschäftigte Warteschleife von MQL5 wird durch einen verwalteten Timer ersetzt, der den Strategie-Thread nicht blockiert.
Anstatt doppelte Statuszeilen zu drucken, meldet die StockSharp-Version strukturierte Statusänderungen zusammen mit Betriebszeit-/Ausfallzeitmetriken.
Die Konvertierung sorgt für eine ordnungsgemäße Entsorgung, indem der Timer sowohl in OnStopped als auch in OnReseted gestoppt wird.
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()