O recurso está a ser carregado... Carregamento...

Tendência multi-modo de tomada de lucros/paragem de perdas de acordo com a estratégia baseada na EMA, na faixa de Madrid e no canal de Donchian

Autora:ChaoZhang, Data: 2025-01-10 16:24:30
Tags:EMARRR

 Multi-Mode Take Profit/Stop Loss Trend Following Strategy Based on EMA, Madrid Ribbon and Donchian Channel

Resumo

Esta é uma estratégia de tendência que combina a média móvel exponencial (EMA), faixa de Madrid e canal de Donchian. A singularidade da estratégia reside em seus três modos de take-profit / stop-loss comutáveis: baseado em tick, baseado em dólar e baseado na relação risco-recompensa.

Princípios de estratégia

A estratégia utiliza uma combinação de três indicadores técnicos para identificar oportunidades de negociação: 1. EMA de 200 períodos para determinar a direcção geral da tendência 2. Faixa de Madrid (crossover da EMA de 5 períodos e de 100 períodos) para avaliação da tendência a médio prazo 3. Fuga do Canal de Donchian para tempo de entrada específico

Condições de negociação longas: preço acima de 200 EMA, Bolsa de Madrid Ribbon e quebras de preços acima do Canal de Donchian. Condições de negociação a curto prazo: preço abaixo de 200 EMA, faixa de Madrid de baixa e desvio de preços abaixo do canal de Donchian. Para reduzir os falsos sinais, as operações só são executadas na segunda ocorrência de sinal válido.

Vantagens da estratégia

  1. Sistema de gestão TP/SL flexível adaptável aos diferentes estilos de negociação
  2. A combinação de múltiplos indicadores técnicos proporciona sinais mais fiáveis
  3. O mecanismo de dupla confirmação reduz eficazmente os falsos sinais
  4. A estratégia evita completamente o viés de olhar para o futuro sem repintura
  5. Muito personalizável para diferentes ambientes de mercado

Riscos estratégicos

  1. Possíveis saques significativos durante inversões de tendência Solução: Ajustar os parâmetros do indicador para aumentar a sensibilidade da estratégia
  2. A confiança excessiva em indicadores técnicos pode fazer perder certas oportunidades de mercado Solução: Recomendar a combinação com a análise fundamental
  3. O TP/SL fixo pode não corresponder a todas as condições de mercado Solução: Ajustar dinamicamente os níveis de TP/SL com base na volatilidade

Orientações para a otimização da estratégia

  1. Introduzir indicadores de volatilidade para o ajustamento dinâmico TP/SL
  2. Adicionar análise de volume para melhorar a confiabilidade do sinal
  3. Incorporar mais indicadores do sentimento do mercado
  4. Desenvolver um sistema de otimização de parâmetros adaptativo
  5. Adicionar um módulo de gestão de riscos, como o controlo da utilização máxima

Resumo

Esta é uma estratégia de tendência que combina vários indicadores técnicos clássicos, aumentando a estabilidade da negociação através de uma gestão flexível de TP/SL e mecanismo de confirmação dupla. A alta personalização da estratégia permite que ela se adapte a diferentes ambientes de mercado e estilos de negociação.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy("Pamplona Enhanced TP/SL Toggleable", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)

// Input settings
use_tick_based = input.bool(false, title="Use Tick-Based TP/SL")
use_dollar_based = input.bool(false, title="Use Dollar-Based TP/SL")
use_risk_reward = input.bool(true, title="Use Risk-Reward TP/SL") // Default option

tick_size = input.float(0.1, title="Tick Size (for Tick-Based)", minval=0.0001, step=0.0001)
ticks = input.int(10, title="Ticks (for Tick-Based TP/SL)", minval=1)
dollar_tp = input.float(10.0, title="Dollar Take Profit (for Dollar-Based)", minval=0.01, step=0.01)
dollar_sl = input.float(10.0, title="Dollar Stop Loss (for Dollar-Based)", minval=0.01, step=0.01)
risk_reward_ratio = input.float(2.0, title="Risk-Reward Ratio (for Risk-Reward TP/SL)", minval=0.1, step=0.1)
contract_size = input.int(1, title="Contract Size", minval=1)

// Retrieve indicators
ema200 = ta.ema(close, 200)
src = close
ma05 = ta.ema(src, 5)
ma100 = ta.ema(src, 100)
madrid_green = ma05 > ma100
dlen = input.int(20, title="Donchian Channel Period")
highest_d = ta.highest(high, dlen)
lowest_d = ta.lowest(low, dlen)
donchian_green = close > highest_d[1]
donchian_red = close < lowest_d[1]

// Track signals
var int long_signal_count = 0
var int short_signal_count = 0

// Conditions
long_condition_raw = madrid_green and donchian_green and close > ema200
short_condition_raw = not madrid_green and donchian_red and close < ema200

// Update signal counters
if long_condition_raw
    long_signal_count += 1
else
    long_signal_count := 0

if short_condition_raw
    short_signal_count += 1
else
    short_signal_count := 0

// Final conditions to enter on the second signal
long_condition = long_signal_count == 2
short_condition = short_signal_count == 2

// Ensure exactly one TP/SL mode is enabled
tp_sl_mode_count = (use_tick_based ? 1 : 0) + (use_dollar_based ? 1 : 0) + (use_risk_reward ? 1 : 0)
if tp_sl_mode_count != 1
    runtime.error("Enable exactly ONE TP/SL mode (Tick-Based, Dollar-Based, or Risk-Reward).")

// Function to calculate TP/SL based on active mode
calc_tp_sl(entry_price, is_long) =>
    float tp = na
    float sl = na
    if use_tick_based
        tp := is_long ? entry_price + ticks * tick_size : entry_price - ticks * tick_size
        sl := is_long ? entry_price - ticks * tick_size : entry_price + ticks * tick_size
    else if use_dollar_based
        tp := is_long ? entry_price + (dollar_tp / contract_size) : entry_price - (dollar_tp / contract_size)
        sl := is_long ? entry_price - (dollar_sl / contract_size) : entry_price + (dollar_sl / contract_size)
    else if use_risk_reward
        risk = is_long ? close - low : high - close
        tp := is_long ? close + (risk * risk_reward_ratio) : close - (risk * risk_reward_ratio)
        sl := is_long ? close - risk : close + risk
    [tp, sl]

// Entry logic
if long_condition
    [take_profit, stop_loss] = calc_tp_sl(close, true)
    strategy.entry("Long", strategy.long, qty=contract_size)
    strategy.exit("Take Profit", from_entry="Long", limit=take_profit, stop=stop_loss)

if short_condition
    [take_profit, stop_loss] = calc_tp_sl(close, false)
    strategy.entry("Short", strategy.short, qty=contract_size)
    strategy.exit("Take Profit", from_entry="Short", limit=take_profit, stop=stop_loss)

// Plot indicators
plot(ema200, title="200 EMA", color=color.white, linewidth=2)
bgcolor(long_condition ? color.new(color.green, 90) : short_condition ? color.new(color.red, 90) : na)


Relacionados

Mais.