
Esta estratégia baseia-se na flutuação suave dos preços, gerando uma faixa alvo de preços e um sinal de negociação quando os preços ultrapassam a faixa alvo.
A estratégia primeiro calcula a amplitude média de oscilação do preço em um determinado período, e depois processa a amplitude de oscilação de forma suave com uma média móvel indexada, gerando uma taxa de flutuação suave. A taxa de flutuação suave é multiplicada por um fator, obtendo o alcance da faixa-alvo. Quando o preço quebra a faixa-alvo, gera um sinal de compra; Quando o preço quebra a faixa-alvo, gera um sinal de venda.
Especificamente, a estratégia calcula a taxa de flutuação suave smrng através da função smoothrng, e depois calcula os bandos h e l da faixa alvo com base no valor de smrng. Com base nisso, define uma condição de posição longa longCondition e uma condição de posição curta shortCondition. Quando as condições de posição longa são satisfeitas, gera um sinal de compra; Quando as condições de posição curta são satisfeitas, gera um sinal de venda.
A estratégia tem as seguintes vantagens:
O uso da volatilidade de preços para construir sinais de negociação permite um acompanhamento eficaz das mudanças no mercado.
Os índices de média móvel podem ser usados para suavizar oscilações, filtrar o ruído e gerar sinais de negociação mais confiáveis.
O alcance da faixa-alvo pode ser ajustado com o coeficiente de taxa de flutuação, permitindo maior flexibilidade na estratégia.
A combinação de um julgamento de ruptura de preços permite capturar oportunidades de negociação em tempo hábil quando a tendência se inverte.
A estratégia também apresenta alguns riscos:
Quando ocorrem oscilações anormais no mercado, a taxa de flutuação de suavização pode não refletir com precisão a situação real de flutuação, resultando em sinais errados. O modelo pode ser otimizado através do ajuste de parâmetros.
O alcance da faixa-alvo pode resultar em frequência de negociação excessiva ou em sinal insuficiente se for configurado incorretamente. Diferentes parâmetros podem ser testados para encontrar o alcance ideal.
A detecção de um sinal de ruptura pode ocorrer com um atraso de tempo, o que pode levar a uma entrada antecipada ou tardia. Pode ser confirmada em combinação com outros indicadores.
A estratégia pode ser otimizada nas seguintes direções:
Teste diferentes ciclos de dados de preços para encontrar o parâmetro de ciclo mais adequado para calcular a taxa de flutuação.
Tente diferentes algoritmos de média móvel, como a média móvel de peso linear.
A introdução de volume de transações ou outros indicadores para confirmar o sinal de ruptura.
O que é um trailing stop?
Otimizar o valor do coeficiente de flutuação mult para determinar a melhor faixa de banda alvo.
Esta estratégia de conceito global é clara, através da volatilidade dos preços de construção de alvos de banda, o uso de preços de ruptura para gerar sinais de negociação, pode efetivamente acompanhar a tendência de mudança de mercado. Mas também existe um certo espaço de melhoria, através de parâmetros de otimização, a introdução de indicadores de confirmação e outros meios pode tornar a estratégia mais estável e confiável.
/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true)
// Source
src = input(defval=close, title="Source")
// Sampling Period
per = input(defval=100, minval=1, title="Sampling Period")
// Range Multiplier
mult = input(defval=3.0, minval=0.1, title="Range Multiplier")
// Smooth Average Range
smoothrng(x, t, m) =>
wper = (t * 2) - 1
avrng = ema(abs(x - x[1]), t)
smoothrng = ema(avrng, wper) * m
smoothrng
smrng = smoothrng(src, per, mult)
// Range Filter
rngfilt(x, r) =>
rngfilt = x
rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
rngfilt
filt = rngfilt(src, smrng)
// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
// Target Bands
hband = filt + smrng
lband = filt - smrng
// Breakouts
longCondition = (src > filt) and (src > src[1]) and (upward > 0)
shortCondition = (src < filt) and (src < src[1]) and (downward > 0)
strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)
// Plotting
plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter")
hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target")
// Fills
fill(hbandplot, lbandplot, color=color.aqua, title="Target Range")
// Bar Color
barcolor(longCondition ? color.green : shortCondition ? color.red : na)
// Alerts
alertcondition(longCondition, title="Buy Alert", message="BUY")
alertcondition(shortCondition, title="Sell Alert", message="SELL")