Tendencia basada en ATR y RSI siguiendo la estrategia de negociación

El autor:¿ Qué pasa?, Fecha: 2023-10-09 15:18:10
Las etiquetas:

Resumen general

Esta estrategia diseña un sistema de negociación con función de seguimiento de tendencias basado en el rango verdadero promedio (ATR) y el índice de fuerza relativa (RSI). Puede identificar automáticamente la dirección de la tendencia y tiene características de stop loss y take profit.

Estrategia lógica

  1. Calcule ATR y RSI. ATR refleja la volatilidad promedio de los precios durante un período. RSI refleja la comparación de poder entre los toros y los osos.

  2. Cuando el ATR es superior a su media móvil, se considera un período de alta volatilidad adecuado para la negociación.

  3. Cuando el RSI está por encima de la línea de sobrecompra, ir largo.

  4. Después de largo, utilizar el punto más alto multiplicado por una relación fija como precio de stop-loss.

  5. Tome el beneficio por la proporción de ganancias.

Análisis de ventajas

  1. Las órdenes de stop loss pueden maximizar las órdenes de stop loss para reducir pérdidas.

  2. El RSI puede juzgar eficazmente el poder de los alcistas y los bajistas para evitar la apertura repetida de posiciones en mercados de rango.

  3. Como indicador de volatilidad, el ATR puede filtrar los mercados limitados al rango y solo operar en mercados de tendencia.

  4. Tome ganancias por la relación de ganancias puede bloquear en algunas ganancias.

Análisis de riesgos

  1. Tanto el ATR como el RSI son indicadores con retraso, lo que puede conducir a un tiempo de entrada tardío.

  2. La relación de pérdidas y ganancias fijas para el stop loss y el take profit es propensa a una optimización excesiva, por lo que debe establecerse con prudencia en función de los resultados de las pruebas de retroceso.

  3. En los grandes mercados de rango de ciclo, el ATR puede ser mayor que el promedio móvil durante un largo tiempo, lo que conduce a una sobrenegociación.

Direcciones de optimización

  1. Optimizar los parámetros de ATR y RSI para hacer que el sistema sea más sensible.

  2. Añadir MA y otros indicadores para determinar la dirección de la tendencia, evitar entrar erróneamente en los mercados de rango.

  3. Pruebe el stop loss dinámico y tome los ratios de ganancia, en lugar de los ajustes fijos.

  4. Considere la posibilidad de añadir medidas de control del tamaño de las operaciones.

Resumen de las actividades

Esta estrategia integra las ventajas de los indicadores ATR y RSI y diseña una tendencia simple y práctica siguiendo el sistema de negociación. Mejora aún más la estabilidad del sistema mediante la optimización de parámetros y la adición de filtros. En general, esta estrategia tiene un fuerte valor práctico para el comercio en vivo.


/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © liwei666
//@version=5
// # ========================================================================= #
// #                   |   Strategy  |
// # ========================================================================= #
strategy(
 title                = "ATR_RSI_Strategy v2[liwei666]",
 shorttitle           = "ATR_RSI_Strategy",
 overlay              =  true,
 max_lines_count                 =  500, 
 max_labels_count                =  500, 
 max_boxes_count                 =  500,
 max_bars_back = 5000,
 initial_capital = 10000,
 default_qty_type=strategy.percent_of_equity, 
 default_qty_value=50, commission_type=strategy.commission.percent, pyramiding=1, 
 commission_value=0.05
 )
// # ========================================================================= #
// #                   |   Strategy  |
// # ========================================================================= #

atr_length = input.int(26, "atr_length", minval = 6, maxval = 100, step=1)
atr_ma_length = input.int(45, "atr_ma_length", minval = 6, maxval = 100, step=1)
rsi_length = input.int(15, "rsi_length", minval = 6, maxval = 100, step=1)
rsi_entry = input.int(10, "rsi_entry", minval = 6, maxval = 100, step=1)
atr_ma_norm_min = input.float(0.3, "atr_ma_norm_min", minval = 0.1, maxval = 0.5, step=0.1)
atr_ma_norm_max = input.float(0.7, "atr_ma_norm_max", minval = 0.5, maxval = 1, step=0.1)
trailing_percent= input.float(1.5, "trailing_percent", minval = 0.1, maxval = 2, step=0.1)

var rsi_buy = 50 + rsi_entry
var rsi_sell = 50 - rsi_entry

sma_norm_h_45() => 
    source = high
    n = 45
    sma = ta.sma(source, n) 
    sma_norm = (sma - ta.lowest(sma, n)) / (ta.highest(sma,n) - ta.lowest(sma, n))
    sma_norm

atr_value = ta.atr(atr_length)
atr_ma = ta.sma(atr_value, atr_ma_length) 
rsi_value = ta.rsi(close, length = rsi_length) 
atr_ma_norm = atr_ma / close * 100
sma_norm = sma_norm_h_45()

var intra_trade_high = 0.0
var intra_trade_low = 0.0

if strategy.position_size == 0
    intra_trade_high := high
    intra_trade_low := low

    if atr_ma_norm >= atr_ma_norm_min and atr_ma_norm <= atr_ma_norm_max
        if atr_value > atr_ma
            if rsi_value > rsi_buy
                strategy.entry("B1", strategy.long, limit = close + 5 )
            else if rsi_value < rsi_sell
                strategy.entry("S1", strategy.short, limit = close - 5 )
else if strategy.position_size > 0
    intra_trade_high := math.max(intra_trade_high, high)
    intra_trade_low := low

    long_tp = intra_trade_high * (1 - trailing_percent / 100)
    strategy.exit("Exit B1", from_entry="B1", stop = long_tp, limit = strategy.position_avg_price * 1.03)

else if strategy.position_size < 0
    intra_trade_high := high
    intra_trade_low := math.min(intra_trade_low, low) 

    short_tp = intra_trade_low * (1 + trailing_percent / 100)
    strategy.exit("Exit S1", from_entry="S1", stop = short_tp, limit = strategy.position_avg_price * 0.94)

Más.