Estratégia de negociação de canais de supertrend adaptativa

Autora:ChaoZhang, Data: 2023-09-20 15:17:51
Tags:

Resumo

Esta estratégia constrói canais de supertrend de camada dupla e gera sinais de negociação quando o preço atravessa os canais.

Estratégia lógica

  1. Calcular o desvio-padrão do preço e a volatilidade ATR, utilizar a volatilidade para ajustar a largura do canal.

  2. Construir canais de supertendência de duas camadas, com camada interna mais sensível e camada externa mais estável.

  3. Gerar sinais de compra/venda quando o preço atravessa o canal interno ou externo.

  4. A estrutura de canal duplo ajuda a filtrar alguns falhos.

  5. A volatilidade do ATR adapta a largura do canal, mais ampla quando a volatilidade aumenta para efeito adaptativo.

Vantagens

  1. Os canais de Supertrend são simples e eficazes no acompanhamento de tendências.

  2. O canal duplo filtra falsos e melhora a qualidade do sinal.

  3. O ajustamento adaptado à volatilidade torna os canais adequados a diferentes ambientes de mercado.

  4. Fácil de implementar com um simples ajuste de parâmetros.

  5. Os canais visualizados e os breakouts formam sinais comerciais intuitivos.

Riscos

  1. Os sinais de ruptura podem produzir falsos sinais, resultando em perdas desnecessárias.

  2. Não consegue determinar a direcção da tendência, os riscos de negociação contra-tendência.

  3. O ajuste adaptativo pode ser demasiado sensível, com excessos de ajustes.

  4. A otimização de parâmetros inadequada leva ao sobreajuste.

  5. Como uma tendência que segue a estratégia, luta em mercados de gama.

Reforço

  1. Parâmetros de ensaio impactos sobre o efeito adaptativo.

  2. Incorporar MA para determinar as principais tendências.

  3. Otimizar a confirmação da fuga para evitar falsas fugas.

  4. Adicionar stop loss ao limite de perda por transação.

  5. Avalie a sintonização do canal na frequência de negociação.

  6. Usar machine learning para otimizar dinamicamente parâmetros.

Conclusão

Esta estratégia usa canais de dupla supertendência adaptativos para capturar tendências de preços. É simples e intuitivo no rastreamento de tendências. Mas os riscos incluem falhas e direção incorreta da tendência.


/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Cloud Strategy", shorttitle="SuperTrend Cloud Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital = 1000)

//Inputs
multi = input(title="Multiplier", type=input.float, step=0.1, defval=3, minval=1)
period = input(title="Period", type=input.integer, step=1, defval=10, minval=1)
SelfAdjust = input(title="Self-Adjusting", type=input.bool, defval = false)


////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2019, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
 
////////////////////////////////////////////////////////////////////////////////

dev = stdev(close, period)
stdDev = (dev / close) * 100 + 1
MultDev = SelfAdjust ? multi * stdDev : multi

up_lev1 = hl2 - MultDev * atr(period)
dn_lev1 = hl2 + MultDev * atr(period)
up_lev2 = hl2 - (MultDev * 2 * atr(period))
dn_lev2 = hl2 + (MultDev * 2 * atr(period))

up_trend1 = 0.0
up_trend1 := close[1] > up_trend1[1] ? max(up_lev1, up_trend1[1]) : up_lev1
up_trend2 = 0.0
up_trend2 := close[1] > up_trend2[1] ? max(up_lev2, up_trend2[1]) : up_lev2

down_trend1 = 0.0
down_trend1 := close[1] < down_trend1[1] ? min(dn_lev1, down_trend1[1]) : dn_lev1
down_trend2 = 0.0
down_trend2 := close[1] < down_trend2[1] ? min(dn_lev2, down_trend2[1]) : dn_lev2

trend1 = 0
trend1 := close > down_trend1[1] ? 1: close < up_trend1[1] ? -1 : nz(trend1[1], 1)
trend2 = 0
trend2 := close > down_trend2[1] ? 1: close < up_trend2[1] ? -1 : nz(trend2[1], 1)

st_line1 = trend1 == 1 ? up_trend1 : down_trend1
st_line2 = trend2 == 1 ? up_trend2 : down_trend2

// Plotting
plot1 = plot(st_line1, color = trend1 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 1")
plot2 = plot(st_line2, color = trend2 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 2")
fill(plot1, plot2, color = color.aqua, title = "Cloud")

buy = crossover(close, st_line1) and close > st_line2 or crossover(close, st_line2) and close > st_line1
sell = crossunder(close, st_line1) and close < st_line2 or crossunder(close, st_line2) and close < st_line1

if(buy and time_cond)
    strategy.entry("long", long = true , comment="long")

if (close < st_line1 and time_cond or close < st_line2 and time_cond)
    strategy.close("long")
    
if (not time_cond)
    strategy.close_all()





 


Mais.