Estratégia de negociação combinada do indicador Hall e do indicador estocástico


Data de criação: 2023-10-18 12:40:23 última modificação: 2023-10-18 12:40:23
cópia: 1 Cliques: 1028
1
focar em
1617
Seguidores

Estratégia de negociação combinada do indicador Hall e do indicador estocástico

Visão geral

A estratégia usa o indicador de Hall para determinar a direção da tendência, em combinação com o indicador aleatório para entrar. Quando o indicador de Hall no meio da linha atravessa a linha abaixo, o indicador de Hall entra em cena e entra em cena.

Princípio da estratégia

A estratégia de negociação utiliza principalmente o indicador de Hall para determinar a direção da tendência do mercado, e o indicador aleatório para a entrada específica.

Em primeiro lugar, a estratégia define o método de cálculo do indicador de Hall, incluindo a fórmula de cálculo para os eixos central, superior e inferior. O eixo central é calculado usando a média móvel ponderada WMA, e os eixos superior e inferior são os desvios do eixo central.

Em seguida, julgar a direção da tendência de acordo com a relação entre o eixo central e o eixo superior e inferior. Quando o eixo central atravessa o eixo inferior, representa uma tendência de compra mais forte, pertencente a uma tendência de compra; Quando o eixo central atravessa o eixo inferior, a tendência de venda mais forte, pertencente a uma tendência de compra.

Além disso, a estratégia também define métodos de cálculo de indicadores aleatórios, incluindo fórmulas de cálculo de valores K e D. Os valores K são utilizados para a suavização do SMA do RSI e os valores D são novamente suavizados pelo SMA do valor K.

Depois de julgar a direção da tendência, se a tendência for positiva, a linha K do indicador aleatório cruzará a linha D abaixo da zona de superalimento; se a tendência for negativa, a linha K cruzará a linha D acima da zona de superalimento.

Desta forma, a combinação de um julgamento de tendência do indicador de Hall com um julgamento de sobrecompra e sobrevenda de um indicador aleatório permite uma entrada mais estável e precisa.

Análise de vantagens

A maior vantagem da estratégia é que, combinando o julgamento de tendências com o julgamento de supercompra e supervenda, pode-se realizar uma análise multidimensional do mercado, com maior precisão de entrada.

O blogueiro também escreveu sobre o tema: “O Brasil é um país com uma economia de mercado e com uma economia de mercado”.

  1. Os indicadores de Hall são eficazes para determinar a direção das tendências do mercado e para se posicionar em grandes níveis;

  2. Os indicadores aleatórios de sobrecompra e sobrevenda permitem entender as mudanças nas forças de compra e venda e os melhores momentos de entrada.

  3. A combinação de ambos permite que os sinais sejam verificados mutuamente, reduzindo assim os falsos sinais.

  4. Adaptação flexível de variedades e períodos de tempo, com ajuste de parâmetros;

  5. O uso de desvios de trajectória média para formar canais de negociação de trajectória ascendente e descendente permite encontrar suporte e resistência potenciais.

  6. STOP LOSS, EXIT ON TARGETS % usado para escalar posições

  7. Use of hull data Dictionary gives multiple asset class flexibility

  8. A direção de otimização escolhida pode aumentar a estabilidade e a rentabilidade da estratégia

Análise de Riscos

A estratégia também tem alguns riscos a serem observados, principalmente:

  1. O indicador de Hall é atrasado e pode perder o ponto de viragem da tendência, causando prejuízos desnecessários.

  2. A configuração incorreta dos parâmetros do indicador aleatório pode gerar um sinal excedente. O sinal de cruzamento entre a linha K e a linha D deve ser filtrado adequadamente.

  3. O indicador de Hall é usado em conjunto com o indicador aleatório, e se os parâmetros não forem combinados corretamente, também pode haver um sinal de erro.

  4. A largura de uma faixa ascendente ou descendente pode afetar a qualidade do sinal de negociação, o que requer um teste cuidadoso para encontrar os melhores parâmetros.

  5. A tendência recente é de instabilidade, e os indicadores de linha média e longa podem não ser bons.

  6. Data mismatches between hull and stoch causing false signals

  7. Sharp trend changes not caught by hull can cause losses

  8. Testing on more timeframes/symbols needed to verify robustness

Para otimizar esses riscos, é possível:

  1. A redução apropriada do comprimento do indicador Hall aumenta a sensibilidade às mudanças de tendência.

  2. Optimizar os parâmetros dos indicadores aleatórios, reduzindo os falsos sinais.

  3. Ajustar os parâmetros de ascensão e descensão para encontrar a melhor largura de passagem.

  4. Adicionar outros sinais de verificação de indicadores, como MACD, etc.

  5. Aumentar as estratégias de stop loss para controlar os riscos.

Direção de otimização

A estratégia também pode ser melhorada nos seguintes aspectos:

  1. Testar mais variedades e mais parâmetros de ciclo de tempo para verificar a estabilidade da estratégia.

  2. Aumentar os mecanismos de suspensão de prejuízos, como a suspensão de tração, a suspensão de movimentação, etc., pode controlar melhor o risco.

  3. Otimizar a lógica das condições de entrada, definir condições de filtragem mais rigorosas e reduzir os falsos sinais.

  4. Estudar como usar o canal de Hall para melhor determinar os pontos de suporte e resistência.

  5. Explorar se os sinais de verificação podem ser adicionados a outros indicadores.

  6. Optimização de parâmetros, como o comprimento do indicador de Hall, o indicador aleatório K, o parâmetro de suavização de D, etc.

  7. Adição de funções de gerenciamento de posições. Ajuste o tamanho das posições de acordo com o número de retiradas e vitórias consecutivas.

  8. Aumentou a regra de stop loss e stop loss.

  9. Optimize hull length parameter for better trend sensitivity

  10. Add additional filters or confirming indicators to improve signal quality

  11. Explore using hull bands to identify dynamic support/resistance levels

  12. Parameter optimization for stoch RSI lengths, overbought/oversold levels

  13. Introduce better position sizing and risk management rules

Resumir

Em geral, a estratégia de integração de tendência julgamento e julgamento de sobre-compra e sobre-venda para entrar em ação é uma idéia que funciona. Mas, devido à existência de problemas com o próprio indicador, o sinal de negociação não é totalmente confiável, e precisa de ser melhorado. Se for possível encontrar o melhor conjunto de parâmetros, e complementado com outros indicadores de verificação e meios de controle de risco, o efeito da estratégia é esperado.

Código-fonte da estratégia
/*backtest
start: 2023-10-16 00:00:00
end: 2023-10-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
//Converted to Strategy by DashTrader
strategy("Hull Suite + Stoch RSI Strategy v1.1", overlay=true, pyramiding=1, initial_capital=100, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.023)
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

stoch_upper_input = input(88, "Stoch Upper Threshold", type=input.float)
stoch_lower_input = input(5, "Stoch Lower Threshold", type=input.float)
sl = input(0.7, "SL %", type=input.float, step=0.1)
tp = input(2.1, "TP %", type=input.float, step=0.1)
// slowEMA = ema(close, slowEMA_input)

// vwap = vwap(close)
// rsi = rsi(close, rsi_input)


// stoch rsi
smoothK = 3
smoothD = 3
lengthRSI = 14
lengthStoch = 14
rsi1 = rsi(close, 14)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title="Source")
modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(180, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?")
candleCol = input(false,title="Color candles based on Hull's Trend?")
visualSwitch  = input(true, title="Show as a Band?")
thicknesSwitch = input(1, title="Line Thickness")
transpSwitch = input(40, title="Band Transparency",step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>  wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>  ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length)))
//THMA    
THMA(_src, _length) =>  wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length)
    
//SWITCH
Mode(modeSwitch, src, len) =>
      modeSwitch == "Hma"  ? HMA(src, len) :
      modeSwitch == "Ehma" ? EHMA(src, len) : 
      modeSwitch == "Thma" ? THMA(src, len/2) : na
      
//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)

bgcolor(color = k < stoch_lower_input  and crossover(k, d) ? color.green : na)
bgcolor(color = d > stoch_upper_input and crossover(d, k) ? color.red : na)

notInTrade = strategy.position_size == 0

if notInTrade and HULL[0] > HULL[2] and testPeriod() and k < stoch_lower_input and crossover(k, d)
// if HULL[0] > HULL[2] and testPeriod()
    stopLoss = close * (1 - sl / 100) 
    profit25 = close * (1 + (tp / 100) * 0.25)
    profit50 = close * (1 + (tp / 100) * 0.5)
    takeProfit = close * (1 + tp / 100)
    
    
    strategy.entry("long", strategy.long, alert_message="buy")
    strategy.exit("exit long 25%", "long", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit long 50%", "long", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

    
if notInTrade and HULL[0] < HULL[2] and testPeriod() and d > stoch_upper_input and crossover(d, k)
// if HULL[0] < HULL[2] and testPeriod()
    stopLoss = close * (1 + sl / 100)
    profit25 = close * (1 - (tp / 100) * 0.25)
    profit50 = close * (1 - (tp / 100) * 0.5)
    takeProfit = close * (1 - tp / 100)
    
    

    strategy.entry("short", strategy.short, alert_message="sell")
    strategy.exit("exit short 25%", "short", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit short 50%", "short", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

// var table winrateDisplay = table.new(position.bottom_right, 1, 1)
// table.cell(winrateDisplay, 0, 0, "Winrate: " + tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##')+" %", text_color=color.white)