Esta estrategia reproduce el MetaTrader experto Expert_ABC_WS_Stoch.mq5, que combina patrones clásicos de inversión de tres velas con la confirmación del oscilador Stochastic. Una señal larga requiere la formación alcista de los "Tres Soldados Blancos" junto con una línea de señal de sobreventa Stochastic, mientras que una señal corta depende de la formación bajista de los "Tres Cuervos Negros" confirmada por una sobrecompra Stochastic. La lógica de salida monitorea los cruces de la línea de señal a través de bandas configurables para cerrar posiciones.
Lógica de trading
Detección de patrones
Realice un seguimiento de las últimas tres velas completadas.
Identifique Tres Soldados Blancos cuando las tres velas sean alcistas y cada cierre sea más alto que el anterior.
Identifique Tres Cuervos Negros cuando las tres velas sean bajistas y cada cierre sea más bajo que el anterior.
Confirmación del oscilador
Calcule un oscilador Stochastic con períodos %K, %D y Slowing idénticos al experto original (47, 9, 13 por defecto).
Utilice la línea de señal (%D) como confirmación:
Ingrese largo si el valor de la línea de señal anterior está por debajo del umbral de sobreventa (predeterminado 30).
Ingrese corto si el valor de la línea de señal anterior está por encima del umbral de sobrecompra (predeterminado 70).
Condiciones de salida
Cierre una operación larga cuando la línea de señal cruce por encima de los umbrales de salida inferior o superior (por defecto 20 y 80).
Cierre una operación corta cuando la línea de señal vuelva a cruzar por debajo de estos umbrales.
Ambas comprobaciones de salida se basan en los valores de la línea de señal anterior y anterior para detectar cruces genuinos.
Parámetros
Nombre
Predeterminado
Descripción
CandleType
1h período de tiempo
Plazo de suscripción de la vela.
StochKPeriod
47
Período retroactivo para %K.
StochDPeriod
9
Longitud media móvil de la línea de señal.
StochSlowing
13
Suavizado adicional aplicado a %K.
OversoldLevel
30
Nivel de línea de señal requerido para confirmar una entrada larga.
OverboughtLevel
70
Nivel de línea de señal requerido para confirmar una entrada corta.
ExitLowerLevel
20
Límite inferior utilizado para cruces de salida largos.
ExitUpperLevel
80
Límite superior utilizado para cruces de salida cortos.
Todos los parámetros numéricos admiten rangos de optimización que coinciden con la plantilla MetaTrader, por lo que el comportamiento se puede ajustar a través del Diseñador de estrategias.
Gestión de órdenes
La estrategia invierte posiciones cuando aparece una señal opuesta sumando el tamaño absoluto de la posición actual al Volume configurado.
StartProtection() está habilitado para integrarse con los controles de riesgo de la plataforma, aunque no se aplican niveles explícitos de limitación de pérdidas o toma de ganancias de forma predeterminada.
Visualización
Cuando se ejecuta dentro del Diseñador de estrategias, la estrategia dibuja:
Velas de precio para el símbolo y el período de tiempo seleccionados.
El oscilador Stochastic configurado.
Intercambie marcadores para resaltar entradas y salidas.
Notas de uso
Confirme que el instrumento proporcione suficiente historial para que el oscilador Stochastic se caliente antes de esperar señales.
Considere combinar la estrategia con filtros de riesgo adicionales (volatilidad, filtros de sesión, etc.) cuando la implemente en vivo.
Los umbrales se exponen como parámetros, lo que permite una experimentación rápida con diferentes bandas de confirmación sin editar código.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Three Soldiers Stochastic strategy: detects three consecutive bullish/bearish candles
/// confirmed by RSI levels.
/// </summary>
public class ThreeSoldiersStochasticStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _signalCooldownCandles;
private int _bullCount;
private int _bearCount;
private int _candlesSinceTrade;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }
public ThreeSoldiersStochasticStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period for confirmation", "Indicators");
_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 6)
.SetGreaterThanZero()
.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_bullCount = 0;
_bearCount = 0;
_candlesSinceTrade = SignalCooldownCandles;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_bullCount = 0;
_bearCount = 0;
_candlesSinceTrade = SignalCooldownCandles;
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(rsi, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsi)
{
if (candle.State != CandleStates.Finished) return;
if (_candlesSinceTrade < SignalCooldownCandles)
_candlesSinceTrade++;
if (candle.ClosePrice > candle.OpenPrice)
{
_bullCount++;
_bearCount = 0;
}
else if (candle.ClosePrice < candle.OpenPrice)
{
_bearCount++;
_bullCount = 0;
}
else
{
_bullCount = 0;
_bearCount = 0;
}
if (_bullCount >= 3 && rsi < 65 && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
BuyMarket();
_bullCount = 0;
_candlesSinceTrade = 0;
}
else if (_bearCount >= 3 && rsi > 35 && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
SellMarket();
_bearCount = 0;
_candlesSinceTrade = 0;
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class three_soldiers_stochastic_strategy(Strategy):
def __init__(self):
super(three_soldiers_stochastic_strategy, self).__init__()
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period for confirmation", "Indicators")
self._signal_cooldown = self.Param("SignalCooldownCandles", 6) \
.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading")
self._rsi = None
self._bull_count = 0
self._bear_count = 0
self._candles_since_trade = 0
@property
def rsi_period(self):
return self._rsi_period.Value
@property
def signal_cooldown(self):
return self._signal_cooldown.Value
def OnReseted(self):
super(three_soldiers_stochastic_strategy, self).OnReseted()
self._rsi = None
self._bull_count = 0
self._bear_count = 0
self._candles_since_trade = self.signal_cooldown
def OnStarted2(self, time):
super(three_soldiers_stochastic_strategy, self).OnStarted2(time)
self._rsi = RelativeStrengthIndex()
self._rsi.Length = self.rsi_period
self._bull_count = 0
self._bear_count = 0
self._candles_since_trade = self.signal_cooldown
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(60)))
subscription.Bind(self._rsi, self._process_candle)
subscription.Start()
def _process_candle(self, candle, rsi_value):
if candle.State != CandleStates.Finished:
return
if not self._rsi.IsFormed:
return
rsi_val = float(rsi_value)
if self._candles_since_trade < self.signal_cooldown:
self._candles_since_trade += 1
close = float(candle.ClosePrice)
open_p = float(candle.OpenPrice)
if close > open_p:
self._bull_count += 1
self._bear_count = 0
elif close < open_p:
self._bear_count += 1
self._bull_count = 0
else:
self._bull_count = 0
self._bear_count = 0
if self._bull_count >= 3 and rsi_val < 65.0 and self.Position <= 0 and self._candles_since_trade >= self.signal_cooldown:
self.BuyMarket()
self._bull_count = 0
self._candles_since_trade = 0
elif self._bear_count >= 3 and rsi_val > 35.0 and self.Position >= 0 and self._candles_since_trade >= self.signal_cooldown:
self.SellMarket()
self._bear_count = 0
self._candles_since_trade = 0
def CreateClone(self):
return three_soldiers_stochastic_strategy()