Estratégia de confirmação de gráficos de sincronização
A estratégia reflete a ideia do utilitário original MQL "SyncCharts" monitorando dois feeds de velas do mesmo instrumento e
tomar decisões de negociação somente quando ambos os fluxos confirmarem a mesma direção de tendência. A série master atua como gráfico de referência
(aquele que um trader normalmente observa), enquanto a série seguidora representa um gráfico auxiliar (por exemplo, um período de tempo mais rápido ou
uma agregação alternativa). Ao forçar ambos os fluxos a concordarem antes de entrar no mercado, o sistema filtra o ruído proveniente de
dessincronização temporária entre intervalos do gráfico.
A configuração funciona melhor em instrumentos que exibem uma estrutura de tendência de vários períodos, como futuros de índices e pares de moedas líquidas.
Como ambos os gráficos devem mover-se juntos antes de uma negociação ser realizada, os sinais falsos são reduzidos e a estratégia limita naturalmente
exposição durante as fases caóticas do mercado, quando os prazos discordam ou novas velas são impressas em momentos diferentes.
Detalhes
Critérios de entrada:
Longo: As médias móveis simples (SMAs) mestre e seguidor inclinam-se para cima em suas velas finalizadas mais recentes, e
os carimbos de data e hora dessas velas diferem menos que a tolerância de sincronização.
Curto: Ambos os SMAs têm inclinação descendente e a diferença do carimbo de data/hora está dentro da janela de tolerância.
Critérios de saída:
Dessincronização de tempo: se as últimas velas estiverem separadas por mais do que a tolerância permitida, a posição é achatada.
Desacordo de tendência: se um SMA subir enquanto o outro descer, a posição aberta é fechada imediatamente.
Paradas: a lógica de nivelamento implícita atua como uma parada suave. Nenhuma parada brusca separada é enviada.
Longo/Curto: Ambos os lados são negociados.
Valores padrão:
Vela mestra: período de 5 minutos.
Vela seguidora: intervalo de tempo de 1 minuto.
Duração SMA: 20 períodos em ambos os fluxos.
Tolerância de sincronização: 15 segundos entre os tempos de abertura da vela.
Filtros:
Categoria: Confirmação de tendência/multiperíodo.
Direção: Bidirecional.
Indicadores: SMA (fluxo duplo).
Paradas: Sem parada fixa, nivelamento automático quando os gráficos divergem.
Complexidade: Média (multi-assinatura com verificações de sincronização).
Prazo: Configurável (padrão intradiário).
Sazonalidade: Nenhuma.
Redes neurais: Não.
Divergência: Usa a divergência de prazo como filtro (requer acordo, não divergência de preço).
Nível de risco: Moderado devido à exigência de confirmação.
Como funciona
Duas assinaturas de velas são criadas por meio do StockSharp API de alto nível: uma para o gráfico mestre e outra para o seguidor.
Cada feed é processado por um SMA com o mesmo comprimento, gerando um sinalizador de direção de tendência (up se o valor de SMA aumentar em relação ao
vela anterior, down caso contrário).
Sempre que ambas as velas terminam, a estratégia verifica se os seus timestamps estão suficientemente próximos (diferença absoluta abaixo do
tolerância configurada).
Se os gráficos estiverem sincronizados e ambas as tendências apontarem para cima, a estratégia compra (fechando primeiro qualquer posição vendida). Se ambas as tendências apontarem para baixo,
ele vende a descoberto (fechando qualquer posição comprada primeiro).
Qualquer perda de sincronização ou desacordo de tendência desencadeia um achatamento imediato para manter a conta alinhada com os gráficos.
relógios de comerciante.
Uso recomendado
Aplicar ao mesmo instrumento em dois intervalos de tempo diferentes que normalmente se correlacionam (por exemplo, 5 minutos e 1 minuto, ou horário e
15 minutos).
Aumente a tolerância de sincronização se você trabalhar com fontes de dados exóticas que imprimem velas com pequenos atrasos.
Combine com um gerenciador de risco externo ou módulo de parada complementar ao implantar para negociação ao vivo.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Sync Charts Confirmation strategy: dual SMA trend confirmation.
/// Uses fast and slow SMAs to confirm trend direction.
/// Buys when both SMAs trend up, sells when both trend down.
/// </summary>
public class SyncChartsConfirmationStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<int> _signalCooldownCandles;
private bool _wasBullish;
private bool _hasPrevTrend;
private int _candlesSinceTrade;
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 int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }
public SyncChartsConfirmationStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 10)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast SMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 40)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow SMA period", "Indicators");
_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 6)
.SetGreaterThanZero()
.SetDisplay("Signal Cooldown", "Bars to wait between signals", "Trading");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_wasBullish = false;
_hasPrevTrend = false;
_candlesSinceTrade = SignalCooldownCandles;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrevTrend = false;
_candlesSinceTrade = SignalCooldownCandles;
var fast = new SimpleMovingAverage { Length = FastPeriod };
var slow = new SimpleMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, slow, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished) return;
if (_candlesSinceTrade < SignalCooldownCandles)
_candlesSinceTrade++;
var isBullish = fast > slow;
if (_hasPrevTrend && isBullish != _wasBullish && _candlesSinceTrade >= SignalCooldownCandles)
{
if (isBullish && Position <= 0)
{
BuyMarket();
_candlesSinceTrade = 0;
}
else if (!isBullish && Position >= 0)
{
SellMarket();
_candlesSinceTrade = 0;
}
}
_wasBullish = isBullish;
_hasPrevTrend = true;
}
}
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 SimpleMovingAverage
from StockSharp.Algo.Strategies import Strategy
from datatype_extensions import *
from indicator_extensions import *
class sync_charts_confirmation_strategy(Strategy):
"""Dual SMA trend confirmation with cooldown."""
def __init__(self):
super(sync_charts_confirmation_strategy, self).__init__()
self._fast_period = self.Param("FastPeriod", 10).SetGreaterThanZero().SetDisplay("Fast Period", "Fast SMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 40).SetGreaterThanZero().SetDisplay("Slow Period", "Slow SMA period", "Indicators")
self._cooldown = self.Param("SignalCooldownCandles", 6).SetGreaterThanZero().SetDisplay("Signal Cooldown", "Bars to wait between signals", "Trading")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5))).SetDisplay("Candle Type", "Candle timeframe", "General")
@property
def CandleType(self): return self._candle_type.Value
@CandleType.setter
def CandleType(self, value): self._candle_type.Value = value
def OnReseted(self):
super(sync_charts_confirmation_strategy, self).OnReseted()
self._was_bullish = False
self._has_prev = False
self._candles_since_trade = self._cooldown.Value
def OnStarted2(self, time):
super(sync_charts_confirmation_strategy, self).OnStarted2(time)
self._was_bullish = False
self._has_prev = False
self._candles_since_trade = self._cooldown.Value
fast = SimpleMovingAverage()
fast.Length = self._fast_period.Value
slow = SimpleMovingAverage()
slow.Length = self._slow_period.Value
sub = self.SubscribeCandles(self.CandleType)
sub.Bind(fast, slow, self.OnProcess).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, sub)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def OnProcess(self, candle, fast, slow):
if candle.State != CandleStates.Finished:
return
if self._candles_since_trade < self._cooldown.Value:
self._candles_since_trade += 1
is_bullish = fast > slow
if self._has_prev and is_bullish != self._was_bullish and self._candles_since_trade >= self._cooldown.Value:
if is_bullish and self.Position <= 0:
self.BuyMarket()
self._candles_since_trade = 0
elif not is_bullish and self.Position >= 0:
self.SellMarket()
self._candles_since_trade = 0
self._was_bullish = is_bullish
self._has_prev = True
def CreateClone(self):
return sync_charts_confirmation_strategy()