Ver no GitHub

Estratégia Dez Pontos 3 v005

Visão geral

Esta estratégia é uma versão StockSharp do MetaTrader 4 consultor especialista "10points 3 v005". Ele segue a inclinação MACD para decidir se a cesta média atual deve ser longa ou curta e continua abrindo ordens martingale sempre que o preço se move contra a posição ativa por uma distância configurável. A versão aprimorada "v005" adiciona regras de proteção baseadas em ações, filtros de dia e hora e a opção de desativar o ciclo longo ou curto.

Lógica de negociação

  • Leia a direção da linha principal MACD. Quando o indicador subir, a próxima cesta será comprada, quando cair, a cesta será curta. Uma opção permite reverter a interpretação.
  • Abra a primeira posição de mercado imediatamente assim que existir uma direção. As entradas subsequentes são adicionadas sempre que o preço se move EntryDistancePips contra a posição flutuante.
  • Os tamanhos dos pedidos crescem geometricamente. O multiplicador é controlado por MartingaleFactor (ou HighTradeFactor quando mais de 12 negociações são permitidas). Os volumes são alinhados à etapa de volume do instrumento e limitados a 100 lotes.
  • Cada entrada atualiza os níveis agregados de stop-loss e take-profit. Os valores iniciais são compensados ​​por InitialStopPips e TakeProfitPips, enquanto a lógica final é ativada depois que a posição ganha EntryDistancePips + TrailingStopPips a favor.
  • Se a proteção da conta estiver ativada, a estratégia pode alinhar a meta com a melhor entrada (ReboundLock) e fechar o pedido mais recente quando o lucro flutuante atingir SecureProfit.
  • As regras de proteção de ações fecham todo o cabaz quando a perda flutuante excede StopLossAmount, quando o capital próprio sobe acima de ProfitTarget + ProfitBuffer ou quando o capital cai abaixo de StartProtectionLevel.
  • A negociação é limitada à janela OpenHour/CloseHour e é completamente desativada às sextas-feiras por padrão.

Gestão de dinheiro

Quando UseMoneyManagement está desabilitado, o primeiro pedido usa o LotSize fixo. Quando a sinalização está habilitada, o volume base é calculado a partir do valor atual do portfólio e do parâmetro RiskPercent. O escalonamento de minicontas pode ser simulado por meio de IsStandardAccount.

Parâmetros

Parâmetro Descrição
TakeProfitPips Distância (em pips) do take-profit aplicado a cada entrada.
LotSize Tamanho base do lote quando o gerenciamento de dinheiro está desativado.
InitialStopPips Distância inicial de stop loss para cada pedido.
TrailingStopPips Distância de parada final quando o limite de disparo é atingido.
MaxTrades Número máximo de entradas simultâneas de martingale.
EntryDistancePips Movimento adverso mínimo necessário para adicionar o próximo pedido.
SecureProfit Lucro flutuante (em unidades monetárias) necessário para acionar a saída de proteção de conta.
UseAccountProtection Ativa a lógica de lucro seguro e bloqueio de recuperação.
OrdersToProtect Número de etapas finais do martingale protegidas pela regra do lucro seguro.
ReverseSignals Inverte a interpretação da inclinação MACD.
UseMoneyManagement Permite dimensionamento baseado em equilíbrio.
RiskPercent Percentagem de risco utilizada pela fórmula de gestão de dinheiro.
IsStandardAccount Usa escala de lote padrão em vez de mini escala.
EurUsdPipValue, GbpUsdPipValue, UsdChfPipValue, UsdJpyPipValue, DefaultPipValue Valores de pip usados para converter lucro flutuante em moeda.
CandleType Período de vela usado para geração de sinal.
MacdFastLength, MacdSlowLength, MacdSignalLength Configuração MACD.
EnableLong, EnableShort Ative ou desative a cesta longa/curta.
OpenHour, CloseHour, MinuteToStop Configuração da janela de negociação.
StopLossProtection, StopLossAmount Guarda stop-loss baseada em ações.
ProfitTargetEnabled, ProfitTarget, ProfitBuffer Bloqueio de lucro baseado em ações.
StartProtectionEnabled, StartProtectionLevel Guarda de piso patrimonial.
ReboundLock Alinha as saídas com a melhor entrada quando a proteção está ativa.
MartingaleFactor, HighTradeFactor Martingale multiplicadores.
CloseOnFriday Desativa a negociação às sextas-feiras.

Notas

  • A estratégia usa StockSharp API (SubscribeCandles + BindEx) de alto nível e não expõe buffers de indicadores brutos.
  • Cada guarda de ações fecha a cesta ativa usando ordens de mercado para replicar o comportamento original EA.
  • Sempre valide os valores dos parâmetros, o tamanho do pip e o valor do pip em relação às especificações do seu corretor antes de usar a estratégia em produção.
using System;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// 10 Points 3 V005: Dual EMA crossover with RSI confirmation and ATR stops.
/// </summary>
public class TenPoints3V005Strategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastEmaLength;
	private readonly StrategyParam<int> _slowEmaLength;
	private readonly StrategyParam<int> _rsiLength;
	private readonly StrategyParam<int> _atrLength;

	private decimal _prevFast;
	private decimal _prevSlow;
	private decimal _entryPrice;

	public TenPoints3V005Strategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe.", "General");
		_fastEmaLength = Param(nameof(FastEmaLength), 10)
			.SetDisplay("Fast EMA", "Fast EMA period.", "Indicators");
		_slowEmaLength = Param(nameof(SlowEmaLength), 30)
			.SetDisplay("Slow EMA", "Slow EMA period.", "Indicators");
		_rsiLength = Param(nameof(RsiLength), 14)
			.SetDisplay("RSI Length", "RSI 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 FastEmaLength { get => _fastEmaLength.Value; set => _fastEmaLength.Value = value; }
	public int SlowEmaLength { get => _slowEmaLength.Value; set => _slowEmaLength.Value = value; }
	public int RsiLength { get => _rsiLength.Value; set => _rsiLength.Value = value; }
	public int AtrLength { get => _atrLength.Value; set => _atrLength.Value = value; }

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

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

		protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevFast = 0; _prevSlow = 0; _entryPrice = 0;
		var fastEma = new ExponentialMovingAverage { Length = FastEmaLength };
		var slowEma = new ExponentialMovingAverage { Length = SlowEmaLength };
		var rsi = new RelativeStrengthIndex { Length = RsiLength };
		var atr = new AverageTrueRange { Length = AtrLength };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fastEma, slowEma, rsi, atr, ProcessCandle).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fastEma); DrawIndicator(area, slowEma); 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;

		if (Position > 0)
		{
			if ((fastVal < slowVal && _prevFast >= _prevSlow) || close <= _entryPrice - atrVal * 1.5m) { SellMarket(); _entryPrice = 0; }
		}
		else if (Position < 0)
		{
			if ((fastVal > slowVal && _prevFast <= _prevSlow) || close >= _entryPrice + atrVal * 1.5m) { BuyMarket(); _entryPrice = 0; }
		}

		if (Position == 0)
		{
			if (fastVal > slowVal && _prevFast <= _prevSlow && rsiVal > 50) { _entryPrice = close; BuyMarket(); }
			else if (fastVal < slowVal && _prevFast >= _prevSlow && rsiVal < 50) { _entryPrice = close; SellMarket(); }
		}
		_prevFast = fastVal; _prevSlow = slowVal;
	}
}