Esta estrategia recrea el experto de MetaTrader Exp_BrainTrend2_AbsolutelyNoLagLwma_MMRec combinando dos bloques de señales independientes: el motor de seguimiento de tendencia BrainTrend2 y el filtro adaptativo AbsolutelyNoLagLWMA. Cada bloque puede abrir y cerrar operaciones de acuerdo con sus propios permisos, imitando los interruptores de gestión monetaria de la plantilla MMRec original. Las órdenes se ejecutan con la API de alto nivel de StockSharp usando ejecuciones de mercado y el volumen predeterminado configurable.
Lógica de trading
Bloque BrainTrend2
Construye un nivel trailing dinámico basado en un rango verdadero ponderado similar al ATR.
La dirección (river) cambia cuando la vela perfora el buffer de trailing por más de 0.7 * ATR.
Las velas alcistas dentro de un river alcista activan entradas largas (si están habilitadas) y cierran posiciones cortas.
Las velas bajistas dentro de un river bajista activan entradas cortas (si están habilitadas) y cierran posiciones largas.
Las señales pueden retrasarse mediante el parámetro Brain Signal Shift para trabajar con barras anteriores.
Bloque AbsolutelyNoLagLWMA
Aplica una media móvil lineal ponderada de dos etapas a la fuente de precio seleccionada.
Los colores se vuelven alcistas (2) cuando la LWMA doble sube, bajistas (0) cuando cae y neutrales (1) en caso contrario.
Una transición al color 2 abre largos y opcionalmente cierra cortos; un cambio al color 0 abre cortos y opcionalmente cierra largos.
Las señales también pueden desplazarse hacia atrás un número de barras definido por el usuario.
Gestión de posición
La estrategia opera una única posición neta. Cuando ambos bloques solicitan operaciones en la misma barra, las señales de cierre se ejecutan antes de cualquier nueva entrada.
Si un bloque quiere abrir una operación pero la posición opuesta está abierta y el permiso de cierre correspondiente está desactivado, la entrada se omite (refleja la imposibilidad de mantener posiciones hedgeadas con una única cartera neta).
Parámetros
Grupo
Nombre
Descripción
BrainTrend2
Brain Candle
Tipo de vela usado para el indicador BrainTrend2.
BrainTrend2
Brain ATR
Período ATR para los cálculos internos de BrainTrend2.
BrainTrend2
Brain Signal Shift
Número de barras para retrasar las señales de BrainTrend2.
BrainTrend2
Brain Buy / Sell
Permitir a BrainTrend2 abrir operaciones largas/cortas.
BrainTrend2
Brain Close Buys / Close Sells
Permitir a las señales de BrainTrend2 cerrar posiciones existentes.
AbsolutelyNoLag
Abs Candle
Tipo de vela usado para el indicador LWMA.
AbsolutelyNoLag
Abs Length
Período de la LWMA.
AbsolutelyNoLag
Abs Price
Precio aplicado usado para la LWMA. Coincide con el enum Applied_price_ de MQL.
AbsolutelyNoLag
Abs Signal Shift
Número de barras para retrasar las señales de la LWMA.
AbsolutelyNoLag
Abs Buy / Sell
Permitir al bloque LWMA abrir operaciones largas/cortas.
AbsolutelyNoLag
Abs Close Buys / Close Sells
Permitir al bloque LWMA cerrar posiciones.
AbsolutelyNoLag
Abs Shift
Agrega un desplazamiento de precio constante a la salida de la LWMA.
General
Order Volume
Volumen de orden de mercado predeterminado.
Notas
Los cálculos de ATR y LWMA siguen las implementaciones MQL originales, incluyendo la ponderación triangular del ATR y la extensa lista de precios aplicados.
La información de spread no está disponible en las velas de StockSharp, por lo que el rango verdadero usa solo precios de vela. Esto refleja el comportamiento del indicador cuando el spread es igual a cero.
Las múltiples posiciones simultáneas con diferentes magic numbers se consolidan en una única posición neta, que es el estándar en las estrategias de StockSharp.
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()