Estrategia de soporte y resistencia con ruptura de volumen y pérdida de parada de seguimiento

El autor:¿ Qué pasa?, Fecha: 2024-01-11 17:58:26
Las etiquetas:

img

Resumen general

La idea principal de esta estrategia es combinar los niveles de soporte/resistencia y las rupturas de volumen para determinar las señales de entrada y utilizar el indicador ATR para ajustar dinámicamente el stop loss para obtener ganancias, con el fin de obtener más ganancias potenciales.

Estrategia lógica

La estrategia consiste en las siguientes lógicas principales:

  1. Utilice ta.pivothigh y ta.pivotlow para calcular el precio más alto de las velas L_Bars anteriores y el precio más bajo de las velas R_Bars anteriores, como niveles de resistencia y soporte.

  2. Cuando el precio de cierre cruza por encima del nivel de resistencia y el volumen rompe por encima del umbral de volumen, ir largo.

  3. Después de una entrada larga, establece la stop loss en close-ATR_LO. Después de una entrada corta, establece la stop loss en close+ATR_SH. Esto realiza el ajuste dinámico de la stop loss de trailing.

  4. Solo tomar la primera señal durante las horas de negociación (0915-1445) cada día.

Análisis de ventajas

  1. Utilice la teoría de soporte/resistencia combinada con el indicador de volumen para mejorar la precisión de entrada.

  2. El nivel de suspensión de pérdidas de seguimiento basado en ATR puede ajustarse de forma flexible en función de la volatilidad del mercado, lo que reduce la posibilidad de retracción de las ganancias.

  3. El control adecuado de los horarios diarios de negociación y el riesgo por operación ayuda a detectar la tendencia y evitar pérdidas de parada excesivas.

Análisis de riesgos

  1. Los niveles de soporte/resistencia pueden fallar y no poder proporcionar señales de entrada efectivas.

  2. Si el multiplicador ATR se establece demasiado alto, puede dar lugar a que la parada de pérdidas esté demasiado lejos, lo que aumenta el riesgo de pérdida.

  3. Si se establece un umbral de volumen demasiado bajo, se pueden perder oportunidades, y si se pone demasiado alto, se pueden producir señales falsas.

Soluciones:

  • Ajustar los parámetros de soporte/resistencia en función de las diferentes características de los productos.

  • Optimizar los parámetros del multiplicador ATR y el umbral de volumen.

  • Añadir otros indicadores para confirmar las señales de entrada.

Direcciones de optimización

  1. Añadir otros indicadores como las medias móviles para ayudar a determinar las señales de entrada.

  2. Optimizar parámetros como el multiplicador de ATR y el umbral de volumen.

  3. Utilice algoritmos de aprendizaje automático para realizar la optimización de parámetros dinámicos.

  4. Ampliar la estrategia a otros productos para encontrar patrones de parámetros.

Resumen de las actividades

La estrategia integra varias herramientas analíticas, aplicando métodos de soporte/resistencia, volumen y stop loss, y logró buenos resultados de backtest.


/*backtest
start: 2024-01-03 00:00:00
end: 2024-01-10 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//   ____________                _________                      _____________
//  |____________|             ||________|                      ||__________|
//       ||            ____    ||        ||                     ||                    ______ ________    _____ ________
//       ||    |   || ||       ||________|| |   || ||    ||     ||     |   ||   /\\   |   // |______| || ||    |______|
//       ||    |===|| |===     ||__________ |   || ||    ||     ||     |===||  /__\\  |===      ||    ||   \\     ||
//       ||    |   || ||___    ||        || |___|| ||___ ||___  ||     |   || /    \\ |   \\    ||    || ___||    ||
//       ||                    ||________||                     ||__________
//       ||                    ||________|                      ||__________|
  
//@version=5
strategy("SUPPORT RESISTANCE STRATEGY [5MIN TF]",overlay=true )
L_Bars = input.int(defval = 10, minval = 1 , maxval = 50, step =1)
R_Bars = input.int(defval = 15, minval = 1 , maxval = 50, step =1)
volumeRange = input.int(20, title='Volume Break [threshold]', minval = 1)

// ═══════════════════════════ //
// ——————————> INPUT <——————— //
// ═══════════════════════════ //

EMA1 = input.int(title='PRICE CROSS EMA', defval = 150, minval = 10 ,maxval = 400)
factor1 = input.float(title='_ATR LONG',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL LONG")
factor2 = input.float(title='_ATR SHORT',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL SHORT")
risk = input.float(title='RISK',defval = 200 , minval = 1 , maxval = 5000 , step = 50, tooltip = "RISK PER TRADE")


var initialCapital = strategy.equity
t = time(timeframe.period, '0915-1445:1234567')
time_cond = not na(t)

// ══════════════════════════════════ //
// ———————————> EMA DATA <——————————— //
// ══════════════════════════════════ //
ema1 = ta.ema(close, EMA1)

plot(ema1, color=color.new(color.yellow, 0), style=plot.style_linebr, title='ema1')

// ══════════════════════════════════ //
// ————————> TRAIL DATA <———————————— //
// ══════════════════════════════════ //
// *******Calculate LONG TRAIL data*****
ATR_LO = ta.atr(14)*factor1

// *******Calculate SHORT TRAIL data*****
ATR_SH = ta.atr(14)*factor2

long_trail = close - ATR_LO
short_trail = close + ATR_SH

// Plot atr data
//plot(longStop, color=color.new(color.green, 0), style=plot.style_linebr, title='Long Trailing Stop')
//plot(shortStop , color=color.new(color.red, 0), style=plot.style_linebr, title='Short Trailing Stop')

// ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ //
// ————————————————————————————————————————————————————————> RESISTANCE/SUPPORT LEVELS DATA <————————————————————————————————————————————————————————————————————————————————————————————— //
// ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ //

Resistance_pi = fixnan(ta.pivothigh(L_Bars, R_Bars)[1])
Support_pi = fixnan(ta.pivotlow(L_Bars, R_Bars)[1])
r1 = plot(Resistance_pi, color=ta.change(Resistance_pi) ? na : color.red,  offset=-(R_Bars + 1),linewidth=2, title='RESISTANCE')
s1 = plot(Support_pi, color=ta.change(Support_pi) ? na : color.green, offset=-(R_Bars + 1),linewidth=2, title='SUPPORT')

//Volume 
vol_1 = ta.ema(volume, 5)
vol_2 = ta.ema(volume, 10)
osc_vol = 100 * (vol_1 - vol_2) / vol_2

// ══════════════════════════════════//
// ————————> LONG POSITIONS <————————//
// ══════════════════════════════════//
//******barinstate.isconfirmed used to avoid repaint in real time*******

if ( ta.crossover(close, Resistance_pi) and osc_vol > volumeRange and not(open - low > close - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close >= ema1 )
    strategy.entry(id= "Long" ,direction = strategy.long, comment = "BUY")
    
plot(long_trail , color=color.new(color.blue, 0), style=plot.style_linebr, title='long Stop')

if strategy.position_size > 0 
    strategy.exit("long tsl", "Long" , stop = long_trail ,comment='SELL')
 
// ═════════════════════════════════════//
// ————————> SHORT POSITIONS <————————— //
// ═════════════════════════════════════//
if ( ta.crossunder(close, Support_pi) and osc_vol > volumeRange and not(open - close < high - open)  and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close <= ema1 )
    strategy.entry(id = "Short" ,direction = strategy.short,  comment = "SELL") 

if strategy.position_size < 0
    strategy.exit("short tsl", "Short" ,  stop = short_trail ,comment='BUY')

// ════════════════════════════════════════════════//
// ————————> CLOSE ALL POSITIONS BY 3PM <————————— //
// ════════════════════════════════════════════════//
strategy.close_all(when = hour == 14 and minute == 55)

// ════════════════════════════════════════//
// ————————> MAX INTRADAY LOSS  <————————— //
// ════════════════════════════════════════//
// strategy.risk.max_intraday_loss(type = strategy.cash, value = risk)



Más.