Neuro Nirvaman EA 2 ist eine Multi-Layer-Perceptron-Strategie, die ursprünglich für MetaTrader 5 geschrieben wurde. Die Logik kombiniert vier Laguerre-geglättete +DI-Ströme mit zwei SilverTrend-Ausbruchsdetektoren. Jede Bar bewertet die Strategie drei Perceptronen, deren Gewichte durch die X-Parameter gesteuert werden. Ein Supervisor-Modul wählt aus, welche Perceptron-Ausgabe basierend auf dem ausgewählten Pass-Modus gehandelt werden soll. Das Handeln ist nur innerhalb des konfigurierten Sitzungsfensters erlaubt und alle Positionen werden geplättet, sobald das Fenster geschlossen wird.
Indikatoren und Signale
Laguerre +DI-Filter – Jeder Laguerre-Block glättet den +DI-Wert eines ADX-Indikators (gamma = 0.764). Der resultierende Wert oszilliert zwischen 0 und 1 und wird mit einer 0.5-Mittellinie mit benutzerdefinierten Abstandsschwellen verglichen.
SilverTrend-Ausbruch – Zwei SilverTrend-Detektoren berechnen dynamische Support-/Resistance-Hüllen anhand der letzten neun Bars. Die Risikoeinstellung modifiziert die Hüllenbreite (K = 33 - risk). Ein Übergang von bärisch zu bullisch (oder umgekehrt) erzeugt ±1-Signale, die die Perceptronen speisen.
Handelslogik
Perceptron #1 verwendet Laguerre #1 für die Spannungskomponente und SilverTrend #1 für die Ausbruchskomponente. Gewichte X11 und X12 versetzen die Beiträge relativ zu 100.
Perceptron #2 spiegelt das erste Perceptron, basiert aber auf Laguerre #2 und SilverTrend #2 mit Gewichten X21 und X22.
Perceptron #3 kombiniert die Spannungsausgaben von Laguerre #3 und Laguerre #4, gewichtet durch X31 und X32.
3 – Eine Long-Position eröffnen, wenn sowohl Perceptron #3 als auch #2 positiv sind. Ein Short eröffnen, wenn Perceptron #3 nicht-positiv und Perceptron #1 negativ ist.
4 – Handel deaktivieren (entspricht dem Standardverhalten des ursprünglichen EA).
Jeder Einstieg platziert eine Marktorder mit festem Volumen und zeichnet Stop-Loss-/Take-Profit-Niveaus in Preisschritten auf. Positionen werden bei jeder fertigen Kerze überwacht: wenn das Hoch/Tief die aufgezeichneten Ziele durchdringt, tritt die Strategie sofort aus. Das Verlassen des Handelsfensters erzwingt ebenfalls einen Ausstieg.
Parameter
Name
Beschreibung
Risk1, Risk2
SilverTrend-Risikoeinstellungen. Höhere Werte schrumpfen die Hülle und erzeugen häufigere Signale.
LaguerreXPeriod
ADX-Länge, die den Laguerre-Glätter speist (für jeden der vier Ströme).
LaguerreXDistance
Prozentabstand um die 0.5-Mittellinie, der bullische/bärische Spannung definiert.
X11, X12, X21, X22, X31, X32
Perceptron-Gewichte (Werte werden in der Formel um 100 versetzt, genau wie in der MQL-Version).
TakeProfit1, StopLoss1, TakeProfit2, StopLoss2
Gewinnziel- und Schutz-Stop-Abstände in Preisschritten für die jeweiligen Perceptron-Signale.
Pass
Supervisor-Modus-Selektor (1–4).
TradeVolume
Basis-Ordergröße für Marktausstiege.
StartHour, StartMinute, EndHour, EndMinute
Handelssitzungsgrenzen. Wenn die aktuelle Uhrzeit außerhalb dieses Fensters liegt, werden alle Positionen geschlossen und keine neuen Trades erlaubt.
CandleType
Kerzenabonnement zum Antrieb der High-Level-Strategie.
Risikomanagement
Die Strategie verlässt sich auf die festen Stop-Loss- und Take-Profit-Abstände, die durch das Perceptron definiert sind, das den Einstieg ausgelöst hat. Es wird keine Pyramidierung oder Mittelung durchgeführt. Da die Logik nur handelt, wenn keine Position offen ist, ist die Exposition auf eine einzelne aktive Position begrenzt und alle Trades werden zwangsgeschlossen, sobald das Sitzungsfenster endet.
Hinweise
Gamma für den Laguerre-Glätter ist bei 0.764 fixiert, um die MQL-Implementierung zu imitieren.
Pass-Wert 4 hält die Strategie inaktiv, was dem Sicherheitsstandard des ursprünglichen EA entspricht.
SilverTrend-Berechnungen verwenden Indikator-Primitive (Highest, Lowest, Simple Moving Average) anstatt benutzerdefinierter Puffer, um den StockSharp-Richtlinien zu entsprechen.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// NeuroNirvaman EA 2 strategy. Uses DEMA crossover (10/30).
/// </summary>
public class NeuroNirvamanEa2Strategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private decimal? _prevFast;
private decimal? _prevSlow;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public NeuroNirvamanEa2Strategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 10).SetGreaterThanZero().SetDisplay("Fast DEMA", "Fast DEMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 30).SetGreaterThanZero().SetDisplay("Slow DEMA", "Slow DEMA period", "Indicators");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = null;
_prevSlow = null;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevFast = null; _prevSlow = null;
var fast = new DoubleExponentialMovingAverage { Length = FastPeriod };
var slow = new DoubleExponentialMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, slow, ProcessCandle).Start();
var area = CreateChartArea();
if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished) return;
if (!IsFormedAndOnlineAndAllowTrading()) { _prevFast = fast; _prevSlow = slow; return; }
if (_prevFast == null || _prevSlow == null) { _prevFast = fast; _prevSlow = slow; return; }
var prevAbove = _prevFast.Value > _prevSlow.Value;
var currAbove = fast > slow;
_prevFast = fast; _prevSlow = slow;
if (!prevAbove && currAbove && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
else if (prevAbove && !currAbove && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
}
}
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 DoubleExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class neuro_nirvaman_ea2_strategy(Strategy):
def __init__(self):
super(neuro_nirvaman_ea2_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Timeframe", "General")
self._fast_period = self.Param("FastPeriod", 10) \
.SetDisplay("Fast DEMA", "Fast DEMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 30) \
.SetDisplay("Slow DEMA", "Slow DEMA period", "Indicators")
self._prev_fast = None
self._prev_slow = None
@property
def CandleType(self):
return self._candle_type.Value
@property
def FastPeriod(self):
return self._fast_period.Value
@property
def SlowPeriod(self):
return self._slow_period.Value
def OnReseted(self):
super(neuro_nirvaman_ea2_strategy, self).OnReseted()
self._prev_fast = None
self._prev_slow = None
def OnStarted2(self, time):
super(neuro_nirvaman_ea2_strategy, self).OnStarted2(time)
self._prev_fast = None
self._prev_slow = None
fast = DoubleExponentialMovingAverage()
fast.Length = self.FastPeriod
slow = DoubleExponentialMovingAverage()
slow.Length = self.SlowPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(fast, slow, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def _on_process(self, candle, fast_value, slow_value):
if candle.State != CandleStates.Finished:
return
fv = float(fast_value)
sv = float(slow_value)
if self._prev_fast is None or self._prev_slow is None:
self._prev_fast = fv
self._prev_slow = sv
return
prev_above = self._prev_fast > self._prev_slow
curr_above = fv > sv
self._prev_fast = fv
self._prev_slow = sv
if not prev_above and curr_above and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif prev_above and not curr_above and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
def CreateClone(self):
return neuro_nirvaman_ea2_strategy()