Esta estratégia negocia um instrumento base enquanto faz hedge com um instrumento correlacionado. A direção da tendência é determinada por uma Média Móvel Simples (SMA). Quando a correlação entre os instrumentos base e de hedge excede um limite, ambos os instrumentos são negociados para formar um par neutro ao mercado.
Como funciona
Calcular a tendência do instrumento base usando uma SMA de comprimento configurável.
Medir a correlação entre os instrumentos base e de hedge usando a diferença entre o preço e sua própria SMA.
Se a correlação atingir o nível esperado, abrir posições em ambos os instrumentos. A direção do hedge pode seguir ou se opor à base dependendo da configuração.
As posições são fechadas automaticamente quando o lucro combinado atinge o valor alvo.
Parâmetros
SmaPeriod — período da SMA usado para detectar tendência. Padrão é 20.
CorrelationPeriod — número de amostras usado para avaliar correlação. Padrão é 20.
ExpectedCorrelation — correlação absoluta mínima necessária para ativar o hedge. Padrão é 0.8.
ProfitTarget — meta de lucro total em unidades monetárias. Padrão é 30.
CandleType — tipo de dados para assinatura de velas. Padrão é período de 1 minuto.
FollowBase — se verdadeiro, o hedge opera na mesma direção quando a correlação é positiva.
Indicadores
SMA
Correlação (cálculo personalizado)
Notas
Esta é uma portagem simplificada da estratégia MQL original. O gerenciamento de risco e dinheiro deve ser ajustado antes da negociação ao vivo.
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>
/// SMA trend direction strategy.
/// </summary>
public class SmaMultiHedge2Strategy : Strategy
{
private readonly StrategyParam<int> _emaPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevEma1;
private decimal _prevEma2;
private int _count;
public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public SmaMultiHedge2Strategy()
{
_emaPeriod = Param(nameof(EmaPeriod), 20)
.SetGreaterThanZero()
.SetDisplay("EMA Period", "EMA trend period", "Parameters");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle type", "Parameters");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
=> [(Security, CandleType)];
protected override void OnReseted()
{
base.OnReseted();
_prevEma1 = 0;
_prevEma2 = 0;
_count = 0;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
SubscribeCandles(CandleType)
.Bind(ema, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal emaVal)
{
if (candle.State != CandleStates.Finished) return;
_count++;
if (_count < 3)
{
_prevEma2 = _prevEma1;
_prevEma1 = emaVal;
return;
}
var trend = 0;
if (_prevEma2 < _prevEma1 && _prevEma1 < emaVal)
trend = 1;
else if (_prevEma2 > _prevEma1 && _prevEma1 > emaVal)
trend = -1;
_prevEma2 = _prevEma1;
_prevEma1 = emaVal;
if (trend == 1 && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
}
else if (trend == -1 && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
}
}
}