Ver no GitHub

Estratégia do Pan Bronze

Esta estratégia é uma versão StockSharp do MetaTrader 4 consultor especialista "Bronzew_pan". Ele negocia um único instrumento em velas finalizadas e combina o oscilador proprietário DayImpuls com Williams %R e o Commodity Channel Index (CCI) para detectar reversões de impulso.

Como funciona

  1. Assina o tipo de vela configurado e executa DayImpuls, Williams %R e CCI com o mesmo período.
  2. Mantém contabilidade independente de exposições longas e curtas para emular o comportamento de cobertura original.
  3. Fecha todas as posições quando o lucro flutuante atingir ProfitTarget ou cair abaixo de LossTarget.
  4. Abre uma venda quando DayImpuls permanece acima de DayImpulsShortLevel e declina, enquanto Williams %R está acima de WilliamsLevelUp e CCI excede CciLevel.
  5. Abre uma compra quando DayImpuls fica abaixo de DayImpulsLongLevel e sobe, enquanto Williams %R está abaixo de WilliamsLevelDown e CCI é menor que -CciLevel.
  6. Se o PnL flutuante ultrapassar os limites de PredBand, a estratégia envia uma grande ordem média multiplicada por LotMultiplier para inverter a direção, espelhando a lógica de recuperação de emergência de MetaTrader.
  7. Os valores individuais de stop-loss e take-profit são monitorados para cestas longas e curtas usando distâncias de pip convertidas em preços.
  8. Nenhuma nova negociação é aberta quando o saldo da conta cai abaixo de MinimumBalance ou quando as cestas longas e curtas estão ativas.

Parâmetros

Nome Descrição Padrão
TradeVolume Volume base para entradas. 0.1
LongStopLossPips Distância de stop-loss para cestas longas em pips. 0
ShortStopLossPips Distância de stop-loss para cestas curtas em pips. 0
LongTakeProfitPips Distância de lucro para cestas longas em pips. 0
ShortTakeProfitPips Distância de lucro para cestas curtas em pips. 0
IndicatorPeriod Comprimento usado por DayImpuls, Williams %R e CCI. 14
CciLevel Limite absoluto de CCI confirmando sobrecompra/sobrevenda. 150
WilliamsLevelUp Williams %R nível necessário para shorts. -15
WilliamsLevelDown Williams %R nível necessário para posições compradas. -85
DayImpulsShortLevel Nível DayImpuls que permite entradas curtas. 50
DayImpulsLongLevel Nível DayImpuls que permite entradas longas. -50
ProfitTarget Lucro flutuante que fecha todas as posições. 500
LossTarget Perda flutuante que fecha todas as posições. -2000
PredBand Faixa de lucro usada para acionar reversões de média. 100
LotMultiplier Multiplicador aplicado ao volume base durante reversões. 30
MinimumBalance Saldo mínimo da conta necessário para continuar negociando. 3000
CandleType Período usado para assinaturas de velas. 15m

Notas

  • O oscilador DayImpuls replica a suavização dupla EMA original sobre corpos de velas expressos em pontos.
  • Os valores de stop-loss e take-profit são opcionais; a configuração 0 desativa o respectivo lado de proteção.
  • A estratégia depende de velas acabadas e ignora barras incompletas.
using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Bronze Pan strategy - CCI with momentum confirmation.
/// Buys when CCI crosses above positive level and momentum is positive.
/// Sells when CCI crosses below negative level and momentum is negative.
/// </summary>
public class BronzePanStrategy : Strategy
{
	private readonly StrategyParam<int> _cciPeriod;
	private readonly StrategyParam<decimal> _cciLevel;
	private readonly StrategyParam<int> _momentumPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevCci;
	private bool _hasPrev;

	public int CciPeriod { get => _cciPeriod.Value; set => _cciPeriod.Value = value; }
	public decimal CciLevel { get => _cciLevel.Value; set => _cciLevel.Value = value; }
	public int MomentumPeriod { get => _momentumPeriod.Value; set => _momentumPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public BronzePanStrategy()
	{
		_cciPeriod = Param(nameof(CciPeriod), 14)
			.SetDisplay("CCI Period", "CCI lookback", "Indicators");

		_cciLevel = Param(nameof(CciLevel), 100m)
			.SetDisplay("CCI Level", "CCI threshold level", "Levels");

		_momentumPeriod = Param(nameof(MomentumPeriod), 14)
			.SetDisplay("Momentum Period", "Momentum lookback", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
	protected override void OnReseted() { base.OnReseted(); _prevCci = 0m; _hasPrev = false; }

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

		_hasPrev = false;

		var cci = new CommodityChannelIndex { Length = CciPeriod };
		var mom = new Momentum { Length = MomentumPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(cci, mom, ProcessCandle)
			.Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal cci, decimal mom)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (!_hasPrev)
		{
			_prevCci = cci;
			_hasPrev = true;
			return;
		}

		if (_prevCci <= CciLevel && cci > CciLevel && mom > 0 && Position <= 0)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		else if (_prevCci >= -CciLevel && cci < -CciLevel && mom < 0 && Position >= 0)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}

		_prevCci = cci;
	}
}