Esta estratégia reproduz o especialista MetaTrader Exp_CandlesticksBW_Tm sobre a API de alto nível do StockSharp. Ela depende do indicador Candlesticks BW de Bill Williams, que pinta as cores das velas combinando o Awesome Oscillator (AO) e o Accelerator Oscillator (AC). A aceleração e desaceleração do momentum são detectadas por meio de transições de cores das velas, enquanto um filtro opcional de sessão de trading restringe as entradas a horas intradiárias específicas.
Como funciona
Subscreve ao período configurado (padrão H4) e alimenta cada vela finalizada em um Awesome Oscillator (5/34). A série AO é suavizada com uma média móvel simples de 5 períodos para produzir o componente Accelerator.
Cada vela é classificada em um de seis estados de cor: duas cores de momentum altista (AO e AC subindo), duas cores de momentum baixista (AO e AC caindo) e duas cores neutras (direção mista AO/AC). A direção do corpo da vela decide entre o tom mais escuro ou mais claro em cada par.
Um buffer circular armazena os índices de cor recentes junto com seus tempos de abertura. O parâmetro SignalBar seleciona qual barra histórica avaliar (padrão = vela anterior, ou seja, offset 1). Uma barra mais atrás é usada como contexto.
As entradas compradas são habilitadas quando a barra mais antiga pertencia a uma zona de momentum altista e a barra de sinal sai dessa zona. As entradas vendidas espelham a lógica com zonas baixistas. Os sinais de saída usam os mesmos filtros de momentum para fechar a direção oposta.
O filtro de sessão opcional (UseTimeFilter) mantém um registro de trading entre StartHour:StartMinute e EndHour:EndMinute. Sair da janela liquida imediatamente as posições abertas, prevenindo exposição noturna.
As proteções de stop-loss e take-profit são registradas através de StartProtection, traduzindo distâncias baseadas em pontos em passos de preço do instrumento.
Regras de trading
Abrir comprado: índice de cor da barra anterior < 2 (AO e AC acelerando para cima) e o índice de cor da barra de sinal > 1. As entradas compradas são ignoradas se já estiver comprado ou se os comprados estiverem desabilitados.
Abrir vendido: índice de cor da barra anterior > 3 (AO e AC acelerando para baixo) e o índice de cor da barra de sinal < 4.
Fechar comprado: acionado quando o índice de cor da barra mais antiga > 3 (aceleração baixista) e as saídas compradas estão habilitadas.
Fechar vendido: acionado quando o índice de cor da barra mais antiga < 2 (aceleração altista) e as saídas vendidas estão habilitadas.
Quando o filtro de tempo está ativo, as posições são fechadas forçosamente fora da sessão permitida mesmo sem sinais de saída baseados em cor.
Parâmetros
Nome
Descrição
Padrão
CandleType
Período usado para os cálculos AO/AC.
TimeSpan.FromHours(4).TimeFrame()
Volume
Tamanho da ordem para novas entradas.
1m
SignalBar
Número de velas finalizadas a pular antes de avaliar sinais (1 = vela anterior).
1
StopLossPoints
Distância do stop protetor em pontos do instrumento. Defina 0 para desabilitar.
1000m
TakeProfitPoints
Distância do objetivo de lucro em pontos do instrumento. Defina 0 para desabilitar.
2000m
EnableLongEntries, EnableShortEntries
Permitir abrir operações na direção respectiva.
true
EnableLongExits, EnableShortExits
Permitir fechar operações na direção respectiva.
true
UseTimeFilter
Habilitar restrições de sessão de trading.
true
StartHour, StartMinute, EndHour, EndMinute
Limites de sessão (início inclusivo, fim exclusivo para horas idênticas).
0/0/23/59
Notas
A estratégia sincroniza automaticamente as distâncias de stop-loss e take-profit com o passo de preço do instrumento.
Os sinais são carimbados com o horário de fechamento da barra avaliada para que operações repetidas dentro da mesma barra sejam suprimidas.
Nenhuma versão Python é fornecida, correspondendo à estrutura do pacote MQL fonte.
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>
/// Bill Williams Candlesticks BW strategy (simplified).
/// Uses candle body direction with SMA trend filter.
/// </summary>
public class ExpCandlesticksBwTimeStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _smaLength;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int SmaLength
{
get => _smaLength.Value;
set => _smaLength.Value = value;
}
public ExpCandlesticksBwTimeStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_smaLength = Param(nameof(SmaLength), 34)
.SetGreaterThanZero()
.SetDisplay("SMA Length", "Bill Williams median line proxy", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var sma = new SimpleMovingAverage { Length = SmaLength };
int bullCount = 0, bearCount = 0;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(sma, (ICandleMessage candle, decimal smaValue) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
var isBullish = candle.ClosePrice > candle.OpenPrice;
var isBearish = candle.ClosePrice < candle.OpenPrice;
if (isBullish)
{
bullCount++;
bearCount = 0;
}
else if (isBearish)
{
bearCount++;
bullCount = 0;
}
// 3 consecutive bullish candles above SMA
if (bullCount >= 3 && candle.ClosePrice > smaValue && Position <= 0)
{
BuyMarket();
bullCount = 0;
}
// 3 consecutive bearish candles below SMA
else if (bearCount >= 3 && candle.ClosePrice < smaValue && Position >= 0)
{
SellMarket();
bearCount = 0;
}
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, sma);
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 SimpleMovingAverage
from StockSharp.Algo.Strategies import Strategy
class exp_candlesticks_bw_time_strategy(Strategy):
"""
Bill Williams Candlesticks BW strategy (simplified).
Uses candle body direction with SMA trend filter.
Buys after 3 consecutive bullish candles above SMA, sells after 3 bearish below SMA.
"""
def __init__(self):
super(exp_candlesticks_bw_time_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5))) \
.SetDisplay("Candle Type", "Candles", "General")
self._sma_length = self.Param("SmaLength", 34) \
.SetDisplay("SMA Length", "Bill Williams median line proxy", "Indicators")
self._bull_count = 0
self._bear_count = 0
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(exp_candlesticks_bw_time_strategy, self).OnReseted()
self._bull_count = 0
self._bear_count = 0
def OnStarted2(self, time):
super(exp_candlesticks_bw_time_strategy, self).OnStarted2(time)
self._bull_count = 0
self._bear_count = 0
sma = SimpleMovingAverage()
sma.Length = self._sma_length.Value
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(sma, self._process_candle).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, sma)
self.DrawOwnTrades(area)
def _process_candle(self, candle, sma_val):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
open_p = float(candle.OpenPrice)
sma_val = float(sma_val)
is_bullish = close > open_p
is_bearish = close < open_p
if is_bullish:
self._bull_count += 1
self._bear_count = 0
elif is_bearish:
self._bear_count += 1
self._bull_count = 0
if self._bull_count >= 3 and close > sma_val and self.Position <= 0:
self.BuyMarket()
self._bull_count = 0
elif self._bear_count >= 3 and close < sma_val and self.Position >= 0:
self.SellMarket()
self._bear_count = 0
def CreateClone(self):
return exp_candlesticks_bw_time_strategy()