Estrategia combinada de ruptura de impulso


Fecha de creación: 2023-12-13 17:08:53 Última modificación: 2023-12-13 17:08:53
Copiar: 6 Número de Visitas: 599
1
Seguir
1621
Seguidores

Estrategia combinada de ruptura de impulso

Descripción general

La estrategia utiliza una combinación de promedios móviles, el indicador Laguerre RSI y el indicador ADX para lograr operaciones de ruptura. Cuando el promedio móvil rápido atraviesa el promedio móvil lento, el RSI de Laguerre es mayor que 80, el ADX es mayor que 20, y cuando el promedio móvil rápido atraviesa el promedio móvil lento, el RSI de Laguerre es menor que 20, el ADX es mayor que 20 y queda en blanco.

El principio

La estrategia se basa principalmente en los siguientes indicadores para determinar la tendencia y el momento de entrada en el mercado:

  1. Combinación de promedios móviles: EMA de 16 días, EMA de 48 días, SMA de 200 días. Cuando el promedio a corto plazo se corre sobre el promedio a largo plazo, se considera un mercado de más cabeza, y cuando se corre por debajo, se considera un mercado de cabeza vacía.

  2. El RSI de Laguerre es un indicador que determina las zonas de sobreventa y sobrecompra. Un RSI mayor a 80 es una señal de másca y menor a 20 es una señal de baja.

  3. El indicador ADX determina el estado de la tendencia. ADX mayor a 20 indica el estado de la tendencia, adecuado para las operaciones de ruptura.

La señal de entrada es la combinación de las medias móviles para determinar la dirección de la tendencia, el RSI de Laguerre para determinar el momento de la entrada, el filtro de ADX para los mercados no tendencia. La señal de salida es la reversión de las medias móviles.

Las ventajas

La estrategia tiene las siguientes ventajas:

  1. Capturar la dinámica de la tendencia: esta estrategia se utiliza solo cuando la tendencia comienza a desarrollarse y puede capturar los beneficios del índice de mercado posterior.

  2. Limitación de pérdidas: el stop loss se establece correctamente, lo que permite controlar las pérdidas individuales en un cierto rango. Incluso si se encuentra en una celda, hay oportunidades de ganar.

  3. El indicador de la combinación de indicadores es preciso: los promedios móviles, el RSI de Laguerre y el indicador ADX pueden determinar con relativa precisión la disponibilidad y el momento de entrada en el mercado.

  4. Simple de implementar: La estrategia utiliza sólo 3 indicadores, es simple de implementar y fácil de aprender.

El riesgo

La estrategia también tiene ciertos riesgos:

  1. Riesgo de reversión de la tendencia: la estrategia es una estrategia de seguimiento de la tendencia, y si no se detecta la reversión de la tendencia a tiempo, se producen grandes pérdidas.

  2. Riesgo de retiro: en situaciones de crisis, el stop loss puede ser superado y la cuenta puede ser retirada.

  3. Riesgo de optimización de parámetros: los parámetros del indicador deben ajustarse a los diferentes mercados, de lo contrario se producen fallas.

Respuesta:

  1. El objetivo de la medida es reducir el riesgo de pérdidas.

  2. Optimización de los parámetros indicadores y ajuste del número de brechas.

  3. La administración de retiros se realiza mediante el uso de métodos como el valor por vencimiento de los conjuntos de futuros.

Dirección de optimización

Esta estrategia puede ser optimizada en los siguientes aspectos:

  1. Optimización de los parámetros óptimos: prueba con el ciclo de las medias móviles, los parámetros de Laguerre RSI y los parámetros de ADX para encontrar la combinación óptima de parámetros.

  2. Optimización de brechas: prueba diferentes brechas de medias móviles para encontrar el equilibrio entre el número de transacciones y la tasa de ganancias.

  3. Optimización de las condiciones de entrada: prueba de otros indicadores en combinación con el indicador RSI de Laguerre para buscar condiciones que determinen con mayor precisión el momento de entrada.

  4. Optimización de las condiciones de salida: Estudiar otros indicadores en combinación con las medias móviles como una señal de salida más precisa.

  5. Objetivos de ganancias y optimización de pérdidas y pérdidas: prueba diferentes estrategias de stop loss y optimización de la ganancia de la cuenta.

Resumir

La estrategia capta la tendencia de manera efectiva mediante el uso de tres indicadores de movimiento de la media, el RSI de Laguerre y el ADX. La estrategia capta las ganancias en el índice de la tendencia al comenzar a desarrollarse. Al mismo tiempo, establece una estrategia de stop loss para controlar las pérdidas individuales.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-12 00:00:00
period: 1m
basePeriod: 1m
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/
// © PtGambler

//@version=5
strategy("3MA + Laguerre RSI + ADX [Pt]", shorttitle = "3MA+LaRSI+ADX[Pt]", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500)


// ********************************** Trade Period / Strategy Setting **************************************
startY = input(title='Start Year', defval=2011, group = "Backtesting window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window")
finishY = input(title='Finish Year', defval=2050, group = "Backtesting window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)
use_entry_sess = input.bool(false, 'Use Entry Session Window', group = "Trading Session")
t1_session = input("0930-1555:23456", "Entry Session", group="Trading Session", tooltip = "Entry Signal only generated within this period.") 
t1 = time(timeframe.period, t1_session)
window = true

margin_req = input.float(1, title="Margin Requirement / Leverage", step=0.1, group = "Trading Options")
qty_per_trade = input.float(100, title = "% of initial capital per trade", group = "Trading Options")
reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options")
reinvest_percent = input.float(defval=100, title = "Reinvest percentage", group="Trading Options")

close_eod = input.bool(false, "All trades will close at the close of trading window", group = "Trading Options")
close_b4_open = input.bool(false, "Position must hit either SL/PT before entering new trade", group = "Trading Options")

profit = strategy.netprofit 
strategy.initial_capital = 50000
float trade_amount = math.floor(strategy.initial_capital*margin_req / close) 

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

// ******************************************************************************************

group_ma = "Moving Average Ribbon"
group_larsi = "Laguerre RSI"
group_adx = "ADX"
group_SL = "Stop Loss / Profit Target"

// ----------------------------------------- MA Ribbon -------------------------------------

ema1_len = input.int(16, "Fast EMA Length", group = group_ma)
ema2_len = input.int(48, "Slow EMA Length ", group = group_ma)
sma1_len = input.int(200, "Slow SMA Length", group = group_ma)

ema1 = ta.ema(close, ema1_len)
ema2 = ta.ema(close, ema2_len)
sma1 = ta.sma(close, sma1_len)

plot(ema1, "EMA 1", color.white, linewidth = 2)
plot(ema2, "EMA 2", color.yellow, linewidth = 2)
plot(sma1, "SMA 1", color.purple, linewidth = 2)

ma_bull = ema1 > ema2 and ema2 > sma1   
ma_bear = ema1 < ema2 and ema2 < sma1

// ------------------------------------------ Laguerre RSI ---------------------------------------

alpha = input.float(0.2, title='Alpha', minval=0, maxval=1, step=0.1, group = group_larsi)

gamma = 1 - alpha
L0 = 0.0
L0 := (1 - gamma) * close + gamma * nz(L0[1])
L1 = 0.0
L1 := -gamma * L0 + nz(L0[1]) + gamma * nz(L1[1])

L2 = 0.0
L2 := -gamma * L1 + nz(L1[1]) + gamma * nz(L2[1])

L3 = 0.0
L3 := -gamma * L2 + nz(L2[1]) + gamma * nz(L3[1])

cu = (L0 > L1 ? L0 - L1 : 0) + (L1 > L2 ? L1 - L2 : 0) + (L2 > L3 ? L2 - L3 : 0)

cd = (L0 < L1 ? L1 - L0 : 0) + (L1 < L2 ? L2 - L1 : 0) + (L2 < L3 ? L3 - L2 : 0)

temp = cu + cd == 0 ? -1 : cu + cd
LaRSI = temp == -1 ? 0 : cu / temp
LaRSI := LaRSI * 100

bull_LaRSI = LaRSI > 80
bear_LaRSI = LaRSI < 20

// --------------------------------------- ADX  ------------------------

adxlen = input(14, title="ADX Smoothing", group = group_adx)
dilen = input(14, title="DI Length", group = group_adx)
dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)

active_adx = sig > 20 //and sig > sig[1]

// ******************************* Profit Target / Stop Loss *********************************************

use_SLPT = input.bool(false, 'Use Fixed SL / PT', group = group_SL)
SL = input.float(50, 'Stop loss in ticks', step = 1, group = group_SL) * syminfo.mintick
PT = input.float(100, "Profit target in ticks", step = 1, group = group_SL) * syminfo.mintick

var L_PT = 0.0
var S_PT = 0.0
var L_SL = 0.0
var S_SL = 0.0

if strategy.position_size > 0
    L_SL := L_SL[1]
    L_PT := L_PT[1]
else if strategy.position_size < 0
    S_SL := S_SL[1]
    S_PT := S_PT[1]
else
    L_SL := close - SL
    L_PT := close + PT
    S_SL := close + SL
    S_PT := close - PT

entry_line = plot(use_SLPT and strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr)

L_PT_line = plot(use_SLPT and strategy.position_size > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr)
S_PT_line = plot(use_SLPT and strategy.position_size < 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr)

L_SL_line = plot(use_SLPT and strategy.position_size > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr)
S_SL_line = plot(use_SLPT and strategy.position_size < 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr)

fill(L_PT_line, entry_line, color = color.new(color.green,90))
fill(S_PT_line, entry_line, color = color.new(color.green,90))
fill(L_SL_line, entry_line, color = color.new(color.red,90))
fill(S_SL_line, entry_line, color = color.new(color.red,90))


// ---------------------------------- Strategy setup ------------------------------------------------------

L_entry1 = ma_bull and bull_LaRSI and active_adx
S_entry1 = ma_bear and bear_LaRSI and active_adx

L_exit1 = ta.crossunder(ema1, ema2)
S_exit1 = ta.crossover(ema1, ema2)

// Trigger zones
bgcolor(ma_bull ? color.new(color.green ,90) : na)
bgcolor(ma_bear ? color.new(color.red,90) : na)

if L_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true)
    strategy.entry("Long", strategy.long, trade_amount)

if S_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true)
    strategy.entry("Short", strategy.short, trade_amount)

if use_SLPT
    strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit")
    strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit")
else
    if L_exit1
        strategy.close("Long", comment = "Exit Long")

    if S_exit1
        strategy.close("Short", comment = "Exit Short")

if use_entry_sess and not window and close_eod
    strategy.close_all(comment = "EOD close")