Ver no GitHub

Estratégia BrainTrend2 + AbsolutelyNoLagLWMA MMRec

Visão geral

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);
		}
	}
}