该策略是一个基于柱形态识别的趋势跟踪系统,主要通过识别市场中的”大象柱”(即显著大于平均大小的价格柱)来捕捉潜在的趋势起点。策略的核心特点是采用动态调整的止损方案,根据价格运动的进展情况自适应地调整止损位置,既保护既得利润又给予价格足够的波动空间。
策略的运作基于以下几个关键步骤: 1. 计算过去特定周期内柱体的平均大小作为基准值 2. 识别当前柱体是否符合”大象柱”特征: - 柱体大小显著超过平均值(可配置倍数) - 收盘价位于高低点的特定百分比范围内 - 或符合锤子/倒锤子形态特征 3. 根据大象柱的方向确定交易方向 4. 设置初始止损和获利目标 5. 随着价格向有利方向发展,动态调整止损位置: - 达到60%目标时将止损移至成本线以上 - 达到80%目标时进一步收紧止损 - 达到90%目标时大幅收紧止损并调整获利目标
该策略通过识别市场中的关键价格形态并采用动态风险管理方法,实现了对趋势的有效跟踪。策略的核心优势在于其自适应的止损管理机制,能够在保护利润的同时充分把握趋势机会。通过进一步优化市场环境识别和风险管理机制,策略有望在不同市场环境下都能取得稳定表现。
/*backtest
start: 2024-12-17 00:00:00
end: 2025-01-16 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
//@version=6
strategy("Estratégia Barra Elefante com Stop Dinâmico", overlay=true)
// Parâmetros configuráveis
num_barras = input.int(15, title="Número de Barras para Média", minval=1, maxval=100)
percentual_fechamento_valido = input.float(10, title="Percentual do Máximo de Pavio (%)", minval=1, maxval=100)
percentual_condicao_tamanho = input.float(1.8, title="Multiplicador do Tamanho Médio da Barra", minval=0.1, step=0.1)
percentual_lucro = input.float(1.8, title="% de Lucro do Alvo ref. Tam. da Barra", minval=0.1, step=0.1)
var bool executou_entrada = false
// Calcula o tamanho de cada barra
barra_tamanho = math.abs(close - open)
// Calcula a média do tamanho das últimas 'num_barras' barras
media_tamanho = ta.sma(barra_tamanho, num_barras)
// Definição das variáveis para o corpo do candle, sombra superior e sombra inferior
corpo = barra_tamanho
sombra_superior = high - math.max(close, open)
sombra_inferior = math.min(close, open) - low
// Condições para verificar se a sombra é pelo menos 2x maior que o corpo
sombra_sup_maior = sombra_superior >= 2 * corpo
sombra_inf_maior = sombra_inferior >= 2 * corpo
// Define a relação mínima entre a sombra e o corpo
relacao_minima = 2.0
fechamento_valido = ((close >= high - (percentual_fechamento_valido / 100) * (high - low)) or (close <= low + (percentual_fechamento_valido / 100) * (high - low)))
// Condição para verificar se o fechamento está próximo da máxima ou mínima
fechamento_proximo_max = close >= (high - (high - low) * 0.1) // Fechamento nos 20% superiores
fechamento_proximo_min = close <= (low + (high - low) * 0.1) // Fechamento nos 20% inferiores
// definição de candle martelo
eh_martelo = (sombra_sup_maior and fechamento_proximo_max) and (math.abs(high - low) > 1.5*media_tamanho)
eh_martelo_invertido = (sombra_inf_maior and fechamento_proximo_min) and (math.abs(low - high) > 1.5*media_tamanho)
// Compara o tamanho da barra atual com a média usando o percentual configurável
condicao_tamanho = (barra_tamanho > percentual_condicao_tamanho * media_tamanho) and (fechamento_valido or (eh_martelo or eh_martelo_invertido))
// Variáveis para entrada
comprar_condicao = (condicao_tamanho and close > open)
vender_condicao = (condicao_tamanho and close < open)
// Stop Loss inicial
stop_loss_compra = low[1] + (barra_tamanho / 5) // Para compra, stop é na mínima do candle anterior ajustado
stop_loss_venda = high[1] - (barra_tamanho / 5) // Para venda, stop é na máxima do candle anterior ajustado
// Take Profit inicial (multiplicador configurado)
take_profit_compra = close + percentual_lucro * barra_tamanho
take_profit_venda = close - percentual_lucro * barra_tamanho
// Variáveis para controle do progresso do preço
lucro_alvo_60 = close + 0.6 * (take_profit_compra - close) // 60% do alvo
lucro_alvo_80 = close + 0.8 * (take_profit_compra - close) // 80% do alvo
lucro_alvo_90 = close + 0.9 * (take_profit_compra - close) // 90% do alvo
// Ajustes dinâmicos do Stop Loss e Alvo
if (strategy.position_size > 0) // Para compras
if (high >= lucro_alvo_60)
stop_loss_compra := close + 0.1 * barra_tamanho // Ajusta Stop para 10% acima da entrada
if (high >= lucro_alvo_80)
stop_loss_compra := close + 0.5 * barra_tamanho // Ajusta Stop para 50% acima da entrada
if (high >= lucro_alvo_90)
stop_loss_compra := close + 0.8 * barra_tamanho // Ajusta Stop para 80% acima da entrada
take_profit_compra := close + 0.5 * barra_tamanho // Ajusta Alvo para +50% do último fechamento
if (strategy.position_size < 0) // Para vendas
if (low <= lucro_alvo_60)
stop_loss_venda := close - 0.1 * barra_tamanho // Ajusta Stop para 10% abaixo da entrada
if (low <= lucro_alvo_80)
stop_loss_venda := close - 0.5 * barra_tamanho // Ajusta Stop para 50% abaixo da entrada
if (low <= lucro_alvo_90)
stop_loss_venda := close - 0.8 * barra_tamanho // Ajusta Stop para 80% abaixo da entrada
take_profit_venda := close - 0.5 * barra_tamanho // Ajusta Alvo para -50% do último fechamento
// Executando as ordens de compra e venda
if (not executou_entrada) and (comprar_condicao)
strategy.entry("Compra", strategy.long)
strategy.exit("Stop Compra", "Compra", stop=stop_loss_compra, limit=take_profit_compra)
executou_entrada := true // Marca que a entrada foi feita
if (not executou_entrada) and (vender_condicao)
strategy.entry("Venda", strategy.short)
strategy.exit("Stop Venda", "Venda", stop=stop_loss_venda, limit=take_profit_venda)
executou_entrada := true // Marca que a entrada foi feita
// Para visualização, vamos colorir as barras
barcolor(comprar_condicao ? color.rgb(14, 255, 22) : na)
barcolor(vender_condicao ? #d606ff : na)
bgcolor((eh_martelo) ? color.new(color.green, 60) : na)
bgcolor((eh_martelo_invertido) ? color.new(color.red, 60) : na)
// Reseta o controle de execução no início de cada nova barra
if barstate.isnew
executou_entrada := false