Tendencia del MACD a raíz de la estrategia intradiaria

El autor:¿ Qué pasa?, Fecha: 2023-12-19 11:16:44
Las etiquetas:

img

Resumen general

La estrategia MACD Trend Following Intraday es una estrategia de negociación intradiaria que combina promedios móviles, el indicador MACD y el indicador Williams. Utiliza diferentes combinaciones de los tres indicadores para formar criterios de entrada y salida para posiciones largas y cortas, con el objetivo de capturar las características de tendencia de los movimientos de precios a corto plazo.

Estrategia lógica

La lógica comercial clave de esta estrategia se basa en varios aspectos:

  1. Ir largo cuando el precio se rompe por encima de la línea de la media móvil exponencial (EMA) y ir corto cuando se rompe por debajo;

  2. Ir largo cuando la línea rápida del MACD está por encima de la línea lenta, y ir corto cuando está por debajo;

  3. Ir largo cuando el indicador de William está por encima de la línea de MA lenta, y viceversa.

  4. utilizar las combinaciones de estos tres escenarios como condiciones de entrada;

  5. Salida a las señales de marcha atrás.

Al combinar EMA para la dirección general de la tendencia y MACD para el impulso a corto plazo, esta estrategia puede capturar los movimientos de la tendencia de precios en puntos de entrada decentes para las ganancias.

Ventajas

Esta estructura combinada de múltiples indicadores hace una tendencia típica a corto plazo siguiendo la estrategia, con los principales bordes como:

  1. Verificación cruzada triple para reducir las falsas señales.

  2. EMA para la tendencia principal, MACD para el impulso a corto plazo;

  3. El indicador Williams evita perseguir las capas superiores o la pesca de fondo durante los movimientos volátiles.

  4. La combinación de inversión asegura que el control de riesgos se alinee con las salidas.

Los riesgos

También hay riesgos importantes a tener en cuenta para esta estrategia:

  1. La estructura compleja hace que el ajuste de parámetros sea un desafío;

  2. Las operaciones a corto plazo frecuentes pueden acarrear mayores costes de transacción;

  3. La falta de detección de los verdaderos puntos de inversión de tendencia puede dar lugar a pérdidas.

Las principales mitigaciones son la optimización de parámetros y el stop loss para maximizar los combos de ganancias y controlar la pérdida máxima de una sola operación.

Oportunidades de mejora

Principales aspectos para mejorar la estrategia:

  1. Prueba más combinaciones de parámetros para obtener el conjunto óptimo;

  2. Añadir más fuentes de datos como volumen para la validación de la entrada;

  3. utilizar un stop loss dinámico o de seguimiento para reforzar el control del riesgo;

  4. Incorporar aprendizaje automático para detectar inversiones verdaderas.

Conclusión

Esta tendencia MACD después de la estrategia intradiaria combina eficazmente indicadores para identificar tendencias a corto plazo y gestionar riesgos.


/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 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/
// © platsn

//@version=5
strategy("MACD Willy Strategy", overlay=true, pyramiding=1, initial_capital=10000) 

// ******************** Trade Period **************************************
startY = input(title='Start Year', defval=2011, group = "Trading window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Trading window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Trading window")
finishY = input(title='Finish Year', defval=2050, group = "Trading window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Trading window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Trading window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)
// t1 = time(timeframe.period, "0945-1545:23456") 
// window = time >= timestart and time <= timefinish and t1 ? true : false 
// t2 = time(timeframe.period, "0930-1555:23456")
// window2 = time >= timestart and time <= timefinish and t2 ? true : false 

leverage = input.float(1, title="Leverage (if applicable)", step=0.1, group = "Trading Options")
reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options")
reinvest_percent = input.float(defval=20, title = "Reinvest percentage", group="Trading Options")
// entry_lookback = input.int(defval=10, title="Lookback period for entry condition", group = "Trading Options")

// -------------------------------------------- Data Source --------------------------------------------

src = input(title="Source", defval=close)

// ***************************************************************************************************** Daily ATR *****************************************************
atrlen = input.int(14, minval=1, title="ATR period", group = "Daily ATR")
iPercent = input.float(5, minval=1, maxval=100, step=0.1, title="% ATR to use for SL / PT", group = "Daily ATR")
 
percentage = iPercent * 0.01
datr = request.security(syminfo.tickerid, "1D", ta.rma(ta.tr, atrlen))
datrp = datr * percentage

// plot(datr,"Daily ATR")
// plot(datrp, "Daily % ATR")

//*********************************************************** VIX volatility index ****************************************

VIX = request.security("BTC_USDT:swap", timeframe.period, close)
vix_thres = input.float(20.0, "VIX Threshold for entry", step=0.5, group="VIX Volatility Index")

// ************************************************ Volume ******************************************************

vol_len = input(50, 'Volume MA Period')
avg_vol = ta.sma(volume, vol_len)

//-------------------------------------------------------- Moving Average ------------------------------------

emalen1 = input.int(200, minval=1, title='EMA', group= "Moving Averages")
ema1 = ta.ema(src, emalen1)

// ------------------------------------------ MACD ------------------------------------------
// Getting inputs
fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Plot colors
col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

// ---------------------------------------- William %R --------------------------------------
w_length = input.int(defval=34, minval=1)
w_upper = ta.highest(w_length)
w_lower = ta.lowest(w_length)

w_output = 100 * (close - w_upper) / (w_upper - w_lower)

fast_period = input(defval=5, title='Smoothed %R Length')
slow_period = input(defval=13, title='Slow EMA Length')

w_fast_ma = ta.wma(w_output,fast_period)
w_slow_ma = ta.ema(w_output,slow_period)



// ------------------------------------------------ Entry Conditions ----------------------------------------

L_entry1 = close > ema1 and hist > 0 and w_fast_ma > w_slow_ma 
S_entry1 = close < ema1 and hist < 0 and w_fast_ma < w_slow_ma 

// -------------------------------------------------- Entry -----------------------------------------------
strategy.initial_capital = 50000
profit = strategy.netprofit
trade_amount = math.floor(strategy.initial_capital*leverage / close) 

if strategy.netprofit > 0 and reinvest
    trade_amount := math.floor((strategy.initial_capital+(profit*reinvest_percent*0.01))*leverage / close) 
else
    trade_amount := math.floor(strategy.initial_capital*leverage/ close) 


if L_entry1 //and window
    strategy.entry("Long", strategy.long, trade_amount)

if S_entry1 //and window
    strategy.entry("Short", strategy.short, trade_amount)

// --------------------------------------------------- Exit Conditions -------------------------------------

L_exit1 = hist < 0 and w_fast_ma < w_slow_ma and w_fast_ma < -20
S_exit1 = hist > 0 and w_fast_ma > w_slow_ma and w_fast_ma > -80

// ----------------------------------------------------- Exit ---------------------------------------------

if L_exit1 //and window2
    strategy.close("Long")
    
if S_exit1 //and window2
    strategy.close("Short")

// if time(timeframe.period, "1530-1600:23456")
//     strategy.close_all()

Más.