La estrategia utiliza los altos y bajos de la volatilidad de los precios para determinar el momento de entrar o salir de una posición, con el objetivo de establecer una posición de más de un lado cuando la volatilidad de los precios es alta y cerrar la posición con ganancias cuando la tendencia de los precios se vuelve favorable.
El indicador ATR mide la volatilidad de los precios. Calcula el ATR de los últimos 20 períodos y calcula su promedio móvil y la diferencia estándar. Si el ATR actual es superior a la media más una diferencia estándar, se considera que el precio tiene una volatilidad alta.
Utiliza el índice de variación de los precios de pares de una etapa para determinar la tendencia de los precios. Calcula el índice de variación de los precios de cierre de pares de los últimos 20 períodos, calcula su promedio móvil, y si el índice de variación actual es mayor que el promedio durante 3 días consecutivos y es positivo, se considera que el precio está en una tendencia al alza.
Cuando la volatilidad de los precios es alta y los precios tienen una tendencia al alza, se abre más posición. Cuando los precios retroceden, el precio de parada se activa para cerrar la posición. El precio de parada se ajusta dinámicamente y siempre se mantiene entre el precio mínimo menos 2 veces el ATR.
Aproveche las fluctuaciones de precios y las tendencias para hacer más tiempo libre y evitar el comercio frecuente en mercados convulsionados.
Ajuste dinámico del precio de parada para evitar que la parada sea demasiado flexible y cause grandes pérdidas.
La retrospectiva muestra que entre 2015 y 2021, la estrategia alcanzó un rendimiento anual del 159%, muy por encima del 120% de la estrategia Buy and Hold.
Si se ajusta el parámetro ATR de forma demasiado radical, puede dar lugar a una baja oportunidad de acceso. El parámetro puede ampliarse adecuadamente para aumentar la frecuencia de acceso.
Los indicadores de tendencia pueden generar errores y no coinciden con las tendencias reales, se debe agregar un factor de confirmación para evitar posibles pérdidas.
El ciclo de retrospección es de 6 años, por lo que es necesario ampliar el intervalo de muestras y hacer pruebas de estabilidad para evitar la sobreadaptación.
No se puede juzgar el rendimiento en situaciones extremas, como la rápida monopolización de la situación, la necesidad de intervención manual o la configuración de un bloqueo programado.
Aumentar los indicadores de confirmación de tendencias, como MACD, KDJ, etc., para determinar la dirección de la tendencia con mayor precisión.
Los parámetros de ATR se pueden ajustar de acuerdo con las diferentes variedades y condiciones del mercado para optimizar la tasa de fluctuación.
Aumentar la posición en caso de una ruptura.
Prueba el efecto de diferentes métodos de deterioro, como el deterioro porcentual, el deterioro por fluctuación, etc.
Evaluar el número de operaciones, la estabilidad de la curva de ganancias, la máxima retirada, etc., para asegurar la solidez de la estrategia.
La estrategia integra las ventajas de la volatilidad de los precios y el juicio de la tendencia, el momento oportuno para juzgar la posibilidad de reversión de los precios en caso de agudización de la volatilidad, la configuración de un stop loss dinámico para controlar el riesgo, y los resultados de la retrospectiva son buenos para obtener mejores ganancias. Sin embargo, con un intervalo de muestra de solo 6 años, la configuración de los parámetros clave debe ajustarse a los diferentes mercados y introducir más factores de confirmación para reducir la probabilidad de error. Además, se necesita una prueba de solidez más completa de la estrategia para que se pueda usar realmente en el mercado de operaciones reales. En general, la estrategia ofrece una forma de pensar para invertir el uso de la volatilidad, pero también requiere una optimización y una prueba más profundas para ser una estrategia de estabilidad y fiabilidad.
/*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)
// }