Alexav D1 Profit GBPUSD é um sistema de breakout diário convertido do MetaTrader 4 consultor especialista Alexav_d1_profit_gbpusd.mq4. A estratégia opera em velas diárias de GBP/USD e avalia a sessão concluída uma vez por dia (terça a sexta). A confirmação do impulso é fornecida por RSI e MACD, enquanto as paradas ajustadas à volatilidade e as metas de lucro escalonadas são derivadas de ATR.
Lógica de negociação
Preparação de Indicadores
Duas EMAs com o mesmo período são aplicadas aos preços máximos e mínimos diários para definir os níveis de referência de alta e baixa.
RSI com um lookback de 10 períodos mede o impulso. Leituras extremas de RSI bloqueiam temporariamente novas negociações nessa direção.
MACD (24/05/14) fornece um filtro de aceleração comparando os dois últimos valores do histograma.
ATR (28) fornece a unidade de volatilidade usada para stops e metas de lucro.
Filtro de sessão
Apenas uma avaliação é realizada para cada vela diária concluída de terça a sexta-feira. Segundas-feiras e fins de semana são ignorados.
Configuração longa
A vela diária anterior deve fechar acima de EMA de máximos calculados há duas sessões.
RSI da sessão anterior deve estar acima do nível superior (padrão 60), mas abaixo do limite superior (padrão 80).
MACD deve estar abaixo de zero há duas sessões ou mostrar uma aceleração positiva suficiente em comparação com o valor anterior.
Se a abertura anterior cair abaixo de EMA de máximos, a estratégia permite um novo lote de compras após a redefinição do bloco.
Configuração breve
Lógica de espelhamento da configuração longa, usando EMA de mínimos, RSI limites inferiores (39/25) e filtros MACD.
Gerenciamento de ordens
Quando uma configuração é confirmada, a estratégia abre um lote de quatro ordens de mercado (cada uma usando a estratégia Volume):
Stops: cada ordem compartilha o mesmo stop de proteção igual a ATR * AtrStopMultiplier (padrão 1,6) do preço de entrada.
Metas: os objetivos de lucro são dimensionados em AtrTargetMultiplier * (1 + i / 2) para o índice de pedido i em [0..3], replicando os deslocamentos 1,0, 1,5, 2,0 e 2,5 ATR do EA original.
Tratamento de conflitos: Posições opostas são achatadas antes de abrir um novo lote. Acionar um lote longo limpa qualquer lote curto pendente (e vice-versa).
A estratégia monitora velas concluídas. Se a mínima diária tocar o stop, a ordem longa correspondente será fechada no mercado; se a máxima atingir a meta, a ordem também será fechada. As vendas são tratadas simetricamente usando a vela alta para stops e a mínima para alvos.
Parâmetros
Parâmetro
Descrição
Padrão
CandleType
Série de velas primárias, diariamente por padrão.
1 dia
MaPeriod
Período do EMA aplicado a máximos/mínimos.
6
RsiPeriod
RSI período para filtro de impulso.
10
AtrPeriod
período ATR para dimensionamento de stop/alvo.
28
AtrStopMultiplier
ATR múltiplo para paradas.
1.6
AtrTargetMultiplier
Base ATR múltipla para destinos.
1,0
RsiUpperLevel
Limite de RSI confirmando o impulso de alta.
60
RsiUpperLimit
RSI limite que bloqueia novos longos.
80
RsiLowerLevel
Limite de RSI confirmando o impulso de baixa.
39
RsiLowerLimit
RSI piso que bloqueia novos shorts.
25
FastMaPeriod
Período rápido de EMA para MACD.
5
SlowMaPeriod
Período EMA lenta para MACD.
24
SignalMaPeriod
Período de sinal EMA para MACD.
14
MacdDiffBuy
Aceleração mínima MACD para longos.
0,5
MacdDiffSell
Aceleração mínima de MACD para shorts.
0,15
Defina a estratégia Volume para o tamanho de lote desejado por pedido antes de iniciar a estratégia.
Notas
A conversão mantém a lógica de avaliação única por dia encontrada no consultor especialista original.
Use dados históricos diários para GBP/USD ao fazer backtesting para reproduzir o comportamento pretendido.
Paradas e alvos de proteção são simulados usando extremos de vela concluídos; picos intradiários dentro de uma vela diária não são visíveis para a estratégia.
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()