Estrategia dinámica de toma de ganancias de múltiples marcos temporales MACD-V y Fibonacci

MACD MACD-V ATR EMA MA
Fecha de creación: 2024-04-26 12:00:21 Última modificación: 2024-06-25 11:28:55
Copiar: 0 Número de Visitas: 908
1
Seguir
1617
Seguidores

Estrategia dinámica de toma de ganancias de múltiples marcos temporales MACD-V y Fibonacci

Descripción general

La estrategia utiliza el MACD-V (MACD con volatilidad ATR) y el retroceso de Fibonacci para tomar decisiones comerciales en varios marcos de tiempo. Calcula los niveles de MACD-V y Fibonacci de diferentes marcos de tiempo y luego decide abrir y cerrar posiciones en función de la relación entre el precio actual y los niveles de Fibonacci y el valor del MACD-V. La estrategia tiene como objetivo capturar tendencias y retrocesos del mercado, mientras controla el riesgo.

Principio de estrategia

  1. Los indicadores MACD-V para calcular diferentes marcos de tiempo (como 5 minutos y 30 minutos), MACD-V se basa en el MACD para introducir un ajuste de la tasa de fluctuación ATR para adaptarse a diferentes estados de mercado.
  2. Calcula los máximos y mínimos de los últimos períodos (por ejemplo, 9 períodos) en un marco de tiempo de nivel superior (por ejemplo, 30 minutos), y luego calcula el nivel de regresión de Fibonacci basado en este intervalo.
  3. La condición de apertura se determina en función de la relación entre el precio de cierre actual y el nivel de Fibonacci, así como el valor y la dirección de cambio del MACD-V. Por ejemplo, cuando el precio retrocede al 38.2% cerca del nivel de Fibonacci y el MACD-V se mueve hacia abajo entre 50 y 150, se abre una posición.
  4. Una vez abierta la posición, se usa un trailing stop para proteger los beneficios y controlar el riesgo. La posición del trailing stop se ajusta dinámicamente según el movimiento del precio y los parámetros de la estrategia.
  5. Si el precio toca el nivel de stop loss móvil o el nivel de stop loss fijo, se cierra la posición.

Análisis de las ventajas

  1. Las estrategias utilizan análisis de múltiples marcos temporales para obtener una visión más completa de las tendencias y fluctuaciones del mercado.
  2. El indicador MACD-V tiene en cuenta la volatilidad de los precios y puede funcionar de manera efectiva en mercados de tendencia y de volatilidad.
  3. Los niveles de Fibonacci capturan muy bien las áreas clave de soporte y resistencia de los precios y sirven de referencia para la toma de decisiones comerciales.
  4. Los stop-loss móviles pueden ser rentables mientras la tendencia continúa, mientras que los stop-loss de movimiento pueden ser rentables cuando el precio se invierte, controlando el riesgo.
  5. La lógica de la estrategia es clara, los parámetros son ajustables y la adaptabilidad es fuerte.

Análisis de riesgos

  1. Las estrategias pueden ser frecuentes en un mercado convulso, lo que puede generar altos costos de transacción.
  2. La dependencia de los indicadores técnicos para juzgar la tendencia puede conducir a un error de juicio en el caso de una falsa ruptura o de una oscilación persistente en el mercado.
  3. Las posiciones de stop loss fijas pueden no responder a los extremos en tiempo y forma, lo que puede llevar a grandes pérdidas.
  4. La elección incorrecta de los parámetros puede causar un mal desempeño de la estrategia.

Dirección de optimización

  1. Introducir más marcos de tiempo e indicadores, como el MA con un período más largo, para mejorar la precisión de las tendencias.
  2. Optimizar la gestión de posiciones, como ajustar el tamaño de las posiciones en función de la ATR o el rango de precios.
  3. Establecer diferentes combinaciones de parámetros para diferentes estados de mercado, mejorando la adaptabilidad.
  4. La introducción de un stop loss móvil, basado en un stop móvil, permite un mejor control del riesgo de bajada.
  5. Las estrategias son evaluadas y optimizadas para encontrar la combinación óptima de parámetros.

Resumir

La estrategia determina la tendencia y el momento de abrir una posición a través de MACD-V y Fibonacci retracciones en múltiples marcos de tiempo, y utiliza paradas móviles para controlar dinámicamente el riesgo y los beneficios. La lógica de la estrategia es clara y adaptable, pero en un mercado convulso puede haber un riesgo de transacciones frecuentes y error de juicio.

Gracias

El indicador MACD-v utilizado en esta estrategia se atribuye a su creador, Alex Spiroglou.MACD-v.

Código Fuente de la Estrategia
/*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)