
A estratégia de preço relativo é uma estratégia de negociação quantitativa baseada na anomalia do volume de negociação e na flutuação dos preços. A estratégia julga se o volume de negociação é anormal comparando o volume de negociação atual com a relação do volume de negociação médio histórico; ao mesmo tempo, combinando a faixa de amplitude real média, julga se o preço está em uma faixa relativamente estável. Quando o volume de negociação aumenta de forma anormal e o preço é relativamente estável, é considerado um sinal de entrada.
A lógica central da estratégia de preço relativo baseia-se em dois indicadores, um é o volume de transação relativo e o outro é o intervalo de flutuação dos preços.
Primeiro, nós calculamos a média móvel simples do volume de transações nos últimos 20 ciclos, como o volume de transações médio histórico. Depois, definimos um parâmetro multiplicador (por exemplo, 1,5 vezes), e quando o volume de transações atual é maior que 1,5 vezes o volume de transações médio, consideramos que o volume de transações é anormal, pertencendo a uma situação de aumento de volume relativo.
Em segundo lugar, calculamos a amplitude real média (ATR) dos últimos 14 ciclos como uma medida da oscilação dos preços. Ao mesmo tempo, calculamos a diferença padrão da amplitude média. Se a amplitude real atual estiver entre a diferença padrão positiva e negativa da média, consideramos que a oscilação dos preços está em um intervalo relativamente estável.
Quando as duas condições acima são simultaneamente satisfeitas, ou seja, é emitido um sinal de fazer mais, abrir uma posição de fazer mais. Durante o processo de manutenção da posição, o ATR é reduzido para o máximo de dois vezes o ATR como ponto de parada, o ATR é reduzido para o máximo de dois vezes o ATR como ponto de parada.
A maior vantagem da estratégia de preço relativo reside na captura de tendências de preços causadas por volume de transações anormais. Quando o volume de transações aumenta, representa uma mudança na atitude dos participantes do mercado, o que geralmente indica a ruptura dos preços e a formação de novas tendências. A estratégia pode determinar efetivamente o momento em que o volume de transações anormais foi comparado à relação entre o volume de transações e a média histórica.
Por outro lado, a estratégia também considera a volatilidade dos preços, fazendo com que os sinais ocorram em momentos de relativa estabilidade dos preços. Isso evita o risco de grandes perdas causadas pela recuperação em momentos de forte flutuação.
O maior risco desta estratégia é que o volume de negociação não pode determinar 100% de uma nova tendência, e a explosão de volume de negociação pode ser uma falsa ruptura, e os preços podem ser rapidamente reversos. Nesse caso, a estratégia sofrerá grandes perdas.
Para reduzir os prejuízos, pode-se ajustar adequadamente os parâmetros do volume de transações em relação ao volume de transações, estabelecendo padrões mais rigorosos para o julgamento de transações anormais. Ou adicionar outros indicadores de julgamento, como aumentar a análise do volume de transações para determinar se o aumento do volume de transações corresponde ao volume de transações.
A estratégia pode ser melhorada em vários aspectos:
A adição de outros indicadores de julgamento, como oscilação, volume de transação, etc., torna os sinais de volume de transação anormais mais confiáveis.
Os parâmetros do ATR podem ser otimizados para diferentes ações, para determinar com mais precisão os intervalos de estabilidade de preços.
Aumentar os algoritmos de aprendizagem de máquina para julgar positivamente as anomalias de volume de transação, e não apenas comparar com a média histórica.
O uso de modelos de aprendizagem profunda para determinar a previsão de flutuação de preços, não apenas com base no histórico de ATR.
A estratégia de preço relativo emite um sinal de negociação através da captura de volume de negócios anormal como um sinal de característica, combinado com o julgamento de estabilidade de preços. A estratégia é simples e prática, e é mais eficaz quando se rastreia o volume de negociação anormal de ações. Mas também existe um certo risco de falso sinal, e é necessário otimizar ainda mais os indicadores para melhorar a eficácia do julgamento.
/*backtest
start: 2022-12-21 00:00:00
end: 2023-12-27 00:00:00
period: 1d
basePeriod: 1h
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/
// © DojiEmoji (kevinhhl)
//@version=4
strategy("[KL] Relative Volume + ATR Strategy",overlay=true,pyramiding=1)
ENUM_LONG = "Long"
// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
len_volat = input(14,title="Length of ATR to determine volatility")
ATR_volat = atr(len_volat)
avg_ATR_volat = sma(ATR_volat, len_volat)
std_ATR_volat = stdev(ATR_volat, len_volat)
// }
// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_X2_TSL
else if strategy.position_size > 0
stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }
// Signals for entry {
_avg_vol = sma(volume,input(20, title="SMA(volume) length (for relative comparison)"))
_relative_vol = _avg_vol * input(1.5,title="Multiple of avg vol to consider relative volume as being high",type=input.float)
__lowerOfOpenClose = min(open,close)
_wickRatio_lower = (__lowerOfOpenClose - low) / (high - low)
entry_signal1 = volume > _relative_vol
entry_signal2 = ATR_volat < avg_ATR_volat + std_ATR_volat and ATR_volat > avg_ATR_volat - std_ATR_volat
// }
alert_per_bar(msg)=>
prefix = "[" + syminfo.root + "] "
suffix = "(P=" + tostring(close) + "; atr=" + tostring(ATR_volat) + ")"
alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)
// MAIN:
if within_timeframe
if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
alert_per_bar("TSL raised to " + tostring(stop_loss_price))
// EXIT :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // placed before entry, will re-enter if stopped out
exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
if strategy.position_size > 0 and TSL_source <= stop_loss_price
strategy.close(ENUM_LONG, comment=exit_msg)
// ENTRY :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if entry_signal1 and entry_signal2// and entry_signal3
entry_msg = strategy.position_size > 0 ? "adding" : "initial"
strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)
// CLEAN UP:
if strategy.position_size == 0
stop_loss_price := float(0)