Auf GitHub ansehen

GTerminal-Strategie

Überblick

Die GTerminal-Strategie ist eine C#-Portierung des MetaTrader 4 Expert Advisors GTerminal_V5a. Das ursprüngliche Skript erlaubte manuelles Arbeiten Kontrolle von Ein- und Ausgängen durch Zeichnen horizontaler Linien auf dem Diagramm. Dieser Port stellt im Inneren dasselbe zeilengesteuerte Verhalten wieder her das StockSharp-Framework, indem jede virtuelle Linie als konfigurierbarer Parameter verfügbar gemacht wird. Immer wenn der Schlusskurs des ausgewählten Wenn eine Kerzenserie eine dieser virtuellen Linien kreuzt, öffnet, schließt oder kehrt die Strategie Positionen auf die gleiche Weise wie die MQL4 um. Version. Optionale automatische Schutzstufen emulieren die Hilfszeilen „tpinit“ und „slinit“ des Originaltools.

Strategielogik

Preisbeispiele

  • Die Strategie funktioniert auf fertige Kerzen eines benutzerdefinierten Zeitrahmens (CandleType).
  • StartShift steuert, welche Kerze als Referenzschluss verwendet wird. Ein Wert von 0 verwendet den aktuellen Kerzenschluss, 1 verwendet den vorherige Kerze usw. Die Verschiebung wirkt sich auch auf die Vergleichskerze aus, sodass das Skript immer zwei aufeinanderfolgende Schlusskurse wie die auswertet MetaTrader-Implementierung.
  • CrossMethod spiegelt die Eingabe von MQL4 wider:
    • 0 – strikte Kreuzung: Der vorherige Schlusskurs muss unter (bei langen Auslösern) oder über (bei kurzen Auslösern) dem Niveau und dem liegen Der aktuelle Abschluss muss auf der gegenüberliegenden Seite des Levels enden.
    • 1 – sofortiger Auslöser: Der aktuelle Schlusskurs muss nur über/unter dem Niveau liegen. Der Port prüft weiterhin die vorherige Nähe Verhindern Sie mehrere Auslöser auf derselben Leiste, indem Sie das „Einmal berühren“-Verhalten reproduzieren, das in MetaTrader durch Löschen der Zeile erhalten wurde nachdem es abgefeuert wurde.

Einreisebestimmungen

  • Kauf-Stopp-Linie – wenn sich der Schlusskurs von unter BuyStopLevel auf über BuyStopLevel bewegt, kauft die Strategie. Wenn eine Short-Position offen ist, Die Auftragsgröße umfasst das zum Glätten der Short-Position erforderliche Volumen zuzüglich der konfigurierten Volume für die neue Long-Position.
  • Kauflimitlinie – wenn der Schlusskurs unter BuyLimitLevel fällt, wird eine Long-Position mit derselben Volumenlogik eröffnet.
  • Verkaufsstopplinie – wenn sich der Schlusskurs von über nach unter SellStopLevel bewegt, wird die Strategie verkauft. Bestehende Long-Positionen werden als geschlossen Teil der Bestellmenge.
  • Verkaufslimitlinie – wenn der Schlusskurs über SellLimitLevel steigt, wird eine Short-Position eröffnet.
  • Einträge werden ignoriert, wenn Volume den Wert 0 hat oder PauseTrading aktiviert ist.

Ausgangsregeln

  • RichtungsausgängeLongStopLevel und LongTakeProfitLevel schließen die lange Seite, wenn der Schluss die entsprechende kreuzt Linie. ShortStopLevel und ShortTakeProfitLevel machen dasselbe für eine Kurzbelichtung.
  • Globale ExitsAllLongStopLevel / AllLongTakeProfitLevel liquidieren jede Long-Position, unabhängig davon, wie sie eröffnet wurde. AllShortStopLevel / AllShortTakeProfitLevel spiegeln die Logik für Kurzfilme wider.
  • Anfänglicher Schutz – Wenn Sie UseInitialProtection auf true setzen, werden InitialLongStopLevel, InitialLongTakeProfitLevel angewendet. InitialShortStopLevel und InitialShortTakeProfitLevel unmittelbar nachdem eine neue Position besetzt ist. Diese Ebenen verhalten sich wie die „slinit“ / „tpinit“ Hilfszeilen aus dem Originalskript und bleiben aktiv, bis die Position geschlossen oder das Level aktualisiert wird.
  • Pro Kerze wird nur eine Exit-Aktion übermittelt. Wenn eine Ausstiegsbedingung erfüllt ist, sendet die Strategie den Abschlussauftrag und überspringt den verbleibende Prüfungen für diesen Balken, genau wie die MQL4-Version nach dem Auslösen der Zeile gestoppt wurde.

Steuerung unterbrechen

  • PauseTrading reproduziert die Funktionalität der MetaTrader „PAUSE“-Zeile. Wenn diese Option aktiviert ist, wird keine Ein- oder Ausstiegslogik ausgewertet. Der Status kann manuell umgeschaltet werden, ohne die Strategie neu zu laden.

Parameter

  • Volumen – Bestellvolumen für Neuzugänge. Die endgültige Auftragsgröße umfasst automatisch alle erforderlichen Gegenpositionen während einer Stornierung geschlossen.
  • Kreuzungsmethode – Wählen Sie den Kreuzungsalgorithmus aus (0 streng, 1 sofort).
  • Start Shift – Kerzenversatz, der für die Kreuzungsberechnung verwendet wird.
  • Handel pausieren – deaktiviert alle Handelsaktionen während true.
  • Anfänglichen Schutz verwenden – ermöglicht die automatische Anwendung der anfänglichen Stop-/Take-Profit-Levels nach jeder Füllung.
  • Buy Stop Level / Buy Limit Level – Preisniveaus, die Long-Einstiege auslösen.
  • Verkaufsstopp-Level / Verkaufslimit-Level – Preisniveaus, die Short-Einstiege auslösen.
  • Long Stop Level / Long Take Profit – Ausstiegslinien für die aktive Long-Position.
  • Short Stop Level / Short Take Profit – Ausstiegslinien für die aktive Short-Position.
  • All Long Stop / All Long Take Profit – globale Ausstiegslinien, die jede Long-Position schließen.
  • All Short Stop / All Short Take Profit – globale Ausstiegslinien, die jede Short-Position schließen.
  • Initial Long Stop / Initial Long Take Profit – Schutzniveaus werden nach jedem Long-Einstieg aktiviert, wenn der anfängliche Schutz aktiviert ist aktiviert.
  • Initial Short Stop / Initial Short Take Profit – Schutzniveaus werden nach jedem Short-Einstieg aktiviert, wenn der anfängliche Schutz aktiviert ist aktiviert.
  • Kerzentyp – Zeitrahmen, der die für Vergleiche verwendeten Schlusskurse liefert.

Hinweise zur Implementierung

  • Der Port behält den linienbasierten Workflow bei, stellt jedoch jede Linie als Parameter bereit, anstatt sich auf Diagrammobjekte zu verlassen. Benutzer können Aktualisieren Sie Ebenen im Handumdrehen durch das Parameterraster und ahmen Sie so die Art und Weise nach, wie Linien in einem MetaTrader-Diagramm verschoben wurden.
  • Indikatorfenster-Trigger aus dem Originalskript (RSI, CCI, Momentum usw.) sind in dieser Version nicht verfügbar. Alle Auslöser Verwenden Sie nur Schlusskurse. Der Parametersatz kann bei indikatorgesteuertem Verhalten weiterhin mit anderen StockSharp-Komponenten kombiniert werden ist erforderlich.
  • Die Strategie basiert ausschließlich auf Marktaufträgen (BuyMarket, SellMarket), genau wie das MQL4-Skript, das dazu Marktaufträge verwendete Emulieren Sie die ausstehende Zeilenausführung.
  • Es gibt keine Python-Implementierung; In diesem Paket wird nur die C#-Version bereitgestellt.
using System;

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

namespace StockSharp.Samples.Strategies;

public class GTerminalStrategy : Strategy
{
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;
	private int _cooldown;

	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public GTerminalStrategy()
	{
		_fastPeriod = Param(nameof(FastPeriod), 9).SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 26).SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = default;
		_prevSlow = default;
		_hasPrev = default;
		_cooldown = default;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_hasPrev = false;
		var fast = new ExponentialMovingAverage { Length = FastPeriod };
		var slow = new ExponentialMovingAverage { Length = SlowPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) return;

		if (!_hasPrev) { _prevFast = fast; _prevSlow = slow; _hasPrev = true; return; }
		if (_cooldown > 0)
		{
			_cooldown--;
			_prevFast = fast;
			_prevSlow = slow;
			return;
		}

		if (_prevFast <= _prevSlow && fast > slow && Position <= 0)
		{
			var volume = Volume + Math.Abs(Position);
			BuyMarket(volume);
			_cooldown = 2;
		}
		else if (_prevFast >= _prevSlow && fast < slow && Position >= 0)
		{
			var volume = Volume + Math.Abs(Position);
			SellMarket(volume);
			_cooldown = 2;
		}

		_prevFast = fast; _prevSlow = slow;
	}
}