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.
La lógica comercial clave de esta estrategia se basa en varios aspectos:
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;
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;
Ir largo cuando el indicador de William está por encima de la línea de MA lenta, y viceversa.
utilizar las combinaciones de estos tres escenarios como condiciones de entrada;
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.
Esta estructura combinada de múltiples indicadores hace una tendencia típica a corto plazo siguiendo la estrategia, con los principales bordes como:
Verificación cruzada triple para reducir las falsas señales.
EMA para la tendencia principal, MACD para el impulso a corto plazo;
El indicador Williams evita perseguir las capas superiores o la pesca de fondo durante los movimientos volátiles.
La combinación de inversión asegura que el control de riesgos se alinee con las salidas.
También hay riesgos importantes a tener en cuenta para esta estrategia:
La estructura compleja hace que el ajuste de parámetros sea un desafío;
Las operaciones a corto plazo frecuentes pueden acarrear mayores costes de transacción;
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.
Principales aspectos para mejorar la estrategia:
Prueba más combinaciones de parámetros para obtener el conjunto óptimo;
Añadir más fuentes de datos como volumen para la validación de la entrada;
utilizar un stop loss dinámico o de seguimiento para reforzar el control del riesgo;
Incorporar aprendizaje automático para detectar inversiones verdaderas.
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()