A AML RSI Meeting Lines Strategy é uma versão StockSharp do MetaTrader 5 consultor especialista Expert_AML_RSI.mq5. O sistema original combina o reconhecimento do padrão de velas japonês com o Índice de Força Relativa (RSI) para negociar reversões de "Linhas de Encontro" de alta e baixa. Esta conversão mantém a lógica de negociação principal enquanto a adapta ao StockSharp de alto nível de API com assinaturas de velas e indicadores integrados.
Lógica de negociação
Assina um tipo de vela configurável e processa apenas velas finalizadas.
Calcula uma média móvel simples dos tamanhos do corpo das velas para detectar velas "longas" que formam padrões de linhas de reunião.
Rastreia valores RSI nas duas velas concluídas mais recentes para confirmação e sinais de saída.
Configuração de alta: a reversão das Linhas de Reunião de duas barras com RSI abaixo do limite de alta aciona entradas longas.
Configuração de baixa: padrão espelhado com RSI acima do limite de baixa aciona entradas curtas.
Saídas de posição: RSI cruzamentos por meio de níveis inferior e superior configuráveis fecham negociações abertas na direção oposta.
Usa ajudantes BuyMarket, SellMarket e ClosePosition para gerenciar a exposição e muda automaticamente o tamanho da posição quando um sinal contrário aparece.
Parâmetros
Nome
Descrição
Padrão
CandleType
Prazo usado para avaliar padrões de velas.
Período de 1 hora
RsiPeriod
RSI comprimento de lookback.
11
BodyAveragePeriod
Número de velas para o tamanho médio do corpo.
3
BullishRsiLevel
Máximo RSI que valida Linhas de Reunião de alta.
40
BearishRsiLevel
Mínimo RSI que valida linhas de reunião de baixa.
60
LowerExitLevel
RSI nível que fecha posições vendidas em cruzamentos ascendentes.
30
UpperExitLevel
RSI nível que fecha posições compradas em cruzamentos descendentes.
70
Todos os parâmetros são expostos como objetos StrategyParam<T> para que possam ser otimizados no designer StockSharp.
Gestão de risco
StartProtection() é invocado em OnStarted para ativar o monitoramento de posição integrado da estrutura.
A estratégia fecha a exposição existente sempre que RSI cruza os limites de saída configurados antes de considerar novos sinais.
As ordens de mercado revertem automaticamente a posição adicionando o valor absoluto da exposição atual ao volume configurado.
Notas de conversão
A média do castiçal usa SimpleMovingAverage alimentado com corpos absolutos de velas, espelhando o auxiliar AvgBody da fonte MQL5.
A confirmação de RSI depende dos valores das duas velas anteriores, reproduzindo as verificações RSI(1) e RSI(2) do especialista original.
Todos os comentários no código foram reescritos em inglês e a estrutura segue os requisitos do repositório de namespaces com escopo de arquivo com recuo de tabulação.
Uso
Anexe a estratégia a um título em StockSharp e selecione o tipo de vela desejado.
Configure RSI e limites de saída para corresponder ao local de negociação ou à volatilidade do instrumento.
Execute primeiro a estratégia na negociação em papel para validar o reconhecimento de padrões antes de passar para a negociação ou otimização ao vivo.
Use os parâmetros fornecidos durante a otimização para ajustar os níveis de RSI e o comprimento médio do corpo para diferentes mercados.
Isenção de responsabilidade
Esta estratégia é fornecida apenas para fins educacionais. Teste minuciosamente em dados históricos e em ambientes simulados antes de implantá-los em capital real.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Meeting Lines + RSI strategy.
/// Buys on bullish meeting lines with low RSI, sells on bearish meeting lines with high RSI.
/// </summary>
public class AmlRsiMeetingLinesStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<decimal> _rsiLow;
private readonly StrategyParam<decimal> _rsiHigh;
private ICandleMessage _prevCandle;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public decimal RsiLow { get => _rsiLow.Value; set => _rsiLow.Value = value; }
public decimal RsiHigh { get => _rsiHigh.Value; set => _rsiHigh.Value = value; }
public AmlRsiMeetingLinesStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period", "Indicators");
_rsiLow = Param(nameof(RsiLow), 40m)
.SetDisplay("RSI Low", "RSI level for bullish entry", "Signals");
_rsiHigh = Param(nameof(RsiHigh), 60m)
.SetDisplay("RSI High", "RSI level for bearish entry", "Signals");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevCandle = null;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevCandle = null;
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(rsi, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsiValue)
{
if (candle.State != CandleStates.Finished) return;
if (_prevCandle != null)
{
var avgBody = (Math.Abs(candle.ClosePrice - candle.OpenPrice) +
Math.Abs(_prevCandle.ClosePrice - _prevCandle.OpenPrice)) / 2m;
if (avgBody > 0)
{
var prevBearish = _prevCandle.OpenPrice > _prevCandle.ClosePrice;
var currBullish = candle.ClosePrice > candle.OpenPrice;
var closesNear = Math.Abs(candle.ClosePrice - _prevCandle.ClosePrice) < avgBody * 0.3m;
if (prevBearish && currBullish && closesNear && rsiValue < RsiLow && Position <= 0)
BuyMarket();
var prevBullish = _prevCandle.ClosePrice > _prevCandle.OpenPrice;
var currBearish = candle.OpenPrice > candle.ClosePrice;
var closesNear2 = Math.Abs(candle.ClosePrice - _prevCandle.ClosePrice) < avgBody * 0.3m;
if (prevBullish && currBearish && closesNear2 && rsiValue > RsiHigh && Position >= 0)
SellMarket();
}
}
_prevCandle = candle;
}
}
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 aml_rsi_meeting_lines_strategy(Strategy):
def __init__(self):
super(aml_rsi_meeting_lines_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5)))
self._rsi_period = self.Param("RsiPeriod", 14)
self._rsi_low = self.Param("RsiLow", 40.0)
self._rsi_high = self.Param("RsiHigh", 60.0)
self._prev_candle = None
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def RsiPeriod(self):
return self._rsi_period.Value
@RsiPeriod.setter
def RsiPeriod(self, value):
self._rsi_period.Value = value
@property
def RsiLow(self):
return self._rsi_low.Value
@RsiLow.setter
def RsiLow(self, value):
self._rsi_low.Value = value
@property
def RsiHigh(self):
return self._rsi_high.Value
@RsiHigh.setter
def RsiHigh(self, value):
self._rsi_high.Value = value
def OnReseted(self):
super(aml_rsi_meeting_lines_strategy, self).OnReseted()
self._prev_candle = None
def OnStarted2(self, time):
super(aml_rsi_meeting_lines_strategy, self).OnStarted2(time)
self._prev_candle = None
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, self._process_candle).Start()
def _process_candle(self, candle, rsi_value):
if candle.State != CandleStates.Finished:
return
rsi_val = float(rsi_value)
if self._prev_candle is not None:
avg_body = (abs(float(candle.ClosePrice) - float(candle.OpenPrice))
+ abs(float(self._prev_candle.ClosePrice) - float(self._prev_candle.OpenPrice))) / 2.0
if avg_body > 0:
prev_bearish = float(self._prev_candle.OpenPrice) > float(self._prev_candle.ClosePrice)
curr_bullish = float(candle.ClosePrice) > float(candle.OpenPrice)
closes_near = abs(float(candle.ClosePrice) - float(self._prev_candle.ClosePrice)) < avg_body * 0.3
if prev_bearish and curr_bullish and closes_near and rsi_val < self.RsiLow and self.Position <= 0:
self.BuyMarket()
prev_bullish = float(self._prev_candle.ClosePrice) > float(self._prev_candle.OpenPrice)
curr_bearish = float(candle.OpenPrice) > float(candle.ClosePrice)
closes_near2 = abs(float(candle.ClosePrice) - float(self._prev_candle.ClosePrice)) < avg_body * 0.3
if prev_bullish and curr_bearish and closes_near2 and rsi_val > self.RsiHigh and self.Position >= 0:
self.SellMarket()
self._prev_candle = candle
def CreateClone(self):
return aml_rsi_meeting_lines_strategy()