A estratégia usa os altos e baixos da volatilidade dos preços para determinar o momento de entrar ou sair de uma posição, com o objetivo de estabelecer posições de mais de um ponto quando a volatilidade dos preços é maior e fechar as posições com lucro quando a tendência dos preços se torna favorável.
O indicador ATR é usado para medir a taxa de flutuação dos preços. Calcule o valor do ATR dos 20 últimos períodos e calcule sua média móvel e diferença padrão. Se o valor atual do ATR for superior à média mais um diferencial padrão, considere-se que a taxa de flutuação dos preços é alta.
A taxa de variação do preço de um binário de um nível é usada para determinar a tendência do preço. Calcule a taxa de variação do preço de fechamento de um binário nos últimos 20 períodos, calculando sua média móvel. Se a taxa de variação atual for maior do que a média por 3 dias consecutivos e for positiva, considere-se que o preço está em uma tendência ascendente.
Quando a volatilidade dos preços é alta e os preços tendem a subir, faça mais posições. Quando o preço retrocede e o preço de parada é acionado, feche as posições. O preço de parada é ajustado dinamicamente, sempre mantido entre o mínimo e o dobro do ATR.
Aproveite as altas e baixas flutuações de preços e o discernimento de tendências para fazer mais ações de curto prazo e evitar transações frequentes em mercados turbulentos.
Ajustar dinamicamente o preço de stop-loss para evitar que o stop-loss se torne demasiado flexível e leve a grandes perdas.
A retrospectiva mostra que a estratégia teve uma taxa de retorno anual de 159% entre 2015 e 2021, muito acima da estratégia Buy and Hold, que teve uma taxa de retorno anual de 120%.
A configuração dos parâmetros ATR excessivamente radical pode levar a um acesso insuficiente. Os parâmetros podem ser ampliados de forma apropriada para aumentar a frequência de acesso.
Os indicadores de avaliação de tendências podem gerar erros de avaliação e não coincidem com a tendência real. Os fatores de confirmação devem ser aumentados para evitar potenciais perdas.
O ciclo de retorno é de apenas 6 anos, sendo necessário ampliar o intervalo de amostragem e fazer testes de estabilidade, para evitar a sobre-adaptação.
Não é possível avaliar o desempenho em situações extremas, como a rápida monopólio, a necessidade de intervenção manual ou a interrupção programada.
Adicionar indicadores de confirmação de tendências, como MACD, KDJ, etc., para determinar a direção da tendência com mais precisão.
Os parâmetros do ATR podem ser ajustados de acordo com diferentes variedades e condições de mercado para otimizar a taxa de flutuação.
Adicionar módulos de julgamento de ruptura, configurar fatores de aceleração de tendências e aumentar a posição em caso de ruptura.
Teste a eficácia de diferentes métodos de perda, como perda porcentual, perda por flutuação, etc.
Avaliação do número de transações, a estabilidade da curva de ganhos, a retirada máxima, etc., para garantir a solidez da estratégia.
A estratégia integra os benefícios da determinação da volatilidade e da tendência dos preços, o tempo de entrada para determinar a possibilidade de uma reversão dos preços em caso de aumento da volatilidade, a configuração de stop loss dinâmico para controlar o risco, o melhor lucro excedente de retrospectiva. Mas o intervalo de amostragem é de apenas 6 anos, a configuração dos parâmetros-chave precisa ser ajustada para diferentes mercados, e é necessário introduzir mais fatores de confirmação para reduzir a probabilidade de erro de julgamento. Além disso, é necessário um teste de robustez mais abrangente da estratégia para ser realmente usado na negociação de placas de negociação.
/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 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("Mean Reversion (ATR) Strategy [KL]",overlay=true,pyramiding=1)
ENUM_LONG = "Long"
// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2000 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
// }
// 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))
// }
// Variables for confirmations of entry {
_len_volat = input(20,title="Length of ATR to determine volatility")
_ATR_volat = atr(_len_volat)
_avg_atr = sma(_ATR_volat, _len_volat)
_std_volat = stdev(_ATR_volat,_len_volat)
signal_diverted_ATR = _ATR_volat > (_avg_atr + _std_volat) or _ATR_volat < (_avg_atr - _std_volat)
_len_drift = input(20,title="Length of Drift")//default set to const: _len_vol's default value
_prcntge_chng = log(close/close[1])
_drift = sma(_prcntge_chng, _len_drift) - pow(stdev(_prcntge_chng, _len_drift),2)*0.5
_chg_drift = _drift/_drift[1]-1
signal_uptrend = (_drift > _drift[1] and _drift > _drift[2]) or _drift > 0
entry_signal_all = signal_diverted_ATR and signal_uptrend
// }
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:
if strategy.position_size > 0 and TSL_source <= stop_loss_price
exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
strategy.close(ENUM_LONG, comment=exit_msg)
// ENTRY:
else if entry_signal_all and (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price))
entry_msg = strategy.position_size > 0 ? "adding" : "initial"
strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)
if strategy.position_size == 0
stop_loss_price := float(0)
// }