Estrategia de corto plazo siguiendo la tendencia MACD


Fecha de creación: 2023-12-19 11:16:44 Última modificación: 2023-12-19 11:16:44
Copiar: 0 Número de Visitas: 605
1
Seguir
1621
Seguidores

Estrategia de corto plazo siguiendo la tendencia MACD

Descripción general

La estrategia de la línea corta de seguimiento de la tendencia del MACD es una estrategia de negociación de la línea corta que combina las medias móviles, el indicador MACD y el indicador William. La estrategia utiliza diferentes combinaciones de tres indicadores para formar las condiciones de entrada y salida de las posiciones abiertas para capturar las características de tendencia de los precios de la línea corta.

Principio de estrategia

La principal lógica de transacción de la estrategia se basa en los siguientes puntos:

  1. Cuando el precio sube a través de la línea media exponencial móvil (EMA), mira hacia arriba, y cuando el precio baja, mira hacia abajo.

  2. Cuando la línea rápida del MACD está por encima de la línea lenta, mira más; cuando la línea rápida está por debajo de la línea lenta, mira menos;

  3. El promedio móvil rápido del índice William es más alto que el promedio móvil lento, y por el contrario es más bajo.

  4. La combinación de estas tres condiciones para la admisión;

  5. En el caso contrario, se juzga la salida.

La combinación de EMA para determinar la dirección de una gran tendencia y MACD para determinar la dinámica de precios a corto plazo, la estrategia puede capturar las características de la tendencia de los precios en un buen punto de entrada, lo que genera beneficios. El índice William puede usarse para verificar aún más la sobrecompra y la sobreventa de variedades, para evitar falsas rupturas.

Ventajas estratégicas

Esta estructura de combinación de múltiples indicadores es una estrategia típica de seguimiento de tendencias en línea corta, que tiene las siguientes ventajas:

  1. Los tres indicadores se verifican entre sí para reducir la probabilidad de falsas señales.

  2. La EMA juzga la dirección de la tendencia principal, mientras que el MACD juzga la fuerza de la línea corta.

  3. El índice William evita caídas y subidas en medio de fuertes fluctuaciones.

  4. La combinación de indicadores inversos en la decisión de la retirada está estrechamente vinculada con el control del riesgo.

Riesgo estratégico

La estrategia también presenta los siguientes riesgos principales:

  1. La estructura de la combinación de múltiples indicadores es compleja, y los parámetros son más difíciles de ajustar.

  2. Las líneas cortas son frecuentes y los costos de las transacciones pueden ser altos.

  3. El riesgo de pérdidas es que no se pueda determinar con exactitud el verdadero punto de inflexión de tendencias.

La estrategia se centra en la optimización de parámetros y la detención de pérdidas, buscando la combinación óptima de parámetros y estableciendo el nivel de detención de pérdidas adecuado para controlar la máxima pérdida en una sola operación.

Dirección de optimización de la estrategia

La estrategia se puede optimizar principalmente en los siguientes aspectos:

  1. Prueba más combinaciones de parámetros de los indicadores para encontrar el parámetro óptimo.

  2. El informe también incluye un análisis de las tendencias en el mercado de trabajo en el Reino Unido.

  3. Establecer paradas dinámicas o paradas de seguimiento para fortalecer el control de riesgos;

  4. Los modelos de aprendizaje automático son usados para determinar el verdadero punto de inflexión.

Resumir

La estrategia de seguimiento de tendencias de la línea corta del MACD utiliza una combinación de varios indicadores para controlar el riesgo al mismo tiempo para determinar la tendencia de la línea corta. A través de la optimización de parámetros, la configuración de niveles de stop loss y la introducción de más fuentes de datos, se puede mejorar aún más la ganancia y el nivel de ganancia de la estrategia.

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