A estratégia Martingale VI Hybrid é uma conversão do consultor especializado original do MetaTrader para a API de alto nível do StockSharp. Combina um filtro de médias móveis rápida/lenta com confirmação MACD e escala em posições usando um multiplicador de martingale. A estratégia acumula posições quando o preço se move contra a última entrada por uma distância fixa em pips e unifica o take profit de todo o cluster no nível definido pela ordem mais recente. As saídas globais adicionais incluem lucro fixo em dinheiro, lucro como percentual do capital inicial e um trailing stop em dinheiro.
Lógica de negociação
Filtro de sinal – são utilizados os valores da vela anterior para as SMAs rápida e lenta e o histograma MACD. Um ciclo comprado começa quando a SMA rápida estava acima da SMA lenta e a linha principal MACD estava abaixo de sua linha de sinal. Um ciclo vendido começa quando a SMA rápida estava abaixo da SMA lenta enquanto a linha principal MACD estava acima da linha de sinal.
Posição inicial – quando um novo ciclo começa e nenhuma posição está aberta, a estratégia envia uma ordem a mercado com o Initial Volume.
Adições de martingale – enquanto uma posição está aberta, a estratégia monitora o último preço de entrada. Se o preço se mover contra a posição Pip Step pips, adiciona outra ordem a mercado cujo volume é volume da ordem anterior × Volume Multiplier. O número de ordens ativas é limitado por Max Trades. Quando o limite é atingido e Close Max Orders está habilitado, toda a posição é fechada imediatamente.
Take profit compartilhado – cada nova ordem atualiza o nível comum de take profit para preço de entrada ± Take Profit (pips) dependendo da direção. Quando a máxima da vela (para comprados) ou a mínima (para vendidos) toca este nível, todas as ordens são fechadas juntas.
Saídas globais – o lucro flutuante é continuamente avaliado:
Se Use Money TP estiver habilitado e o lucro atingir Money TP, a posição é fechada.
Se Use Percent TP estiver habilitado e o lucro atingir Percent TP por cento do valor inicial do portfólio, a posição é fechada.
Se Enable Trailing estiver ativo, um trailing stop em dinheiro é aplicado quando o lucro supera Trailing Activation. A posição é fechada se o lucro cair Trailing Drawdown a partir do pico.
Parâmetros
Parâmetro
Descrição
Candle Type
Série de velas primária usada para atualizações de indicadores.
Fast MA, Slow MA
Períodos das médias móveis simples que definem o filtro de tendência.
MACD Fast, MACD Slow, MACD Signal
Parâmetros do indicador MACD usados para confirmação.
Initial Volume
Volume da primeira ordem em um ciclo de martingale.
Volume Multiplier
Multiplicador aplicado ao volume da ordem anterior a cada adição.
Max Trades
Número máximo de ordens simultâneas na sequência de martingale.
Take Profit (pips)
Distância do take profit para cada ordem; a ordem mais recente define o preço de take profit compartilhado.
Pip Step
Movimento de preço contra o ciclo atual que aciona a próxima adição.
Use Money TP, Money TP
Habilita e define a meta de lucro na moeda da conta.
Use Percent TP, Percent TP
Habilita e define a meta de lucro como percentual do valor inicial do portfólio.
Parâmetros do trailing stop baseado em dinheiro que protege o lucro acumulado.
Close Max Orders
Quando habilitado, toda a posição é fechada assim que o limite de ordens de martingale é atingido.
Gestão de risco
A estratégia suporta metas de lucro tanto absolutas quanto baseadas em percentual para travar ganhos antecipadamente.
O trailing stop em dinheiro evita que a posição devolva mais do que o drawdown configurado após uma sequência lucrativa.
Limitar o número total de etapas de martingale evita crescimento ilimitado da posição; habilitar Close Max Orders força uma saída de emergência quando a sequência atinge seu limite configurado.
Notas de implementação
A estratégia usa a API de alto nível SubscribeCandles do StockSharp com indicadores vinculados via BindEx para MACD e processamento manual para as médias móveis.
O tamanho do pip é derivado do passo de preço do instrumento, incluindo suporte para cotações de 5 e 3 dígitos.
Os cálculos de lucro dependem de Security.PriceStep, Security.StepPrice e PositionAvgPrice, garantindo compatibilidade com instrumentos que fornecem os metadados necessários.
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Martingale VI Hybrid strategy (simplified).
/// Uses SMA crossover for entries.
/// </summary>
public class MartingaleViHybridStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
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 MartingaleViHybridStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_fastPeriod = Param(nameof(FastPeriod), 8)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast SMA", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 21)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow SMA", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
decimal prevFast = 0, prevSlow = 0;
bool hasPrev = false;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(fast, slow, (ICandleMessage candle, decimal fastValue, decimal slowValue) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!hasPrev)
{
prevFast = fastValue;
prevSlow = slowValue;
hasPrev = true;
return;
}
if (!IsFormedAndOnlineAndAllowTrading())
{
prevFast = fastValue;
prevSlow = slowValue;
return;
}
if (prevFast <= prevSlow && fastValue > slowValue && Position <= 0)
BuyMarket();
else if (prevFast >= prevSlow && fastValue < slowValue && Position >= 0)
SellMarket();
prevFast = fastValue;
prevSlow = slowValue;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, fast);
DrawIndicator(area, slow);
DrawOwnTrades(area);
}
}
}