Estratégia de Stop Loss Dinâmica de Retracement de Fibonacci

Autora:ChaoZhang, Data: 2024-02-06 14:33:06
Tags:

img

Resumo

Esta estratégia utiliza os níveis de retração de Fibonacci para definir automaticamente o stop loss e tomar preços de lucro para a gestão de posições.

Estratégia lógica

O núcleo desta estratégia depende do indicador de retração de Fibonacci para determinar os principais níveis de suporte e resistência. Ele rastreia os altos e baixos recentes para traçar 10 zonas de preços de Fibonacci. Com base na configuração, um dos níveis de Fibonacci é escolhido como gatilho de entrada. Quando o preço ultrapassa esse nível, uma ordem longa será colocada com base na alavancagem configurada. Ao mesmo tempo, um preço de take profit é definido em uma certa porcentagem acima do preço de entrada.

Após a entrada, a estratégia continua a rastrear os níveis atualizados de Fibonacci. Se um nível Fib mais baixo emergir, indicando uma reversão potencial, a estratégia cancelará as ordens existentes e colocará ordens no preço mais baixo como um mecanismo de stop loss. Quando o preço finalmente ultrapassar o preço de take profit, a posição será fechada para lucro.

Vantagens

A maior vantagem desta estratégia é a capacidade de ajustar dinamicamente o stop loss e tomar preços de lucro para os mercados de tendência.

  1. Capture maiores lucros em condições de tendência por trailing paradas com base no preço de entrada.

  2. Mitigar as perdas na consolidação parando nos níveis mais baixos de Fib emergentes.

  3. Permitir a pirâmide adicionando à posição quando o preço cai uma certa porcentagem do último preço de entrada.

  4. Simples de operar com colocação automática de pedidos uma vez configurado corretamente.

Riscos

Ainda existem alguns riscos a tomar em consideração:

  1. São propensos a paradas repetidas durante os mercados laterais, aumentando as taxas.

  2. Não há um mecanismo fixo de stop loss, há riscos de grandes drawdowns.

  3. A pirâmide desfeita pode exacerbar as perdas.

Soluções correspondentes:

  1. Pausar a negociação quando o preço oscilar no intervalo.

  2. Supervisar manualmente os mercados e fechar posições, se necessário.

  3. Definir limites para ordens de pirâmide.

Oportunidades de melhoria

Ainda há muito espaço para otimização:

  1. Adicionar indicadores adicionais como EMA, MACD para confirmação de entrada extra para evitar falhas.

  2. Incorporar mecanismos de stop loss fixos/trailing para limitar as perdas em condições extremas.

  3. Refinar a lógica da pirâmide baseada nos regimes de mercado para evitar a alavancagem excessiva.

  4. Empregar modelos de aprendizagem de máquina como o LSTM para prever o preço e identificar melhores entradas/saídas.

Conclusão

Em resumo, esta estratégia é adequada para cenários de tendência de desvanecimento. Ao ajustar constantemente as paradas, permite conduzir as tendências de forma eficaz.


/*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)

Mais.