Estrategia de volatilidad de impulso de canal de banda de Bol


Fecha de creación: 2023-10-31 15:54:41 Última modificación: 2023-10-31 15:54:41
Copiar: 0 Número de Visitas: 733
1
Seguir
1617
Seguidores

Estrategia de volatilidad de impulso de canal de banda de Bol

Descripción general

La estrategia utiliza comparaciones dentro y fuera del canal de la banda de Bol para juzgar la tendencia, y se combina con el seguimiento de la tendencia del indicador de la dinámica, y pertenece a la estrategia de seguimiento de la tendencia. La estrategia determina que la fluctuación dentro del canal genera una nueva señal de dirección de tendencia cuando es menor que fuera del canal, y abre una posición.

El principio

La estrategia se compone principalmente de las siguientes partes:

  1. Configuración de la banda polar: incluye 40 ciclos de longitud de la banda polar mayor y 20 ciclos de longitud de la banda polar menor, con un ancho de canal dos veces mayor que la diferencia estándar.

  2. La determinación de la explosión de canal: si la banda de la bola grande está en órbita por debajo de la banda de la bola pequeña y la banda de la bola grande está en órbita por debajo de la banda de la bola pequeña, indica que la oscilación aumenta y produce una nueva señal de dirección de tendencia.

  3. Indicador de la dinámica: EMA de 14 días de 240 ciclos, para determinar la dirección de la tendencia.

  4. ATR para detener el deterioro: 14 veces la distancia de deterioro de ATR y 1.5 veces la distancia de deterioro de la parada.

La estrategia consiste en determinar si hay una ruptura de canal, y si la ruptura de canal se produce, determinar la dirección del motor y decidir si se hace más o menos. Después de la entrada, se realiza la gestión de la parada de pérdidas con el múltiplo ATR.

Las ventajas

  1. El uso de la estructura de la banda de doble polo permite comparar las fluctuaciones en diferentes períodos de tiempo para determinar el punto de ruptura de la tendencia.

  2. Los indicadores de la dinámica ayudan a determinar la dirección de la tendencia y evitan ser whipsaw de los mercados convulsionados.

  3. El ATR se utiliza para la gestión de los paros de pérdida, que se pueden ajustar a la distancia de pérdida según la fluctuación del mercado.

  4. La proporción de riesgo-recompensa es razonable, evita el exceso de búsqueda y no sea demasiado conservadora.

El riesgo

  1. En situaciones de convulsiones sin tendencias claras, es fácil quedar atrapado. Se puede reducir el error de juicio optimizando los parámetros del indicador de la dinámica.

  2. La detención ATR puede ser demasiado conservadora, por lo que se pueden probar otras formas de detención, como la detención móvil.

  3. La multiplicación fija de la suspensión de pérdidas puede no ser adecuada para todas las variedades y se puede considerar que sea ajustable.

  4. El efecto de la banda de doble polar para determinar el punto de inflexión de la tendencia es dudoso, se pueden probar otros indicadores de canal como el canal KD.

Dirección de optimización

  1. Prueba diferentes parámetros del indicador de movilidad para encontrar la combinación óptima.

  2. Prueba diferentes métodos de pérdida, como la pérdida móvil, el ATR automático, etc.

  3. El multiplicador de stop loss se puede ajustar y optimizar según las diferentes variedades y el entorno del mercado.

  4. Prueba la eficacia de los diferentes indicadores de canal y selecciona el indicador de canal más estable.

  5. Considere la posibilidad de incorporar la gestión de ganancias para que las ganancias sean más controlables.

  6. Se puede filtrar el tiempo de entrada en función de la franja de onda, el tiempo, etc., para aumentar la tasa de victoria.

Resumir

La idea general de esta estrategia es clara, y el uso de la banda de doble polo para determinar el punto de ruptura de la tendencia es su punto más brillante. Sin embargo, aún se necesitan pruebas de optimización en términos de métodos de detención de pérdidas, indicadores de canal y gestión de riesgos, para que los parámetros de la estrategia sean más adaptables y puedan operar de manera estable en diferentes entornos de mercado. En general, la estrategia tiene buenas ventajas y potencial de desarrollo, y merece un estudio profundo.

Código Fuente de la Estrategia
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 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/
// © kasaism
//@version=4
// strategy(title="[EURUSD60] BB Expansion Strategy", shorttitle="[EURUSD60] BBEXP",overlay=true, max_bars_back=5000, max_labels_count=500)

// === INPUTS === //
////BB
largeBbRes = input(title="Large BB Resolution", type=input.resolution, defval="", group="BB")
largeBbLength = input(title="Large BB Length", type=input.integer, defval=40, minval=1, group="BB")
smallBbRes = input(title="Small BB Resolution ", type=input.resolution, defval="", group="BB")
smallBbLength = input(title="Small BB Length", type=input.integer, defval=20, minval=1, group="BB")
multi = input(title="BB StdDev", type=input.float, defval=2.0, maxval=10, minval=0.01, group="BB")
validLen = input(title="BB expand valid length", defval=14, group="BB")

// 3 each EMA settings. EMA directions are as each time frame directions. 
resFirstTime = input(title="EMA Trend t/f", type=input.resolution, defval="240", group="SMT")
// resSecondTime = input(title="Second t/f", type=input.resolution, defval="30", group="SMT") 
// resThirdTime = input(title="Third t/f", type=input.resolution, defval="", group="SMT")
emaLen = input(14, minval=1, title="Length", group="SMT") 
smooth = input(3, minval=1, title="Smooth factor", group="SMT")

//Lisk Management
var riskManagementRule1 = "ATR"
var riskManagementRule2 = "Bracket"
riskManagementRule = input(riskManagementRule1, "Detect Risk Management Based On", options=[riskManagementRule1, riskManagementRule2, "No detection"], group="Trade")
atrMulti = input(3.0, title="ATR Multiple", type=input.float, minval = 1.0, group="ATR")
riskRewardRatio = input(1.5, title="Risk Reward Ratio for ATR", type=input.float, minval = 0.01, group="ATR")
stopLossPoint = input(100, title="Stop Loss Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket")
takeProfitPoint = input(200, title="Take Profit Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket")
// === /INPUTS/ === //

// === CONSTANT === //
//For barmerge.lookahead_off
index = barstate.isrealtime ? 1 : 0

//For Entry
NOENTRY=0
LONG=1
SHORT=2

//SMT color
int up=1
int dn=2
int up_HL=3
int dn_HL=4

//label color
color_bearish = color.red
color_bullish = color.blue
C_label_color_bearish = color.red
C_label_color_bullish = color.blue
// === /CONSTANT/ === //


// === FUNCTIONS === //
//BB trade direction
bbTradeDetection(lrgUpper, lrgLower, smlUpper, smlLower) =>
    if not(na(lrgUpper) or na(lrgLower) or na(smlUpper) or na(smlLower))
        if lrgUpper < smlUpper and lrgLower > smlLower
            true
        else
            false
    else
        na
// === /FUNCTIONS/ === //


// === CALCURATES === //
////BB
//large BB
lrgBbBasis = security(syminfo.tickerid, largeBbRes, sma(close[index], largeBbLength))
lrgBbDev = multi * security(syminfo.tickerid, largeBbRes, stdev(close[index], largeBbLength))
lrgBbUpper = lrgBbBasis + lrgBbDev
lrgBbLower = lrgBbBasis - lrgBbDev

//small BB
smlBbBasis = security(syminfo.tickerid, smallBbRes, sma(close[index], smallBbLength))
smlBbDev = multi * security(syminfo.tickerid, smallBbRes, stdev(close[index], smallBbLength))
smlBbUpper = smlBbBasis + smlBbDev
smlBbLower = smlBbBasis - smlBbDev

bbTrade = bbTradeDetection(lrgBbUpper, lrgBbLower, smlBbUpper, smlBbLower)

//EMA Trend
base=security(syminfo.tickerid, resFirstTime, ema(close[index],emaLen))
sig=security(syminfo.tickerid, resFirstTime, ema(base[index],smooth))
emaTrend = not(na(base) or na(sig)) ? base < sig ? dn : up : na

////LISK MANAGEMENT
float stopLossLineForLong = na
float stopLossLineForShort = na
float takeProfitLineForLong = na
float takeProfitLineForShort = na
atr_ = atr(14) * atrMulti

if riskManagementRule == riskManagementRule1
    stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : round(close[index] - atr_,3) : na
    stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : round(close[index] + atr_,3) : na
    takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] + atr_*riskRewardRatio : na
    takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - atr_*riskRewardRatio : na

if riskManagementRule == riskManagementRule2
    stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : close[index] - stopLossPoint * syminfo.mintick : na
    stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : close[index] + stopLossPoint * syminfo.mintick : na
    takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] +takeProfitPoint * syminfo.mintick : na
    takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - takeProfitPoint * syminfo.mintick : na
// === /CALCURATES/ === //


// === CONDITIONS === //
//BB
bool isBbEntry = na
for i=0 to validLen
    isBbEntry := bbTrade==true ? true : bbTrade[i]==true ? true : false
//plotshape(isBbEntry, style=shape.circle, location=location.bottom)

isBbLong = isBbEntry and open[index] < smlBbBasis[index] and close[index] > smlBbBasis[index]
isBbShort = isBbEntry and open[index] > smlBbBasis[index] and close[index] < smlBbBasis[index]  

//SMT
isEmaLong = emaTrend == up 
isEmaShort = emaTrend == dn

//ATR
isAtrLongStop = low[index] <= stopLossLineForLong
isAtrShortStop = high[index] >= stopLossLineForShort
isAtrLongLimit = high[index] >= takeProfitLineForLong
isAtrShortLimit = low[index] <= takeProfitLineForShort
// === /CONDITIONS/ === //


// === TRADE === //
//ENTRY
if (isBbLong and isEmaLong)
    strategy.entry("LongEntry", strategy.long,  comment="LongEntry")
    if riskManagementRule == riskManagementRule2
        strategy.exit("LongEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket")
if (isBbShort and isEmaShort)
    strategy.entry("ShortEntry", strategy.short,  comment="ShortEntry")
    if riskManagementRule == riskManagementRule2	        
        strategy.exit("ShortEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket")
//EXIT
if riskManagementRule == riskManagementRule1
    if(isAtrLongStop)
        strategy.close("LongEntry", when=isAtrLongStop, comment="ATR Stop")
    if(isAtrShortStop)
        strategy.close("ShortEntry", when=isAtrShortStop, comment="ATR Stop")
    if(isAtrLongLimit)
        strategy.close("LongEntry", when=isAtrLongLimit, comment="ATR Limit")
    if(isAtrShortLimit)
        strategy.close("ShortEntry", when=isAtrShortLimit, comment="ATR Limit")
//  === /TRADE/ === //


// === PLOTS === //
plot(lrgBbBasis, title="Large BB Basis", linewidth=2, color=color.gray)
plot(lrgBbUpper, title="Large BB Upper", linewidth=2, color=color.gray)
plot(lrgBbLower, title="Large BB Lower", linewidth=2, color=color.gray)
plot(smlBbBasis, title="Small BB Basis", color=color.white)
plot(smlBbUpper, title="Small BB Upper", color=color.white)
plot(smlBbLower, title="Small BB Lower", color=color.white)
plot(base, title="EMA Line", color= emaTrend==dn ? color_bearish : emaTrend==up ? color_bullish : color.gray)

plot(stopLossLineForLong ? stopLossLineForLong : na, title="S/L Line For Long", color=color.yellow, style=plot.style_circles)
plot(stopLossLineForShort ? stopLossLineForShort : na, title="S/L Line For Short", color=color.yellow, style=plot.style_circles)
plot(takeProfitLineForLong ? takeProfitLineForLong : na, title="T/P Line For Long", color=color.purple, style=plot.style_circles)
plot(takeProfitLineForShort ? takeProfitLineForShort : na, title="T/P Line For Short", color=color.purple, style=plot.style_circles)
// /=== PLOTS ===/ //