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);
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import RelativeStrengthIndex, ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class brain_trend2_absolutely_no_lag_lwma_mmrec_strategy(Strategy):
def __init__(self):
super(brain_trend2_absolutely_no_lag_lwma_mmrec_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Candles", "General")
self._rsi_length = self.Param("RsiLength", 14) \
.SetDisplay("RSI Length", "RSI period", "Indicators")
self._ema_length = self.Param("EmaLength", 20) \
.SetDisplay("EMA Length", "EMA period", "Indicators")
@property
def CandleType(self):
return self._candle_type.Value
@property
def RsiLength(self):
return self._rsi_length.Value
@property
def EmaLength(self):
return self._ema_length.Value
def OnStarted2(self, time):
super(brain_trend2_absolutely_no_lag_lwma_mmrec_strategy, self).OnStarted2(time)
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiLength
ema = ExponentialMovingAverage()
ema.Length = self.EmaLength
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, ema, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, ema)
self.DrawOwnTrades(area)
def _on_process(self, candle, rsi_value, ema_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
rv = float(rsi_value)
ev = float(ema_value)
if rv > 55 and close > ev and self.Position <= 0:
self.BuyMarket()
elif rv < 45 and close < ev and self.Position >= 0:
self.SellMarket()
def CreateClone(self):
return brain_trend2_absolutely_no_lag_lwma_mmrec_strategy()