Estrategia de toma de ganancias en movimiento del Joker


Fecha de creación: 2023-09-23 15:04:20 Última modificación: 2023-09-23 15:04:20
Copiar: 0 Número de Visitas: 786
1
Seguir
1617
Seguidores

Descripción general

La estrategia de paradas móviles Joker es una estrategia de seguimiento de tendencias basada en promedios móviles. Combina las características de paradas móviles y paradas móviles, con el objetivo de bloquear al máximo los beneficios cuando el movimiento se mueve en la dirección favorable, pero también puede detenerse lo antes posible cuando el movimiento se vuelve desfavorable.

Principio de estrategia

La estrategia utiliza las medias móviles rápidas y las medias móviles lentas para construir un filtro de tendencia. Haga más cuando cruza la media móvil lenta sobre la media móvil rápida; y haga menos cuando cruza la media móvil lenta debajo de la media móvil rápida.

La estrategia primero calcula el primer precio de parada después de abrir la posición en función del porcentaje de parada de la configuración. Si la función de parada móvil está activada, el tamaño del paso de parada móvil se calcula en función del precio de mínima variación de la variedad de transacción y el porcentaje de parada móvil de la configuración.

Cuando la dirección de la posición coincide con la dirección de la señal, si no se ha activado el stop móvil, se utiliza el método de parada de precio limitado; si se ha activado el stop móvil, se utiliza el método de parada de seguimiento, que ajusta continuamente el precio de parada según el tamaño del paso.

Análisis de las ventajas

  • Utiliza las medias móviles para determinar la dirección de las tendencias principales y evita que el ruido del mercado interfiera demasiado con la estrategia.

  • La activación de la parada móvil permite ajustar la posición de la parada en función de la evolución del mercado, lo que garantiza que la parada esté siempre cerca del precio. Esto es más flexible y eficiente que establecer un precio de parada fijo.

  • El stop móvil puede bloquear más ganancias y reducir el riesgo de pérdida de la estrategia. También evita el problema de que la posición de parada sea demasiado conservadora y bloquee las ganancias prematuramente si solo se establece un stop fijo.

  • La parada móvil conserva las ventajas de la parada de pérdidas establecida, que se puede detener lo antes posible cuando la situación se vuelve desfavorable.

Análisis de riesgos

  • Los promedios móviles son propensos a la formación de señales erróneas o de signos de retraso cuando los precios fluctúan fuertemente. Esto puede conducir a la pérdida de inversión de la estrategia. Se pueden ajustar los parámetros de los promedios móviles o agregar filtros para optimizarlos.

  • La configuración de un Stop Ratio demasiado grande también aumenta el tiempo de mantenimiento de la estrategia y el desvío entre el precio de la parada real y el precio teórico. Se puede reducir el riesgo de un Stop Ratio adecuado.

  • El paso de la parada móvil está configurado en una proporción demasiado pequeña, lo que puede conducir a una frecuencia de movimiento demasiado alta, lo que aumenta los costos de transacción y el riesgo de deslizamiento. Se puede ajustar el paso de la parada móvil para optimizar.

  • El parón móvil solo considera el movimiento unilateral y no considera el retroceso. Esto significa que el precio vuelve a retroceder y el parón móvil no se ajusta.

Dirección de optimización

  • Se puede considerar ajustar los parámetros de la media móvil en función de la dinámica de la tasa de fluctuación del mercado, aumentando el ciclo cuando aumenta la fluctuación y reduciendo el ciclo cuando disminuye la fluctuación.

  • Se pueden estudiar las características de las diferentes variedades y mercados, y se pueden establecer diferentes proporciones de estímulo por defecto para reducir el riesgo de desviación de estímulo.

  • Se puede estudiar el mecanismo de suspensión de movimiento bilateral, moviendo la suspensión hacia arriba cuando el precio alcanza un nuevo punto alto y moviendo la suspensión hacia abajo cuando se produce un retroceso, para que la suspensión esté más cerca del precio.

  • Se puede considerar la combinación con el indicador de fuerza de tendencia para reducir la proporción de paradas cuando la tendencia es débil y aumentar la proporción de paradas cuando la tendencia es fuerte.

  • Se puede considerar la combinación con modelos de aprendizaje automático para configurar dinámicamente la proporción de paradas utilizando el rango de precios que el modelo predice.

Resumir

La estructura general de la estrategia de parada móvil de Joker es clara, utiliza las medias móviles para determinar la dirección de la tendencia y luego ajusta dinámicamente la posición de la parada para bloquear los beneficios. Contiene las ventajas de la parada móvil y la parada móvil, que puede seguir la tendencia de manera efectiva y controlar el riesgo al mismo tiempo.

Código Fuente de la Estrategia
/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='Joker Trailing TP Bot', shorttitle='Joker TTP Bot', overlay=true, pyramiding=0, process_orders_on_close=false, close_entries_rule='ANY', calc_on_every_tick=false, calc_on_order_fills=false, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, currency=currency.USD) //, max_labels_count=500)

fromDate = input(timestamp('01 Jan 2021 00:00 UTC'), 'From Date')
toDate = input(timestamp('31 Dec 2121 23:59 UTC'), 'To Date')
fastMALen = input.int(23, 'Fast SMA Length')
slowMALen = input.int(50, 'Slow SMA Length')
longTakeProfitPerc = input.float(0.5, 'Long Take Profit %', minval=0.05, step=0.05) * 0.01
shortTakeProfitPerc = input.float(0.5, 'Short Take Profit %', minval=0.05, step=0.05) * 0.01
enableTrailing = input.bool(true, 'Enable Trailing')
trailingTakeProfitPerc = input.float(0.01, 'Trailing Take Profit %', minval=0.01, maxval=100, step=0.01) * 0.01

float fastMA = ta.sma(close, fastMALen)
float slowMA = ta.sma(close, slowMALen)
bool isWithinPeriod = true
bool openLongPosition = isWithinPeriod and ta.crossover(fastMA, slowMA)
bool openShortPosition = isWithinPeriod and ta.crossunder(fastMA, slowMA)
bool longIsActive = openLongPosition or strategy.position_size > 0
bool shortIsActive = openShortPosition or strategy.position_size < 0

float longTakeProfitPrice = na
longTakeProfitPrice := if longIsActive
    if openLongPosition and not (strategy.position_size > 0)
        close * (1 + longTakeProfitPerc)
    else
        nz(longTakeProfitPrice[1], close * (1 + longTakeProfitPerc))
else
    na

float shortTakeProfitPrice = na
shortTakeProfitPrice := if shortIsActive
    if openShortPosition and not (strategy.position_size < 0)
        close * (1 - shortTakeProfitPerc)
    else
        nz(shortTakeProfitPrice[1], close * (1 - shortTakeProfitPrice))
else
    na

float longTrailingTakeProfitStepTicks = longTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
float shortTrailingTakeProfitStepTicks = shortTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick

strategy.entry(id = 'Long Entry', direction = strategy.long, when = openLongPosition, alert_message = 'Long(' + syminfo.ticker + '): Started')
strategy.entry(id = 'Short Entry', direction = strategy.short, when = openShortPosition, alert_message = 'Short(' + syminfo.ticker + '): Started')
strategy.exit(id = 'Long Take Profit', from_entry = 'Long Entry', limit = enableTrailing ? na : longTakeProfitPrice, trail_price = enableTrailing ? longTakeProfitPrice : na, trail_offset = enableTrailing ? longTrailingTakeProfitStepTicks : na, when = longIsActive, alert_message = 'Long(' + syminfo.ticker + '): Take Profit activated')
strategy.exit(id = 'Short Take Profit', from_entry = 'Short Entry', limit = enableTrailing ? na : shortTakeProfitPrice, trail_price = enableTrailing ? shortTakeProfitPrice : na, trail_offset = enableTrailing ? shortTrailingTakeProfitStepTicks : na, when = shortIsActive, alert_message = 'Short(' + syminfo.ticker + '): Take Profit activated')

plot(series = fastMA, title='Fast SMA', color = color.blue, linewidth = 1, style = plot.style_line)
plot(series = slowMA, title='Slow SMA', color = color.orange, linewidth = 1, style = plot.style_line)
plot(series = longTakeProfitPrice, title='Long Take Profit', color = color.green, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = shortTakeProfitPrice, title='Short Take Profit', color = color.red, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = strategy.position_avg_price, title='Position', color = color.white, linewidth = 1, style = plot.style_linebr)