Estrategia de ruptura dinámica


Fecha de creación: 2023-10-17 16:36:49 Última modificación: 2023-10-17 16:36:49
Copiar: 0 Número de Visitas: 690
1
Seguir
1617
Seguidores

Estrategia de ruptura dinámica

Descripción general

Esta estrategia se utiliza principalmente para lograr la estrategia de seguimiento de la ruptura de la corredera de la cuenca de Dengxian. Esta estrategia combina la tendencia y la ruptura de dos ideas de comercio, en la base de la tendencia de la línea larga de juicio, la búsqueda de los puntos de ruptura de menor período para realizar entradas, la realización de la situación de la tendencia de la tendencia. Además, la estrategia también establece el nivel de pérdidas y paradas para controlar el riesgo-beneficio de cada transacción.

Principio de estrategia

  1. Configuración de los parámetros para el indicador de la valvula de la vía de Deng Dongqian, con un ciclo por defecto de 20;

  2. Configuración de la línea media móvil suave de la EMA, con un ciclo por defecto de 200;

  3. La tasa de riesgo-beneficio es de 1.5 por defecto.

  4. Configuración de los parámetros de retroceso de la ruptura, en forma de múltiples y sin cabeza;

  5. Si el registro de una ruptura es alto o bajo;

  6. Señales múltiples: si la ruptura anterior es baja y el precio está por encima de la línea superior de Dongguan y por encima de la línea media de la EMA, se genera una señal múltiple;

  7. Señales de cabeza vacía: si la ruptura anterior es alta y el precio está por debajo de la línea descendente de Dongguan y por debajo de la línea media de la EMA, se genera una señal de cabeza vacía;

  8. Después de entrar en una posición de múltiples cabezas, el stop loss se establece como una retirada de 5 puntos por debajo de la vía de Dongjian, y el stop loss es el riesgo por la ganancia multiplicado por la distancia de parada;

  9. Después de entrar en la posición de cabeza vacía, el stop loss se establece como la retracción de 5 puntos en la vía superior de Dongjian, y el stop loss es el riesgo por la ganancia multiplicado por la distancia de parada.

De esta manera, la estrategia, combinada con el juicio de la tendencia y la operación de ruptura, puede capturar oportunidades de períodos más cortos en la tendencia de la línea larga. Al mismo tiempo, la configuración de stop loss puede controlar el riesgo de ganancias de una sola operación.

Análisis de las ventajas

  1. En la actualidad, el comercio de divisas en el mercado de divisas está en pleno apogeo.

  2. El canal de Dongxian es un indicador de línea larga que, en combinación con el filtro de línea uniforme de la EMA, permite determinar mejor la dirección de la tendencia.

  3. El mecanismo de prevención de pérdidas controla cada riesgo y limita las posibles pérdidas.

  4. Optimización de la relación riesgo-beneficio, que permite aumentar la relación pérdidas-ganancias y buscar ganancias extras.

  5. La configuración de los parámetros de retroalimentación es flexible y permite ajustar la combinación óptima de parámetros para diferentes mercados.

Análisis de riesgos

  1. El canal de Dongxian y la línea media de la EMA son indicadores de filtración y pueden emitir señales erróneas.

  2. Las brechas son fácilmente manipulables y requieren una identificación clara del contexto de la tendencia.

  3. El stop loss está fijado y no se puede ajustar según la volatilidad del mercado.

  4. Parameters El espacio de optimización es limitado, y el disco duro es difícil de garantizar.

  5. Los sistemas de negociación no pueden soportar demasiados eventos aleatorios, y los eventos de Black Swan pueden causar grandes pérdidas.

Dirección de optimización

  1. Se puede considerar la adición de más indicadores para filtrar, como el indicador de vibración, para mejorar la calidad de la señal.

  2. Se puede configurar un Stop Loss inteligente para ajustar la posición de pérdidas y ganancias en función de la volatilidad del mercado y la dinámica del indicador ATR.

  3. Se pueden utilizar métodos como el aprendizaje automático para probar y optimizar los parámetros para que estén más cerca del mercado real.

  4. Se puede optimizar la lógica de entrada, configurar un indicador de VOLUME o de fluctuación como condición auxiliar para evitar la trampa.

  5. Se puede considerar la combinación con estrategias de seguimiento de tendencias o aprendizaje automático para formar estrategias mixtas y mejorar la estabilidad.

Resumir

Esta estrategia es una estrategia de seguimiento de ruptura, la idea central es determinar la tendencia de la línea larga, para hacer una operación de avance con la ruptura como señal, y establecer un stop loss para controlar el riesgo de una sola transacción. Esta estrategia tiene ciertas ventajas, pero también hay un espacio para la optimización. En general, si se puede manejar la configuración de los parámetros, la elección de la hora de entrada, y otros problemas complementarios con otras técnicas, esta estrategia puede ser una estrategia práctica de seguimiento de tendencias.

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

//@version=4
// Welcome to my second script on Tradingview with Pinescript
// First of, I'm sorry for the amount of comments on this script, this script was a challenge for me, fun one for sure, but I wanted to thoroughly go through every step before making the script public
// Glad I did so because I fixed some weird things and I ended up forgetting to add the EMA into the equation so our entry signals were a mess
// This one was a lot tougher to complete compared to my MACD crossover trend strategy but I learned a ton from it, which is always good and fun
// Also I'll explain the strategy and how I got there through some creative coding(I'm saying creative because I had to figure this stuff out by myself as I couldn't find any reference codes)
// First things first. This is a Donchian Channel Breakout strategy which follows the following rules
// If the price hits the upperband of the Donchian Channel + price is above EMA and the price previously hit the lowerband of the Donchian Channel it's a buy signal
// If the price hits the lowerband of the Donchian Channel + price is below EMA and the price prevbiously hit the upper band of the Donchian Channel it's a sell signal
// Stop losses are set at the lower or upper band with a 0.5% deviation because we are acting as if those two bands are the resistance in this case
// Last but not least(yes, this gave BY FAR the most trouble to code), the profit target is set with a 1.5 risk to reward ratio
// If you have any suggestions to make my code more efficient, I'll be happy to hear so from you
// So without further ado, let's walk through the code

// The first line is basically standard because it makes backtesting so much more easy, commission value is based on Binance futures fees when you're using BNB to pay those fees in the futures market
// strategy(title="Donchian Channels", shorttitle="DC", overlay=true, default_qty_type = strategy.cash, default_qty_value = 150, initial_capital = 1000, currency = currency.USD, commission_type = "percent", commission_value = 0.036)
// The built-in Donchian Channels + an added EMA input which I grouped with the historical bars from the Donchian Channels
length          = input(20, minval=1, group = "Indicators")
lower           = lowest(length)
upper           = highest(length)
basis           = avg(upper, lower)
emaInput        = input(title = "EMA Input", type = input.integer, defval = 200, minval = 10, maxval = 400, step = 1, group = "Indicators")
// I've made three new inputs, for risk/reward ratio and for the standard pullback deviation. My advise is to not use the pullback inputs as I'm not 100% sure if they work as intended or not
riskreward      = input(title = "Risk/Reward Ratio", type = input.float, defval = 1.50, minval = 0.01, maxval = 100, step = 0.01, group = "Risk/Reward")
pullbackLong    = input(title = "Distance from Long pullback %", type = input.float, defval = 0.995, minval = 0.001, maxval = 2, step = 0.001, group = "Risk/Reward")
pullbackShort   = input(title = "Distance from Short pullback %", type = input.float, defval = 1.005, minval = 0.001, maxval = 2, step = 0.001, group = "Risk/Reward")

// Input backtest range, you can adjust these in the input options, just standard stuff
fromMonth       = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
fromDay         = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
fromYear        = input(defval = 2000, title = "From Year",       type = input.integer, minval = 1970,           group = "Backtest Date Range")
thruMonth       = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
thruDay         = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
thruYear        = input(defval = 2099, title = "Thru Year",       type = input.integer, minval = 1970,           group = "Backtest Date Range")
// Date variable also standard stuff
inDataRange     = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0))

// I had to makes these variables because the system has to remember whether the previous 'breakout' was a high or a low
// Also, because I based my stoploss on the upper/lower band of the indicator I had to find a way to change this value just once without losing the value, that was added, on the next bar
var previousishigh = false
var previousislow = false
var longprofit = 0.0
var shortprofit = 0.0
var stoplossLong = 0.0
var stoplossShort = 0.0
// These are used as our entry variables
emaCheck = ema(close, emaInput)
longcond = high >= upper and close > emaCheck
shortcond = low <= lower and close < emaCheck

// With these two if statements I'm changing the boolean variable above to true, we need this to decide out entry position
if high >= upper
    previousishigh := true
if low <= lower
    previousislow := true

// Made a last minute change on this part. To clean up our entry signals we don't want our breakouts, while IN a position, to change. This way we do not instantly open a new position, almost always in the opposite direction, upon exiting one
if strategy.position_size > 0 or strategy.position_size < 0 
    previousishigh := false
    previousislow := false

// Strategy inputs
// Long - previous 'breakout' has to be a low, the current price has to be a new high and above the EMA, we're not allowed to be in a position and ofcourse it has to be within our given data for backtesting purposes
if previousislow == true and longcond and strategy.position_size == 0 and inDataRange
    strategy.entry("Long Entry", strategy.long, comment = "Entry Long")
    stoplossLong := lower * pullbackLong
    longprofit := ((((1 - stoplossLong / close) * riskreward) + 1) * close)
    strategy.exit("Long Exit", "Long Entry", limit = longprofit, stop = stoplossLong, comment = "Long Exit")

// Short - Previous 'breakout' has to be a high, current price has to be a new low and lowe than the 200EMA, we're not allowed to trade when we're in a position and it has to be within our given data for backtesting purposes
if previousishigh == true and shortcond and strategy.position_size == 0 and inDataRange
    strategy.entry("Short Entry", strategy.short, comment = "Entry Short")
    stoplossShort := upper * pullbackShort
    shortprofit := (close - ((((1 - close / stoplossShort) * riskreward) * close)))
    strategy.exit("Short Exit", "Short Entry", limit = shortprofit, stop = stoplossShort, comment = "Short Exit")
    
// This plots the Donchian Channels on the chart which is just using the built-in Donchian Channels
plot(basis, "Basis", color=color.blue)
u = plot(upper, "Upper", color=color.green)
l = plot(lower, "Lower", color=color.red)
fill(u, l, color=#0094FF, transp=95, title="Background")

// These plots are to show if the variables are working as intended, it's a mess I know but I didn't have any better ideas, they work well enough for me
// plot(previousislow ? close * 0.95 : na, color=color.red, linewidth=2, style=plot.style_linebr)
// plot(previousishigh ? close * 1.05 : na, color=color.green, style=plot.style_linebr)
// plot(longprofit, color=color.purple)
// plot(shortprofit, color=color.silver)
// plot(stoplossLong)
// plot(stoplossShort)
// plot(strategy.position_size)