Auf GitHub ansehen

Expert Candles-Strategie

Überblick

Die Expert Candles Strategy ist eine StockSharp-Portierung des MetaTrader 5 Expert_Candles Expertenberaters. Es überwacht am meisten jüngste Preisbewegung für Candlestick-Umkehrformationen, die längliche Schatten aufweisen. Wann immer eine bullische oder bärische Zusammensetzung vorliegt Wenn eine Kerze erkannt wird, eröffnet die Strategie eine Position in die entsprechende Richtung und wendet optional das gleiche Geldmanagement an das Original EA.

Die Implementierung folgt dem High-Level-StockSharp API: Kerzenabonnements werden verwendet, um zusammengesetzte Balken zu erstellen und gleichzeitig zu vermarkten Aufträge und Schutzstufen werden direkt aus der Strategie verwaltet.

Handelslogik

  1. Jedes Mal, wenn eine Kerze geschlossen wird, führt die Strategie sie mit bis zu Range vorherigen Kerzen zusammen, bis die volle Höhe des Verbunds erreicht ist Der Balken überschreitet MinimumPoints (umgerechnet in Preispunkte unter Verwendung der Pip-Größe des Instruments).
  2. Ein bullisches Signal wird ausgegeben, wenn der zusammengesetzte Balken einen flachen oberen Schatten (ShadowSmall) und einen tiefen unteren Schatten aufweist (ShadowBig). Ein bärisches Signal wird ausgegeben, wenn der untere Schatten flach und der obere Schatten dominant ist.
  3. Der Einstiegspreis wird von der Kerze um LimitFactor * rangeSize verschoben. Positive Werte emulieren den ursprünglichen Grenzwert Ordnung, die innerhalb des Kerzenbereichs liegt.
  4. Stop-Loss- und Take-Profit-Ziele werden bei StopLossFactor- und TakeProfitFactor-Vielfachen der zusammengesetzten Höhe positioniert. Wenn eines der beiden Niveaus bei nachfolgenden Kerzen erreicht wird, wird die Position sofort geschlossen.
  5. Signale gelten für ExpirationBars abgeschlossene Kerzen als gültig. Sobald das Zeitfenster verstrichen ist, wartet die Strategie auf ein neues Formation, bevor Sie neue Bestellungen aufgeben.
  6. Entgegengesetzte Signale schließen bestehende Positionen, bevor Trades in die neue Richtung eingeleitet werden, und ahmen das Verhalten von MQL5 nach.

Geldmanagement

  • Als Standardbestellgröße wird FixedVolume verwendet.
  • Wenn ein Stop-Loss verfügbar ist und RiskPercent größer als Null ist, riskiert die Strategie den ausgewählten Prozentsatz Portfolio-Eigenkapital. Die Stoppdistanz wird mithilfe von Security.PriceStep und Security.StepPrice in einen Geldwert umgerechnet.
  • Die Volumina werden auf das Instrument VolumeStep gerundet, wenn die Börse diese Metadaten offenlegt.

Parameter

Parameter Standard Beschreibung
CandleType H1 Zeitrahmen, der zum Anfordern von Kerzen verwendet wird.
Range 3 Maximale Anzahl benachbarter Kerzen, die zu einem zusammengesetzten Muster kombiniert werden.
MinimumPoints 50 Minimale zusammengesetzte Höhe in Punkten (PriceStep-basiert), die zur Auswertung des Musters erforderlich ist.
ShadowBig 0,5 Verhältnis, das der dominante Schatten überschreiten muss, um die Umkehrung zu bestätigen.
ShadowSmall 0,2 Maximal zulässiges Verhältnis für den gegenüberliegenden Schatten.
LimitFactor 0,0 Einstiegsoffset als Bruchteil der zusammengesetzten Höhe (positive Werte verschieben den Preis innerhalb der Kerze).
StopLossFactor 2,0 Stop-Loss-Distanz als Vielfaches der zusammengesetzten Höhe. Auf Null setzen, um den Schutzstopp zu deaktivieren.
TakeProfitFactor 1,0 Take-Profit-Distanz als Vielfaches der zusammengesetzten Höhe. Auf Null setzen, um das Ziel zu deaktivieren.
ExpirationBars 4 Anzahl der abgeschlossenen Kerzen, während derer ein Signal aktiv bleibt.
FixedVolume 0,1 Fallback-Ordergröße, die verwendet wird, wenn die risikobasierte Größenbestimmung nicht berechnet werden kann.
RiskPercent 10 Prozentsatz des pro Trade riskierten Eigenkapitals, wenn ein Stop-Loss verfügbar ist.

Nutzungshinweise

  • Die Strategie basiert auf Security.PriceStep, Security.StepPrice und Security.VolumeStep, um den Punkt MetaTrader zu replizieren Berechnungen. Stellen Sie genaue Instrumentenmetadaten bereit oder passen Sie die Parameter entsprechend an.
  • Signale werden nur bei geschlossenen Kerzen ausgewertet. Hängen Sie die Strategie an einen Zeitreihen-Connector an, der CandleStates.Finished ausgibt. Veranstaltungen für eine zuverlässige Durchführung.
  • Schutzausstiege werden simuliert, indem die Position geschlossen wird, sobald das Hoch oder Tief einer fertigen Kerze den berechneten Wert überschreitet Stop-Loss- oder Take-Profit-Level.
  • Die zusammengesetzte Kerzenliste ist auf 500 Elemente begrenzt, um den Speicherbedarf vorhersehbar zu halten.

Unterschiede zur MetaTrader-Version

  • Der Port StockSharp verwendet Marktaufträge anstelle ausstehender Limitaufträge. Der Eintragsoffset gibt das Grenzverhalten wieder Verschiebung des Ausführungspreises relativ zum Kerzenschluss.
  • Die Geldverwaltung ist optional; Wenn Sie RiskPercent auf Null setzen, wird das feste Losverhalten vom ursprünglichen EA wiederhergestellt.
  • Die Stop-Loss- und Take-Profit-Abwicklung erfolgt innerhalb der Strategie und nicht durch externe Trailing-Module.
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// Candlestick reversal strategy: detects hammer/shooting star patterns.
/// Buys on bullish hammer candle, sells on bearish shooting star.
/// </summary>
public class ExpertCandlesStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<decimal> _shadowRatio;

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

	public decimal ShadowRatio
	{
		get => _shadowRatio.Value;
		set => _shadowRatio.Value = value;
	}

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

		_shadowRatio = Param(nameof(ShadowRatio), 0.3m)
			.SetGreaterThanZero()
			.SetDisplay("Shadow Ratio", "Min shadow to body ratio for pattern", "Signals");
	}

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

		var sma = new SimpleMovingAverage { Length = 20 };

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

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var open = candle.OpenPrice;
				var high = candle.HighPrice;
				var low = candle.LowPrice;
				var close = candle.ClosePrice;
				var range = high - low;

				if (range <= 0)
					return;

				var body = Math.Abs(close - open);
				var upperShadow = high - Math.Max(open, close);
				var lowerShadow = Math.Min(open, close) - low;

				var isHammer = lowerShadow > range * ShadowRatio && upperShadow < body;
				var isShootingStar = upperShadow > range * ShadowRatio && lowerShadow < body;

				if (isHammer && close > smaVal && Position <= 0)
					BuyMarket();
				else if (isShootingStar && close < smaVal && Position >= 0)
					SellMarket();
			})
			.Start();

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