Esta estrategia replica la idea original de MetaTrader "Plantilla Martingale simple" en StockSharp. Analiza velas terminadas de un período de tiempo configurable utilizando un par de promedios móviles simples (SMA). Un filtro de ruptura verifica si el cierre de la vela anterior rompe el máximo o el mínimo de una vela incluso anterior para confirmar la dirección. El tamaño de la posición sigue una secuencia de martingala: después de cada ciclo perdedor, el siguiente volumen comercial se multiplica, mientras que los ciclos rentables restablecen el volumen al tamaño base configurado.
Lógica de trading
Suscríbete a velas del período de tiempo CandleType. En la generación de señales sólo participan las velas terminadas.
Calcule un SMA rápido y un SMA lento en el cierre de la vela.
Genera una señal de compra cuando:
el último cierre de vela terminado está por encima del rápido SMA,
el rápido SMA está por encima del lento SMA,
en la vela anterior, el SMA rápido estaba por debajo del SMA lento, y
el último cierre finalizado de la vela está por encima del máximo de la vela de hace dos barras.
Genere una señal de venta cuando se produzcan condiciones simétricas a la baja, incluido el cierre por debajo del mínimo de la vela de hace dos barras.
Cuando se activa una señal y no hay posiciones abiertas ni órdenes activas, envíe una orden de mercado utilizando el volumen de martingala calculado actualmente.
Adjunte niveles sintéticos de stop-loss y take-profit monitoreando velas futuras. Cuando el precio toque cualquiera de los niveles, cierre la posición abierta.
Después de que se cierra una posición y se actualiza el saldo de la cartera:
si el saldo aumentó, restablezca el volumen al valor BaseVolume;
si el saldo disminuyó, multiplique el último volumen comercial por Multiplier y alinéelo con el paso de volumen del instrumento.
Parámetros
Nombre
Descripción
StopLossPoints
Distancia desde la entrada hasta la parada de protección en puntos de precio.
TakeProfitPoints
Distancia desde la entrada hasta el objetivo de beneficios en puntos de precio.
BaseVolume
Tamaño de lote inicial para el ciclo martingala.
Multiplier
Factor aplicado al tamaño del lote anterior después de una pérdida.
FastPeriod
Longitud del SMA rápido utilizado para el sesgo direccional.
SlowPeriod
Duración del SMA lento para confirmación de tendencia.
CandleType
Plazo de velas procesadas por la estrategia.
Gestión monetaria
La escalera martingala reacciona estrictamente a los cambios de equilibrio realizados. Las pequeñas fluctuaciones (±0,01 unidades monetarias) se ignoran para evitar ruido.
Los volúmenes están alineados con el instrumento VolumeStep, MinVolume y MaxVolume para garantizar tamaños de pedido válidos.
Los niveles de stop-loss y take-profit se monitorean en los extremos de las velas (alto/bajo) en lugar de colocar órdenes de intercambio, lo que refleja la implementación original de MQL que utilizaba salidas de mercado.
Notas de uso
Elija una combinación de marco temporal y símbolo que produzca suficientes velas históricas para que se formen ambas SMA antes de permitir el comercio.
Ajuste StopLossPoints y TakeProfitPoints para que coincidan con el tamaño de marca del símbolo; representan recuentos de puntos, no unidades de precio.
Considere probar diferentes multiplicadores y volúmenes base para controlar los requisitos de capital porque las secuencias de martingala crecen rápidamente.
La estrategia exige que StartProtection() comience a integrarse con las funciones estándar de gestión de riesgos de StockSharp.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Simple Martingale Template strategy: SMA crossover with momentum confirmation.
/// Buys on fast SMA crossing above slow SMA, sells on crossing below.
/// </summary>
public class SimpleMartingaleTemplateStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private decimal _prevFast;
private decimal _prevSlow;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public SimpleMartingaleTemplateStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 5)
.SetGreaterThanZero()
.SetDisplay("Fast SMA", "Fast SMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 15)
.SetGreaterThanZero()
.SetDisplay("Slow SMA", "Slow SMA period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = 0;
_prevSlow = 0;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var fast = new SimpleMovingAverage { Length = FastPeriod };
var slow = new SimpleMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, slow, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fastValue, decimal slowValue)
{
if (candle.State != CandleStates.Finished) return;
if (_hasPrev)
{
if (_prevFast <= _prevSlow && fastValue > slowValue && Position <= 0)
BuyMarket();
else if (_prevFast >= _prevSlow && fastValue < slowValue && Position >= 0)
SellMarket();
}
else
{
if (fastValue > slowValue && Position <= 0)
BuyMarket();
else if (fastValue < slowValue && Position >= 0)
SellMarket();
}
_prevFast = fastValue;
_prevSlow = slowValue;
_hasPrev = true;
}
}