Esta estratégia combina o indicador de tendência de cor BykovTrend V2 com o filtro de inclinação de média móvel de dupla suavização ColorX2MA. Ambos os blocos lógicos operam no mesmo símbolo e podem emitir ordens de forma independente, o que permite que a posição líquida reflita o último acordo entre as duas fontes de sinal.
Visão geral
Viés de mercado: Funciona em qualquer instrumento que suporte dados de candles. O período padrão para ambos os blocos é 4 horas (H4), espelhando o Consultor Especialista original.
Indicadores:
BykovTrend V2: Usa Williams %R para colorir os candles de acordo com a tendência predominante.
ColorX2MA: Aplica duas médias móveis consecutivas a uma fonte de preço configurável e classifica a direção da inclinação.
Sinais: Entradas e saídas são geradas separadamente por cada bloco. A posição final é a soma de todos os trades executados.
Bloco BykovTrend
Williams %R é calculado usando o período configurado (padrão 9).
Os limiares são deslocados por 33 - Risk. Quando %R sobe acima de -Risk, a tendência local se torna altista; quando cai abaixo de -100 + (33 - Risk), a tendência se torna baixista.
Cores de candle:
Verde/teal (códigos 0, 1): tendência altista.
Cinza (código 2): neutro, sem mudança de tendência.
Os sinais são avaliados no candle que está SignalBar passos atrás da última barra fechada. Um valor de 1 significa o candle completado anterior, que corresponde à implementação MetaTrader.
Lógica de trading:
Entrada comprada: Cor atual < 2 (altista) e cor anterior > 1 (era neutro/baixista). Opcional via Bykov Allow Long Entries.
Saída vendida: Cor atual < 2. Opcional via Bykov Allow Short Exits.
Entrada vendida: Cor atual > 2 (baixista) e cor anterior < 3 (era neutro/altista). Opcional via Bykov Allow Short Entries.
Saída comprada: Cor atual > 2. Opcional via Bykov Allow Long Exits.
Bloco ColorX2MA
Uma primeira média móvel suaviza o preço aplicado selecionado (fechamento por padrão) usando o método e comprimento escolhidos.
Uma segunda média móvel suaviza a saída da primeira MA, novamente com método e comprimento configuráveis.
A inclinação da segunda suavização define o fluxo de cor:
1 (magenta): o valor aumentou desde o candle anterior.
2 (violeta): o valor diminuiu.
0 (cinza): sem mudança.
Os sinais são avaliados no candle que está SignalBar passos atrás do último fechamento.
Lógica de trading:
Entrada comprada: Cor atual = 1 e cor anterior ≠ 1. Opcional via Color Allow Long Entries.
Saída vendida: Cor atual = 1. Opcional via Color Allow Short Exits.
Entrada vendida: Cor atual = 2 e cor anterior ≠ 2. Opcional via Color Allow Short Entries.
Saída comprada: Cor atual = 2. Opcional via Color Allow Long Exits.
Gestão de Posição
As ordens são ordens de mercado. Ao mudar de direção, a estratégia compra/vende contratos suficientes para neutralizar a posição existente e estabelecer uma nova de tamanho Volume.
Cada bloco pode acionar uma saída mesmo se o outro bloco ainda favorece o lado atual; o efeito líquido é uma luta gradual entre os dois módulos.
Nenhum stop-loss ou take-profit automático é aplicado. O gerenciamento de risco deve ser tratado externamente ou ajustando os flags de permissão.
Parâmetros
Parâmetro
Descrição
BykovTrend Candle
Tipo de dados (período) para o cálculo BykovTrend.
Williams %R Period
Retrospectiva para Williams %R.
Risk Offset
Desloca os limiares de Williams %R (33 - Risk). Valores maiores apertam os limiares altistas e afrouxam os baixistas.
Signal Bar
Atraso (número de candles completados) antes de agir sobre uma cor BykovTrend.
Allow Long/Short Entries
Habilitar ou desabilitar entradas impulsionadas por BykovTrend.
Allow Long/Short Exits
Habilitar ou desabilitar saídas impulsionadas por BykovTrend.
ColorX2MA Candle
Tipo de dados (período) para o bloco ColorX2MA.
First/Second MA Method
Método de suavização para cada etapa (SMA, EMA, SMMA, LWMA, Jurik).
First/Second MA Length
Comprimento de período para cada etapa de suavização.
First/Second MA Phase
Parâmetro de compatibilidade mantido do EA original; a implementação atual o mantém para documentação, mas a suavização Jurik usa seus padrões internos.
Applied Price
Fonte de preço para ColorX2MA (fechamento, abertura, máximo, mínimo, mediana, típico, ponderado, simples, quarto, variações de seguimento de tendência, DeMark).
Color Signal Bar
Atraso antes de agir sobre as cores ColorX2MA.
Allow Long/Short Entries/Exits
Habilitar ou desabilitar ações impulsionadas por ColorX2MA.
Notas e Limitações
Apenas os tipos de média móvel disponíveis no StockSharp são suportados. Suavizações exóticas da biblioteca MetaTrader (JurX, Parabolic, T3, VIDYA, AMA) não são reproduzidas; escolher entre SMA, EMA, SMMA, LWMA ou Jurik.
Os parâmetros de fase são preservados como referência, mas não alteram os indicadores incorporados do StockSharp.
A estratégia assume que a propriedade Volume está configurada; caso contrário, as entradas não colocarão ordens.
Como ambos os módulos podem operar de forma independente, o fluxo de ordens resultante pode diferir das instalações MetaTrader que segregam trades por números mágicos.
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>
/// BykovTrend + ColorX2MA strategy (simplified). Uses Williams %R for trend
/// detection combined with double EMA smoothing for entry confirmation.
/// </summary>
public class BykovTrendColorX2MaStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _emaFastLength;
private readonly StrategyParam<int> _emaSlowLength;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int EmaFastLength
{
get => _emaFastLength.Value;
set => _emaFastLength.Value = value;
}
public int EmaSlowLength
{
get => _emaSlowLength.Value;
set => _emaSlowLength.Value = value;
}
public BykovTrendColorX2MaStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_emaFastLength = Param(nameof(EmaFastLength), 9)
.SetGreaterThanZero()
.SetDisplay("EMA Fast", "Fast EMA period", "Indicators");
_emaSlowLength = Param(nameof(EmaSlowLength), 21)
.SetGreaterThanZero()
.SetDisplay("EMA Slow", "Slow EMA period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var emaFast = new ExponentialMovingAverage { Length = EmaFastLength };
var emaSlow = new ExponentialMovingAverage { Length = EmaSlowLength };
decimal prevFast = 0, prevSlow = 0;
var hasPrev = false;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(emaFast, emaSlow, (ICandleMessage candle, decimal fastVal, decimal slowVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!hasPrev)
{
prevFast = fastVal;
prevSlow = slowVal;
hasPrev = true;
return;
}
if (!IsFormedAndOnlineAndAllowTrading())
{
prevFast = fastVal;
prevSlow = slowVal;
return;
}
// EMA crossover with candle direction confirmation
var bullishCross = prevFast <= prevSlow && fastVal > slowVal;
var bearishCross = prevFast >= prevSlow && fastVal < slowVal;
var close = candle.ClosePrice;
var open = candle.OpenPrice;
if (bullishCross && close > open && Position <= 0)
BuyMarket();
else if (bearishCross && close < open && Position >= 0)
SellMarket();
prevFast = fastVal;
prevSlow = slowVal;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, emaFast);
DrawIndicator(area, emaSlow);
DrawOwnTrades(area);
}
}
}
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 ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class bykov_trend_color_x2_ma_strategy(Strategy):
def __init__(self):
super(bykov_trend_color_x2_ma_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Candles", "General")
self._ema_fast_length = self.Param("EmaFastLength", 9) \
.SetDisplay("EMA Fast", "Fast EMA period", "Indicators")
self._ema_slow_length = self.Param("EmaSlowLength", 21) \
.SetDisplay("EMA Slow", "Slow EMA period", "Indicators")
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@property
def EmaFastLength(self):
return self._ema_fast_length.Value
@property
def EmaSlowLength(self):
return self._ema_slow_length.Value
def OnReseted(self):
super(bykov_trend_color_x2_ma_strategy, self).OnReseted()
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(bykov_trend_color_x2_ma_strategy, self).OnStarted2(time)
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
ema_fast = ExponentialMovingAverage()
ema_fast.Length = self.EmaFastLength
ema_slow = ExponentialMovingAverage()
ema_slow.Length = self.EmaSlowLength
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(ema_fast, ema_slow, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, ema_fast)
self.DrawIndicator(area, ema_slow)
self.DrawOwnTrades(area)
def _on_process(self, candle, fast_value, slow_value):
if candle.State != CandleStates.Finished:
return
fv = float(fast_value)
sv = float(slow_value)
if not self._has_prev:
self._prev_fast = fv
self._prev_slow = sv
self._has_prev = True
return
close = float(candle.ClosePrice)
open_p = float(candle.OpenPrice)
bullish_cross = self._prev_fast <= self._prev_slow and fv > sv
bearish_cross = self._prev_fast >= self._prev_slow and fv < sv
if bullish_cross and close > open_p and self.Position <= 0:
self.BuyMarket()
elif bearish_cross and close < open_p and self.Position >= 0:
self.SellMarket()
self._prev_fast = fv
self._prev_slow = sv
def CreateClone(self):
return bykov_trend_color_x2_ma_strategy()