Estrategia de ruptura por porcentaje de barras positivas

El autor:¿ Qué pasa?, Fecha: 2024-01-08 10:32:25
Las etiquetas:

img

Resumen general

La estrategia de ruptura de porcentaje de barras positivas es una estrategia de negociación cuantitativa basada en juicios de acción de precios. Cálcula el porcentaje de velas de tendencia alcista en un período específico para determinar si el mercado está actualmente en un estado de tendencia alcista. Cuando el porcentaje de velas de tendencia alcista es mayor que el límite superior definido por el usuario, la estrategia juzga que el mercado está actualmente en una tendencia alcista y va largo. Cuando el porcentaje es menor que el límite inferior definido por el usuario, la estrategia juzga que el mercado está actualmente en una tendencia bajista y va corto.

Estrategia lógica

El indicador principal de esta estrategia es el porcentaje de velas de tendencia alcista. Una vela de tendencia alcista se abre por debajo del mínimo anterior y se cierra por encima del abierto, lo que indica que el precio subió durante ese período. La estrategia cuenta el número de velas de tendencia alcista en el período de retroceso definido por el usuario y calcula el porcentaje de velas de tendencia alcista entre todas las velas. Cuando el porcentaje es mayor que el límite superior, la estrategia juzga que el mercado está en una tendencia alcista persistente y va largo. Cuando el porcentaje es menor que el límite inferior, la estrategia juzga que el mercado está en una tendencia alcista y se queda corto. Las órdenes de stop loss y take profit se establecen de acuerdo con el método de stop loss definido por el usuario.

Por ejemplo, si el usuario establece el período de retroceso a 20, límite superior a 70, límite inferior a 30, la estrategia rastrea las últimas 20 velas. Si 16 de ellas son velas de tendencia alcista, el porcentaje sería de 16/20=80%. Dado que el 80% es superior al límite superior de 70%, la estrategia ejecutará una orden larga. Si entre las últimas 20 velas, solo 5 son velas de tendencia alcista, entonces el porcentaje sería de 5/20=25%. Esto es inferior al límite inferior del 30%, la estrategia ejecutará una orden corta.

Análisis de ventajas

Las principales ventajas de esta estrategia son las siguientes:

  1. La lógica de la estrategia es simple e intuitiva, fácil de entender;
  2. Se basa en un solo indicador, lo que reduce el riesgo de sobreajuste;
  3. Los usuarios pueden personalizar los parámetros para diferentes productos;
  4. Tiene funciones de stop loss/take profit incorporadas para evitar pérdidas enormes;
  5. Permite invertir el comercio sin salir primero de las posiciones, seguimiento más rápido de las tendencias.

Análisis de riesgos

Los principales riesgos de esta estrategia son:

  1. La dependencia únicamente de un indicador puede generar señales falsas.
  2. Los parámetros son propensos a la sobreajuste, el rendimiento en vivo puede variar mucho;
  3. Las pérdidas de detención pueden verse afectadas por fluctuaciones volátiles de los precios, lo que conduce a pérdidas;
  4. El comercio inverso puede amplificar las pérdidas;
  5. El rendimiento depende en gran medida del símbolo, requiriendo pruebas separadas.

Los riesgos pueden reducirse:

  1. Añadir filtros para evitar señales falsas;
  2. Optimizar la lógica de stop loss para limitar las pérdidas;
  3. Evaluación y control del tamaño máximo de las pérdidas;
  4. Prueba con diferentes símbolos por separado.

Direcciones de optimización

Las principales direcciones para optimizar esta estrategia incluyen:

  1. Añadir indicadores auxiliares como el volumen para evitar señales falsas;
  2. Optimización de los métodos de stop loss, tales como el stop loss de seguimiento;
  3. Añadir filtros de entrada como la ruptura de las bandas de Bollinger;
  4. Prueba de los parámetros óptimos de las velas de tendencia alcista para diferentes símbolos;
  5. Evaluación del aprovechamiento máximo y control del tamaño de las pérdidas.

Conclusión

La estrategia de breakout de porcentaje de barras positivas tiene una lógica simple y directa para capturar tendencias al juzgar estadísticamente la persistencia de tendencias alcistas / bajistas. Es fácil de entender y fácil de usar, adecuado para los principiantes.


/*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)

Más.