Auf GitHub ansehen

eKeyboardTrader-Strategie

Überblick

Diese Strategie repliziert das Verhalten des Expertenberaters MetaTrader „eKeyboardTrader“ unter Verwendung des StockSharp-High-Level-API. Das ursprüngliche Skript wartete auf Tastaturkürzel zum Senden manueller Marktaufträge und zeigte Hilfstexte direkt im Diagramm an. In der StockSharp-Version werden die interaktiven Eingaben als Strategieparameter bereitgestellt, während die Ausführungslogik, Sicherheitsprüfungen und Auftragsschutzfunktionen der MQL-Implementierung treu bleiben.

Handelslogik

  1. Level1-Abonnement – Die Strategie abonniert Level1-Marktdaten, um die neuesten besten Geld- und Briefkurse zu erhalten. Diese Anführungszeichen sind erforderlich, bevor eine manuelle Anfrage ausgeführt werden kann, und ahmen die MetaTrader-Abhängigkeit von aktuellen Tick-Daten nach.
  2. Manuelle Befehle – drei boolesche Parameter (BuyRequest, SellRequest, CloseRequest) repräsentieren die ursprünglichen Tastaturkürzel (B, S und C). Wenn ein Parameter auf true gesetzt ist, führt die Strategie die entsprechende Marktaktion aus und setzt das Flag sofort zurück.
  3. Ratenbegrenzung – eine Abklingzeit von einer Sekunde schützt vor versehentlichen Doppeleinsendungen, identisch mit der in der MQL-Version implementierten Timer-Prüfung. Während der Abklingzeit gestellte Anforderungen warten auf den nächsten Verarbeitungszyklus.
  4. Auftragsschutz – optionale Stop-Loss- und Take-Profit-Distanzen, ausgedrückt in MetaTrader Punkten, werden mit Security.PriceStep in absolute Preise umgerechnet. Wenn mindestens ein Schutzabstand konfiguriert ist, aktiviert die Strategie die integrierte StartProtection-Logik von StockSharp, sodass jede manuelle Eingabe automatisch die konfigurierten Schutzbefehle erhält.
  5. Slippage-Erkennung – Der Parameter SlippagePoints wird aus Kompatibilitätsgründen beibehalten und im Protokoll erwähnt, wenn eine manuelle Bestellung gesendet wird, wobei er die vom Fachberater angezeigten Informationskommentare nachahmt.

Parameter

Parameter Beschreibung
OrderVolume Basisvolumen für manuelle Marktaufträge.
StopLossPoints Abstand vom Einstiegspreis bis zum Schutzstopp in MetaTrader Punkten. Zum Deaktivieren auf 0 setzen.
TakeProfitPoints Abstand vom Einstiegspreis zum Schutzziel in MetaTrader Punkten. Zum Deaktivieren auf 0 setzen.
SlippagePoints Im Protokoll wird für jede manuelle Bestellung eine informative Schlupftoleranz angezeigt.
BuyRequest Auf true setzen, um eine Marktkauforder zu senden (wird nach der Verarbeitung automatisch zurückgesetzt).
SellRequest Auf true setzen, um einen Marktverkaufsauftrag zu senden (wird nach der Verarbeitung automatisch zurückgesetzt).
CloseRequest Auf true setzen, um die Nettoposition zum Marktpreis zu reduzieren (wird nach der Verarbeitung automatisch zurückgesetzt).

Unterschiede zur MQL-Version

  • Die Textaufforderungen und akustischen Benachrichtigungen auf der Karte werden nicht reproduziert. Stattdessen dokumentieren Protokollierungsmeldungen die durchgeführten Aktionen.
  • Schutzaufträge werden über den StartProtection-Helper von StockSharp verwaltet, der Marktaufträge übermittelt, wenn der Schwellenwert erreicht wird, anstatt einzelne MetaTrader-Tickets zu ändern.
  • Tastatureingaben werden durch Parameterumschaltungen ersetzt. Jede Benutzeroberfläche, die die Strategie hostet, kann Benutzerinteraktionen (Tastatur, Schaltflächen, Skripte) diesen Parametern zuordnen.
  • Die MetaTrader-Handelsanfragediagnosen werden in Protokollierungsanweisungen zusammengefasst, um die Konvertierung möglichst einfach zu gestalten.

Nutzungshinweise

  • Weisen Sie sowohl Security als auch Portfolio zu, bevor Sie mit der Strategie beginnen. Diese Prüfungen spiegeln die Initialisierungsbedingungen des Fachberaters wider.
  • Die manuellen Befehlsflags werden ausgewertet, wenn neue Level1-Daten eintreffen. In einem ruhigen Markt werden Aktionen zum nächsten verfügbaren Kurs ausgeführt.
  • Das Anpassen von StopLossPoints oder TakeProfitPoints während der Ausführung der Strategie erfordert einen Neustart, um das Schutzmodul neu zu konfigurieren und es an die einmal pro Sitzung vorgenommene Schutzeinrichtung des ursprünglichen Skripts anzupassen.
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// eKeyboard Trader strategy: CCI trend following.
/// Buys when CCI crosses above +100, sells when CCI crosses below -100.
/// </summary>
public class EKeyboardTraderStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _cciPeriod;

	private decimal _prevCci;
	private bool _hasPrev;

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

	public EKeyboardTraderStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_cciPeriod = Param(nameof(CciPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("CCI Period", "CCI period", "Indicators");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevCci = 0m;
		_hasPrev = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_hasPrev = false;
		var cci = new CommodityChannelIndex { Length = CciPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(cci, ProcessCandle).Start();
	}

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

		if (_hasPrev)
		{
			if (_prevCci <= 100 && cci > 100 && Position <= 0) BuyMarket();
			else if (_prevCci >= -100 && cci < -100 && Position >= 0) SellMarket();
		}

		_prevCci = cci;
		_hasPrev = true;
	}
}