La Estrategia de Inversión de Barras de Pin de Perforación es una estrategia de trading de tendencia basada en patrones de precios a corto plazo. Utiliza barras de pin como señales, combinadas con promedios móviles para determinar la dirección de la tendencia, para lograr una entrada de alta precisión. También utiliza un mecanismo único de trailing stop para lograr una rentabilidad extremadamente alta.
La señal de entrada para esta estrategia es perforar barras de alfiler.
Dicha combinación asegura el filtrado de la mayor parte del ruido y aumenta la precisión de entrada.
La estrategia utiliza tres MAs de diferentes períodos para definir tendencias. Específicamente, cuando los MAs rápidos, medios y lentos se alinean en una dirección, se define como una tendencia. De lo contrario, se considera como consolidación.
Para las entradas largas, se requiere un MA rápido > medio MA > lento MA. Para las entradas cortas, se requiere un MA rápido < medio MA < lento MA.
La estrategia utiliza un mecanismo único de stop loss de trailing. Después de la entrada, los puntos óptimos de stop loss se rastrean en función de los valores definidos por el usuario para los puntos de trailing y offset. Esto permite maximizar el beneficio capturado mientras se controla el riesgo.
Las señales de penetración permiten la entrada solo en puntos de oportunidad de alta probabilidad, evitando operaciones excesivamente ruidosas. La combinación con filtros de tendencia evita aún más la mayoría de las operaciones de contratrend. Esto garantiza una alta precisión para la estrategia.
El único stop de seguimiento es el punto más destacado de esta estrategia. controla con precisión el stop loss dentro de un pequeño rango por operación, al tiempo que garantiza el máximo beneficio capturado.
Los resultados de la simulación muestran una rentabilidad insana después de aplicar este mecanismo, con un rendimiento total superior al 1000% para múltiples pares, y un beneficio máximo por operación de más de 100 veces el riesgo inicial.
Dados los resultados casi "santo grial", es muy probable que se trate de una simulación sobreajustada de los mercados.
Además, es posible que el corto período de prueba de dos años no capte los cambios estructurales del régimen del mercado que podrían afectar a los resultados reales.
Los valores excesivamente sensibles de las paradas de seguimiento pueden causar paradas no deseadas excesivas. Los eventos repentinos del mercado también pueden invalidar las órdenes de paradas de pérdida de seguimiento. Estos son riesgos intrínsecos asociados con el uso de paradas de seguimiento.
Para que sea ágil y confiable, trata de relajar los puntos de arrastre para evitar la sobre-sensibilidad.
Aumentar el plazo de prueba también ayuda a examinar la robustez de los parámetros.
Los períodos actuales de MA probablemente no sean el conjunto óptimo de parámetros.
Por ejemplo, aumentando la diferencia entre los períodos de admisión rápida y media, o modificando la forma en que las admisiones medias interactúan.
La estrategia de reversión de las barras perforadoras logró resultados sorprendentes en las pruebas de retroceso a través de una entrada de alta eficiencia y una extracción de ganancias extremas.
Con el ajuste o la optimización adecuada de los parámetros, esta estrategia puede ser capaz de generar ganancias considerables en el comercio en vivo, convirtiéndose en un poderoso sistema de seguimiento de tendencias.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //Time Frame: H1 strategy("Pin Bar Magic 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=0.5,confirm=false) slPoints = input(title="Stop Loss Trail Points (Pips)",type=input.integer,minval=1,maxval=1000,step=1,defval=1,confirm=false) slOffset = input(title="Stop Loss Trail Offset (Pips)",type=input.integer,minval=1,maxval=1000,step=1,defval=1,confirm=false) sma_slow = input(title="Slow SMA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=50,confirm=false) ema_medm = input(title="Medm EMA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=18,confirm=false) ema_fast = input(title="Fast EMA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=6,confirm=false) atr_valu = input(title="ATR (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=14,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 slowSMA = sma(close, sma_slow) medmEMA = ema(close, ema_medm) fastEMA = ema(close, ema_fast) 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 fanUpTrend = (fastEMA > medmEMA) and (medmEMA > slowSMA) fanDnTrend = (fastEMA < medmEMA) and (medmEMA < slowSMA) // Specify Piercing Conditions bullPierce = ((low < fastEMA) and (open > fastEMA) and (close > fastEMA)) or ((low < medmEMA) and (open > medmEMA) and (close > medmEMA)) or ((low < slowSMA) and (open > slowSMA) and (close > slowSMA)) bearPierce = ((high > fastEMA) and (open < fastEMA) and (close < fastEMA)) or ((high > medmEMA) and (open < medmEMA) and (close < medmEMA)) or ((high > slowSMA) and (open < slowSMA) and (close < slowSMA)) // Specify Entry Conditions longEntry = fanUpTrend and bullishPinBar and bullPierce shortEntry = fanDnTrend and bearishPinBar and bearPierce // 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) strategy.entry("long", strategy.long, units, stop=entryPrice) strategy.exit("exit long", from_entry="long", trail_points=slPoints, trail_offset=slOffset) // 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) strategy.entry("short", strategy.short, units, stop=entryPrice) strategy.exit("exit short", from_entry="short", trail_points=slPoints, trail_offset=slOffset) // Execute Long Entry if (longEntry) enterlong() // Execute Short Entry if (shortEntry) entershort() // Cancel the Entry if Bar Time is Exceeded strategy.cancel("long", barssince(longEntry) > ent_canc) strategy.cancel("short", barssince(shortEntry) > ent_canc) // Force Close During Certain Conditions strategy.close_all(when = hour==16 and dayofweek==dayofweek.friday, comment = "exit all, market-closed") strategy.close_all(when = crossunder(fastEMA, medmEMA), comment = "exit long, re-cross") strategy.close_all(when = crossover(fastEMA, medmEMA), comment = "exit short, re-cross") // Plot Moving Averages to Chart plot(fastEMA, color=color.red) plot(medmEMA, color=color.blue) plot(slowSMA, color=color.green) // Plot Pin Bars to Chart plotshape(bullishPinBar, text='Bull PB', style=shape.labeldown, location=location.abovebar, color=color.green, textcolor=color.white, transp=0) plotshape(bearishPinBar, text='Bear PB', style=shape.labelup, location=location.belowbar, color=color.red, textcolor=color.white, transp=0) // Plot Days of Week plotshape(hour==0 and dayofweek==dayofweek.monday, text='Monday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0) plotshape(hour==0 and dayofweek==dayofweek.tuesday, text='Tuesday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0) plotshape(hour==0 and dayofweek==dayofweek.wednesday, text='Wednesday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0) plotshape(hour==0 and dayofweek==dayofweek.thursday, text='Thursday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0) plotshape(hour==0 and dayofweek==dayofweek.friday, text='Friday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0) plotshape(hour==16 and dayofweek==dayofweek.friday, text='Market Closed', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0)