Diese Strategie ist eine StockSharp-Portierung des MetaTrader-Experten ADX_MA (Fortrader).
Es kombiniert einen SMMA-Filter (Smoothed Moving Average) mit dem Average Directional Index (ADX).
sodass Trades nur dann getätigt werden, wenn der Trend durch einen Crossover bestätigt und stark genug ist
gemäß ADX. Der Port behält das asymmetrische Risikomanagement des ursprünglichen Roboters bei:
Long-Positionen nutzen große Take-Profit- und Trailing-Distanzen, während Short-Trades engere Positionen nutzen
Ziele und Schutz.
Handelslogik
Erstellen Sie einen geglätteten gleitenden Durchschnitt auf den mittleren Kerzenpreisen und einen ADX mit den konfigurierten Zeiträumen.
Bewerten Sie Signale nur bei geschlossenen Kerzen, um die MQL4-Logik (iClose(...,1) / iClose(...,2)) nachzuahmen.
Geben Sie Long ein, wenn die vorherige Kerze über dem SMMA schließt, und die Kerze, bevor sie unter dem SMMA schließt
Derselbe SMMA-Wert und der vorherige ADX-Messwert liegt über dem Schwellenwert.
Geben Sie Short ein, wenn die vorherige Kerze unter dem SMMA schließt, die Kerze, bevor sie über dem schließt
derselbe SMMA-Wert und ADX liegt über dem Schwellenwert.
Sobald die Ausgänge in Position sind, werden sie gesteuert durch:
Umkehrung des gleitenden Durchschnitts in die entgegengesetzte Richtung.
Individuelle Stop-Loss- und Take-Profit-Level, gemessen in Pips.
Optionale Trailing-Stop-Distanzen, die sich zu Gunsten des Handels auswirken.
Alle Preisversätze werden mithilfe der Preisstufe des Wertpapiers aus Pips umgerechnet. Wenn das Instrument dies nicht tut
Wenn Sie einen gültigen Schritt melden, wird ein Wert von 1 als sicherer Fallback verwendet.
Parameter
Name
Beschreibung
SMMA Period
Länge des geglätteten gleitenden Durchschnitts (Standard 21).
ADX Period
Länge des durchschnittlichen Richtungsindex (Standard 14).
ADX Threshold
Mindestwert ADX erforderlich, um Einträge zuzulassen (Standard 16).
Long Take Profit (pips)
Take-Profit-Distanz für Kaufpositionen (Standard 1300 Pips).
Long Stop Loss (pips)
Stop-Loss-Distanz für Kaufpositionen (Standard 30 Pips).
Long Trailing Stop (pips)
Trailing-Stop-Distanz für Kaufpositionen (Standard 270 Pips).
Short Take Profit (pips)
Take-Profit-Distanz für Verkaufspositionen (Standard 160 Pips).
Short Stop Loss (pips)
Stop-Loss-Distanz für Verkaufspositionen (Standard 50 Pips).
Short Trailing Stop (pips)
Trailing-Stop-Distanz für Verkaufspositionen (Standard 20 Pips).
Volume
Für Neueingaben verwendetes Bestellvolumen (Standard 0,1).
Candle Type
Primäre Kerzenserie für Berechnungen (Standardzeitrahmen 1 Minute).
Alle Parameter stehen zur Optimierung zur Verfügung. Die Standardeinstellungen entsprechen den ursprünglichen EA-Einstellungen.
Notizen
Trailing-Stops werden erst aktiviert, wenn sich der Preis mindestens um die konfigurierte Entfernung vom Einstiegspunkt bewegt.
Gegensätzliche Signale schließen die aktive Position, bevor sie eine neue eröffnen.
Die Strategie zeichnet automatisch Kerzen, Indikatoren und eigene Trades auf dem Chart ein, sofern ein Chartbereich verfügbar ist.
Für diesen Port gibt es keine automatisierten Tests; Verwenden Sie manuelles Backtesting, um das Verhalten Ihrer Instrumente zu validieren.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class AdxMaStrategy : Strategy
{
private readonly StrategyParam<int> _emaPeriod;
private readonly StrategyParam<int> _smaPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevClose; private decimal _prevEma; private bool _hasPrev;
public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
public int SmaPeriod { get => _smaPeriod.Value; set => _smaPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public AdxMaStrategy()
{
_emaPeriod = Param(nameof(EmaPeriod), 14).SetDisplay("EMA Period", "EMA lookback", "Indicators");
_smaPeriod = Param(nameof(SmaPeriod), 50).SetDisplay("SMA Period", "SMA trend filter", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
}
protected override void OnReseted()
{
base.OnReseted();
_prevClose = 0;
_prevEma = 0;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(ema, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal ema)
{
if (candle.State != CandleStates.Finished) return;
var close = candle.ClosePrice;
if (!_hasPrev) { _prevClose = close; _prevEma = ema; _hasPrev = true; return; }
if (_prevClose <= _prevEma && close > ema && Position <= 0)
{ if (Position < 0) BuyMarket(); BuyMarket(); }
else if (_prevClose >= _prevEma && close < ema && Position >= 0)
{ if (Position > 0) SellMarket(); SellMarket(); }
_prevClose = close; _prevEma = ema;
}
}
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 CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
from datatype_extensions import *
class adx_ma_strategy(Strategy):
"""
ADX MA strategy: EMA crossover with price for trend-following entries.
"""
def __init__(self):
super(adx_ma_strategy, self).__init__()
self._ema_period = self.Param("EmaPeriod", 14) \
.SetDisplay("EMA Period", "EMA lookback", "Indicators")
self._sma_period = self.Param("SmaPeriod", 50) \
.SetDisplay("SMA Period", "SMA trend filter", "Indicators")
self._candle_type = self.Param("CandleType", tf(5)) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._prev_close = 0.0
self._prev_ema = 0.0
self._has_prev = False
@property
def EmaPeriod(self):
return self._ema_period.Value
@EmaPeriod.setter
def EmaPeriod(self, value):
self._ema_period.Value = value
@property
def SmaPeriod(self):
return self._sma_period.Value
@SmaPeriod.setter
def SmaPeriod(self, value):
self._sma_period.Value = value
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
def OnReseted(self):
super(adx_ma_strategy, self).OnReseted()
self._prev_close = 0.0
self._prev_ema = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(adx_ma_strategy, self).OnStarted2(time)
self._has_prev = False
ema = ExponentialMovingAverage()
ema.Length = self.EmaPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(ema, self.ProcessCandle).Start()
def ProcessCandle(self, candle, ema):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
if not self._has_prev:
self._prev_close = close
self._prev_ema = ema
self._has_prev = True
return
if self._prev_close <= self._prev_ema and close > ema and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif self._prev_close >= self._prev_ema and close < ema and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_close = close
self._prev_ema = ema
def CreateClone(self):
"""!! REQUIRED!! Creates a new instance of the strategy."""
return adx_ma_strategy()