Estrategia de doble láser para la detección de tendencias a corto y largo plazo


Fecha de creación: 2023-11-06 10:01:42 Última modificación: 2023-11-06 10:01:42
Copiar: 0 Número de Visitas: 587
1
Seguir
1617
Seguidores

Estrategia de doble láser para la detección de tendencias a corto y largo plazo

Descripción general

La estrategia utiliza tres indicadores técnicos para determinar la dirección de la tendencia actual, los indicadores de la banda de Brin, el canal de Kentner y el indicador SAR de la línea de parálisis para entrar en el mercado. Cuando los resultados de los tres indicadores coinciden, se produce una señal de negociación. La estrategia determina principalmente la dirección de la tendencia, entrar en el mercado a tiempo cuando la tendencia cambia y obtener ganancias.

El principio

La estrategia utiliza una combinación de tres indicadores técnicos para evaluar las tendencias actuales:

  1. SQUEEZE MOMENTUM INDICATOR: Calcula la compresión de las bandas de Bryn y los canales de Kentner cuando se superponen, lo que indica que la tendencia está a punto de cambiar. El indicador devuelve el estado de compresión y la inclinación de la curva de regreso lineal.

  2. RSI VOLUME WEIGHTED: calcula el RSI ponderado por volumen de transacciones, usando la línea media para determinar sobrecompra y sobreventa. El indicador enfatiza los cambios en el volumen de transacciones.

  3. Parálisis de la línea de parálisis ((SAR): determina la relación entre el precio actual y la posición de la línea de parálisis SAR, con SAR bajando por encima del precio y SAR bajando por debajo del precio.

La estrategia utiliza las bandas de Brin para determinar la dirección de la tendencia, el canal de Kentner para refinar, el RSI para determinar el exceso de compra y venta para encontrar oportunidades de reversión, y el SAR para indicar el momento de entrada. La lógica específica es la siguiente:

  1. Calcular la banda de Brin, el canal de Kentner y el índice de squeeze. El squeeze entra en la fase de preparación cuando se comprime.

  2. Calcula el RSI ponderado por el volumen de transacciones. El RSI es superior a la línea media positiva y inferior a la línea media negativa.

  3. Calcular la línea de parálisis SAR. El SAR sube por debajo del precio y baja por encima del precio.

  4. Combinación de los tres indicadores anteriores: Cuando el esquizofrénico se comprime, el RSI está por encima de la línea media y el SAR produce una señal de cabeza cuando el precio está por debajo; Cuando el esquizofrénico se comprime, el RSI está por debajo de la línea media y el SAR produce una señal de cabeza cuando el precio está por encima.

  5. Cuando se produce la señal, se juzga el resultado de los tres indicadores de la línea K anterior, y si es contrario al juicio de la señal actual, se produce la señal de entrada.

  6. Después de la entrada, configure el bloqueo de pérdidas y el seguimiento de las pérdidas.

Las ventajas

La estrategia tiene las siguientes ventajas:

  1. La combinación de varios indicadores de inflexión y desinflexión es precisa. El indicador de Squizes identifica el cambio de tendencia con precisión, el RSI determina el exceso de compra y venta con precisión, y el SAR indica el momento exacto de entrada.

  2. La lógica del indicador es simple, clara y fácil de entender.

  3. El uso de varios indicadores de confirmación para filtrar brechas falsas.

  4. El sistema de bloqueo de pérdidas (Stop Loss Stop Loss Mechanism) permite el bloqueo de ganancias y el control de riesgos.

  5. Los datos de detección son abundantes y de alta fiabilidad.

El riesgo

La estrategia también tiene sus riesgos:

  1. Las entradas de múltiples cabezas y de cabezas vacías son similares y pueden emitir señales de retroceso simultáneamente, lo que requiere un filtro.

  2. Los tres indicadores están optimizados para los parámetros y pueden ser demasiado ajustados.

  3. El número de transacciones puede ser demasiado frecuente, por lo que se debe controlar razonablemente el número de posiciones.

  4. La configuración de deterioro puede ser demasiado cercana y fácil de romper.

La solución es la siguiente:

  1. Aumentar la determinación del ciclo continuo de los resultados de los indicadores y evitar la oscilación de la señal.

  2. Utiliza el método de análisis de caminar hacia adelante para ajustar los parámetros y evitar la sobreadaptación.

  3. Configurar el tamaño de la pirámide para controlar el número de posiciones unidireccionales.

  4. Prueba diferentes rangos de pérdida y optimiza la posición de la pérdida.

Dirección de optimización

La estrategia puede ser optimizada en las siguientes direcciones:

  1. Optimización de los parámetros indicadores para mejorar la estabilidad de los parámetros. Se pueden considerar parámetros de optimización dinámica.

  2. Aumentar la lógica de control de posiciones, como el tamaño de la bolsa, el promedio de la bolsa, etc.

  3. Prueba diferentes métodos de detención, como detención de fluctuación, detención lineal, posiciones de cero, etc.

  4. Aumentar las funciones de administración de dinero, como posiciones fijas, tasa de utilización de fondos fijos, etc.

  5. La entrada y salida dinámica se realiza en combinación con algoritmos de aprendizaje automático.

  6. Incrementar los mecanismos de cobertura, hacer más cobertura de riesgo y reducir el riesgo sistémico de los mercados relevantes.

  7. Considerar la posibilidad de añadir más indicadores, crear un mecanismo de votación y mejorar la precisión de los juicios.

Resumir

La estrategia tiene una idea general clara, utiliza múltiples indicadores de tendencia positiva y negativa para determinar la dirección de la tendencia, entra en juego de manera oportuna en la compresión del canal de la banda de Brin, y detiene el riesgo de control del mecanismo de frenado. Es una estrategia de seguimiento de tendencia más estable.

Código Fuente de la Estrategia
/*backtest
start: 2023-10-06 00:00:00
end: 2023-11-05 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/
// © XaviZ

//#####©ÉÉÉɶN###############################################
//####*..´´´´´´,,,»ëN########################################
//###ë..´´´´´´,,,,,,''%©#####################################
//###'´´´´´´,,,,,,,'''''?¶###################################
//##o´´´´´´,,,,,,,''''''''*©#################################
//##'´´´´´,,,,,,,'''''''^^^~±################################
//#±´´´´´,,,,,,,''''''''^í/;~*©####æ%;í»~~~~;==I±N###########
//#»´´´´,,,,,,'''''''''^;////;»¶X/í~~/~~~;=~~~~~~~~*¶########
//#'´´´,,,,,,''''''''^^;////;%I^~/~~/~~~=~~~;=?;~~~~;?ë######
//©´´,,,,,,,''''''''^^~/////X~/~~/~~/~~»í~~=~~~~~~~~~~^;É####
//¶´,,,,,,,''''''''^^^;///;%;~/~~;í~~»~í?~?~~~?I/~~~~?*=íÑ###
//N,,,,,,,'''''''^^^^^///;;o/~~;;~~;£=»í»;IX/=~~~~~~^^^^'*æ##
//#í,,,,,''''''''^^^^^;;;;;o~»~~~~íX//~/»~;í?IíI»~~^/*?'''=N#
//#%,,,'''''''''^^^^^^í;;;;£;~~~//»I»/£X/X/»í*&~~~^^^^'^*~'É#
//#©,,''''''''^^^^^^^^~;;;;&/~/////*X;í;o*í»~=*?*===^'''''*£#
//##&''''''''^^^^^^^^^^~;;;;X=í~~~»;;;/~;í»~»±;^^^^^';=''''É#
//##N^''''''^^^^^^^^^^~~~;;;;/£;~~/»~~»~~///o~~^^^^''''?^',æ#
//###Ñ''''^^^^^^^^^^^~~~~~;;;;;í*X*í»;~~IX?~~^^^^/?'''''=,=##
//####X'''^^^^^^^^^^~~~~~~~~;;íííííí~~í*=~~~~Ií^'''=''''^»©##
//#####£^^^^^^^^^^^~~~~~~~~~~~íííííí~~~~~*~^^^;/''''='',,N###
//######æ~^^^^^^^^~~~~~~~~~~~~~~íííí~~~~~^*^^^'=''''?',,§####
//########&^^^^^^~~~~~~~~~~~~~~~~~~~~~~~^^=^^''=''''?,íN#####
//#########N?^^~~~~~~~~~~~~~~~~~~~~~~~~^^^=^''^?''';í@#######
//###########N*~~~~~~~~~~~~~~~~~~~~~~~^^^*'''^='''/É#########
//##############@;~~~~~~~~~~~~~~~~~~~^^~='''~?'';É###########
//#################É=~~~~~~~~~~~~~~^^^*~'''*~?§##############
//#####################N§£I/~~~~~~»*?~»o§æN##################

//@version=4
strategy(title="M-SQUEEZE", overlay = true)

//study(title="M-SQUEEZE", overlay = true)

src = input(close, "SOURCE", type = input.source)

// ███▓▒░░ VARIABLES ░░▒▓███

var bool longCond = na, var bool shortCond = na
var int CondIni_long0 = 0, var int CondIni_short0 = 0
var int CondIni_long = 0, var int CondIni_short = 0
var float last_open_longCondition = na, var float last_open_shortCondition = na
var int last_longCondition0 = na, var int last_shortCondition0 = na
var int last_longCondition = na, var int last_shortCondition = na
var bool long_tp = na, var bool short_tp = na
var int last_long_tp = na, var int last_short_tp = na
var bool Final_Long_tp = na, var bool Final_Short_tp = na
var bool SMI_longCond = na, var bool SMI_shortCond = na
var bool RSI_longCond = na, var bool RSI_shortCond = na
var bool ADX_longCond = na, var bool ADX_shortCond = na
var bool SAR_longCond = na, var bool SAR_shortCond = na
var bool Final_longCondition0 = na, var bool Final_shortCondition0 = na
var bool Final_longCondition = na, var bool Final_shortCondition = na

// ███▓▒░░ SQUEEZE MOMENTUM INDICATOR ░░▒▓███

Act_SMI = input(true, "SQUEEZE MOMENTUM INDICATOR")
BB_length = input(85, title="BOLLINGER BANDS LENGTH", minval = 1)
BB_mult = input(2.1, title="BOLLINGER BANDS MULTI-FACTOR", minval = 0.1, step = 0.1)
KC_length = input(38, title="KELTNER CHANNEL LENGTH", minval = 1)
KC_mult = input(2.0, title="KELTNER CHANNEL MULTI-FACTOR", minval = 0.1, step = 0.1)

SQUEEZE_M(_src,_BB_length,_BB_mult,_KC_length,_KC_mult)=>

    // Calculate BB
    basis = sma(_src, _BB_length)
    dev = _BB_mult * stdev(_src, _BB_length)
    upperBB = basis + dev
    lowerBB = basis - dev
    // Calculate KC
    ma = sma(src, _KC_length)
    rangema = sma(tr, _KC_length)
    upperKC = ma + rangema * _KC_mult
    lowerKC = ma - rangema * _KC_mult
    // Squeeze
    sqzOn = lowerBB > lowerKC and upperBB < upperKC
    sqzOff = lowerBB < lowerKC and upperBB > upperKC
    nosqz = sqzOn == false and sqzOff == false
    // Linear Regression curve
    val = linreg(_src - avg(avg(highest(high, _KC_length), lowest(low, _KC_length)), sma(close, _KC_length)), _KC_length, 0)
    [nosqz,val]
    
[NOSQZ,VAL] = SQUEEZE_M(src,BB_length,BB_mult,KC_length,KC_mult)

barcolor(iff(VAL > 0, iff(VAL > nz(VAL[1]), color.lime, color.green), iff(VAL < nz(VAL[1]), color.red, color.maroon)))

// ███▓▒░░ SAR ░░▒▓███

Act_SAR = input(true, "PARABOLIC SAR")
Sst = input (0.73, "SAR STAR", step=0.01, minval = 0.01)
Sinc = input (0.5, "SAR INC", step=0.01, minval = 0.01)
Smax = input (0.06, "SAR MAX", step=0.01, minval = 0.01)

SAR = sar(Sst, Sinc, Smax)
plot(SAR, style = plot.style_cross, title = "SAR")

// ███▓▒░░ RSI VOLUME WEIGHTED ░░▒▓███

Act_RSI = input(true, "RSI VOLUME WEIGHTED")
RSI_len = input(22, "RSI LENGHT", minval = 1)
RSI_obos = input(45,title="RSI CENTER LINE", type=input.integer, minval = 1)

WiMA(_src, _length)=> 
    var float MA_s=0.0
    MA_s:=(_src + nz(MA_s[1] * (_length-1)))/_length
    MA_s

RSI_Volume(fv, length)=>	
	up=iff(fv>fv[1],abs(fv-fv[1])*volume,0)
	dn=iff(fv<fv[1],abs(fv-fv[1])*volume,0)
	upt=WiMA(up,length)
	dnt=WiMA(dn,length)
	100*(upt/(upt+dnt))

RSI_V = RSI_Volume(src, RSI_len)

// ███▓▒░░ STRATEGY ░░▒▓███

SMI_longCond := (Act_SMI ? (VAL > 0 and (VAL > nz(VAL[1])) and not NOSQZ) : RSI_longCond) 
RSI_longCond := (Act_RSI ? (RSI_V > RSI_obos) : SAR_longCond)
SAR_longCond := (Act_SAR ? (SAR < close) : SMI_longCond)

SMI_shortCond := (Act_SMI ? (VAL < 0 and (VAL < nz(VAL[1])) and not NOSQZ) : RSI_shortCond) 
RSI_shortCond := (Act_RSI ? (RSI_V < RSI_obos) : SAR_shortCond)
SAR_shortCond := (Act_SAR ? (SAR > close) : SMI_shortCond)

longCond := SMI_longCond and RSI_longCond and SAR_longCond
shortCond := SMI_shortCond and RSI_shortCond and SAR_shortCond

CondIni_long0 := longCond ? 1 : shortCond ? -1 : CondIni_long0[1]
CondIni_short0 := longCond ? 1 : shortCond ? -1 : CondIni_short0[1]

longCondition0 = (longCond and CondIni_long0[1] == -1)
shortCondition0 = (shortCond and CondIni_short0[1] == 1)

CondIni_long := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_long[1]
CondIni_short := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_short[1]

longCondition = (longCond[1] and CondIni_long[1] == -1)
shortCondition = (shortCond[1] and CondIni_short[1] == 1)

// ███▓▒░░ ALERTS & SIGNALS ░░▒▓███

plotshape(longCondition, title = "Long Signal", style = shape.triangleup, location = location.belowbar, color = color.blue, transp = 0, size = size.tiny)
plotshape(shortCondition, title = "Short Signal", style = shape.triangledown, location = location.abovebar, color = #FF0000, transp = 0, size = size.tiny)

//alertcondition(longCondition, title="Long Alert", message = "LONG") 
//alertcondition(shortCondition, title="Short Alert", message = "SHORT")

// ███▓▒░░ BACKTESTING ░░▒▓███

testStartYear = input(2018, "BACKTEST START YEAR", minval = 1980, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = input(2222, "BACKTEST STOP YEAR", minval=1980, maxval = 2222)
testStopMonth = input(12, "BACKTEST STOP MONTH", minval=1, maxval=12)
testStopDay = input(31, "BACKTEST STOP DAY", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod = time >= testPeriodStart and time <= testPeriodStop ? true : false

strategy.entry("Long", strategy.long, when = longCondition0 and testPeriod)
strategy.entry("Short", strategy.short, when = shortCondition0 and testPeriod)