Auf GitHub ansehen

BrainTrend2 + AbsolutelyNoLagLWMA MMRec-Strategie

Übersicht

Diese Strategie rekonstruiert den MetaTrader-Experten Exp_BrainTrend2_AbsolutelyNoLagLwma_MMRec, indem zwei unabhängige Signalblöcke kombiniert werden: die Trendfolgemaschine BrainTrend2 und der adaptive Filter AbsolutelyNoLagLWMA. Jeder Block kann Trades gemäß seinen eigenen Berechtigungen öffnen und schließen, wodurch die Money-Management-Schalter der ursprünglichen MMRec-Vorlage nachgeahmt werden. Orders werden mit der StockSharp High-Level-API über Marktausführungen und dem konfigurierbaren Standardvolumen ausgeführt.

Handelslogik

BrainTrend2-Block

  • Erstellt ein dynamisches Trailing-Level basierend auf einem ATR-ähnlichen gewichteten True Range.
  • Die Richtung (river) wechselt, wenn die Kerze den Trailing-Puffer um mehr als 0.7 * ATR durchbricht.
  • Aufwärtskerzen innerhalb eines Aufwärts-Rivers lösen Long-Einstiege aus (wenn aktiviert) und schließen Short-Positionen.
  • Abwärtskerzen innerhalb eines Abwärts-Rivers lösen Short-Einstiege aus (wenn aktiviert) und schließen Long-Positionen.
  • Signale können durch den Parameter Brain Signal Shift verzögert werden, um mit älteren Bars zu arbeiten.

AbsolutelyNoLagLWMA-Block

  • Wendet einen zweistufigen linear gewichteten gleitenden Durchschnitt auf die ausgewählte Preisquelle an.
  • Farben werden aufwärts (2), wenn der doppelte LWMA steigt, abwärts (0), wenn er fällt, und neutral (1) andernfalls.
  • Ein Übergang zu Farbe 2 öffnet Longs und schließt optional Shorts; ein Wechsel zu Farbe 0 öffnet Shorts und schließt optional Longs.
  • Signale können auch um eine benutzerdefinierte Anzahl von Bars zurückversetzt werden.

Positionsmanagement

  • Die Strategie betreibt eine einzelne Nettoposition. Wenn beide Blöcke Trades auf derselben Bar anfordern, werden Schließsignale vor neuen Einstiegen ausgeführt.
  • Wenn ein Block einen Trade öffnen möchte, aber die entgegengesetzte Position offen und die entsprechende Schließberechtigung deaktiviert ist, wird der Einstieg übersprungen (spiegelt die Unmöglichkeit wider, Hedge-Positionen mit einem einzelnen Nettoportfolio zu halten).

Parameter

Gruppe Name Beschreibung
BrainTrend2 Brain Candle Kerzentyp für den BrainTrend2-Indikator.
BrainTrend2 Brain ATR ATR-Periode für die internen BrainTrend2-Berechnungen.
BrainTrend2 Brain Signal Shift Anzahl der Bars zur Verzögerung von BrainTrend2-Signalen.
BrainTrend2 Brain Buy / Sell BrainTrend2 erlauben, Long/Short-Trades zu öffnen.
BrainTrend2 Brain Close Buys / Close Sells BrainTrend2-Signalen erlauben, bestehende Positionen zu schließen.
AbsolutelyNoLag Abs Candle Kerzentyp für den LWMA-Indikator.
AbsolutelyNoLag Abs Length LWMA-Periode.
AbsolutelyNoLag Abs Price Angewandter Preis für den LWMA. Entspricht dem MQL Applied_price_-Enum.
AbsolutelyNoLag Abs Signal Shift Anzahl der Bars zur Verzögerung von LWMA-Signalen.
AbsolutelyNoLag Abs Buy / Sell LWMA-Block erlauben, Long/Short-Trades zu öffnen.
AbsolutelyNoLag Abs Close Buys / Close Sells LWMA-Block erlauben, Positionen zu schließen.
AbsolutelyNoLag Abs Shift Fügt dem LWMA-Ausgabewert einen konstanten Preisversatz hinzu.
General Order Volume Standard-Marktorder-Volumen.

Hinweise

  • Die ATR- und LWMA-Berechnungen folgen den ursprünglichen MQL-Implementierungen, einschließlich der triangulären ATR-Gewichtung und der umfangreichen Liste angewandter Preise.
  • Spread-Informationen sind in StockSharp-Kerzen nicht verfügbar, daher verwendet der True Range nur Kerzenpreise. Dies spiegelt das Indikatorverhalten wider, wenn der Spread gleich null ist.
  • Mehrere gleichzeitige Positionen mit unterschiedlichen Magic Numbers werden zu einer einzigen Nettoposition konsolidiert, was Standard in StockSharp-Strategien ist.
using System;
using System.Collections.Generic;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// BrainTrend2 AbsolutelyNoLag LWMA MMRec strategy (simplified).
/// Uses RSI + EMA for trend detection with position recovery logic.
/// </summary>
public class BrainTrend2AbsolutelyNoLagLwmaMmrecStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiLength;
	private readonly StrategyParam<int> _emaLength;

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

	public int RsiLength
	{
		get => _rsiLength.Value;
		set => _rsiLength.Value = value;
	}

	public int EmaLength
	{
		get => _emaLength.Value;
		set => _emaLength.Value = value;
	}

	public BrainTrend2AbsolutelyNoLagLwmaMmrecStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
			.SetDisplay("Candle Type", "Candles", "General");

		_rsiLength = Param(nameof(RsiLength), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Length", "RSI period", "Indicators");

		_emaLength = Param(nameof(EmaLength), 20)
			.SetGreaterThanZero()
			.SetDisplay("EMA Length", "EMA period", "Indicators");
	}

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

		var rsi = new RelativeStrengthIndex { Length = RsiLength };
		var ema = new ExponentialMovingAverage { Length = EmaLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(rsi, ema, (ICandleMessage candle, decimal rsiVal, decimal emaVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var close = candle.ClosePrice;

				// Bullish: RSI above 55 and close above EMA
				if (rsiVal > 55 && close > emaVal && Position <= 0)
					BuyMarket();
				// Bearish: RSI below 45 and close below EMA
				else if (rsiVal < 45 && close < emaVal && Position >= 0)
					SellMarket();
			})
			.Start();

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