Estrategia dinámica de stop loss de retroceso de Fibonacci

El autor:¿ Qué pasa?, Fecha: 2024-02-06 14:33:06
Las etiquetas:

img

Resumen general

Esta estrategia utiliza los niveles de retroceso de Fibonacci para establecer automáticamente el stop loss y tomar precios de ganancia para la gestión de posiciones.

Estrategia lógica

El núcleo de esta estrategia se basa en el indicador de retroceso de Fibonacci para determinar los niveles clave de soporte y resistencia. Rastrea los máximos y mínimos recientes para trazar 10 zonas de precios de Fibonacci. Basado en la configuración, se elige uno de los niveles de Fibonacci como el disparador de entrada. Cuando el precio se rompe por encima de ese nivel, se colocará un pedido largo basado en el apalancamiento configurado. Al mismo tiempo, se establece un precio de toma de ganancias a un cierto porcentaje por encima del precio de entrada.

Si aparece un nivel Fib más bajo, lo que indica una posible reversión, la estrategia cancelará las órdenes existentes y volverá a colocarlas al precio más bajo como un mecanismo de stop loss.

Ventajas

La mayor ventaja de esta estrategia es la capacidad de ajustar dinámicamente el stop loss y tomar precios de ganancia para los mercados de tendencia.

  1. Captura mayores ganancias en condiciones de tendencia mediante paradas de seguimiento basadas en el precio de entrada.

  2. Mitigar las pérdidas en la consolidación al detenerse en los niveles Fib más bajos emergentes.

  3. Permitir la pirámide añadiendo a la posición cuando el precio cae cierto porcentaje del último precio de entrada.

  4. Simple de operar con la colocación automática de pedidos una vez configurado correctamente.

Los riesgos

Todavía hay algunos riesgos a tener en cuenta:

  1. Suelen detenerse repetidamente durante los mercados laterales, aumentando las tarifas.

  2. No hay un mecanismo fijo de stop loss, hay un riesgo de grandes reducciones.

  3. Una pirámide abierta podría exacerbar las pérdidas.

Soluciones correspondientes:

  1. Pausa la negociación cuando el precio oscila en el rango.

  2. Supervisa manualmente los mercados y cierra posiciones si es necesario.

  3. Establece límites en las órdenes piramidal.

Oportunidades de mejora

Queda mucho espacio para la optimización:

  1. Añadir indicadores adicionales como EMA, MACD para confirmación de entrada adicional para evitar fallas falsas.

  2. Incorporar mecanismos fijos de detención de pérdidas para limitar las pérdidas en condiciones extremas.

  3. Refinar la lógica piramidal basada en los regímenes de mercado para evitar el apalancamiento excesivo.

  4. Emplear modelos de aprendizaje automático como LSTM para pronosticar el precio e identificar mejores entradas/salidas.

Conclusión

En resumen, esta estrategia es adecuada para escenarios de tendencia que se desvanecen. Al ajustar constantemente las paradas, permite manejar las tendencias de manera efectiva. Se necesitan optimizaciones adecuadas y barandillas de protección para manejar condiciones de mercado más difíciles.


/*backtest
start: 2024-01-06 00:00:00
end: 2024-02-05 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/
// © CryptoRox

//@version=4
//Paste the line below in your alerts to run the built-in commands.
//{{strategy.order.alert_message}}
strategy(title="Fibs limit only", shorttitle="Strategy", overlay=true, precision=8, pyramiding=1000, commission_type=strategy.commission.percent, commission_value=0.04)

//Settings 
testing = input(false, "Live")
//Use epochconverter or something similar to get the current timestamp.
starttime = input(1600976975, "Start Timestamp") * 1000
//Wait XX seconds from that timestamp before the strategy starts looking for an entry.
seconds = input(60, "Start Delay") * 1000
testPeriod = true


leverage = input(1, "Leverage")
tp = input(1.0, "Take Profit %") / leverage
dca = input(-1.0, "DCA when < %") / leverage *-1
fibEntry = input("1", "Entry Level", options=["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"])

//Strategy Calls
equity = strategy.equity
avg = strategy.position_avg_price
symbol = syminfo.tickerid
openTrades = strategy.opentrades
closedTrades = strategy.closedtrades
size = strategy.position_size

//Fibs
lentt = input(60, "Pivot Length")
h = highest(lentt)
h1 = dev(h, lentt) ? na : h
hpivot = fixnan(h1)
l = lowest(lentt)
l1 = dev(l, lentt) ? na : l
lpivot = fixnan(l1)
z = 400
p_offset= 2
transp = 60
a=(lowest(z)+highest(z))/2
b=lowest(z)
c=highest(z)

fib0 = (((hpivot - lpivot)) + lpivot)
fib1 = (((hpivot - lpivot)*.21) + lpivot)
fib2 = (((hpivot - lpivot)*.3) + lpivot)
fib3 = (((hpivot - lpivot)*.5) + lpivot)
fib4 = (((hpivot - lpivot)*.62) + lpivot)
fib5 = (((hpivot - lpivot)*.7) + lpivot)
fib6 = (((hpivot - lpivot)* 1.00) + lpivot)
fib7 = (((hpivot - lpivot)* 1.27) + lpivot)
fib8 = (((hpivot - lpivot)* 2) + lpivot)
fib9 = (((hpivot - lpivot)* -.27) + lpivot)
fib10 = (((hpivot - lpivot)* -1) + lpivot)

notna = nz(fib10[60])
entry = 0.0
if fibEntry == "1"
    entry := fib10
if fibEntry == "2"
    entry := fib9
if fibEntry == "3"
    entry := fib0
if fibEntry == "4"
    entry := fib1
if fibEntry == "5"
    entry := fib2
if fibEntry == "6"
    entry := fib3
if fibEntry == "7"
    entry := fib4
if fibEntry == "8"
    entry := fib5
if fibEntry == "9"
    entry := fib6
if fibEntry == "10"
    entry := fib7
profit = avg+avg*(tp/100)
pause = 0
pause := nz(pause[1])
paused = time < pause

fill = 0.0
fill := nz(fill[1])
count = 0.0
count := nz(fill[1])

filled = count > 0 ? entry > fill-fill/100*dca : 0
signal = testPeriod and notna and not paused and not filled ? 1 : 0

neworder = crossover(signal, signal[1])
moveorder = entry != entry[1] and signal and not neworder ? true : false
cancelorder = crossunder(signal, signal[1]) and not paused
filledorder = crossunder(low[1], entry[1]) and signal[1]

last_profit = 0.0
last_profit := nz(last_profit[1])

if neworder and signal
    strategy.order("New", 1, 0.0001, alert_message='New Order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry)) 
if moveorder
    strategy.order("Move", 1, 0.0001, alert_message='Move Order|e=binancefuturestestnet s=btcusdt b=long c=order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry))
if filledorder and size < 1
    fill := entry
    count := count+1 
    pause := time + 60000
    p = close+close*(tp/100)
    strategy.entry("Filled", 1, 1,  alert_message='Long Filled|e=binancefuturestestnet s=btcusdt b=short c=order|delay=1|e=binancefuturestestnet s=btcusdt b=long c=position q=100% ro=1 fp=' + tostring(p))
if filledorder and size >= 1
    fill := entry
    count := count+1 
    pause := time + 60000
    strategy.entry("Filled", 1, 1,  alert_message='Long Filled|e=binancefuturestestnet s=btcusdt b=short c=order|delay=1|e=binancefuturestestnet s=btcusdt b=long c=position q=100% ro=1 fp=' + tostring(profit))

if cancelorder and not filledorder
    pause := time + 60000
    strategy.order("Cancel", 1, 0.0001,  alert_message='Cancel Order|e=binancefuturestestnet s=btcusdt b=long c=order')

if filledorder
    last_profit := profit

closeit = crossover(high, profit) and size >= 1
if closeit
    strategy.entry("Close ALL", 0, 0, alert_message='Profit')
    count := 0
    fill := 0.0
    last_profit := 0.0
    
//Plots
bottom = signal ? color.green : filled ? color.red : color.white
plot(entry, "Entry", bottom)

Más.