
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.
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.
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”.
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;
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.
A combinação de ambos permite que os sinais sejam verificados mutuamente, reduzindo assim os falsos sinais.
Adaptação flexível de variedades e períodos de tempo, com ajuste de parâmetros;
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.
STOP LOSS, EXIT ON TARGETS % usado para escalar posições
Use of hull data Dictionary gives multiple asset class flexibility
A direção de otimização escolhida pode aumentar a estabilidade e a rentabilidade da estratégia
A estratégia também tem alguns riscos a serem observados, principalmente:
O indicador de Hall é atrasado e pode perder o ponto de viragem da tendência, causando prejuízos desnecessários.
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.
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.
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.
A tendência recente é de instabilidade, e os indicadores de linha média e longa podem não ser bons.
Data mismatches between hull and stoch causing false signals
Sharp trend changes not caught by hull can cause losses
Testing on more timeframes/symbols needed to verify robustness
Para otimizar esses riscos, é possível:
A redução apropriada do comprimento do indicador Hall aumenta a sensibilidade às mudanças de tendência.
Optimizar os parâmetros dos indicadores aleatórios, reduzindo os falsos sinais.
Ajustar os parâmetros de ascensão e descensão para encontrar a melhor largura de passagem.
Adicionar outros sinais de verificação de indicadores, como MACD, etc.
Aumentar as estratégias de stop loss para controlar os riscos.
A estratégia também pode ser melhorada nos seguintes aspectos:
Testar mais variedades e mais parâmetros de ciclo de tempo para verificar a estabilidade da estratégia.
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.
Otimizar a lógica das condições de entrada, definir condições de filtragem mais rigorosas e reduzir os falsos sinais.
Estudar como usar o canal de Hall para melhor determinar os pontos de suporte e resistência.
Explorar se os sinais de verificação podem ser adicionados a outros indicadores.
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.
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.
Aumentou a regra de stop loss e stop loss.
Optimize hull length parameter for better trend sensitivity
Add additional filters or confirming indicators to improve signal quality
Explore using hull bands to identify dynamic support/resistance levels
Parameter optimization for stoch RSI lengths, overbought/oversold levels
Introduce better position sizing and risk management rules
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.
/*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)