Die X MAN-Strategie stellt die Kernlogik des MetaTrader-Expertenberaters X_MAN.mq4 innerhalb des StockSharp-High-Level-API wieder her. Das System handelt Ausbrüche, die durch einen schnellen und langsamen linear gewichteten gleitenden Durchschnitt (LWMA) gesteuert werden, während Einträge mit Multi-Timeframe-Momentum und einer monatlichen MACD-Bestätigung gefiltert werden. Es ist für Trendfortsetzungsgeschäfte konzipiert, die nur dann ausgelöst werden, wenn Momentum und Trendstruktur übereinstimmen.
Handelslogik
Primärer Trendfilter – Zwei auf dem ausgewählten primären Zeitrahmen berechnete LWMAs müssen durch mindestens den konfigurierbaren Wert DistancePoints getrennt sein. Bei einem langen Setup muss der schnelle LWMA um diesen Abstand über dem langsamen LWMA liegen, während bei einem kurzen Setup der langsame LWMA dominieren muss.
Momentum-Bestätigung – Die Strategie abonniert eine Kerzenserie mit höherem Zeitrahmen und speist sie in einen Momentum-Indikator ein. Der absolute Abstand der letzten drei Momentumwerte vom neutralen Wert (100) muss mindestens einmal die entsprechende Kauf- oder Verkaufsschwelle überschreiten, um einen Handel in diese Richtung zu ermöglichen.
MACD Filter – Eine monatliche Kerzenserie treibt einen Standard (12, 26, 9) MACD an. Long-Trades sind nur zulässig, wenn die MACD-Linie über der Signallinie liegt, und Short-Trades erfordern das umgekehrte Verhältnis.
Auftragsausführung – Wenn alle Filter übereinstimmen, wird die Strategie mit Marktaufträgen umgesetzt. Positionen werden nur dann umgedreht, wenn das entgegengesetzte Setup angezeigt wird und die aktuelle Position flach oder in die entgegengesetzte Richtung ist.
Parameter
Parameter
Beschreibung
CandleType
Primärer Zeitrahmen, der für die LWMA-Berechnungen verwendet wird.
HigherCandleType
Höherer Zeitrahmen, der den Impulsfilter speist.
MacdCandleType
Zeitrahmen für die MACD-Bestätigung (standardmäßig monatlich).
FastMaPeriod
Länge des schnellen LWMA.
SlowMaPeriod
Länge des langsamen LWMA.
MomentumPeriod
Rückblickfenster des Impulsoszillators.
MomentumBuyThreshold
Mindestabstand von 100 für bullisches Momentum erforderlich.
MomentumSellThreshold
Für eine rückläufige Dynamik ist ein Mindestabstand von 100 erforderlich.
DistancePoints
Minimaler Abstand zwischen schnellem und langsamem LWMA, ausgedrückt in Preispunkten.
TakeProfitPoints
Optionale schützende Take-Profit-Distanz in Punkten.
StopLossPoints
Optionaler Schutz-Stop-Loss-Abstand in Punkten.
Alle Parameter werden über StrategyParam<T> verfügbar gemacht, sodass sie im StockSharp Designer optimiert oder zur Laufzeit konfiguriert werden können.
Risikomanagement
Wenn entweder TakeProfitPoints oder StopLossPoints größer als Null ist, aktiviert die Strategie das integrierte Schutzmodul von StockSharp mithilfe von Marktausstiegen. Es ist noch keine zusätzliche Trailing- oder Breakeven-Logik vom ursprünglichen MQL-Experten implementiert.
Unterschiede zum Original-Experten
Die MetaTrader-Implementierung verwaltete Aktienstopps, Break-Even-Bewegungen und komplexe Geldverwaltungsoptionen. Diese Konvertierung konzentriert sich auf die Kernrichtungsfilter und Markteintritte; Auf ein Money Management auf Portfolioebene wird bewusst verzichtet.
Die Auftragsgröße wird an die Hosting-Umgebung delegiert. Die ursprüngliche Lot-Exponenten-Logik wird nicht reproduziert.
Warnungen, E-Mail-Benachrichtigungen und manuelle Trailing-Stop-Änderungen sind nicht enthalten.
Diese Änderungen halten die Strategie prägnant und nutzen das hochrangige API von StockSharp, während das Haupthandelskonzept erhalten bleibt.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// X-MAN strategy: Stochastic + SMA trend filter.
/// </summary>
public class XManStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _smaPeriod;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int SmaPeriod { get => _smaPeriod.Value; set => _smaPeriod.Value = value; }
public XManStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_smaPeriod = Param(nameof(SmaPeriod), 20)
.SetGreaterThanZero()
.SetDisplay("SMA Period", "SMA period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var sma = new SimpleMovingAverage { Length = SmaPeriod };
var rsi = new RelativeStrengthIndex { Length = 14 };
decimal? prevClose = null;
decimal? prevSma = null;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(sma, rsi, (candle, smaVal, rsiVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
var close = candle.ClosePrice;
if (prevClose.HasValue && prevSma.HasValue)
{
var crossUp = prevClose.Value <= prevSma.Value && close > smaVal;
var crossDown = prevClose.Value >= prevSma.Value && close < smaVal;
if (crossUp && rsiVal < 70 && Position <= 0)
BuyMarket();
else if (crossDown && rsiVal > 30 && Position >= 0)
SellMarket();
}
prevClose = close;
prevSma = smaVal;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, sma);
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 SimpleMovingAverage, RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class x_man_strategy(Strategy):
def __init__(self):
super(x_man_strategy, self).__init__()
self._sma_period = self.Param("SmaPeriod", 20) \
.SetDisplay("SMA Period", "SMA period", "Indicators")
self._sma = None
self._rsi = None
self._prev_close = None
self._prev_sma = None
@property
def sma_period(self):
return self._sma_period.Value
def OnReseted(self):
super(x_man_strategy, self).OnReseted()
self._sma = None
self._rsi = None
self._prev_close = None
self._prev_sma = None
def OnStarted2(self, time):
super(x_man_strategy, self).OnStarted2(time)
self._sma = SimpleMovingAverage()
self._sma.Length = self.sma_period
self._rsi = RelativeStrengthIndex()
self._rsi.Length = 14
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(30)))
subscription.Bind(self._sma, self._rsi, self._process_candle)
subscription.Start()
def _process_candle(self, candle, sma_value, rsi_value):
if candle.State != CandleStates.Finished:
return
if not self._sma.IsFormed or not self._rsi.IsFormed:
return
close = float(candle.ClosePrice)
sma_val = float(sma_value)
rsi_val = float(rsi_value)
if self._prev_close is not None and self._prev_sma is not None:
cross_up = self._prev_close <= self._prev_sma and close > sma_val
cross_down = self._prev_close >= self._prev_sma and close < sma_val
if cross_up and rsi_val < 70.0 and self.Position <= 0:
self.BuyMarket()
elif cross_down and rsi_val > 30.0 and self.Position >= 0:
self.SellMarket()
self._prev_close = close
self._prev_sma = sma_val
def CreateClone(self):
return x_man_strategy()