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.
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.
Las principales ventajas de esta estrategia son las siguientes:
Los principales riesgos de esta estrategia son:
Los riesgos pueden reducirse:
Las principales direcciones para optimizar esta estrategia incluyen:
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)