Rétracement de Fibonacci Stratégie de stop loss dynamique

Auteur:ChaoZhang est là., Date: 2024-02-06 14:33:06 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie utilise les niveaux de retracement de Fibonacci pour définir automatiquement le stop loss et prendre les prix de profit pour la gestion de position.

La logique de la stratégie

Le noyau de cette stratégie repose sur l'indicateur de retracement de Fibonacci pour déterminer les niveaux de support et de résistance clés. Il suit les hauts et les bas récents pour tracer 10 zones de prix de Fibonacci. En fonction de la configuration, l'un des niveaux de Fibonacci est choisi comme déclencheur d'entrée. Lorsque le prix dépasse ce niveau, un ordre long sera placé en fonction du levier configuré.

Après l'entrée, la stratégie continue à suivre les niveaux de Fibonacci mis à jour. Si un niveau Fib inférieur émerge, indiquant un renversement potentiel, la stratégie annulera les ordres existants et ré-placera les ordres au prix inférieur en tant que mécanisme de stop loss. Lorsque le prix dépasse finalement le prix de prise de profit, la position sera fermée pour le profit.

Les avantages

Le plus grand avantage de cette stratégie est la capacité d'ajuster dynamiquement le stop loss et de prendre des prix de profit pour les marchés tendance.

  1. Capturez des profits plus importants dans des conditions de tendance en arrêtant les trailers basés sur le prix d'entrée.

  2. Atténuer les pertes dans la consolidation en s'arrêtant à des niveaux Fib plus bas émergents.

  3. Permettez la pyramide en ajoutant à la position lorsque le prix chute un certain pourcentage par rapport au dernier prix d'entrée.

  4. Facile à utiliser avec un placement automatique de commandes une fois correctement configuré.

Les risques

Il y a encore des risques à prendre en compte:

  1. Prédisposé à des arrêts répétés pendant les marchés latéraux, augmentation des frais.

  2. Aucun mécanisme de stop loss fixe, risque de grosses pertes.

  3. Une pyramide non couverte pourrait exacerber les pertes.

Solution correspondante:

  1. Arrêter la négociation lorsque le prix oscille dans la fourchette.

  2. Surveiller manuellement les marchés et fermer les positions si nécessaire.

  3. Mettez des limites aux ordres pyramidaux.

Des possibilités d'amélioration

Il reste beaucoup de place pour l'optimisation:

  1. Ajoutez des indicateurs supplémentaires comme EMA, MACD pour une confirmation d'entrée supplémentaire pour éviter de fausses ruptures.

  2. Incorporer des mécanismes d'arrêt des pertes fixes/trailing pour limiter les pertes dans des conditions extrêmes.

  3. Améliorer la logique de la pyramide basée sur les régimes de marché pour éviter le surendettement.

  4. Utiliser des modèles d'apprentissage automatique comme LSTM pour prévoir le prix et identifier de meilleures entrées/sorties.

Conclusion

En résumé, cette stratégie est adaptée aux scénarios de déclin des tendances. En ajustant constamment les arrêts, elle permet de conduire efficacement les tendances. Des optimisations et des garde-corps appropriés sont nécessaires pour gérer des conditions de marché plus difficiles.


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

Plus de