Auf GitHub ansehen

Strategie Status-Mail und Benachrichtigung bei Orderabschluss

Diese Strategie überwacht das Konto und meldet wichtige Ereignisse:

  • Sendet täglich eine Statusbenachrichtigung zu einer festgelegten Minute.
  • Meldet jede geschlossene Order mit grundlegenden Trade-Informationen.

Sie basiert auf dem MQL-Experten StatusMailandAlertOnOrderClose.mq4 und zeigt, wie Benachrichtigungen in StockSharp gehandhabt werden.

Parameter

Name Beschreibung
SendReportEmail Tägliche Statusbenachrichtigung aktivieren.
StatusEmailMinute Minute der Stunde zum Senden der Statusnachricht.
SendClosedEmail Benachrichtigungen beim Schließen von Orders aktivieren.
StartBalance Anfangssaldo des Kontos für die Gewinnberechnung.
CandleType Zeitrahmen zur Uhrzeitprüfung. Normalerweise auf 1 Minute eingestellt.

Logik

  1. Kerzen des gewählten Zeitrahmens abonnieren.
  2. Wenn eine Kerze endet, prüfen ob es die angegebene Minute ist und eine Berichtsnachricht senden.
  3. Bei jedem neuen Trade benachrichtigen, wenn eine Order geschlossen wurde.

Diese Nachrichten werden über AddInfo protokolliert, können aber durch einen beliebigen Benachrichtigungsmechanismus ersetzt werden.

using System;
using System.Collections.Generic;

using Ecng.Common;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// EMA crossover with status tracking.
/// </summary>
public class StatusMailAndAlertOnOrderCloseStrategy : Strategy
{
	private readonly StrategyParam<int> _fastLength;
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;

	public int FastLength { get => _fastLength.Value; set => _fastLength.Value = value; }
	public int SlowLength { get => _slowLength.Value; set => _slowLength.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public StatusMailAndAlertOnOrderCloseStrategy()
	{
		_fastLength = Param(nameof(FastLength), 9)
			.SetGreaterThanZero()
			.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
		_slowLength = Param(nameof(SlowLength), 26)
			.SetGreaterThanZero()
			.SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Type of candles", "General");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
		=> [(Security, CandleType)];

	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = 0; _prevSlow = 0; _hasPrev = false;
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		var fast = new ExponentialMovingAverage { Length = FastLength };
		var slow = new ExponentialMovingAverage { Length = SlowLength };
		SubscribeCandles(CandleType).Bind(fast, slow, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!_hasPrev) { _prevFast = fast; _prevSlow = slow; _hasPrev = true; return; }

		if (_prevFast <= _prevSlow && fast > slow)
		{ if (Position < 0) BuyMarket(); if (Position <= 0) BuyMarket(); }
		else if (_prevFast >= _prevSlow && fast < slow)
		{ if (Position > 0) SellMarket(); if (Position >= 0) SellMarket(); }

		_prevFast = fast; _prevSlow = slow;
	}
}