Stratégie de take profit dynamique multi-périodes MACD-V et Fibonacci

MACD MACD-V ATR EMA MA
Date de création: 2024-04-26 12:00:21 Dernière modification: 2024-06-25 11:28:55
Copier: 0 Nombre de clics: 908
1
Suivre
1617
Abonnés

Stratégie de take profit dynamique multi-périodes MACD-V et Fibonacci

Aperçu

La stratégie utilise le MACD-V (MACD avec ATR volatile) et le Fibonacci retracement pour prendre des décisions de négociation sur plusieurs périodes. Elle calcule les niveaux de MACD-V et de Fibonacci sur différentes périodes, puis décide d’ouvrir et de fermer une position en fonction de la relation du prix actuel avec le niveau de Fibonacci et de la valeur du MACD-V. La stratégie vise à capturer les tendances et les retournements du marché tout en contrôlant les risques.

Principe de stratégie

  1. L’indicateur MACD-V est calculé sur différentes périodes de temps (par exemple, 5 minutes et 30 minutes). Le MACD-V est basé sur le MACD et introduit un ajustement du taux de volatilité ATR pour s’adapter à différentes conditions du marché.
  2. Calculer les plus hauts et les plus bas prix sur une période donnée (par exemple, 9 cycles) sur une période de temps de niveau supérieur (par exemple, 30 minutes), puis calculer le niveau de rétroaction de Fibonacci sur cette période.
  3. Les conditions d’ouverture sont déterminées en fonction de la relation entre le prix de clôture actuel et le niveau de Fibonacci, ainsi que de la valeur et de la direction de la MACD-V. Par exemple, lorsque le prix revient à environ 38,2% du niveau de Fibonacci et que le MACD-V se déplace vers le bas entre 50 et 150, la position est ouverte.
  4. Après avoir ouvert une position, utilisez un stop mobile pour protéger les bénéfices et contrôler les risques. La position du stop mobile s’ajuste dynamiquement en fonction du mouvement des prix et des paramètres de la stratégie.
  5. Si le prix atteint un niveau de stop-loss mobile ou fixe, il est plafonné.

Analyse des avantages

  1. Les stratégies utilisent une analyse multi-temporelle pour mieux comprendre les tendances et les fluctuations du marché.
  2. L’indicateur MACD-V prend en compte la volatilité des prix et fonctionne efficacement dans les marchés tendanciels et volatiles.
  3. Les niveaux de Fibonacci permettent de bien saisir les zones de support et de résistance clés du prix et de fournir une référence pour les décisions de négociation.
  4. Le stop mobile permet de maintenir la rentabilité pendant la durée de la tendance, tout en réduisant la position en temps opportun et en contrôlant le risque lors d’un renversement des cours.
  5. La logique de la stratégie est claire, les paramètres sont réglables et l’adaptation est forte.

Analyse des risques

  1. La stratégie est de prévoir des échanges fréquents dans les marchés en crise, ce qui entraîne des coûts élevés.
  2. Les tendances de jugement basées sur les indicateurs techniques peuvent être mal interprétées en cas de fausse percée ou de perturbation continue du marché.
  3. Les positions de stop-loss fixes peuvent ne pas être en mesure de faire face à des situations extrêmes en temps opportun, ce qui entraîne des pertes plus importantes.
  4. Une mauvaise sélection de paramètres peut entraîner une mauvaise performance de la stratégie.

Direction d’optimisation

  1. L’introduction de plus de périodes et d’indicateurs, tels que des MAs à plus longues périodes, améliore la précision des jugements de tendances.
  2. Optimiser la gestion des positions, par exemple en ajustant la taille des positions en fonction de l’ATR ou de la dynamique des fourchettes de prix.
  3. Adaptation à différentes conditions de marché, avec différentes combinaisons de paramètres.
  4. L’introduction d’un stop mobile, sur la base d’un stop mobile, permet de mieux maîtriser le risque de baisse.
  5. Les stratégies sont retestées et les paramètres optimisés pour trouver la meilleure combinaison de paramètres.

Résumer

La stratégie juge les tendances et le moment d’ouvrir une position à l’aide de MACD-V et de Fibonacci sur plusieurs périodes de temps. La logique de la stratégie est claire et flexible, mais il peut y avoir des risques de transactions fréquentes et d’erreurs de jugement dans un marché en crise.

Merci

L’indicateur MACD-v utilisé dans cette stratégie est l’œuvre d’Alex Spiroglou. Pour plus de détails, vous pouvez vous référer à son travail:MACD-v.

Code source de la stratégie
/*backtest
start: 2024-03-26 00:00:00
end: 2024-04-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © catikur

//@version=5
strategy("Advanced MACD-V and Fibonacci Strategy with EMA Trailing TP", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=1000, margin_long=1./10*50, margin_short=1./10*50, slippage=0, commission_type=strategy.commission.percent, commission_value=0.05)

// Parametreler
fast_len = input.int(12, title="Fast Length", minval=1, group="MACD-V Settings")
slow_len = input.int(26, title="Slow Length", minval=1, group="MACD-V Settings")
signal_len = input.int(9, title="Signal Smoothing", minval=1, group="MACD-V Settings")
atr_len = input.int(26, title="ATR Length", minval=1, group="MACD-V Settings")
source = input.source(close, title="Source", group="MACD-V Settings")

//ema_length = input.int(20, title="EMA Length for Trailing TP", group="Trailing TP Settings")
trailing_profit = input.float(1000, title="Trailing Profit", minval=0.01, maxval=1000000, step=0.01, group="Trailing TP Settings")
trailing_offset = input.float(30000, title="Trailing Offset", minval=0.01, maxval=1000000, step=0.01, group="Trailing TP Settings")
trailing_factor = input.float(0.01, title="Trailing Factor", minval=0.01, maxval=1000000, step=0.01, group="Trailing TP Settings")
fix_loss = input.float(20000, title="Fix Loss", minval=0.01, maxval=1000000, step=0.01, group="Trailing TP Settings")

fib_lookback = input.int(9, title="Fibonacci Lookback Periods", minval=1, group="Fibonacci Settings")

macd_tf = input.timeframe("5", title="MACD Timeframe", group="Timeframe Settings")
fib_tf = input.timeframe("30", title="Fibonacci Timeframe", group="Timeframe Settings")
//ema_tf = input.timeframe("30", title="EMA Timeframe for Trailing TP", group="Timeframe Settings")




// MACD-V Hesaplama
atr = ta.atr(atr_len)
ema_slow = ta.ema(source, slow_len)
ema_fast = ta.ema(source, fast_len)

atr_tf = request.security(syminfo.tickerid, macd_tf , atr)
ema_slow_tf = request.security(syminfo.tickerid, macd_tf , ema_slow)
ema_fast_tf = request.security(syminfo.tickerid, macd_tf , ema_fast)

macd = ( ema_fast_tf - ema_slow_tf ) / atr_tf * 100
signal = ta.ema(macd, signal_len)
hist = macd - signal
hist_prev = hist[1]

// log.info("MACD {0} ", macd)
// log.info("Signal {0} ", signal)
// log.info("Histogram {0} ", hist)
// log.info("Previous Histogram {0} ", hist_prev)

// EMA for Trailing TP
//ema_trailing_tf = ta.ema(close, ema_length)

//ema_trailing = request.security(syminfo.tickerid, ema_tf, ema_trailing_tf)

//log.info("EMA Trailing {0} ", ema_trailing)

// Fibonacci Seviyeleri

high_val_tf = ta.highest(high, fib_lookback)
low_val_tf = ta.lowest(low, fib_lookback)

h1 = request.security(syminfo.tickerid, fib_tf, high_val_tf)
l1 = request.security(syminfo.tickerid, fib_tf, low_val_tf)

fark = h1 - l1

//Low ile fark
hl236 = l1 + fark * 0.236
hl382 = l1 + fark * 0.382
hl500 = l1 + fark * 0.5
hl618 = l1 + fark * 0.618
hl786 = l1 + fark * 0.786
//High ile fark
lh236 = h1 - fark * 0.236
lh382 = h1 - fark * 0.382
lh500 = h1 - fark * 0.5
lh618 = h1 - fark * 0.618
lh786 = h1 - fark * 0.786

hbars_tf = -ta.highestbars(high, fib_lookback)
lbars_tf = -ta.lowestbars(low, fib_lookback)

hbars = request.security(syminfo.tickerid, fib_tf , hbars_tf)
lbars = request.security(syminfo.tickerid, fib_tf , lbars_tf)

fib_236 = hbars > lbars ? hl236 : lh236
fib_382 = hbars > lbars ? hl382 : lh382
fib_500 = hbars > lbars ? hl500 : lh500
fib_618 = hbars > lbars ? hl618 : lh618
fib_786 = hbars > lbars ? hl786 : lh786

// log.info("Fibo 382 {0} ", fib_382)
// log.info("Fibo 618 {0} ", fib_618)

// Keep track of the strategy's highest and lowest net profit
var highestNetProfit = 0.0
var lowestNetProfit  = 0.0

var bool sell_retracing = false
var bool sell_reversing = false
var bool buy_rebound = false
var bool buy_rallying = false

// Satış Koşulları
sell_retracing := (signal > -20) and (macd > -50 and macd < 150) and (macd < signal) and (hist < hist_prev) and (close < fib_382)
sell_reversing := (macd > -150 and macd < -50) and (macd < signal) and (hist < hist_prev) and (close < fib_618)

// log.info("Retracing var mi: {0} ", sell_retracing)
// log.info("Reversing var mi: {0} ", sell_reversing)

// Alım Koşulları
buy_rebound := (signal < 20) and (macd > -150 and macd < 50) and (macd > signal) and (hist > hist_prev) and ((fib_618 < close) or ((fib_618 > close ) and (close > fib_382)))
buy_rallying := (macd > 50 and macd < 150) and (macd > signal) and (hist > hist_prev) and (close > fib_618)

// log.info("Rallying var mi: {0} ", buy_rallying)
// log.info("Rebound var mi: {0} ", buy_rebound)

// Emirleri Yerleştirme
if (sell_retracing == true and strategy.opentrades == 0 )
    strategy.entry("sell_retracing", strategy.short)

if (sell_reversing == true and strategy.opentrades == 0 )
    strategy.entry("sell_reversing", strategy.short)

if (buy_rebound == true and strategy.opentrades == 0 )
    strategy.entry("buy_rebound", strategy.long)

if (buy_rallying == true and strategy.opentrades == 0 )
    strategy.entry("buy_rallying", strategy.long)


// log.info("open order: {0} ", strategy.opentrades )


highestNetProfit := math.max(highestNetProfit, strategy.netprofit)
lowestNetProfit  := math.min(lowestNetProfit, strategy.netprofit)




// Plot the net profit, as well as its highest and lowest value
//plot(strategy.netprofit, style=plot.style_area, title="Net profit",
//     color=strategy.netprofit > 0 ? color.green : color.red)

//plot(highestNetProfit, color=color.green, title="Highest net profit")
//plot(lowestNetProfit, color=color.red, title="Lowest net profit")

// Trailing Take Profit
//long_trailing_stop = ema_trailing * trailing_factor
//short_trailing_stop = ema_trailing / trailing_factor

//log.info("long trailing stop {0} ", long_trailing_stop)
//log.info("short trailing stop {0} ", short_trailing_stop)
//log.info("avg price {0} ", strategy.position_avg_price)
//trail_price1 = strategy.position_avg_price * (1 + trailing_factor)
//trail_price2 = strategy.position_avg_price * (1 - trailing_factor)
// log.info("position_size {0} ", strategy.position_size)

// Trailing Take Profit
var float long_trailing_stop = 0.0
var float short_trailing_stop = 0.0

//if (strategy.position_size > 0)
 //   long_trailing_stop := math.max(long_trailing_stop, close * (1 + trailing_factor))  // Yeni bir maksimum değer belirlendiğinde güncelle
//if (strategy.position_size < 0)
 //  short_trailing_stop := math.min(short_trailing_stop, close * (1 - trailing_factor))  // Yeni bir minimum değer belirlendiğinde güncelle

//log.info("long trailing {0} ", long_trailing_stop)
// log.info("trailing factor{0} ", trailing_factor)
//log.info("short trailing {0} ", short_trailing_stop)

if (strategy.position_size != 0 )
    strategy.exit("Exit Long", from_entry="buy_rebound", trail_points = trailing_profit, trail_offset = trailing_offset, loss = fix_loss)
    strategy.exit("Exit Long", from_entry="buy_rallying", trail_points = trailing_profit, trail_offset = trailing_offset, loss = fix_loss)
    strategy.exit("Exit Short", from_entry="sell_retracing", trail_points = trailing_profit, trail_offset = trailing_offset, loss = fix_loss)
    strategy.exit("Exit Short", from_entry="sell_reversing", trail_points = trailing_profit, trail_offset = trailing_offset, loss = fix_loss)