Esta estrategia es una versión StockSharp del MetaTrader 4 asesor experto "Bronzew_pan". Opera con un solo instrumento en velas terminadas y combina el oscilador patentado DayImpuls con Williams %R y el índice de canales de productos básicos (CCI) para detectar reversiones de impulso.
como funciona
Se suscribe al tipo de vela configurado y ejecuta DayImpuls, Williams %R y CCI con el mismo período.
Mantiene una contabilidad independiente de las exposiciones largas y cortas para emular el comportamiento de cobertura original.
Cierra todas las posiciones una vez que el beneficio flotante alcanza ProfitTarget o cae por debajo de LossTarget.
Abre un corto cuando DayImpuls se mantiene por encima de DayImpulsShortLevel y disminuye, mientras que Williams %R está por encima de WilliamsLevelUp y CCI supera CciLevel.
Abre una posición larga cuando DayImpuls permanece por debajo de DayImpulsLongLevel y sube, mientras que Williams %R está por debajo de WilliamsLevelDown y CCI es menor que -CciLevel.
Si el PnL flotante se mueve más allá de los límites de PredBand, la estrategia envía una orden promedio grande multiplicada por LotMultiplier para invertir la dirección, reflejando la lógica de recuperación de emergencia de MetaTrader.
Los valores individuales de stop-loss y take-profit se monitorean para cestas largas y cortas utilizando distancias de pips convertidas a precios.
No se abren nuevas operaciones cuando el saldo de la cuenta cae por debajo de MinimumBalance o cuando están activas tanto las cestas largas como las cortas.
Parámetros
Nombre
Descripción
Predeterminado
TradeVolume
Volumen base para entradas.
0.1
LongStopLossPips
Distancia de stop-loss para cestas largas en pips.
0
ShortStopLossPips
Distancia de stop-loss para cestas cortas en pips.
0
LongTakeProfitPips
Distancia de obtención de beneficios para cestas largas en pips.
0
ShortTakeProfitPips
Distancia de obtención de beneficios para cestas cortas en pips.
0
IndicatorPeriod
Longitud utilizada por DayImpuls, Williams %R y CCI.
14
CciLevel
Umbral absoluto CCI que confirma sobrecompra/sobreventa.
150
WilliamsLevelUp
Williams Nivel %R requerido para cortos.
-15
WilliamsLevelDown
Williams Nivel %R requerido para posiciones largas.
-85
DayImpulsShortLevel
Nivel DayImpuls que permite entradas cortas.
50
DayImpulsLongLevel
Nivel DayImpuls que permite entradas largas.
-50
ProfitTarget
Beneficio flotante que cierra cada posición.
500
LossTarget
Pérdida flotante que cierra todas las posiciones.
-2000
PredBand
Banda de ganancias utilizada para desencadenar reversiones promedio.
100
LotMultiplier
Multiplicador aplicado al volumen base durante las reversiones.
30
MinimumBalance
Se requiere un saldo mínimo de cuenta para seguir operando.
3000
CandleType
Plazo utilizado para las suscripciones de velas.
15m
Notas
El oscilador DayImpuls replica el doble suavizado original EMA sobre los cuerpos de las velas expresado en puntos.
Los valores de stop-loss y take-profit son opcionales; la configuración 0 desactiva el lado de protección respectivo.
La estrategia se basa en velas terminadas e ignora las 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;
}
}