Médias Móveis com Martingale
Visão Geral
SmaStrategyMartingaleStrategy é uma estratégia de negociação baseada no cruzamento de duas médias móveis simples (SimpleMovingAverage) com elementos de martingale. A estratégia utiliza SMAs longa e curta para determinar sinais de entrada e saída, aumentando o tamanho da posição a cada nova transação.
Componentes Principais
public class SmaStrategyMartingaleStrategy : Strategy
{
private readonly StrategyParam<int> _longSmaLength;
private readonly StrategyParam<int> _shortSmaLength;
private readonly StrategyParam<DataType> _candleType;
// Variáveis para armazenar valores anteriores dos indicadores
private decimal _prevLongValue;
private decimal _prevShortValue;
private bool _isFirstValue = true;
}
Parâmetros da Estratégia
A estratégia permite personalizar os seguintes parâmetros:
- LongSmaLength - período da média móvel longa (predefinição 80)
- ShortSmaLength - período da média móvel curta (predefinição 30)
- CandleType - tipo de vela com que trabalhar (predefinição 5 minutos)
Todos os parâmetros estão disponíveis para otimização com intervalos de valores especificados.
Inicialização da Estratégia
No método OnStarted2, são criados indicadores SMA, a subscrição de velas é configurada e a visualização é preparada:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// Criar indicadores
var longSma = new SimpleMovingAverage { Length = LongSmaLength };
var shortSma = new SimpleMovingAverage { Length = ShortSmaLength };
// Adicionar indicadores à coleção da estratégia para acompanhamento automático de IsFormed
Indicators.Add(longSma);
Indicators.Add(shortSma);
// Criar subscrição e associar indicadores
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(longSma, shortSma, ProcessCandle)
.Start();
// Configurar visualização no gráfico
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, longSma, System.Drawing.Color.Blue);
DrawIndicator(area, shortSma, System.Drawing.Color.Red);
DrawOwnTrades(area);
}
}
Processamento de Velas
O método ProcessCandle é chamado para cada vela concluída e implementa a lógica de negociação:
private void ProcessCandle(ICandleMessage candle, decimal longValue, decimal shortValue)
{
// Ignorar velas incompletas
if (candle.State != CandleStates.Finished)
return;
// Verificar se a estratégia está pronta para negociar
if (!IsFormedAndOnlineAndAllowTrading())
return;
// Para o primeiro valor, apenas guardar dados sem gerar sinais
if (_isFirstValue)
{
_prevLongValue = longValue;
_prevShortValue = shortValue;
_isFirstValue = false;
return;
}
// Obter a comparação atual e anterior dos valores dos indicadores
var isShortLessThenLongCurrent = shortValue < longValue;
var isShortLessThenLongPrevious = _prevShortValue < _prevLongValue;
// Guardar valores atuais como anteriores para a próxima vela
_prevLongValue = longValue;
_prevShortValue = shortValue;
// Verificar cruzamento (sinal)
if (isShortLessThenLongPrevious == isShortLessThenLongCurrent)
return;
// Cancelar ordens ativas antes de colocar novas
CancelActiveOrders();
// Determinar direção da transação
var direction = isShortLessThenLongCurrent ? Sides.Sell : Sides.Buy;
// Calcular tamanho da posição (aumentar posição a cada transação - abordagem martingale)
var volume = Volume + Math.Abs(Position);
// Criar e registar uma ordem com o preço apropriado
var price = Security.ShrinkPrice(shortValue);
RegisterOrder(CreateOrder(direction, price, volume));
}
Lógica de Negociação
- Sinal de compra: a SMA curta cruza a SMA longa de baixo para cima
- Sinal de venda: a SMA curta cruza a SMA longa de cima para baixo
- O tamanho da posição aumenta pelo valor da posição atual a cada nova transação (elemento martingale)
- O preço da ordem é definido para o valor atual da SMA curta, arredondado ao tamanho do tick do instrumento
Funcionalidades
- A estratégia determina automaticamente os instrumentos com que trabalhar através do método
GetWorkingSecurities() - A estratégia trabalha apenas com velas concluídas
- A estratégia acompanha cruzamentos de indicadores comparando a relação atual e anterior entre as SMAs
- Todas as ordens ativas são canceladas antes de colocar novas
- O princípio de martingale é implementado - aumentando o tamanho da posição a cada nova transação
- Indicadores e transações são visualizados no gráfico quando existe uma área gráfica disponível
- A otimização de parâmetros é suportada para encontrar definições ideais da estratégia