Alexav D1 Profit GBPUSD es un sistema de ruptura diario convertido del MetaTrader 4 asesor experto Alexav_d1_profit_gbpusd.mq4. La estrategia opera con velas diarias del GBP/USD y evalúa la sesión completa una vez al día (de martes a viernes). La confirmación del impulso la proporcionan RSI y MACD, mientras que los stop ajustados por volatilidad y los objetivos de ganancias escalonados se derivan de ATR.
Lógica de trading
Preparación de indicadores
Se aplican dos EMA con el mismo período a los precios máximos y mínimos diarios para definir niveles de referencia alcistas y bajistas.
RSI con una mirada retrospectiva de 10 períodos mide el impulso. Las lecturas extremas de RSI bloquean temporalmente nuevas operaciones en esa dirección.
MACD (24/05/14) ofrece un filtro de aceleración al comparar los dos últimos valores del histograma.
ATR (28) proporciona la unidad de volatilidad utilizada para paradas y objetivos de ganancias.
Filtro de sesión
Solo se realiza una evaluación por cada vela diaria completa de martes a viernes. Se omiten los lunes y fines de semana.
Configuración larga
La vela diaria anterior debe cerrar por encima del EMA de máximos calculados hace dos sesiones.
RSI de la sesión anterior debe estar por encima del nivel superior (predeterminado 60) pero por debajo del límite superior (predeterminado 80).
MACD debe estar por debajo de cero hace dos sesiones o mostrar una aceleración positiva suficiente en comparación con el valor anterior.
Si la apertura anterior vuelve a caer por debajo del EMA de máximos, la estrategia permite un nuevo lote de compras después de que se reinicia el bloque.
Configuración corta
Lógica reflejada de la configuración larga, utilizando el EMA de mínimos, RSI umbrales inferiores (39/25) y MACD filtros.
Gestión de órdenes
Cuando se confirma una configuración, la estrategia abre un lote de cuatro órdenes de mercado (cada una usando la estrategia Volume):
Paradas: cada orden comparte la misma parada de protección igual a ATR * AtrStopMultiplier (predeterminado 1,6) del precio de entrada.
Objetivos: Los objetivos de ganancias aumentan en AtrTargetMultiplier * (1 + i / 2) para el índice de pedidos i en [0..3], replicando las compensaciones de 1,0, 1,5, 2,0 y 2,5 ATR del EA original.
Manejo de conflictos: Las posiciones opuestas se aplanan antes de abrir un nuevo lote. Al activar un lote largo se borra cualquier lote corto pendiente (y viceversa).
La estrategia monitorea las velas completadas. Si el mínimo diario toca el stop, la orden larga correspondiente se cierra en el mercado; si el máximo alcanza el objetivo, la orden también se cierra. Los cortos se manejan simétricamente usando el máximo de la vela para las paradas y el mínimo para los objetivos.
Parámetros
Parámetro
Descripción
Predeterminado
CandleType
Serie de velas primarias, diaria por defecto.
1 dia
MaPeriod
Periodo del EMA aplicado a máximos/mínimos.
6
RsiPeriod
RSI período para el filtro de impulso.
10
AtrPeriod
periodo ATR para el tamaño de parada/objetivo.
28
AtrStopMultiplier
ATR múltiplo para paradas.
1.6
AtrTargetMultiplier
Base ATR múltiplo para objetivos.
1.0
RsiUpperLevel
RSI umbral que confirma el impulso alcista.
60
RsiUpperLimit
RSI límite que bloquea nuevas posiciones largas.
80
RsiLowerLevel
RSI umbral que confirma el impulso bajista.
39
RsiLowerLimit
RSI piso que bloquea pantalones cortos nuevos.
25
FastMaPeriod
Período rápido de EMA para MACD.
5
SlowMaPeriod
Período lento de EMA durante MACD.
24
SignalMaPeriod
Periodo de señal EMA durante MACD.
14
MacdDiffBuy
Aceleración mínima MACD para largos.
0,5
MacdDiffSell
Aceleración mínima MACD para pantalones cortos.
0,15
Establezca la estrategia Volume en el tamaño de lote deseado por pedido antes de comenzar la estrategia.
Notas
La conversión mantiene la lógica de una sola evaluación por día que se encuentra en el asesor experto original.
Utilice datos históricos diarios para GBP/USD al realizar pruebas retrospectivas para reproducir el comportamiento previsto.
Las paradas y objetivos de protección se simulan utilizando los extremos de las velas completadas; Los picos intradiarios dentro de una vela diaria no son visibles para la estrategia.
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>
/// Alexav D1 Profit breakout strategy.
/// Buys when price breaks above EMA and RSI is rising.
/// Sells when price breaks below EMA and RSI is falling.
/// </summary>
public class AlexavD1ProfitGbpUsdBreakoutStrategy : Strategy
{
private readonly StrategyParam<int> _emaPeriod;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevClose;
private decimal _prevEma;
private decimal _prevRsi;
private bool _hasPrev;
public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public AlexavD1ProfitGbpUsdBreakoutStrategy()
{
_emaPeriod = Param(nameof(EmaPeriod), 20)
.SetDisplay("EMA Period", "EMA period", "Indicators");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetDisplay("RSI Period", "RSI period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevClose = 0m;
_prevEma = 0m;
_prevRsi = 0m;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(ema, rsi, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal emaValue, decimal rsiValue)
{
if (candle.State != CandleStates.Finished)
return;
var close = candle.ClosePrice;
if (!_hasPrev)
{
_prevClose = close;
_prevEma = emaValue;
_prevRsi = rsiValue;
_hasPrev = true;
return;
}
// Breakout above EMA with rising RSI
if (_prevClose <= _prevEma && close > emaValue && rsiValue > _prevRsi && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Breakout below EMA with falling RSI
else if (_prevClose >= _prevEma && close < emaValue && rsiValue < _prevRsi && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevClose = close;
_prevEma = emaValue;
_prevRsi = rsiValue;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan, Math
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage, RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class alexav_d1_profit_gbp_usd_breakout_strategy(Strategy):
"""Alexav D1 Profit breakout strategy.
Buys when price breaks above EMA and RSI is rising.
Sells when price breaks below EMA and RSI is falling."""
def __init__(self):
super(alexav_d1_profit_gbp_usd_breakout_strategy, self).__init__()
self._ema_period = self.Param("EmaPeriod", 20) \
.SetDisplay("EMA Period", "EMA period", "Indicators")
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._prev_close = 0.0
self._prev_ema = 0.0
self._prev_rsi = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def EmaPeriod(self):
return self._ema_period.Value
@property
def RsiPeriod(self):
return self._rsi_period.Value
def OnReseted(self):
super(alexav_d1_profit_gbp_usd_breakout_strategy, self).OnReseted()
self._prev_close = 0.0
self._prev_ema = 0.0
self._prev_rsi = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(alexav_d1_profit_gbp_usd_breakout_strategy, self).OnStarted2(time)
self._has_prev = False
ema = ExponentialMovingAverage()
ema.Length = self.EmaPeriod
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(ema, rsi, self._process_candle).Start()
def _process_candle(self, candle, ema_value, rsi_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
ema_val = float(ema_value)
rsi_val = float(rsi_value)
if not self._has_prev:
self._prev_close = close
self._prev_ema = ema_val
self._prev_rsi = rsi_val
self._has_prev = True
return
# Breakout above EMA with rising RSI
if self._prev_close <= self._prev_ema and close > ema_val and rsi_val > self._prev_rsi and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
# Breakout below EMA with falling RSI
elif self._prev_close >= self._prev_ema and close < ema_val and rsi_val < self._prev_rsi and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_close = close
self._prev_ema = ema_val
self._prev_rsi = rsi_val
def CreateClone(self):
return alexav_d1_profit_gbp_usd_breakout_strategy()