Auf GitHub ansehen

Zehn Punkte 3 v005 Strategie

Überblick

Diese Strategie ist eine StockSharp-Portierung des MetaTrader 4-Expertenberaters „10points 3 v005“. Es folgt der MACD-Steigung, um zu entscheiden, ob der aktuelle Durchschnittskorb long oder short sein soll, und eröffnet jedes Mal Martingal-Orders, wenn sich der Preis um eine konfigurierbare Distanz gegen die aktive Position bewegt. Die erweiterte Version „v005“ fügt eigenkapitalbasierte Schutzregeln, Tages- und Zeitfilter und die Option hinzu, entweder den langen oder den kurzen Zyklus zu deaktivieren.

Handelslogik

  • Lesen Sie die Richtung aus der Hauptzeile MACD ab. Wenn der Indikator steigt, wird der nächste Korb long sein, wenn er fällt, wird der Korb short sein. Eine Option erlaubt die Umkehrung der Interpretation.
  • Eröffnen Sie sofort die erste Marktposition, sobald eine Richtung vorliegt. Nachfolgende Einträge werden hinzugefügt, wenn sich der Preis um EntryDistancePips gegenüber der Floating-Position bewegt.
  • Bestellgrößen wachsen geometrisch. Der Multiplikator wird durch MartingaleFactor gesteuert (oder HighTradeFactor, wenn mehr als 12 Trades zulässig sind). Die Volumina richten sich nach der Instrumentenvolumenstufe und sind auf 100 Lots begrenzt.
  • Jeder Eintrag aktualisiert die aggregierten Stop-Loss- und Take-Profit-Level. Die Anfangswerte werden um InitialStopPips und TakeProfitPips ausgeglichen, während die nachgestellte Logik aktiviert wird, nachdem die Position EntryDistancePips + TrailingStopPips dafür gewonnen hat.
  • Wenn der Kontoschutz aktiviert ist, kann die Strategie das Ziel mit dem besten Eintrag (ReboundLock) ausrichten und die letzte Order schließen, sobald der variable Gewinn SecureProfit erreicht.
  • Die Eigenkapitalschutzregeln schließen den gesamten Korb, wenn der variable Verlust StopLossAmount übersteigt, wenn das Eigenkapital über ProfitTarget + ProfitBuffer steigt oder wenn das Eigenkapital unter StartProtectionLevel fällt.
  • Der Handel ist auf das Zeitfenster OpenHour/CloseHour beschränkt und freitags standardmäßig vollständig deaktiviert.

Geldmanagement

Wenn UseMoneyManagement deaktiviert ist, verwendet die erste Bestellung das feste LotSize. Wenn das Flag aktiviert ist, wird das Basisvolumen aus dem aktuellen Portfoliowert und dem Parameter RiskPercent berechnet. Die Skalierung von Minikonten kann durch IsStandardAccount simuliert werden.

Parameter

Parameter Beschreibung
TakeProfitPips Abstand (in Pips) des Take-Profits, der auf jeden Eintrag angewendet wird.
LotSize Basislosgröße, wenn die Geldverwaltung deaktiviert ist.
InitialStopPips Anfängliche Stop-Loss-Distanz für jede Order.
TrailingStopPips Trailing-Stop-Distanz, sobald die Triggerschwelle erreicht ist.
MaxTrades Maximale Anzahl gleichzeitiger Martingaleinträge.
EntryDistancePips Mindestens erforderliche Gegenbewegung zum Hinzufügen der nächsten Bestellung.
SecureProfit Variabler Gewinn (in Währungseinheiten), der erforderlich ist, um den Ausstieg aus dem Kontoschutz auszulösen.
UseAccountProtection Aktiviert die Secure-Profit- und Rebound-Lock-Logik.
OrdersToProtect Anzahl der letzten Martingalschritte, die durch die Secure-Profit-Regel geschützt sind.
ReverseSignals Kehrt die Interpretation der MACD-Steigung um.
UseMoneyManagement Ermöglicht die ausgleichsbasierte Größenbestimmung.
RiskPercent Von der Money-Management-Formel verwendeter Risikoprozentsatz.
IsStandardAccount Verwendet die Standardlosskalierung anstelle der Miniskalierung.
EurUsdPipValue, GbpUsdPipValue, UsdChfPipValue, UsdJpyPipValue, DefaultPipValue Pip-Werte, die zur Umrechnung variabler Gewinne in eine Währung verwendet werden.
CandleType Kerzenzeitrahmen, der für die Signalgenerierung verwendet wird.
MacdFastLength, MacdSlowLength, MacdSignalLength MACD-Konfiguration.
EnableLong, EnableShort Aktivieren oder deaktivieren Sie den langen/kurzen Korb.
OpenHour, CloseHour, MinuteToStop Konfiguration des Handelsfensters.
StopLossProtection, StopLossAmount Aktienbasierter Stop-Loss-Schutz.
ProfitTargetEnabled, ProfitTarget, ProfitBuffer Eigenkapitalbasierte Gewinnsperre.
StartProtectionEnabled, StartProtectionLevel Equity-Bodenwächter.
ReboundLock Richtet Ausgänge am besten Eingang aus, wenn der Schutz aktiv ist.
MartingaleFactor, HighTradeFactor Martingale Multiplikatoren.
CloseOnFriday Deaktiviert den Handel freitags.

Notizen

  • Die Strategie verwendet das übergeordnete StockSharp API (SubscribeCandles + BindEx) und stellt keine rohen Indikatorpuffer bereit.
  • Jeder Aktienwächter schließt den aktiven Warenkorb mithilfe von Marktaufträgen, um das ursprüngliche EA-Verhalten zu reproduzieren.
  • Überprüfen Sie immer die Parameterwerte, die Pip-Größe und den Pip-Wert anhand Ihrer Broker-Spezifikationen, bevor Sie die Strategie in der Produktion verwenden.
using System;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// 10 Points 3 V005: Dual EMA crossover with RSI confirmation and ATR stops.
/// </summary>
public class TenPoints3V005Strategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastEmaLength;
	private readonly StrategyParam<int> _slowEmaLength;
	private readonly StrategyParam<int> _rsiLength;
	private readonly StrategyParam<int> _atrLength;

	private decimal _prevFast;
	private decimal _prevSlow;
	private decimal _entryPrice;

	public TenPoints3V005Strategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe.", "General");
		_fastEmaLength = Param(nameof(FastEmaLength), 10)
			.SetDisplay("Fast EMA", "Fast EMA period.", "Indicators");
		_slowEmaLength = Param(nameof(SlowEmaLength), 30)
			.SetDisplay("Slow EMA", "Slow EMA period.", "Indicators");
		_rsiLength = Param(nameof(RsiLength), 14)
			.SetDisplay("RSI Length", "RSI period.", "Indicators");
		_atrLength = Param(nameof(AtrLength), 14)
			.SetDisplay("ATR Length", "ATR period.", "Indicators");
	}

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int FastEmaLength { get => _fastEmaLength.Value; set => _fastEmaLength.Value = value; }
	public int SlowEmaLength { get => _slowEmaLength.Value; set => _slowEmaLength.Value = value; }
	public int RsiLength { get => _rsiLength.Value; set => _rsiLength.Value = value; }
	public int AtrLength { get => _atrLength.Value; set => _atrLength.Value = value; }

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();

		_prevFast = 0; _prevSlow = 0; _entryPrice = 0;
	}

		protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevFast = 0; _prevSlow = 0; _entryPrice = 0;
		var fastEma = new ExponentialMovingAverage { Length = FastEmaLength };
		var slowEma = new ExponentialMovingAverage { Length = SlowEmaLength };
		var rsi = new RelativeStrengthIndex { Length = RsiLength };
		var atr = new AverageTrueRange { Length = AtrLength };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fastEma, slowEma, rsi, atr, ProcessCandle).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fastEma); DrawIndicator(area, slowEma); DrawOwnTrades(area); }
	}

	private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal, decimal rsiVal, decimal atrVal)
	{
		if (candle.State != CandleStates.Finished) return;
		if (_prevFast == 0 || _prevSlow == 0 || atrVal <= 0) { _prevFast = fastVal; _prevSlow = slowVal; return; }
		var close = candle.ClosePrice;

		if (Position > 0)
		{
			if ((fastVal < slowVal && _prevFast >= _prevSlow) || close <= _entryPrice - atrVal * 1.5m) { SellMarket(); _entryPrice = 0; }
		}
		else if (Position < 0)
		{
			if ((fastVal > slowVal && _prevFast <= _prevSlow) || close >= _entryPrice + atrVal * 1.5m) { BuyMarket(); _entryPrice = 0; }
		}

		if (Position == 0)
		{
			if (fastVal > slowVal && _prevFast <= _prevSlow && rsiVal > 50) { _entryPrice = close; BuyMarket(); }
			else if (fastVal < slowVal && _prevFast >= _prevSlow && rsiVal < 50) { _entryPrice = close; SellMarket(); }
		}
		_prevFast = fastVal; _prevSlow = slowVal;
	}
}