ダイナミックストップロス調整を備えたエレファントバートレンドフォロー戦略

SMA HAMMER RSI
作成日: 2025-01-17 16:24:18 最終変更日: 2025-01-17 16:24:18
コピー: 4 クリック数: 371
1
フォロー
1617
フォロワー

ダイナミックストップロス調整を備えたエレファントバートレンドフォロー戦略

概要

この戦略は、バーパターン認識に基づくトレンド追跡システムであり、主に市場内の「エレファントバー」(つまり、平均サイズよりも大幅に大きい価格バー)を識別することで潜在的なトレンドの開始点を捉えます。この戦略の核となる特徴は、価格変動の進行に応じてストップロスポジションを適応的に調整する、動的に調整されたストップロスプランを採用し、それによって既存の利益を保護し、価格に十分な変動の余地を与えることです。

戦略原則

戦略の運用は、次の主要なステップに基づいています。

  1. 過去の特定の期間のバーの平均サイズをベンチマーク値として計算します
  2. 現在の列が「象の列」の特性を満たしているかどうかを識別します。
    • 列のサイズが平均よりも大幅に大きい(設定可能な倍数)
    • 終値は高値と安値の一定の割合の範囲内にある
    • またはハンマー/逆ハンマーパターンの特性を満たす
  3. 象の列の方向に基づいて取引方向を決定する
  4. 最初のストップロスと利益目標を設定する
  5. 価格が有利な方向に動くにつれて、ストップロスポジションを動的に調整します。
    • 60%の目標に達したら、ストップロスをコストラインより上に移動させます。
    • 目標の80%に達したらストップロスをさらに厳しくする
    • 90%の目標に達すると、ストップロスが大幅に引き締められ、利益目標が調整されます。

戦略的優位性

  1. 動的リスク管理: ストップロスポジションを動的に調整することで、トレンドが完全に発展する余地を残しながら利益を保護する戦略です。
  2. パターン認識の柔軟性:従来のエレファントバーに加えて、ハンマーラインなどの特殊パターンの認識も含まれます。
  3. 強力なパラメータ調整機能: 列サイズの倍数、目標パーセンテージなどの主要なパラメータは、市場特性に応じて柔軟に調整できます。
  4. 合理的なリスクリターン比:初期のストップロスは比較的保守的ですが、トレンドが発展するにつれて、より大きなリターンを得るために動的に調整されます。

戦略リスク

  1. 偽のブレイクアウトリスク:エレファントコラムパターンは偽のブレイクアウトが発生する可能性があるため、フィルタリング条件を合理的に設定する必要があります。
  2. 不安定な市場のリスク: 横ばいで不安定な市場では、ストップロスが頻繁に発動される可能性があります。
  3. ストップロス調整リスク: 過度に積極的なストップロス調整は早期の撤退につながる可能性がある
  4. パラメータの感度: 戦略の効果はパラメータ設定に敏感であり、十分なテストが必要です。

戦略最適化の方向性

  1. 市場環境フィルターを追加します:
    • 現在の市場環境を識別するためのトレンド指標を追加する
    • 異なる市場環境では異なるパラメータ設定を使用する
  2. ストップロスのメカニズムを改善する:
    • トレーリングストップの導入
    • ボラティリティに基づいてストップロス距離を動的に調整する
  3. エントリータイミングを最適化:
    • ボリュームインジケーターと組み合わせる
    • 反転確認シグナルを追加
  4. 利益の向上:
    • 部分的な利益の出口を達成する
    • 市場構造に基づいて利益目標を動的に調整する

要約する

この戦略は、市場の主要な価格パターンを特定し、動的なリスク管理アプローチを採用することで、効果的なトレンド追跡を実現します。この戦略の核となる利点は、利益を保護しながらトレンドの機会を完全に把握できる適応型ストップロス管理メカニズムにあります。市場環境の特定とリスク管理メカニズムをさらに最適化することで、この戦略はさまざまな市場環境において安定したパフォーマンスを達成することが期待されます。

ストラテジーソースコード
/*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