Neuro Nirvaman EA 2 es una estrategia de perceptrón multicapa que fue escrita originalmente para MetaTrader 5. La lógica combina cuatro flujos +DI suavizados por Laguerre con dos detectores de ruptura SilverTrend. Cada barra la estrategia evalúa tres perceptrones cuyos pesos están controlados por los parámetros X. Un módulo supervisor elige qué salida del perceptrón debe negociarse según el modo de paso seleccionado. Las operaciones se permiten solo dentro de la ventana de sesión configurada y todas las posiciones se aplanan una vez que la ventana se cierra.
Indicadores y señales
Filtros Laguerre +DI – Cada bloque Laguerre suaviza el valor +DI de un indicador ADX (gamma = 0.764). El valor resultante oscila entre 0 y 1 y se compara con una línea central de 0.5 con umbrales de distancia definidos por el usuario.
Ruptura SilverTrend – Dos detectores SilverTrend calculan envolventes dinámicas de soporte/resistencia usando las últimas nueve barras. El ajuste de riesgo modifica el ancho de la envolvente (K = 33 - risk). Una transición de bajista a alcista (o viceversa) produce señales ±1 que alimentan los perceptrones.
Lógica de negociación
Perceptrón #1 usa Laguerre #1 para el componente de tensión y SilverTrend #1 para el componente de ruptura. Los pesos X11 y X12 desplazan las contribuciones relativas a 100.
Perceptrón #2 refleja el primer perceptrón pero se basa en Laguerre #2 y SilverTrend #2 con pesos X21 y X22.
Perceptrón #3 combina las salidas de tensión de Laguerre #3 y Laguerre #4 ponderadas por X31 y X32.
Modos supervisor (Pass)
1 – Negociar el perceptrón #1 (< 0 abre corto, de lo contrario largo).
2 – Negociar el perceptrón #2 (> 0 abre largo, de lo contrario corto).
3 – Abrir una posición larga cuando tanto el perceptrón #3 como el #2 son positivos. Abrir un corto cuando el perceptrón #3 es no positivo y el perceptrón #1 es negativo.
4 – Deshabilitar negociación (coincide con el comportamiento predeterminado del EA original).
Cada entrada coloca una orden de mercado de volumen fijo y registra niveles de stop-loss / take-profit expresados en pasos de precio. Las posiciones se monitorean en cada vela finalizada: si el máximo/mínimo perfora los objetivos registrados, la estrategia sale inmediatamente. Salir de la ventana de negociación también fuerza una salida.
Parámetros
Nombre
Descripción
Risk1, Risk2
Configuraciones de riesgo SilverTrend. Los valores más altos reducen la envolvente y generan señales más frecuentes.
LaguerreXPeriod
Longitud ADX que alimenta el suavizador Laguerre (para cada uno de los cuatro flujos).
LaguerreXDistance
Distancia porcentual alrededor de la línea central 0.5 que define la tensión alcista/bajista.
X11, X12, X21, X22, X31, X32
Pesos del perceptrón (los valores se desplazan en 100 dentro de la fórmula, exactamente como en la versión MQL).
TakeProfit1, StopLoss1, TakeProfit2, StopLoss2
Distancias de objetivo de beneficio y stop de protección en pasos de precio para las respectivas señales del perceptrón.
Pass
Selector de modo supervisor (1–4).
TradeVolume
Tamaño base de orden usado para entradas de mercado.
StartHour, StartMinute, EndHour, EndMinute
Límites de la sesión de negociación. Cuando la hora actual está fuera de esta ventana, todas las posiciones se cierran y no se permiten nuevas operaciones.
CandleType
Suscripción de velas para impulsar la estrategia de alto nivel.
Gestión de riesgos
La estrategia depende de las distancias fijas de stop-loss y take-profit definidas por el perceptrón que activó la entrada. No se realiza piramidación ni promediado. Porque la lógica solo opera cuando no hay posición abierta, la exposición está limitada a una sola posición activa y todas las operaciones se cierran a la fuerza una vez que termina la ventana de sesión.
Notas
El gamma para el suavizador Laguerre está fijo en 0.764 para coincidir con la implementación MQL.
El valor Pass 4 mantiene la estrategia inactiva, lo que refleja el predeterminado de seguridad del EA original.
Los cálculos SilverTrend usan primitivos de indicador (highest, lowest, simple moving average) en lugar de buffers personalizados para cumplir con las directrices de StockSharp.
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()