
A estratégia forma o principal canal de preços, representando a direção da tendência de longo prazo, calculando os preços máximos e mínimos em diferentes períodos de tempo (de 50 bar e 200 bar). Ao mesmo tempo, a combinação de linhas de sinal rápido e linhas de sinal lento determina a direção da tendência de curto prazo. A estratégia aconselha a entrada quando a direção da tendência de longo prazo é consistente.
Em primeiro lugar, através da contagem dos preços máximos e mínimos nos últimos 50 bares e dos preços máximos e mínimos nos últimos 200 bares, formam-se dois canais de preços que representam a direção da tendência a longo prazo.
Em segundo lugar, calcular os preços mais altos e mais baixos dos últimos 7 bares para determinar a tendência de curto prazo; calcular os preços mais altos e mais baixos dos últimos 20 bares para determinar a tendência de curto prazo.
Finalmente, quando os canais de sinais rápidos, os canais de sinais lentos e os canais de preços de longo prazo estão alinhados, o sinal de entrada é sugerido. Por exemplo, todos os canais estão em uma tendência ascendente, o que sugere a compra; todos os canais estão em uma tendência descendente, o que sugere a venda.
A maior vantagem dessa estratégia é a capacidade de identificar a direção de tendências unificadas de longo prazo. Através da confirmação de canais de preços em diferentes períodos de tempo, pode-se evitar efetivamente ser confundido com o ruído do mercado de curto prazo.
Além disso, a estratégia usa um julgamento de múltiplos prazos, o que garante a estabilidade do sinal, mesmo que a inversão de preços de curto prazo não mude facilmente o sinal.
O principal risco dessa estratégia é que, quando a tendência de curto prazo se inverte, há um certo atraso na geração de sinais devido à necessidade de confirmação de vários canais de ciclo de tempo. Neste caso, o acompanhamento cego pode causar a expansão dos prejuízos.
Além disso, não é amigável para a negociação de alta frequência e não pode reagir rapidamente às flutuações de preços de curto prazo. Se houver uma situação aguda, a configuração inadequada das condições de parada pode causar grandes perdas.
Pode-se considerar a inclusão de uma estratégia de stop loss dinâmico adaptável, que pode efetivamente controlar o risco quando o preço ultrapassa uma certa proporção na direção negativa.
Além disso, pode-se adicionar mais canais de preços de diferentes comprimentos para que o sistema de votação decida o sinal final, o que pode melhorar a precisão do julgamento.
Ou então, os algoritmos de aprendizagem de máquina podem ser usados para otimizar automaticamente os parâmetros de cada canal, tornando os parâmetros mais adequados para o ambiente de mercado atual.
A estratégia é clara e fácil de entender, e pode ser usada para avaliar a tendência do mercado através de canais de preços de vários quadros temporais, eliminando efetivamente o ruído do mercado de curto prazo. No entanto, o controle de risco e o tratamento de situações de reversão devem ser reforçados.
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-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/
// © ZoomerXeus
//@version=4
strategy("Swing High Low Price Channel V.1", overlay=true)
//========================= variable =================================//
dead_channel_source = input(title="Main swing channel source", defval="H/L", options=["H/L"])
fast_signal_length = input(title="Fast Slow Length", type=input.integer, defval=7, maxval=49, minval=1)
slow_signal_length = input(title="Slow Slow Length", type=input.integer, defval=20, maxval=49, minval=1)
is_show_only_dead_channel = input(title="Show main channel only", defval=true)
main_channel_width = input(title="Main line width", defval=2, minval=1)
signal_channel_width = input(title="Signal line width", defval=1, minval=1)
//========================= indicator function =================================//
dead_cross_high_50 = highest(high, 50)
dead_cross_high_200 = highest(high, 200)
//========================================
dead_cross_low_50 = lowest(low, 50)
dead_cross_low_200 = lowest(low, 200)
//========================================
medain_dead_cross_50 = ((dead_cross_high_50-dead_cross_low_50)*0.5)+dead_cross_low_50
medain_dead_cross_200 = ((dead_cross_high_200-dead_cross_low_200)*0.5)+dead_cross_low_200
//========================================
fasthighest = highest(high, fast_signal_length)
fastlowest = lowest(low, fast_signal_length)
//========================================
slowhighest = highest(high, slow_signal_length)
slowlowest = lowest(low, slow_signal_length)
//========================================
//========================= plot =================================//
plot(dead_channel_source == "H/L" ? dead_cross_high_50 : na,title="50 bar highest", color=color.red, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? dead_cross_high_200 : na,title="200 bar highest", color=color.aqua, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? dead_cross_low_50 : na,title="50 bar lowest", color=color.red, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? dead_cross_low_200 : na,title="200 bar lowest", color=color.aqua, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? medain_dead_cross_200 : na,title="200 bar middle lowest", color=color.orange, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? medain_dead_cross_50 : na,title="50 bar middle lowest", color=color.lime, linewidth=main_channel_width)
//===========================================
plot(is_show_only_dead_channel == false ? fasthighest : na,title="fast signal highest", color=#ff00f9, linewidth=signal_channel_width)
plot(is_show_only_dead_channel == false ? fastlowest : na,title="fast signal lowest", color=#ff00f9, linewidth=signal_channel_width)
plot(is_show_only_dead_channel == false ? slowhighest : na,title="slow signal highest", color=color.white, linewidth=signal_channel_width)
plot(is_show_only_dead_channel == false ? slowlowest : na,title="slow signal lowest", color=color.white, linewidth=signal_channel_width)
//===========================================
plot(crossover(medain_dead_cross_50, medain_dead_cross_200) ? medain_dead_cross_200 : na, title="Dead cross buy plot", style=plot.style_circles, linewidth=6, color=color.lime)
plot(crossunder(medain_dead_cross_50, medain_dead_cross_200) ? medain_dead_cross_200 : na, title="Dead cross sell plot", style=plot.style_circles, linewidth=6, color=color.red)
plot(is_show_only_dead_channel and (medain_dead_cross_50 < medain_dead_cross_200) and high == slowhighest ? high : na, title="Follow trend short term sell plot zone", style=plot.style_circles, linewidth=3, color=color.orange)
plot(is_show_only_dead_channel and (medain_dead_cross_50 > medain_dead_cross_200) and low == slowlowest ? low : na, title="Follow trend short term buy plot zone", style=plot.style_circles, linewidth=3, color=color.green)
plot(is_show_only_dead_channel and high == slowhighest and (high == dead_cross_high_200) ? high : na, title="Not follow trend short term sell plot zone", style=plot.style_circles, linewidth=3, color=color.orange)
plot(is_show_only_dead_channel and low == slowlowest and (low == dead_cross_low_200) ? low : na, title="Not follow trend short term buy plot zone", style=plot.style_circles, linewidth=3, color=color.green)
//===================== open close order condition =========================================================//
strategy.entry("strong buy", true, 1, when=low == dead_cross_low_200)
strategy.exit("close strong buy 50%", "strong buy", qty_percent=50, when=high==slowhighest)
strategy.entry("strong sell", false, 1, when=high == dead_cross_high_200)
strategy.exit("close strong sell 50%", "strong sell", qty_percent=50, when=low==slowlowest)