Estrategias comerciales basadas en rupturas de histogramas


Fecha de creación: 2023-11-15 15:25:57 Última modificación: 2023-11-15 15:25:57
Copiar: 0 Número de Visitas: 700
1
Seguir
1617
Seguidores

Estrategias comerciales basadas en rupturas de histogramas

Descripción general

La estrategia utiliza el principio de ruptura del gráfico rectangular, en combinación con la determinación de la tendencia de las medias móviles, para lograr una operación de ruptura en la dirección de la tendencia. Se produce una señal de negociación cuando el precio rompe la frontera del gráfico rectangular. Al mismo tiempo, se determina la dirección de la tendencia general mediante la determinación de la relación de posición de las medias móviles rápidas y lentas, para evitar la generación de señales erróneas en toda la discusión.

Principio de estrategia

  1. Calcule el promedio móvil rápido (de 20 ciclos) y el promedio móvil lento (de 50 ciclos).

  2. Calcule si se forma un rectángulo ascendente (close>open) o un rectángulo descendente (close>open) según la línea K.

  3. Determina si el rectángulo ha roto el precio más alto o el precio más bajo de la línea K anterior. Si es un rectángulo ascendente y rompe el precio más alto de la línea K anterior, genera una señal de ruptura múltiple; si es un rectángulo descendente y rompe el precio más bajo de la línea K anterior, genera una señal de ruptura en blanco.

  4. Al mismo tiempo, se determina si la media móvil rápida está por encima de la media móvil lenta, y si lo está, se determina como una tendencia múltiple; por el contrario, se determina como una tendencia hueca.

  5. La señal de ruptura de la línea media rápida y lenta es válida solo si se determina que la línea media rápida y lenta es una tendencia de cabeza; la señal de ruptura de cabeza vacía es válida solo si la línea media rápida y lenta se determina como una tendencia de cabeza. Esto evita la generación de señales erróneas en la compilación.

  6. Cuando se genera una señal de ruptura de múltiples cabezas efectiva, se abren varias cartas según ciertos estándares de stop loss y stop; cuando se genera una señal de ruptura de cabeza vacía efectiva, se abren cartas en blanco según ciertos estándares de stop loss y stop stop.

  7. Si se produce una bifurcación entre la media móvil rápida y la media móvil lenta, se aplana la posición actual.

Análisis de las ventajas

  • El uso de la frontera del diagrama rectangular como punto de ruptura representa una señal de ruptura más fuerte.

  • Al mismo tiempo, se debe considerar la dirección de la tendencia para evitar señales erróneas en el balance y mejorar la precisión.

  • Las estrategias que tienen en cuenta tendencias y rupturas para que funcionen bien en situaciones de tendencias.

  • Se puede adaptar a diferentes variedades y períodos de tiempo a través de la optimización de parámetros.

Riesgos y soluciones

  • El riesgo de fracaso de la brecha. La solución es elegir una brecha más grande, asegurando que la energía de la brecha sea más fuerte.

  • El riesgo de que la tendencia sea inexacta. La solución es ajustar los parámetros de la línea media o agregar otros indicadores auxiliares para determinar la tendencia.

  • El riesgo de que la configuración de stop loss sea demasiado pequeña puede conducir a un stop loss demasiado frecuente. La solución consiste en ajustar la amplitud de stop loss en función de la dinámica de las diferentes variedades y períodos de tiempo.

  • El riesgo de que el espacio de ganancias sea demasiado pequeño. La solución es establecer diferentes tasas de ganancias y pérdidas en función de la dinámica de diferentes variedades y períodos de tiempo.

Dirección de optimización

  • En general, los parámetros de las medias móviles, los parámetros de breakout, los parámetros de stop loss y los parámetros de ganancias y pérdidas necesitan ser probados y optimizados para diferentes variedades y períodos de tiempo, lo que hace que los parámetros de la estrategia sean personalizados.

  • Se pueden probar diferentes tipos de medias móviles (como EMA, SMA, etc.) para encontrar indicadores de medias más adecuados.

  • Se pueden agregar otros indicadores auxiliares de juicio, como Momentum, para mejorar la precisión de juicio de tendencias.

  • Los parámetros se pueden optimizar dinámicamente a través de métodos como el aprendizaje automático.

  • Se puede realizar un estudio estadístico de la brecha y ajustar los parámetros de la brecha.

Resumir

La estrategia integra características de tendencia y características de ruptura, que en teoría pueden filtrar una gran cantidad de señales no válidas. La clave es centrarse en la prueba y optimización de los parámetros, para que la estrategia se adapte a las diferentes variedades y períodos de tiempo, con el fin de obtener mejores resultados en el comercio real. Además, los indicadores auxiliares y las tecnologías de aprendizaje automático también proporcionan orientación para la mejora de la estrategia.

Código Fuente de la Estrategia
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Backtested Time Frame: H1
//Default Settings: Are meant to run successfully on all currency pairs to reduce over-fitting.
//Risk Warning: This is a forex trading robot, backtest performance will not equal future performance, USE AT YOUR OWN RISK.
//Code Warning: Although every effort has been made for robustness, this code has not been vetted by independent 3rd parties.
strategy("Pin Bar Strategy v1", overlay=true)

// User Input
usr_risk = input(title="Equity Risk (%)",type=input.integer,minval=1,maxval=100,step=1,defval=3,confirm=false)
atr_mult = input(title="Stop Loss (x*ATR, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=1.9,confirm=false)
trd_rewd = input(title="Risk : Reward (1 : x*SL, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=3.1,confirm=false)
sma_fast = input(title="Fast MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=20,confirm=false)
sma_slow = input(title="Slow MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=50,confirm=false)
atr_valu = input(title="ATR (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=14,confirm=false)
use_slpe = input(title="Use MA Slope (Boolean)",type=input.bool,defval=true,confirm=false)
slp_long = input(title="Bull Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=1,confirm=false)
slp_shrt = input(title="Bear Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=-1,confirm=false)
emg_exit = input(title="Exit When MA Re-Cross (Boolean)",type=input.bool,defval=true,confirm=false)
ent_canc = input(title="Cancel Entry After X Bars (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=3,confirm=false)

// Create Indicators
fastSMA = sma(close, sma_fast)
slowSMA = sma(close, sma_slow)
bullishPinBar = ((close > open) and ((open - low) > 0.66 * (high - low))) or ((close < open) and ((close - low) > 0.66 * (high - low)))
bearishPinBar = ((close > open) and ((high - close) > 0.66 * (high - low))) or ((close < open) and ((high - open) > 0.66 * (high - low)))
atr = atr(atr_valu)

// Specify Trend Conditions
smaUpTrend = (fastSMA > slowSMA) and (fastSMA[1] > slowSMA[1]) and (fastSMA[2] > slowSMA[2]) and (fastSMA[3] > slowSMA[3]) and (fastSMA[4] > slowSMA[4])
smaDnTrend = (fastSMA < slowSMA) and (fastSMA[1] < slowSMA[1]) and (fastSMA[2] < slowSMA[2]) and (fastSMA[3] < slowSMA[3]) and (fastSMA[4] < slowSMA[4])
candleUpTrend = (close[5] > fastSMA[5]) and (open[5] > fastSMA[5]) and (close[6] > fastSMA[6]) and (open[6] > fastSMA[6]) and (close[7] > fastSMA[7]) and (open[7] > fastSMA[7]) and (close[8] > fastSMA[8]) and (open[8] > fastSMA[8]) and (close[9] > fastSMA[9]) and (open[9] > fastSMA[9]) and (close[10] > fastSMA[10]) and (open[10] > fastSMA[10])
candleDnTrend = (close[5] < fastSMA[5]) and (open[5] < fastSMA[5]) and (close[6] < fastSMA[6]) and (open[6] < fastSMA[6]) and (close[7] < fastSMA[7]) and (open[7] < fastSMA[7]) and (close[8] < fastSMA[8]) and (open[8] < fastSMA[8]) and (close[9] < fastSMA[9]) and (open[9] < fastSMA[9]) and (close[10] < fastSMA[10]) and (open[10] < fastSMA[10])

// Specify Piercing Conditions
bullPierce = ((low < fastSMA) and (open > fastSMA) and (close > fastSMA)) or ((low < slowSMA) and (open > slowSMA) and (close > slowSMA))
bearPierce = ((high > fastSMA) and (open < fastSMA) and (close < fastSMA)) or ((high > slowSMA) and (open < slowSMA) and (close < slowSMA))

// MA Slope Function
angle(_source) =>
    rad2degree=180/3.14159265359
    ang=rad2degree*atan((_source[0] - _source[1])/atr(atr_valu)) 

// Calculate MA Slope
fastSlope=angle(fastSMA)
slowSlope=angle(slowSMA)
slopingUp = fastSlope > slp_long
slopingDn = fastSlope < slp_shrt
    
// Specify Entry Conditions
longEntry = smaUpTrend and bullishPinBar and bullPierce
shortEntry = smaDnTrend and bearishPinBar and bearPierce
longEntryWithSlope = smaUpTrend and bullishPinBar and bullPierce and slopingUp
shortEntryWithSlope = smaDnTrend and bearishPinBar and bearPierce and slopingDn

// Specify Secondary Exit Conditions
longExit = crossunder(fastSMA, slowSMA)
shortExit = crossover(fastSMA, slowSMA)

// Long Entry Function
enterlong() =>
    risk = usr_risk * 0.01 * strategy.equity
    stopLoss = low[1] - atr[1] * atr_mult
    entryPrice = high[1]
    units = risk / (entryPrice - stopLoss)
    takeProfit = entryPrice + trd_rewd * (entryPrice - stopLoss)
    strategy.entry("long", strategy.long, units, stop=entryPrice)
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
// Short Entry Function
entershort() =>
    risk = usr_risk * 0.01 * strategy.equity
    stopLoss = high[1] + atr[1] * atr_mult
    entryPrice = low[1]
    units = risk / (stopLoss - entryPrice)
    takeProfit = entryPrice - trd_rewd * (stopLoss - entryPrice)
    strategy.entry("short", strategy.short, units, stop=entryPrice)
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
// Execute Long Entry w/o Slope
if (longEntry and use_slpe == false)
    enterlong()
    
// Execute Long Entry w/ Slope
if (longEntryWithSlope and use_slpe == true)
    enterlong()

// Exit Long Due to Re-Cross
if(longExit and strategy.position_size > 0 and emg_exit)    
    strategy.order("exit long, re-cross", strategy.short, abs(strategy.position_size))

// Cancel the Long Entry
strategy.cancel("long", barssince(longEntry) > ent_canc)

// Execute Short Entry w/o Slope
if (shortEntry and use_slpe == false)
    entershort() 
    
// Execute Short Entry w/ Slope
if (shortEntryWithSlope and use_slpe == true)
    entershort() 

// Exit Short Due to Re-Cross
if(shortExit and strategy.position_size < 0 and emg_exit)    
    strategy.order("exit short, re-cross", strategy.long, abs(strategy.position_size))

// Cancel the Short Entry
strategy.cancel("short", barssince(shortEntry) > ent_canc)

// Plot Moving Averages to Chart
plot(fastSMA, color=color.red)
plot(slowSMA, color=color.blue)

// Plot Pin Bars to Chart
plotshape(bullishPinBar, style=shape.arrowup, location=location.abovebar, color=#FF0000, text='')
plotshape(bearishPinBar, style=shape.arrowdown, location=location.belowbar, color=#0000FF, text='')