Auf GitHub ansehen

Auto-Trading-Publish-Strategie

Überblick

Diese Strategie portiert das MetaTrader-4-Hilfsprogramm "Auto Trading Publish" nach StockSharp. Statt Marktorders zu senden, konzentriert sie sich darauf, zu steuern, wann Handel erlaubt ist. Sie überwacht die Marktuhr über ein Kerzenabonnement und schaltet das Flag AutoTradingActive, sobald die konfigurierte Start- oder Stoppstunde erreicht wird. Das Flag spiegelt das Verhalten des ursprünglichen Hilfsprogramms wider, das den MT4-"AutoTrading"-Button programmatisch umschaltete.

Handelslogik

  • Einen leichten Kerzenstrom abonnieren (standardmäßig Ein-Minuten-Kerzen), um die Marktzeit auch ohne Trades zu verfolgen.
  • Wenn eine abgeschlossene Kerze die konfigurierte StartHour meldet, das Flag AutoTradingActive aktivieren und das Ereignis protokollieren.
  • Wenn eine abgeschlossene Kerze die konfigurierte StopHour meldet, das Flag AutoTradingActive deaktivieren und das Ereignis protokollieren.
  • Doppelte Umschaltungen innerhalb derselben Stunde unterdrücken, damit das Log nicht überläuft, wenn mehrere Kerzen oder Ticks in dieser Stunde eintreffen.

Parameter

Parameter Beschreibung
StartHour Tagesstunde (0-23), die Auto-Trading aktiviert.
StopHour Tagesstunde (0-23), die Auto-Trading deaktiviert.
CandleType Zeitrahmen zur Abfrage der Marktuhr. Kleinere Frames reagieren schneller.

Nutzungshinweise

  • Die Strategie sendet keine Orders; sie stellt nur die Eigenschaft AutoTradingActive bereit, die andere Strategien oder Bedienpanels beobachten können, um zu entscheiden, wann Trades gesendet werden.
  • Wenn Start- und Stoppstunde gleich sind, läuft das Stop-Ereignis nach dem Start-Ereignis und lässt den Handel deaktiviert, identisch zum ursprünglichen Expert Advisor.
  • Wählen Sie einen Kerzenzeitrahmen passend zur gewünschten Umschaltgeschwindigkeit. Ein Ein-Minuten-Zeitrahmen ist ein guter Kompromiss zwischen Reaktionsfähigkeit und Ressourcenverbrauch.

Unterschiede zur MetaTrader-Version

  • MT4 schaltete über Windows-Nachrichten einen globalen Plattformbutton um. StockSharp stellt stattdessen ein Strategie-Flag bereit, wodurch das Verhalten leichter in komplexe Setups integrierbar ist.
  • Der StockSharp-Port läuft vollständig in der High-Level-API und lässt sich ohne Low-Level-Message-Hooks leicht mit Charting oder anderen Hilfsstrategien kombinieren.
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Auto Trading Publish strategy: SMA crossover + RSI confirmation.
/// Buys when close crosses above SMA and RSI is below 40.
/// Sells when close crosses below SMA and RSI is above 60.
/// </summary>
public class AutoTradingPublishStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _smaPeriod;
	private readonly StrategyParam<int> _rsiPeriod;

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public int SmaPeriod
	{
		get => _smaPeriod.Value;
		set => _smaPeriod.Value = value;
	}

	public int RsiPeriod
	{
		get => _rsiPeriod.Value;
		set => _rsiPeriod.Value = value;
	}

	public AutoTradingPublishStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

		_smaPeriod = Param(nameof(SmaPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("SMA Period", "SMA period", "Indicators");

		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Period", "RSI period", "Indicators");
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var sma = new SimpleMovingAverage { Length = SmaPeriod };
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };

		decimal? prevClose = null;
		decimal? prevSma = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(sma, rsi, (candle, smaVal, rsiVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var close = candle.ClosePrice;

				if (prevClose.HasValue && prevSma.HasValue)
				{
					var crossUp = prevClose.Value <= prevSma.Value && close > smaVal;
					var crossDown = prevClose.Value >= prevSma.Value && close < smaVal;

					if (crossUp && rsiVal < 55m && Position <= 0)
						BuyMarket();
					else if (crossDown && rsiVal > 45m && Position >= 0)
						SellMarket();
				}

				prevClose = close;
				prevSma = smaVal;
			})
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, sma);
			DrawOwnTrades(area);
		}
	}
}