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
Assina o tipo de vela configurado e executa DayImpuls, Williams %R e CCI com o mesmo período.
Mantém contabilidade independente de exposições longas e curtas para emular o comportamento de cobertura original.
Fecha todas as posições quando o lucro flutuante atingir ProfitTarget ou cair abaixo de LossTarget.
Abre uma venda quando DayImpuls permanece acima de DayImpulsShortLevel e declina, enquanto Williams %R está acima de WilliamsLevelUp e CCI excede CciLevel.
Abre uma compra quando DayImpuls fica abaixo de DayImpulsLongLevel e sobe, enquanto Williams %R está abaixo de WilliamsLevelDown e CCI é menor que -CciLevel.
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.
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.
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;
}
}