Esta estratégia recria o especialista MetaTrader Exp_BrainTrend2_AbsolutelyNoLagLwma_MMRec combinando dois blocos de sinal independentes: o motor de seguimento de tendência BrainTrend2 e o filtro adaptativo AbsolutelyNoLagLWMA. Cada bloco pode abrir e fechar negociações de acordo com suas próprias permissões, imitando os interruptores de gestão de dinheiro do template MMRec original. As ordens são executadas com a API de alto nível do StockSharp usando execuções de mercado e o volume padrão configurável.
Lógica de negociação
Bloco BrainTrend2
Constrói um nível de trailing dinâmico baseado em um intervalo verdadeiro ponderado semelhante ao ATR.
A direção (river) alterna quando a vela perfura o buffer de trailing em mais de 0.7 * ATR.
Velas de alta dentro de um river de alta acionam entradas compradas (se habilitadas) e fecham posições vendidas.
Velas de baixa dentro de um river de baixa acionam entradas vendidas (se habilitadas) e fecham posições compradas.
Os sinais podem ser atrasados pelo parâmetro Brain Signal Shift para trabalhar com barras mais antigas.
Bloco AbsolutelyNoLagLWMA
Aplica uma média móvel linear ponderada em dois estágios à fonte de preço selecionada.
As cores tornam-se alta (2) quando a LWMA dupla sobe, baixa (0) quando cai e neutra (1) caso contrário.
Uma transição para a cor 2 abre compradas e opcionalmente fecha vendidas; uma mudança para a cor 0 abre vendidas e opcionalmente fecha compradas.
Os sinais também podem ser deslocados para trás por um número definido pelo usuário de barras.
Gestão de posição
A estratégia opera uma única posição líquida. Quando ambos os blocos solicitam negociações na mesma barra, os sinais de fechamento são executados antes de quaisquer novas entradas.
Se um bloco quer abrir uma negociação mas a posição oposta está aberta e a permissão de fechamento correspondente está desativada, a entrada é ignorada (reflete a impossibilidade de manter posições hedgeadas com um único portfólio líquido).
Parâmetros
Grupo
Nome
Descrição
BrainTrend2
Brain Candle
Tipo de vela usado para o indicador BrainTrend2.
BrainTrend2
Brain ATR
Período ATR para os cálculos internos do BrainTrend2.
BrainTrend2
Brain Signal Shift
Número de barras para atrasar os sinais do BrainTrend2.
BrainTrend2
Brain Buy / Sell
Permitir que o BrainTrend2 abra negociações compradas/vendidas.
BrainTrend2
Brain Close Buys / Close Sells
Permitir que os sinais do BrainTrend2 fechem posições existentes.
AbsolutelyNoLag
Abs Candle
Tipo de vela usado para o indicador LWMA.
AbsolutelyNoLag
Abs Length
Período da LWMA.
AbsolutelyNoLag
Abs Price
Preço aplicado usado para a LWMA. Corresponde ao enum Applied_price_ do MQL.
AbsolutelyNoLag
Abs Signal Shift
Número de barras para atrasar os sinais da LWMA.
AbsolutelyNoLag
Abs Buy / Sell
Permitir que o bloco LWMA abra negociações compradas/vendidas.
AbsolutelyNoLag
Abs Close Buys / Close Sells
Permitir que o bloco LWMA feche posições.
AbsolutelyNoLag
Abs Shift
Adiciona um deslocamento de preço constante à saída da LWMA.
General
Order Volume
Volume de ordem de mercado padrão.
Notas
Os cálculos de ATR e LWMA seguem as implementações MQL originais, incluindo a ponderação triangular do ATR e a extensa lista de preços aplicados.
As informações de spread não estão disponíveis nas velas do StockSharp, portanto o intervalo verdadeiro usa apenas preços de vela. Isso reflete o comportamento do indicador quando o spread é igual a zero.
Múltiplas posições simultâneas com diferentes magic numbers são consolidadas em uma única posição líquida, o que é padrão nas estratégias do 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()