Tendencia de los índices de rentabilidad de acuerdo con la estrategia

El autor:¿ Qué pasa?, fecha: 2023-11-16 15:33:40
Las etiquetas:

Resumen general

Esta estrategia combina el indicador RSI y el promedio móvil ponderado para la tendencia después de la negociación. Va largo cuando el RSI está por encima de 60 y va corto cuando el RSI está por debajo de 40, con el promedio móvil verificando la condición de la tendencia. El RSI de 40 períodos actúa como un indicador de tendencia. El promedio móvil ponderado utiliza diferentes pesos para reducir el impacto de las fluctuaciones a corto plazo. La estrategia también emplea stop loss y trailing take profit para controlar riesgos.

Estrategia lógica

La estrategia primero calcula el RSI y la media móvil ponderada. La longitud del RSI es de 20 períodos y la longitud del MA ponderada es de 20 con pesos más altos que reducen el impacto de la volatilidad a corto plazo. Se hace largo cuando el RSI está por encima de 60 y la tasa de cambio del MA ponderado está por debajo de -1%. Se hace corto cuando el RSI está por debajo de 40 y la tasa de cambio del MA ponderado está por encima del 1%.

Después de abrir largo o corto, las órdenes de stop loss y trailing take profit se colocan simultáneamente. La stop loss se establece en 3 ATR desde el precio actual. La activación inicial de trailing take profit está a 4 ATR de distancia, y se realiza en incrementos del 3%. Cuando el precio alcanza la activación de stop loss o trailing take profit, la posición se cerrará.

La estrategia también incorpora reglas de gestión de dinero basadas en el enfoque de tamaño de posición fraccionario fijo.

Análisis de ventajas

  • El indicador RSI puede realizar un seguimiento eficaz de las tendencias
  • El MA ponderado reduce el impacto de las fluctuaciones a corto plazo, evitando los problemas de balance.
  • El retraso en la obtención de beneficios permite maximizar los beneficios.
  • Los controles de dimensionamiento de la posición de la fracción fija son eficaces en el riesgo

La ventaja general es la capacidad de seguir las tendencias, mientras se toman medidas de stop loss y trailing take profit para controlar los riesgos, capturando así ganancias significativas en tendencias fuertes.

Análisis de riesgos

  • Las señales falsas del RSI pueden causar operaciones innecesarias
  • Se ve obligado a parar cuando las infracciones de precios se detienen o los niveles de ganancias disminuyen, incapaz de seguir las tendencias
  • Las reglas agresivas de gestión de dinero pueden llevar a grandes pérdidas

Los principales riesgos provienen de la confiabilidad de las señales RSI y la configuración de stop loss/trailing take profit. Los parámetros incorrectos pueden resultar en el cierre innecesario de operaciones o pérdidas más allá del apetito por el riesgo. Romper el stop loss/take profit también puede forzar stop out injustificados, perdiendo la oportunidad de continuar el comercio de tendencia.

Las soluciones incluyen optimizar los parámetros del RSI o agregar otros indicadores para la confirmación de la señal. Ajustar los niveles de stop/trailing take profit basados en diferentes productos y condiciones de volatilidad. También ser prudente con las reglas de gestión de dinero para evitar riesgos excesivos.

Direcciones de optimización

  • Prueba otros indicadores junto con el RSI para confirmar la señal, por ejemplo, KD, MACD, etc.
  • Optimizar los parámetros de stop loss y trailing take profit basados en las características del producto y el rango de volatilidad
  • Pruebe otras técnicas de gestión de dinero como el comercio de tamaño fijo, fórmula de Kelly, etc.
  • Añadir condiciones de entrada como breakouts de Bollinger, divergencias del RSI, etc.
  • Considere la posibilidad de añadir posiciones en tendencias fuertes

Hay muchos aspectos a optimizar. El primero es identificar otros indicadores para complementar las señales del RSI. El siguiente paso crítico es optimizar los parámetros de stop loss/trailing take profit basados en el rendimiento histórico. La gestión de dinero también puede cambiar a otros tipos. Finalmente, las condiciones de entrada y adición se pueden mejorar a posiciones piramidal en tendencias fuertes.

Resumen de las actividades

La estrategia de seguimiento de tendencia del RSI tiene una lógica clara, utilizando el RSI para la dirección de la tendencia y el MA ponderado para la confirmación. Su fortaleza radica en el comercio de tendencias, maximizando las ganancias con paradas / gestión de dinero que controlan los riesgos. Pero la confiabilidad del RSI y la optimización de parámetros necesitan mejora. Podemos buscar mejorar los indicadores de señal, parámetros de parada / seguimiento, métodos de gestión de dinero, etc. para hacer que la estrategia sea más robusta en diferentes productos.

[/trans] ¿Qué quieres decir?


/*backtest
start: 2023-01-01 00:00:00
end: 2023-06-24 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/
// © gsanson66


//This code is based on RSI and a backed weighted MA
//@version=5
strategy("RSI + MA BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18)


//------------------------FUNCTIONS---------------------------//

//@function which calculate a retro weighted moving average to minimize the impact of short term reversal
rwma(source, length) =>
    sum = 0.0
    denominator = 0.0
    weight = 0.0
    weight_x = 100/(4+(length-4)*1.30)
    weight_y = 1.30*weight_x
    for i=0 to length - 1
        if i <= 3
            weight := weight_x
        else
            weight := weight_y
        sum := sum + source[i] * weight
        denominator := denominator + weight
    rwma = sum/denominator

//@function which permits the user to choose a moving average type
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "RWMA" => rwma(source, length)

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//--------------------------------USER INPUTS-------------------------------//

//Technical parameters
rsiLengthInput = input.int(20, minval=1, title="RSI Length", group="RSI Settings")
maTypeInput = input.string("RWMA", title="MA Type", options=["SMA", "RWMA"], group="MA Settings", inline="1")
maLenghtInput = input.int(20, minval=1, title="MA Length", group="MA Settings", inline="1")
rsiLongSignalValue = input.int(60, minval=1, maxval=99, title="RSI Long Signal", group="Strategy parameters", inline="3")
rsiShortSignalValue = input.int(40, minval=1, maxval=99, title="RSI Short Signal", group="Strategy parameters", inline="3")
rocMovAverLongSignalValue = input.float(-1, maxval=0, title="ROC MA Long Signal", group="Strategy parameters", inline="4")
rocMovAverShortSignalValue = input.float(1, minval=0, title="ROC MA Short Signal", group="Strategy parameters", inline="4")
//TP Activation and Trailing TP
takeProfitActivationInput = input.float(4, minval=1.0, title="TP activation in multiple of ATR", group="Strategy parameters")
trailingStopInput = input.float(3, minval=0, title="Trailing TP in percentage", group="Strategy parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2018 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")

strategy.initial_capital = 50000

//------------------------------VARIABLES INITIALISATION-----------------------------//

float rsi = ta.rsi(close, rsiLengthInput)
float ma = ma(close, maLenghtInput, maTypeInput)
float roc_ma = ((ma/ma[maLenghtInput]) - 1)*100
float atr = ta.atr(20)
var float trailingStopOffset = na
var float trailingStopActivation = na
var float trailingStop = na
var float stopLoss = na
var bool long = na
var bool short = na
var bool bufferTrailingStopDrawing = na
float theoreticalStopPrice = na
bool inRange = na
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))
    strategy.close_all()
    bufferTrailingStopDrawing := false
    stopLoss := na
    trailingStopActivation := na
    trailingStop := na
    short := false
    long := false


//------------------------------STOP LOSS AND TRAILING STOP ACTIVATION----------------------------//

// We handle the stop loss and trailing stop activation 
if (low <= stopLoss or high >= trailingStopActivation) and long
    if high >= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if low <= stopLoss
        long := false
    stopLoss := na
    trailingStopActivation := na
if (low <= trailingStopActivation or high >= stopLoss) and short
    if low <= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if high >= stopLoss
        short := false
    stopLoss := na
    trailingStopActivation := na


//-------------------------------------TRAILING STOP--------------------------------------//

// If the traling stop is activated, we manage its plotting with the bufferTrailingStopDrawing
if bufferTrailingStopDrawing and long
    theoreticalStopPrice := high - trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice > trailingStop
        trailingStop := theoreticalStopPrice
    else if low <= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        long := false
if bufferTrailingStopDrawing and short
    theoreticalStopPrice := low + trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice < trailingStop
        trailingStop := theoreticalStopPrice
    else if high >= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        short := false


//---------------------------------LONG CONDITION--------------------------//

if rsi >= 60 and roc_ma <= rocMovAverLongSignalValue and inRange and not long
    if short
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        short := false
    trailingStopActivation := close + takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close - 3*atr
    long := true
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
    strategy.exit("Exit Long", "Long", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------SHORT CONDITION-------------------------------//

if rsi <= 40 and roc_ma >= rocMovAverShortSignalValue and inRange and not short
    if long
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        long := false
    trailingStopActivation := close - takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close + 3*atr
    short := true
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)
    strategy.exit("Exit Short", "Short", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------PLOTTING ELEMENT---------------------------------//

// Plotting of element in the graph
plotchar(rsi, "RSI", "", location.top, color.rgb(0, 214, 243))
plot(ma, "MA", color.rgb(219, 219, 18))
plotchar(roc_ma, "ROC MA", "", location.top, color=color.orange)
// Visualizer trailing stop and stop loss movement
plot(stopLoss, "SL", color.red, 3, plot.style_linebr)
plot(trailingStopActivation, "Trigger Trail", color.green, 3, plot.style_linebr)
plot(trailingStop, "Trailing Stop",  color.blue, 3, plot.style_linebr)


Más.