Esta estrategia es una conversión de StockSharp del asesor experto de MetaTrader "ICHMOKU RETRACEMENT". Mantiene la idea original de operar retrocesos de Ichimoku que ocurren dentro de una tendencia de marco temporal superior mientras son filtrados por lecturas de momentum a largo plazo y del MACD. La implementación de StockSharp se enfoca en la claridad, la reutilización de indicadores y el control de riesgo a través de la API de alto nivel.
Idea de trading
Filtro de tendencia – la estrategia busca un sesgo alcista o bajista usando un par de Medias Móviles Linealmente Ponderadas (LWMA). Un contexto alcista requiere que la LWMA rápida esté por encima de la LWMA lenta, mientras que un contexto bajista requiere la relación opuesta.
Retroceso Ichimoku – después de detectar una tendencia, la vela anterior debe tocar cualquiera de las líneas de Ichimoku (Tenkan-sen, Kijun-sen o los dos tramos de avance). La vela actual debe volver a abrirse en el lado de la tendencia de la línea tocada, señalando un retroceso de momentum.
Confirmación de momentum – la relación de momentum de cierre a cierre debe desviarse de su valor neutral (100) al menos un umbral configurable. La relación se calcula en el mismo marco temporal usado para el indicador Ichimoku.
Filtro macro – un MACD mensual (12/26/9) confirma la dirección dominante a largo plazo. Las operaciones largas requieren la línea principal del MACD por encima de la línea de señal, las cortas requieren lo contrario.
Gestión de órdenes – la estrategia mantiene como máximo una posición neta. Los niveles de stop-loss y take-profit de protección se colocan en pips y se evalúan en cada vela terminada.
Parámetros
Nombre
Descripción
Por defecto
Signal Candle Type
Marco temporal usado para los cálculos de LWMA, Ichimoku y momentum.
Velas de 1 hora
Macro Candle Type
Marco temporal superior usado para el filtro de tendencia MACD.
Velas de 30 días
Fast LWMA
Período para la media móvil linealmente ponderada rápida.
6
Slow LWMA
Período para la media móvil linealmente ponderada lenta.
85
Tenkan Period
Período de Ichimoku Tenkan-sen.
9
Kijun Period
Período de Ichimoku Kijun-sen.
26
Span B Period
Período de Ichimoku Senkou Span B.
52
Momentum Period
Lookback para la relación de momentum de cierre a cierre.
14
Momentum Threshold
Desviación absoluta mínima de 100 requerida por la relación de momentum.
0.3
Take Profit (pips)
Distancia del take-profit expresada en pips.
50
Stop Loss (pips)
Distancia del stop-loss expresada en pips.
20
El parámetro base Volume controla el tamaño de las nuevas órdenes. Cuando aparece una señal de reversión, la estrategia cierra la posición actual (si la hay) y abre una nueva posición en la dirección opuesta usando contratos Volume + |Position|.
Reglas de trading
Entradas largas
LWMA rápida > LWMA lenta.
Línea principal MACD > línea de señal MACD en el marco temporal macro.
Desviación de la relación de momentum ≥ umbral.
El mínimo de la vela anterior tocó al menos un nivel de Ichimoku y la vela actual abrió de vuelta por encima de ese nivel.
La posición neta debe ser plana o corta.
Entradas cortas
LWMA rápida < LWMA lenta.
Línea principal MACD < línea de señal MACD en el marco temporal macro.
Desviación de la relación de momentum ≥ umbral.
El máximo de la vela anterior tocó al menos un nivel de Ichimoku y la vela actual abrió de vuelta por debajo de ese nivel.
La posición neta debe ser plana o larga.
Salidas
Una posición larga se cierra cuando el mínimo de la vela alcanza el stop-loss o el máximo alcanza el nivel de take-profit.
Una posición corta se cierra cuando el máximo de la vela alcanza el stop-loss o el mínimo alcanza el nivel de take-profit.
Diferencias vs. EA original
Las escalas de gestión de dinero, los movimientos de break-even y las características de trailing de la versión MQL no se replican; el control de riesgo se limita a niveles fijos de stop-loss y take-profit.
StockSharp trabaja con una posición neta única, por lo que la pila de órdenes martingala se reemplaza por una entrada por dirección.
Se omiten las alertas, el correo electrónico y las notificaciones push del entorno MetaTrader.
Notas de uso
Agregar la estrategia a un proyecto StockSharp Designer o Shell.
Seleccionar el instrumento deseado y ajustar el Signal Candle Type para que coincida con el marco temporal objetivo.
Asegurarse de que el Macro Candle Type pueda sintetizarse a partir de los datos disponibles (la suscripción usa allowBuildFromSmallerTimeFrame).
Ajustar el stop-loss, el take-profit y el umbral de momentum según la volatilidad del instrumento.
Los comentarios incluidos describen cada paso de decisión para que la lógica pueda adaptarse o extenderse fácilmente.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class IchimokuRetracementStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private decimal? _prevFast, _prevSlow;
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 IchimokuRetracementStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 9).SetGreaterThanZero().SetDisplay("Fast DEMA", "Fast DEMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 26).SetGreaterThanZero().SetDisplay("Slow DEMA", "Slow DEMA period", "Indicators");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = null;
_prevSlow = null;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevFast = null; _prevSlow = null;
var fast = new DoubleExponentialMovingAverage { Length = FastPeriod };
var slow = new DoubleExponentialMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, slow, ProcessCandle).Start();
var area = CreateChartArea();
if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished) return;
if (!IsFormedAndOnlineAndAllowTrading()) { _prevFast = fast; _prevSlow = slow; return; }
if (_prevFast == null || _prevSlow == null) { _prevFast = fast; _prevSlow = slow; return; }
var prevAbove = _prevFast.Value > _prevSlow.Value;
var currAbove = fast > slow;
_prevFast = fast; _prevSlow = slow;
if (!prevAbove && currAbove && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
else if (prevAbove && !currAbove && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
}
}
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 DoubleExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class ichimoku_retracement_strategy(Strategy):
def __init__(self):
super(ichimoku_retracement_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Timeframe", "General")
self._fast_period = self.Param("FastPeriod", 9) \
.SetDisplay("Fast DEMA", "Fast DEMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 26) \
.SetDisplay("Slow DEMA", "Slow DEMA period", "Indicators")
self._prev_fast = None
self._prev_slow = None
@property
def CandleType(self):
return self._candle_type.Value
@property
def FastPeriod(self):
return self._fast_period.Value
@property
def SlowPeriod(self):
return self._slow_period.Value
def OnReseted(self):
super(ichimoku_retracement_strategy, self).OnReseted()
self._prev_fast = None
self._prev_slow = None
def OnStarted2(self, time):
super(ichimoku_retracement_strategy, self).OnStarted2(time)
self._prev_fast = None
self._prev_slow = None
fast = DoubleExponentialMovingAverage()
fast.Length = self.FastPeriod
slow = DoubleExponentialMovingAverage()
slow.Length = self.SlowPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(fast, slow, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def _on_process(self, candle, fast_value, slow_value):
if candle.State != CandleStates.Finished:
return
fv = float(fast_value)
sv = float(slow_value)
if self._prev_fast is None or self._prev_slow is None:
self._prev_fast = fv
self._prev_slow = sv
return
prev_above = self._prev_fast > self._prev_slow
curr_above = fv > sv
self._prev_fast = fv
self._prev_slow = sv
if not prev_above and curr_above and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif prev_above and not curr_above and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
def CreateClone(self):
return ichimoku_retracement_strategy()