Auf GitHub ansehen

Strategie Twenty200 Time Breakout

Diese Strategie ist eine StockSharp-Portierung des MetaTrader Expert Advisors 20/200 Expert v4.2 (AntS). Es wartet auf eine bestimmte Stunde des Handelstages und vergleicht dann zwei historische stündliche Eröffnungspreise (6 und 2 Balken zurück in der Standardkonfiguration). Wenn die entfernte Eröffnung um mehr als Short Delta Pips höher ist als die nähere Eröffnung, wird die Strategie verkauft, während die umgekehrte Lücke, die Long Delta Pips überschreitet, eine Long-Position eröffnet.

Handelslogik

  • Die Strategie abonniert stündliche Kerzen (konfigurierbar über Candle Type).
  • Es ist nur ein Handel pro Tag erlaubt. Bestellungen werden aufgegeben, wenn eine Kerze mit einer Stunde von Trade Hour aktiv wird.
  • Signale verwenden den Eröffnungspreis LookbackFar und LookbackNear Balken zurück von der aktuellen Kerze.
    • Kurze Einrichtung: Open[t1] - Open[t2] > Short Delta × pip.
    • Lange Einrichtung: Open[t2] - Open[t1] > Long Delta × pip.
  • Es wird eine Market-Order mit dem berechneten Volumen versendet. Stop-Loss- und Take-Profit-Distanzen werden aus der MetaTrader-Version übernommen und in Pips ausgedrückt, die über Security.PriceStep automatisch in Preise umgewandelt werden.
  • Es kann jeweils nur eine Position existieren. Der tägliche Handel wird am nächsten Kalendertag wieder aufgenommen.

Positionsmanagement

  • Stop-Loss und Take-Profit werden bei jeder Kerzenaktualisierung anhand der Hoch-/Tief-Extreme der Kerze bewertet.
  • Max Open Hours erzwingt einen Marktausstieg, wenn die Positionslebensdauer die konfigurierte Anzahl von Stunden überschreitet (standardmäßig 504 Stunden). Setzen Sie den Parameter auf Null, um den Sicherheitstimer zu deaktivieren.

Geldmanagement

  • Fixed Volume definiert die Ersatzvertragsgröße, die verwendet wird, wenn Use Auto Lot deaktiviert ist oder die Kontostandinformationen nicht verfügbar sind.
  • Wenn Use Auto Lot aktiviert ist, folgt die Losgröße der enormen Schritttabelle des Fachberaters. In StockSharp wird die Tabelle durch volume = round(balance × Auto Lot Factor, 2) mit dem Standardfaktor 0.000038 angenähert, wodurch die MT4-Werte innerhalb eines Pip Volumens über den dokumentierten Bereich (300 USD bis 270.000 USD+) reproduziert werden.
  • Wenn der aktuelle Portfoliowert unter den zuletzt aufgezeichneten Saldo fällt, wird der nächste Trade mit Big Lot Multiplier multipliziert, was den „Big Lot“-Recovery-Trade im Originalcode nachahmt.
  • Die Volumina werden auf Security.VolumeStep ausgerichtet und zwischen MinVolume/MaxVolume eingeklemmt, sofern verfügbar.

Unterschiede zum MetaTrader EA

  • Das MT4-Skript speicherte mehr als tausend manuelle Schwellenwertzeilen. Die StockSharp-Version verwendet einen linearen Koeffizienten (Auto Lot Factor), der zur gleichen Treppe passt. Passen Sie den Faktor an, wenn Sie eine exakte Replik für einen anderen Broker benötigen.
  • Stop-Loss-/Take-Profit-Orders werden durch Marktaustritte bei Candle-Extremen simuliert. Dadurch bleibt das Verhalten über Backtests und Live-Handel hinweg konsistent, ohne auf die Stop-Order-Unterstützung der Börse angewiesen zu sein.
  • Globale Variablen (globalBalans, globalPosic) werden durch den speicherinternen Status ersetzt. Es ist kein Dateisystem oder Terminalstatus erforderlich.

Parameter

Parameter Beschreibung
Long/Short-Take-Profit Abstand in Pips für Gewinnziele.
Long/Short-Stop-Loss Abstand in Pips für Stop-Losses.
Handelsstunde Stunde der Sitzung (0–23), in der Signale ausgelöst werden können.
Fern-/Nah-Rückblick Wie viele Bars zurück, um die beiden Eröffnungspreise zu überprüfen?
Langes/Kurz-Delta Erforderlicher Pip-Gap zum Eröffnen einer Position.
Maximale Öffnungszeiten Maximale Positionslebensdauer in Stunden (0 deaktiviert den Schutz).
Feste Lautstärke Basisvertragsvolumen, wenn die automatische Größenanpassung deaktiviert ist.
Verwenden Sie Auto-Lot Losgröße anhand des Kontowerts aktivieren.
Automatischer Losfaktor Auf den Portfoliowert angewendeter Multiplikator, um die MT4-Schritttabelle zu emulieren.
Großer Lot-Multiplikator Nach einem Eigenkapitalrückgang wird ein Volumenmultiplikator angewendet.
Kerzentyp Zeitrahmen, der für die Signalkerzen verwendet wird.
using System;

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

namespace StockSharp.Samples.Strategies;

public class Twenty200TimeBreakoutStrategy : Strategy
{
	private readonly StrategyParam<int> _shortPeriod;
	private readonly StrategyParam<int> _longPeriod;
	private readonly StrategyParam<int> _cooldownCandles;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevShort;
	private decimal _prevLong;
	private bool _hasPrev;
	private int _cooldownRemaining;

	public int ShortPeriod { get => _shortPeriod.Value; set => _shortPeriod.Value = value; }
	public int LongPeriod { get => _longPeriod.Value; set => _longPeriod.Value = value; }
	public int CooldownCandles { get => _cooldownCandles.Value; set => _cooldownCandles.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public Twenty200TimeBreakoutStrategy()
	{
		_shortPeriod = Param(nameof(ShortPeriod), 20).SetDisplay("Short SMA", "Short SMA period", "Indicators");
		_longPeriod = Param(nameof(LongPeriod), 200).SetDisplay("Long SMA", "Long SMA period", "Indicators");
		_cooldownCandles = Param(nameof(CooldownCandles), 100).SetDisplay("Cooldown", "Candles between signals", "General");
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevShort = default;
		_prevLong = default;
		_hasPrev = default;
		_cooldownRemaining = default;
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevShort = 0;
		_prevLong = 0;
		_hasPrev = false;
		_cooldownRemaining = 0;

		var shortSma = new SimpleMovingAverage { Length = ShortPeriod };
		var longSma = new SimpleMovingAverage { Length = LongPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(shortSma, longSma, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal shortSma, decimal longSma)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!_hasPrev) { _prevShort = shortSma; _prevLong = longSma; _hasPrev = true; return; }

		if (_cooldownRemaining > 0)
		{
			_cooldownRemaining--;
			_prevShort = shortSma;
			_prevLong = longSma;
			return;
		}

		if (_prevShort <= _prevLong && shortSma > longSma && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
			_cooldownRemaining = CooldownCandles;
		}
		else if (_prevShort >= _prevLong && shortSma < longSma && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
			_cooldownRemaining = CooldownCandles;
		}
		_prevShort = shortSma;
		_prevLong = longSma;
	}
}