Ver no GitHub

Estratégia de Trader Elite eFibo

Visão geral

Elite eFibo Trader reproduz o consultor especialista em média que abre uma progressão Fibonacci de pedidos enquanto monitora um cruzamento de média móvel e um filtro RSI opcional. A porta StockSharp mantém a lógica da cesta original: uma entrada no mercado aciona uma pilha de ordens de stop pendentes espaçadas por distâncias de pip configuráveis, e cada preenchimento adicional aumenta a exposição seguindo a sequência Fibonacci. A estratégia nivela automaticamente a cesta quando o lucro flutuante atinge uma meta de caixa ou quando o filtro de tendência se volta contra a exposição atual.

Dados de mercado

  • Assina um único tipo de vela configurável (padrão: velas de 15 minutos).
  • Usa o fechamento da vela para valores do indicador e para avaliar condições de trailing/stop.

Lógica de entrada

  1. A direção é determinada pelo cruzamento da média móvel (ativado por padrão) ou pelas alternâncias manuais ManualOpenBuy/ManualOpenSell.
  2. Quando a lógica MA está ativa, um cruzamento de alta (fast acima de slow) arma compra cestas e um cruzamento de baixa vende cestas. Um único sinal por vela é aplicado.
  3. Se o filtro RSI estiver ativado, cestas longas exigem RSI > RsiHigh enquanto cestas curtas exigem RSI < RsiLow.
  4. Uma nova escada é aberta somente quando não há ordens ou posições ativas da estratégia e a negociação é permitida (TradeAgainAfterProfit).
  5. O primeiro nível é aberto com uma ordem de mercado, enquanto os níveis restantes são submetidos como ordens stop compensadas por LevelDistancePips. Os volumes seguem a sequência Fibonacci e podem ser ajustados nível por nível.

Lógica de saída

  • Cada nível preenchido recebe uma parada inicial calculada a partir de StopLossPips e participa de uma atualização final quando a lógica MA detecta um cruzamento adverso.
  • As paradas são seguidas até close - TrailingStopPips para cestas longas e close + TrailingStopPips para cestas curtas, nunca se afastando mais do que a parada atual.
  • Quando o preço atinge um nível de stop (com base na máxima/mínima da vela), a estratégia fecha o volume restante desse nível com uma ordem de mercado.
  • Se o lucro flutuante da cesta (calculado a partir dos instrumentos PriceStep e StepPrice) atingir MoneyTakeProfit, todas as posições serão fechadas e as ordens pendentes serão canceladas.
  • Depois que a cesta estiver estável, quaisquer ordens de stop pendentes serão canceladas automaticamente. Se TradeAgainAfterProfit for false a estratégia permanece inativa até ser redefinida.

Parâmetros

Nome Descrição
UseMaLogic Habilite ou desabilite a lógica de cruzamento da média móvel que define a direção da negociação.
MaSlowPeriod, MaFastPeriod Períodos dos SMAs lentos e rápidos.
TrailingStopPips Distância pip usada pelo trailing stop de proteção quando o filtro de tendência fica adverso.
UseRsiFilter, RsiPeriod, RsiHigh, RsiLow RSI configuração de filtro. O filtro permite posições compradas acima de RsiHigh e vendidas abaixo de RsiLow.
ManualOpenBuy, ManualOpenSell Alternâncias manuais usadas quando a lógica MA está desabilitada.
TradeAgainAfterProfit Retome a negociação depois de atingir o lucro líquido.
LevelDistancePips Distância em pips entre ordens pendentes consecutivas.
StopLossPips Deslocamento de parada inicial para cada nível.
MoneyTakeProfit Meta de lucro monetário avaliada no PnL aberto da cesta.
Level1VolumeLevel14Volume Volume de cada nível Fibonacci. Defina como zero para desativar um nível.
CandleType Prazo/tipo de dados usado para indicadores.

Notas de implementação

  • As distâncias pip são convertidas de pontos estilo MetaTrader multiplicando o instrumento PriceStep por dez quando o título tem 3 ou 5 casas decimais. Isso reflete o ajuste original MyPoint para cotações de câmbio de 5 dígitos.
  • Cada nível é rastreado de forma independente. A estratégia armazena o preço de entrada, o volume restante e o nível de stop para que os preenchimentos parciais e os stop-outs individuais sejam tratados da mesma forma que o especialista MQL.
  • O lucro flutuante é calculado a partir de PriceStep e StepPrice. Certifique-se de que as propriedades do instrumento estejam configuradas, caso contrário, o lucro do dinheiro não será acionado corretamente.
  • StartProtection() é invocado uma vez durante a inicialização para ativar as verificações de segurança integradas da classe base da estratégia StockSharp.
  • Quando nenhum volume aberto permanece, CancelAllPendingOrders() é chamado automaticamente, replicando as chamadas subCloseAllPending() repetidas do script original.

Dicas de uso

  • Verifique as configurações do corretor para PriceStep, StepPrice, VolumeStep e tamanho mínimo do lote para garantir que os volumes de Fibonacci sejam convertidos em pedidos válidos.
  • A estratégia depende de dados de velas; certifique-se de que o período selecionado corresponda ao período do gráfico MetaTrader pretendido.
  • Considere executar a estratégia primeiro em feeds de demonstração: os sistemas de média podem acumular grande exposição durante tendências adversas.
  • Desative UseMaLogic para reproduzir a polarização manual usada nas entradas originais EA ou mantenha-o ativado para detecção automática de tendências.
using System;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Elite eFibo Trader: MA crossover with RSI filter and grid averaging.
/// Adds to winning positions on pullbacks using Fibonacci-style scaling.
/// </summary>
public class EliteEfiboTraderStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastLength;
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<int> _rsiLength;
	private readonly StrategyParam<int> _atrLength;

	private decimal _prevFast;
	private decimal _prevSlow;
	private decimal _entryPrice;
	private int _addCount;

	public EliteEfiboTraderStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(8).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe.", "General");

		_fastLength = Param(nameof(FastLength), 10)
			.SetDisplay("Fast MA", "Fast SMA period.", "Indicators");

		_slowLength = Param(nameof(SlowLength), 30)
			.SetDisplay("Slow MA", "Slow SMA period.", "Indicators");

		_rsiLength = Param(nameof(RsiLength), 14)
			.SetDisplay("RSI Length", "RSI filter period.", "Indicators");

		_atrLength = Param(nameof(AtrLength), 14)
			.SetDisplay("ATR Length", "ATR period.", "Indicators");
	}

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public int FastLength
	{
		get => _fastLength.Value;
		set => _fastLength.Value = value;
	}

	public int SlowLength
	{
		get => _slowLength.Value;
		set => _slowLength.Value = value;
	}

	public int RsiLength
	{
		get => _rsiLength.Value;
		set => _rsiLength.Value = value;
	}

	public int AtrLength
	{
		get => _atrLength.Value;
		set => _atrLength.Value = value;
	}

	/// <inheritdoc />
	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();

		_prevFast = 0;
		_prevSlow = 0;
		_entryPrice = 0;
		_addCount = 0;
	}

		protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		_prevFast = 0;
		_prevSlow = 0;
		_entryPrice = 0;
		_addCount = 0;

		var fast = new SimpleMovingAverage { Length = FastLength };
		var slow = new SimpleMovingAverage { Length = SlowLength };
		var rsi = new RelativeStrengthIndex { Length = RsiLength };
		var atr = new AverageTrueRange { Length = AtrLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fast, slow, rsi, atr, 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 fastVal, decimal slowVal, decimal rsiVal, decimal atrVal)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (_prevFast == 0 || _prevSlow == 0 || atrVal <= 0)
		{
			_prevFast = fastVal;
			_prevSlow = slowVal;
			return;
		}

		var close = candle.ClosePrice;

		// Position management
		if (Position > 0)
		{
			// Take profit or stop
			if (close >= _entryPrice + atrVal * 3m)
			{
				SellMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (close <= _entryPrice - atrVal * 2m)
			{
				SellMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (_addCount < 2 && close <= _entryPrice - atrVal * 0.8m && rsiVal < 40)
			{
				// Fibonacci add: buy more on pullback
				_entryPrice = (_entryPrice + close) / 2m;
				_addCount++;
				BuyMarket();
			}
		}
		else if (Position < 0)
		{
			if (close <= _entryPrice - atrVal * 3m)
			{
				BuyMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (close >= _entryPrice + atrVal * 2m)
			{
				BuyMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (_addCount < 2 && close >= _entryPrice + atrVal * 0.8m && rsiVal > 60)
			{
				_entryPrice = (_entryPrice + close) / 2m;
				_addCount++;
				SellMarket();
			}
		}

		// Entry: MA crossover with RSI confirmation
		if (Position == 0)
		{
			if (_prevFast <= _prevSlow && fastVal > slowVal && rsiVal > 50)
			{
				_entryPrice = close;
				_addCount = 0;
				BuyMarket();
			}
			else if (_prevFast >= _prevSlow && fastVal < slowVal && rsiVal < 50)
			{
				_entryPrice = close;
				_addCount = 0;
				SellMarket();
			}
		}

		_prevFast = fastVal;
		_prevSlow = slowVal;
	}
}