Auf GitHub ansehen

IsConnected-Strategie

Zusammenfassung

  • 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

  1. Wenn die Strategie startet, protokolliert sie sofort, dass das Überwachungsmodul initialisiert wurde und erfasst den aktuellen Connector-Status.
  2. Ein Hintergrund-Timer überprüft das Flag Connector.IsConnected alle CheckIntervalSeconds (Standard: 1 Sekunde).
  3. 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).
  4. 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;
	}
}