Estrategia personalizada de ruptura ascendente


Fecha de creación: 2024-01-08 10:32:25 Última modificación: 2024-01-08 10:32:25
Copiar: 0 Número de Visitas: 629
1
Seguir
1617
Seguidores

Estrategia personalizada de ruptura ascendente

Descripción general

La estrategia de ruptura ascendente es una estrategia de negociación cuantitativa basada en el juicio de la tendencia del precio. La estrategia determina si el mercado está actualmente en una tendencia ascendente continua mediante el cálculo de la proporción de la línea K positiva en el período especificado. Cuando la proporción de la línea K positiva está por encima del límite superior establecido por el usuario, la estrategia determina que está en una tendencia ascendente y hace más; cuando la proporción de la línea K positiva está por debajo del límite inferior establecido por el usuario, la estrategia determina que está en una tendencia descendente y hace un espacio.

Principio de estrategia

El indicador central de la estrategia es la proporción de la línea K hacia la derecha. La línea K hacia la derecha indica que el precio ha subido en el ciclo desde el punto de apertura más bajo y el precio de cierre más alto que el precio de apertura. La estrategia utiliza el período transitorio especificado por el usuario de estadística para determinar la proporción de la cantidad de líneas K hacia la derecha en todas las líneas K. Si la proporción es mayor que el límite superior, se determina que la situación actual es de continuo alza, y se hace un pronóstico.

Ejemplo: el número de ciclos de configuración del usuario es 20, el límite superior es 70, el límite inferior es 30 La estrategia retrocede las 20 líneas K más recientes, si 16 de ellas son líneas K positivas, la proporción es 1620 = 80 En este momento, por encima del límite superior de la configuración del usuario, 70 Ejecutar más operaciones Si solo 5 de las 20 líneas K más recientes son líneas K positivas, la proporción es 520 = 25% Por debajo del límite inferior de la configuración del usuario, 30 Ejecutar la operación de vacío

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. La estrategia es sencilla, intuitiva y fácil de entender.
  2. El hecho de que solo se necesite un indicador reduce el riesgo de optimización.
  3. El usuario puede personalizar los parámetros para adaptarse a las diferentes variedades;
  4. La función de bloqueo de pérdidas incorporada evita pérdidas masivas.
  5. Se puede invertir directamente, sin esperar a que la posición se cierre para seguir la marcha más rápido.

Análisis de riesgos

La estrategia también tiene sus riesgos:

  1. El uso de un solo indicador puede generar señales erróneas.
  2. Los parámetros de los indicadores son fácilmente sobre optimizados, y los resultados en el disco duro pueden variar mucho.
  3. En caso de fluctuaciones extremas, el stop loss puede ser superado y causar pérdidas.
  4. La función de apertura inversa puede aumentar las pérdidas.
  5. El efecto es muy correlacionado con la variedad, por lo que requiere ser probado por separado.

Para reducir el riesgo, se puede optimizar en los siguientes aspectos:

  1. El gobierno de la República Democrática del Congo ha anunciado el inicio de una nueva fase en la industria de la energía.
  2. Optimizar las estrategias de detención de pérdidas y reducir las pérdidas individuales;
  3. Evaluar y controlar el monto de las pérdidas individuales;
  4. Resultados de las pruebas en diferentes variedades.

Dirección de optimización

La estrategia puede ser optimizada en las siguientes direcciones:

  1. Aumentar los indicadores auxiliares de juicio, como la racionalidad del precio, para evitar señales erróneas
  2. Optimización de los métodos de detención de pérdidas, incluyendo detención de movimiento, detención de pérdidas por vibración, etc.
  3. Aumentar las condiciones de filtración de la apertura, como la ruptura de la línea de Brin y la reentrada
  4. Prueba de la adaptabilidad de diferentes parámetros de la línea K recta a diferentes variedades
  5. Evaluar el máximo retiro y controlar el tamaño de la pérdida individual

Resumir

La idea general de la estrategia de ruptura hacia arriba es clara y simple, y capta las tendencias mediante el uso de indicadores simples para determinar el estado de subida o caída constante a través de la proporción estadística de la línea K. La estrategia es fácil de entender, fácil de usar y adecuada para la práctica de los principiantes en el comercio cuantitativo. Sin embargo, hay cierta volatilidad de ganancias que se basa solo en una configuración de indicadores y parámetros.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-04 00:00:00
period: 1m
basePeriod: 1m
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/
// © ZenAndTheArtOfTrading 
// © TweakerID

// Based on the calculations by ZenAndTheArtOfTrading, I added stop loss, take profit and reverse line codes.
// The Positive Bars % calculates the number of green (positive) bars, relative to a lookback period, defined 
// by the user. If the percentage is low, it means that there was a bigger number of red candles in the 
// lookback period. The strategy goes long when the percentage is high and short when it's low, although
// this logic can be reversed with positive results on different time frames.

//@version=4
strategy("Positive Bars % Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

lookback = input(title="Lookback", type=input.integer, defval=13)
upperLimit = input(title="Upper Limit", type=input.integer, defval=70)
lowerLimit = input(title="Lower Limit", type=input.integer, defval=30)

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(10, step=.1, title="ATR Multiple")
i_TPRRR = input(1.6, step=.1, title="Take Profit Risk Reward Ratio")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR

// Strategy Stop
float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

//Calculations
positiveBars = 0
for i = (lookback - 1) to 0
    if close[i] > open[i]
        positiveBars := positiveBars + 1
positiveBarsPercent = (positiveBars / lookback) * 100

BUY=positiveBarsPercent >= upperLimit
SELL=positiveBarsPercent <= lowerLimit

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)