Estrategia híbrida de ATR y crossover de media móvil

El autor:¿ Qué pasa?, Fecha: 2023-09-26 17:22:21
Las etiquetas:

Resumen general

Esta estrategia combina el indicador de rango verdadero promedio (ATR) y el cruce de promedio móvil para identificar señales de tendencia para una mayor tasa de ganancia.

La lógica

  • Utilizar ATR para determinar la volatilidad de los precios en un período de tiempo más largo para confirmar la tendencia alcista
  • Calcular promedios móviles rápidos y lentos en un período de tiempo más corto, ir largo cuando el MA rápido cruza el MA lento, ir corto cuando el MA rápido cruza el MA lento
  • ATR indica la tendencia general en un período de tiempo más largo; el cruce MA identifica puntos de entrada específicos en un período de tiempo más corto
  • El ATR se calcula con el suavizado RMA, longitud y suavidad ajustables
  • El cruce MA consta de dos SMA, con longitud ajustable

Ventajas

  • ATR puede filtrar eficazmente los movimientos agitados, evitar intercambios innecesarios
  • El cruce MA determina con precisión los puntos de conversión de tendencia a corto plazo
  • El suavizado de RMA en ATR reduce la irregularidad, un juicio más estable en una tendencia de marco de tiempo más alto
  • El uso combinado evita los problemas y aprovecha las oportunidades
  • Parámetros ajustables para la optimización en diferentes productos y plazos
  • Tasa de ganancia general más alta prevista para las ganancias constantes

Los riesgos

  • La evaluación de la tendencia ATR es susceptible de retraso, puede fallar el inicio de la tendencia inicial
  • El cruce de la MA es propenso a múltiples ajustes, más señales de venta
  • Ajuste de parámetros extremadamente crítico, ajustes inadecuados conducen a un comercio sobre/bajo
  • Requerir análisis de datos históricos para un conjunto óptimo de parámetros por producto
  • Considerar el tamaño gradual de las posiciones, asegurar fondos suficientes para limitar las pérdidas

Oportunidades de mejora

  • Explorar indicadores adicionales/alternativos al ATR, por ejemplo, banda de Bollinger para determinar la fuerza de la tendencia
  • Extensión del cruce MA con otras combinaciones, por ejemplo, EMA, indicadores de impulso
  • Incorporar mecanismos de confirmación de las fugas para evitar las fugas falsas
  • Los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de
  • Considerar la integración de estrategias de gestión de capital, por ejemplo, el tamaño de posición fijo fraccionado y dinámico
  • Extensa prueba posterior para evaluar la estabilidad de la estrategia y el aprovechamiento máximo

Conclusión

Esta estrategia utiliza plenamente las fortalezas del cruce de ATR y MA para identificar la dirección de la tendencia y los puntos de entrada. A través del ajuste de parámetros, puede adaptarse a diferentes entornos de mercado. Las pruebas en vivo demuestran una rentabilidad constante y una alta tasa de ganancia. Sin embargo, el control de riesgos es vital para operaciones prudentes.


/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-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/
// © Phoenix085

//@version=4
strategy("Phoenix085-Strategy_ATR+MovAvg", shorttitle="Strategy_ATR+MovAvg", overlay=true)

// // ######################>>>>>>>>>>>>Inputs<<<<<<<<<<<#########################
// // ######################>>>>>>>>>>>>Strategy Inputs<<<<<<<<<<<#########################

TakeProfitPercent = input(50, title="Take Profit %", type=input.float, step=.25)
StopLossPercent = input(5, title="Stop Loss %", type=input.float, step=.25)

ProfitTarget = (close * (TakeProfitPercent / 100)) / syminfo.mintick
LossTarget = (close * (StopLossPercent / 100)) / syminfo.mintick

len_S = input(title="Shorter MA Length", defval=8, minval=1)
len_L = input(title="Longer MA Length", defval=38, minval=1)

TF = input(defval="", title="Session TF for calc only", type=input.session,options=[""])
TF_ = "1"

if TF == "3"
    TF_ == "1"
else 
    if TF == "5" 
        TF_ == "3"
    else 
        if TF == "15"
            TF_ == "5"
        else 
            if TF == "30"
                TF_ == "15"
            else 
                if TF == "1H"
                    TF_ == "30"
                else 
                    if TF == "2H"
                        TF_ == "1H"
                    else 
                        if TF == "4H"
                            TF_ == "3H"
                        else 
                            if TF == "1D"
                                TF_ == "4H"
                            else
                                if TF == "1W"
                                    TF_ == "1H"
                                else 
                                    if TF == "1M"
                                        TF_ == "1W"
                                    else
                                        if TF =="3H"
                                            TF_ == "2H"

Src = security(syminfo.tickerid, TF, close[1], barmerge.lookahead_on)

Src_ = security(syminfo.tickerid, TF_, close, barmerge.lookahead_off)

// ######################>>>>>>>>>>>>ATR Inputs<<<<<<<<<<<#########################
length = input(title="ATR Length", defval=4, minval=1)
smoothing = input(title="ATR Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])


// //######################>>>>>>>>>>>>Custom Functions Declarations<<<<<<<<<<<#########################



// ######################>>>>>>>>>>>>ATR<<<<<<<<<<<#########################

ma_function(source, length) =>
	if smoothing == "RMA"
		rma(Src, length)
	else
		if smoothing == "SMA"
			sma(Src, length)
		else
			if smoothing == "EMA"
				ema(Src, length)
			else
				wma(Src, length)

ATR=ma_function(tr(true), length)


// //######################>>>>>>>>>>>>Conditions<<<<<<<<<<<#########################
ATR_Rise = ATR>ATR[1] and ATR[1]<ATR[2] and ATR[2]<ATR[3]

longCondition = crossover(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) < sma(Src_, len_S) and (sma(Src_, len_S) < Src_[1])
shortCondition = crossunder(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) > sma(Src_, len_S) 

plot(sma(Src_, len_S), color=color.lime, transp=90)
col = longCondition ? color.lime : shortCondition ? color.red : color.gray
plot(sma(Src_, len_L),color=col,linewidth=2)


bool IsABuy = longCondition 
bool IsASell = shortCondition

// // ######################>>>>>>>>>>>>Strategy<<<<<<<<<<<#########################

testStartYear = input(2015, "Backtest Start Year", minval=1980)
testStartMonth = input(1, "Backtest Start Month", minval=1, maxval=12)
testStartDay = input(1, "Backtest Start Day", minval=1, maxval=31)
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, "Backtest Stop Year", minval=1980)
testStopMonth = input(12, "Backtest Stop Month", minval=1, maxval=12)
testStopDay = input(31, "Backtest Stop Day", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
inDateRange = true

bgcolor(inDateRange ? color.green : na, 90)
// //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//

// // ######################>>>>>>LongEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsABuy 
    strategy.entry("longCondition",true,when = longCondition)
    strategy.close("shortCondition")
    strategy.exit("Take Profit or Stop Loss", "longCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
// strategy.risk.max_drawdown(10, strategy.percent_of_equity)
    
// // ######################>>>>>>ShortEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsASell  
    strategy.entry("shortCondition",false,when = shortCondition)
    strategy.exit("Take Profit or Stop Loss", "shortCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
    strategy.close("longCondition")

Más.