A Estratégia Fique Rico ou Morra Tentando GBP é um sistema de reversão à média de alta frequência que portou o MetaTrader 4 consultor especialista "Fique Rico ou Morra Tentando GBP" para o StockSharp API de alto nível. A lógica monitora um curto histórico contínuo de velas de minuto e abre negociações perto de dois horários predefinidos do dia, quando as velas mais recentes fecharam principalmente contra a direção esperada. Esta abordagem tenta capturar uma retração rápida imediatamente após a sobreposição das sessões de Londres e Nova York.
Lógica de negociação
A estratégia assina velas de 1 minuto por padrão (o tipo de vela pode ser personalizado).
Uma janela contínua das últimas velas finalizadas Lookback é mantida. Cada vela é categorizada como:
+1 se fechou abaixo de sua abertura (vela de baixa).
-1 se fechou acima de sua abertura (vela de alta).
0 se a vela for neutra.
A soma cumulativa dessas classificações é usada para decidir a direção do comércio:
Uma soma positiva significa que as velas de baixa dominam e a estratégia se prepara para uma entrada longa.
Uma soma negativa significa que as velas de alta dominam e a estratégia se prepara para uma entrada curta.
Os pedidos podem ser feitos apenas durante os primeiros EntryWindowMinutes minutos após a hora em que o horário atual do servidor corresponde a um dos dois horários alvo:
FirstEntryHour + HourShift (padrão: meia-noite de Londres após a correção GMT+2).
SecondEntryHour + HourShift (padrão: 21h, horário do servidor para a sobreposição de fechamento de Nova York).
Se nenhuma posição estiver aberta e todas as condições forem satisfeitas, a estratégia envia uma ordem de mercado com tamanho de lote fixo ou tamanho dinâmico calculado a partir do bloco de gestão de dinheiro.
Enquanto estiver numa posição, a estratégia aplica três regras de saída independentes:
Um obter lucro parcial fecha a negociação assim que o preço de fechamento move o preço de PartialTakeProfitPoints a favor.
Um stop-loss rígido é acionado quando o preço se move em direção ao preço de StopLossPoints contra a negociação.
Um trailing stop bloqueia o lucro depois que o mercado ultrapassa as etapas de preço TrailingStopPoints, usando a máxima mais alta (para posições compradas) ou a mínima mais baixa (para posições vendidas) observada desde a entrada.
Um nível final de lucro igual às etapas de preço TakeProfitPoints também é monitorado como uma rede de segurança.
Parâmetros
Parâmetro
Padrão
Descrição
TakeProfitPoints
100
Distância máxima de lucro (em etapas de preço) monitorada após a lógica de rastreamento.
PartialTakeProfitPoints
40
Distância primária de lucro (em etapas de preço) que replica a saída antecipada do EA original.
StopLossPoints
100
Distância de stop-loss (em etapas de preço).
TrailingStopPoints
30
Distância do trailing stop (em etapas de preço).
FixedVolume
1
Volume base do pedido em lotes quando o gerenciamento de dinheiro está desativado.
UseMoneyManagement
falso
Permite o dimensionamento dinâmico da posição com base no valor da conta e no risco configurado.
RiskPercent
10
Percentagem do valor da carteira em relação ao risco por negociação quando a gestão de dinheiro está ativa.
Lookback
18
Número de velas finalizadas usadas na contagem de alta/baixa.
FirstEntryHour
22
Primeira hora de negociação antes da correção da mudança horária.
SecondEntryHour
19
Segunda hora de negociação antes da correção da mudança horária.
HourShift
2
Correção de fuso horário aplicada a ambos os horários de negociação.
EntryWindowMinutes
5
Largura da janela de entrada (minutos desde o início da hora de qualificação).
CandleType
Período de 1 minuto
Tipo de vela para assinar; pode ser substituído por qualquer outro tipo de vela periódica.
Gestão de capital
Quando UseMoneyManagement está habilitado, a estratégia estima o volume do pedido arriscando RiskPercent do valor do portfólio atual sobre o StopLossPoints configurado. O cálculo respeita o passo do lote e o volume mínimo do instrumento para permanecer compatível com o câmbio.
Notas de uso
As janelas de negociação são avaliadas usando o horário de troca/servidor das velas recebidas. Ajuste HourShift para que FirstEntryHour + HourShift e SecondEntryHour + HourShift correspondam aos limites de sessão desejados.
Lookback deve permanecer maior que 1 para evitar decisões ruidosas. Aumentá-lo suaviza a medição do sentimento ao custo de reações mais lentas.
A lógica de proteção depende de velas acabadas. Se for necessária precisão intrabarra, reduza a duração da vela de acordo.
O especialista MQL original permitiu múltiplas posições simultâneas; esta porta limita a exposição a uma única posição aberta para corresponder às StockSharp práticas recomendadas.
Limitações
O trailing stop é virtual e é executado enviando uma saída de mercado na próxima vela concluída após o preço cruzar o limite móvel.
O dimensionamento da gestão financeira pressupõe que Security.StepPrice representa corretamente o valor monetário de uma etapa de preço. Valide este mapeamento para cada instrumento antes de negociar ao vivo.
Requisitos
StockSharp ambiente API de alto nível (solução AlgoTrading).
Velas de minutos históricas e em tempo real para o instrumento negociado em GBP.
Referências
Consultor especialista original MetaTrader 4: MQL/7690/Get_rich_or_die_trying_any_gbp.mq4.
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>
/// Get Rich GBP Session Reversal strategy - RSI mean reversion with EMA trend filter.
/// Buys when RSI crosses below oversold while price is above EMA (bullish dip).
/// Sells when RSI crosses above overbought while price is below EMA (bearish rally).
/// </summary>
public class GetRichGbpSessionReversalStrategy : Strategy
{
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _emaPeriod;
private readonly StrategyParam<decimal> _overbought;
private readonly StrategyParam<decimal> _oversold;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevRsi;
private bool _hasPrev;
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
public decimal Overbought { get => _overbought.Value; set => _overbought.Value = value; }
public decimal Oversold { get => _oversold.Value; set => _oversold.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public GetRichGbpSessionReversalStrategy()
{
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetDisplay("RSI Period", "RSI lookback", "Indicators");
_emaPeriod = Param(nameof(EmaPeriod), 50)
.SetDisplay("EMA Period", "EMA trend filter", "Indicators");
_overbought = Param(nameof(Overbought), 70m)
.SetDisplay("Overbought", "RSI overbought level", "Levels");
_oversold = Param(nameof(Oversold), 30m)
.SetDisplay("Oversold", "RSI oversold level", "Levels");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
protected override void OnReseted() { base.OnReseted(); _prevRsi = 0m; _hasPrev = false; }
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(rsi, ema, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsi, decimal ema)
{
if (candle.State != CandleStates.Finished)
return;
var close = candle.ClosePrice;
if (!_hasPrev)
{
_prevRsi = rsi;
_hasPrev = true;
return;
}
// RSI crosses below oversold = buy reversal
if (_prevRsi >= Oversold && rsi < Oversold && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// RSI crosses above overbought = sell reversal
else if (_prevRsi <= Overbought && rsi > Overbought && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevRsi = rsi;
}
}