Estratégia de negociação baseada na média móvel do Hull e no cruzamento da WT

Autora:ChaoZhang, Data: 2023-09-26 20:00:32
Tags:

Resumo

Esta estratégia combina principalmente os sinais cruzados Hull Moving Average e WT para alavancar as vantagens de cada indicador para um julgamento mais preciso da tendência e do calendário de entrada.

Estratégia lógica

A estratégia consiste nos sinais cruzados Hull Moving Average e WT.

A parte da média móvel do Hull calcula os MAs de curto e longo prazo do Hull e preenche a cor para determinar a direção da tendência.

MA de casco curto = WMA ((2*WMA ((n/2) - WMA ((n), sqrt ((n))

A partir de 1 de janeiro de 2014, a Comissão deve apresentar ao Conselho e ao Parlamento Europeu uma proposta de decisão relativa à aplicação do presente regulamento.

Quando o MA curto cruza o MA longo, é um sinal de alta, caso contrário, um sinal de baixa.

A parte WT calcula as linhas WT e observa os seus cruzamentos para determinar as entradas.

TCI = (Close - EMA(Close,n1)) / (k * STD(Close - EMA(Close,n1),n1))

WT1 = EMA ((TCI,n2)

WT2 = SMA(WT1,m)

Onde o TCI é o índice composto de tendência, refletindo o desvio do preço da EMA; WT1 é o EMA do TCI, WT2 é a SMA do WT1, m é geralmente 4.

Combinando o julgamento da tendência Hull MA e os sinais de cruzamento WT, podemos entrar no mercado na direcção certa.

Análise das vantagens

As vantagens desta estratégia são as seguintes:

  1. O Hull MA capta as alterações de preços mais rapidamente, modificando o cálculo, e filtra eficazmente o ruído do mercado para um julgamento confiável da tendência.

  2. A WT utiliza a flutuação dos preços dentro do canal para capturar rapidamente pontos de virada e gerar sinais comerciais relativamente precisos.

  3. A combinação considera a tendência e o cruzamento para um melhor controlo do risco quando a tendência se alinha.

  4. Os parâmetros Hull MA e WT são personalizáveis para ajustamento e otimização com base nas características dos símbolos e nas preferências de negociação.

  5. Os sinais MA e WT do casco podem ser utilizados isoladamente ou em conjunto, tanto para a validação de tendências como para a validação de cruzamento.

  6. O "stop loss" e o "take profit" podem ser definidos para controlar eficazmente os riscos comerciais únicos.

Análise de riscos

Os principais riscos desta estratégia são:

  1. Tanto a Hull MA como a WT suavizam os preços até certo ponto, o que pode causar sinais de entrada atrasados.

  2. A WT pode gerar falsos sinais de divergência de alta/baixa sem uma tendência clara.

  3. As configurações inadequadas dos parâmetros podem afetar o desempenho das negociações e exigir uma otimização contínua.

  4. O "stop loss" pode ser desencadeado frequentemente durante a consolidação da tendência, causando alguma perda.

Os riscos podem ser abordados e otimizados da seguinte forma:

  1. Ajustar os parâmetros MA e WT do casco para encontrar o equilíbrio ideal.

  2. Adicionar mecanismos de validação de tendências para evitar falsos sinais WT sem uma tendência confirmada.

  3. Otimizar os parâmetros através de backtesting e negociação demo e definir intervalos razoáveis de stop loss.

  4. Reduzir o tamanho das posições ou parar de negociar quando a tendência não estiver clara.

Orientações de otimização

A estratégia pode ser melhorada a partir dos seguintes aspectos:

  1. Teste diferentes médias móveis combinadas com WT, para encontrar um melhor equilíbrio, por exemplo, KAMA, TEMA, etc.

  2. Adicionar outros indicadores como osciladores, Bandas de Bollinger para melhorar a precisão da decisão.

  3. Optimizar parâmetros através de backtesting e demo trading.

  4. Otimizar as estratégias de stop loss, por exemplo, trailing stop, stop baseado em volatilidade, movendo-se de perto para longe, etc., para reduzir o desencadeamento indesejado.

  5. Otimizar as estratégias de dimensionamento das posições, reduzir as dimensões e as frequências de tendências pouco claras para reduzir os riscos.

  6. Introduzir aprendizagem de máquina e outras técnicas avançadas para decisões comerciais mais inteligentes e parâmetros adaptativos.

Resumo

Esta estratégia combina a suavização do Hull MA e as forças de cruzamento do WT para julgamento e validação da tendência. A negociação com direção confirmada ajuda a controlar os riscos. Podem ser feitas melhorias adicionais na otimização de parâmetros, estratégias de stop loss, dimensionamento de posição, etc. A integração de outros indicadores e técnicas inteligentes também são direções de otimização futuras.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// WT CROSS @author [© LazyBear]
// © pigsq
// @version=5

strategy("Kahlman HullMA / WT Cross Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100)

_1 = input(false, '───────── SP/TP SETTINGS ─────────')

stoploss1 = input(title='Stop Loss On/Off?', defval=true)
stoploss = input.float(5, "Stop Loss", minval = 1, step = 1)/100
takeprofit1 = input(title='Take Profit On/Off?', defval=true)
takeprofit = input.float(10, "Take Profit", minval = 1, step = 1)/100

_2 = input(false, '──────── WT CROSS SETTINGS ────────')

wtcross = input(title='WT Cross On/Off?', defval=true)
wtcross2 = input(title='Change WT Cross Method ( If WT Cross ON )', defval=false)

/// WT CROSS ///

n1 = input(10, 'Channel Length')
n2 = input(21, 'Average Length')

ap = hlc3
esa = ta.ema(ap, n1)
r = ta.ema(math.abs(ap - esa), n1)
ci = (ap - esa) / (0.015 * r)
tci = ta.ema(ci, n2)

wt1 = tci
wt2 = ta.sma(wt1, 4)

/// WT CROSS ///

/// HULL TREND WITH KAHLMAN ///

_3 = input(false, '──────── HULLMA SETTINGS ────────')

srchull = input(hl2, 'Source')
lengthhull = input(24, 'Lookback')
gain = input(10000, 'Gain')
kh = input(true, 'Use Kahlman')

hma(_srchull, _lengthhull) =>
    ta.wma((2 * ta.wma(_srchull, _lengthhull / 2)) - ta.wma(_srchull, _lengthhull), math.round(math.sqrt(_lengthhull)))

hma3(_srchull, _lengthhull) =>
    p = lengthhull / 2
    ta.wma(ta.wma(close, p / 3) * 3 - ta.wma(close, p / 2) - ta.wma(close, p), p)

kahlman(x, g) =>
    kf = 0.0
    dk = x - nz(kf[1], x)
    smooth = nz(kf[1], x) + dk * math.sqrt(g / 10000 * 2)
    velo = 0.0
    velo := nz(velo[1], 0) + g / 10000 * dk
    kf := smooth + velo
    kf

a = kh ? kahlman(hma(srchull, lengthhull), gain) : hma(srchull, lengthhull)
b = kh ? kahlman(hma3(srchull, lengthhull), gain) : hma3(srchull, lengthhull)
c = b > a ? color.lime : color.red
crossdn = a > b and a[1] < b[1]
crossup = b > a and b[1] < a[1]

p1hma = plot(a, color=c, linewidth=1, title='Long Plot', transp=75)
p2hma = plot(b, color=c, linewidth=1, title='Short Plot', transp=75)
fill(p1hma, p2hma, color=c, title='Fill', transp=55)

/// HULL TREND WITH KAHLMAN ///

/// DATE ///

_4 = input(false, '───────── DATE SETTINGS ─────────')

FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12)
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
FromYear = input.int(defval=999, title='From Year', minval=999)
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12)
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31)
ToYear = input.int(defval=9999, title='To Year', minval=999)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() =>
    time >= start and time <= finish ? true : false

/// DATE ///

/// LONG/SHORT CONDITION ///

longCondition = crossup and ta.crossover(wt1,wt2)
longCondition1 = crossup
longCondition2 = crossup and wt1 > wt2

if (wtcross == true ? longCondition : wtcross == false ? longCondition1:na)
    strategy.entry("LONG", strategy.long, when=window(), comment="Enter Long")
else if (wtcross2 == true ? longCondition2 : wtcross2 == false ? longCondition:na)
    strategy.entry("LONG", strategy.long, when=window(), comment="Enter Long")
    
shortCondition = crossdn and ta.crossunder(wt1,wt2)
shortCondition1 = crossdn
shortCondition2 = crossdn and wt1 < wt2

if (wtcross == true ? shortCondition : wtcross == false ? shortCondition1:na)
    strategy.entry("SHORT", strategy.short, when=window(), comment="Enter Short")
else if (wtcross2 == true ? shortCondition2 : wtcross2 == false ? shortCondition:na)
    strategy.entry("LONG", strategy.long, when=window(), comment="Enter Short")

/// LONG/SHORT CONDITION ///

/// CLOSE STRATEGY ///

strategy.close("LONG", when=wtcross == true ? shortCondition : wtcross == false ? shortCondition1:na, comment = "Close Long")
strategy.close("SHORT", when=wtcross == true ? longCondition : wtcross == false ? longCondition1:na, comment = "Close Short")

/// EXIT STRATEGY ///

strategy.exit("LONG", when=strategy.position_size > 0, stop=stoploss1 == true ? strategy.position_avg_price * (1 - stoploss):na, limit=takeprofit1 == true ? strategy.position_avg_price * (1 + takeprofit):na, comment="Exit Long")
strategy.exit("SHORT", when=strategy.position_size < 0, stop=stoploss1 == true ? strategy.position_avg_price * (1 + stoploss):na, limit=takeprofit1 == true ? strategy.position_avg_price * (1 - takeprofit):na, comment ="Exit Short")

/// LONG SL/TP LINE ///

plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 - stoploss) : na, title='Long Stop Loss', color=stoploss1 == true ? color.new(color.red, 0):na, style=plot.style_linebr)
plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + takeprofit) : na, title='Long Take Profit', color=takeprofit1 == true ? color.new(color.green, 0):na, style=plot.style_linebr)

/// LONG SL/TP LINE ///

/// SHORT SL/TP LINE ///

plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 + stoploss) : na, title='Short Stop Loss', color=stoploss1 == true ? color.new(color.red, 0):na, style=plot.style_linebr)
plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - takeprofit) : na, title='Short Take Profit', color=takeprofit1 == true ? color.new(color.green, 0):na, style=plot.style_linebr)

/// SHORT SL/TP LINE ///


Mais.