Esta estrategia adopta el principio de diferencia de precios para ir largo cuando el precio rompe los mínimos recientes, con órdenes de stop loss y take profit para seguir el precio más bajo para obtener ganancias.
Identifica las brechas cuando el precio se rompe por debajo del precio más bajo en N horas recientes, va largo basado en el porcentaje configurado, con órdenes de stop loss y take profit.
Las ventajas de esta estrategia:
También hay algunos riesgos:
La estrategia puede mejorarse en los siguientes aspectos:
En conclusión, esta es una estrategia de stop loss simple y efectiva basada en las brechas de precios. Reduce las entradas falsas y bloquea las ganancias de manera efectiva. Todavía hay mucho espacio para mejoras en la sintonización de parámetros y el filtrado de señales. Merece más investigación y refinamiento.
/*backtest start: 2022-11-21 00:00:00 end: 2023-11-27 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Squeeze Backtest by Shaqi v1.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0) strategy.risk.allow_entry_in(strategy.direction.long) R0 = "6 Hours" R1 = "12 Hours" R2 = "24 Hours" R3 = "48 Hours" R4 = "1 Week" R5 = "2 Weeks" R6 = "1 Month" R7 = "Maximum" buyPercent = input( title="Buy, %", type=input.float, defval=3, minval=0.01, step=0.01, inline="Percents", group="Squeeze Settings") * 0.01 sellPercent = input(title="Sell, %", type=input.float, defval=1, minval=0.01, step=0.01, inline="Percents", group="Squeeze Settings") * 0.01 stopPercent = input(title="Stop Loss, %", type=input.float, defval=1, minval=0.01, maxval=100, step=0.01, inline="Percents", group="Squeeze Settings") * 0.01 isMaxBars = input( title="Max Bars To Sell", type=input.bool, defval=true , inline="MaxBars", group="Squeeze Settings") maxBars = input( title="", type=input.integer, defval=2, minval=0, maxval=1000, step=1, inline="MaxBars", group="Squeeze Settings") bind = input( title="Bind", type=input.source, defval=close, group="Squeeze Settings") isRange = input( title="Fixed Range", type=input.bool, defval=true, inline="Range", group="Backtesting Period") rangeStart = input( title="", defval=R4, options=[R0, R1, R2, R3, R4, R5, R6, R7], inline="Range", group="Backtesting Period") periodStart = input(title="Backtesting Start", type=input.time, defval=timestamp("01 Aug 2021 00:00 +0000"), group="Backtesting Period") periodEnd = input( title="Backtesting End", type=input.time, defval=timestamp("01 Aug 2022 00:00 +0000"), group="Backtesting Period") int startDate = na int endDate = na if isRange if rangeStart == R0 startDate := timenow - 21600000 endDate := timenow else if rangeStart == R1 startDate := timenow - 43200000 endDate := timenow else if rangeStart == R2 startDate := timenow - 86400000 endDate := timenow else if rangeStart == R3 startDate := timenow - 172800000 endDate := timenow else if rangeStart == R4 startDate := timenow - 604800000 endDate := timenow else if rangeStart == R5 startDate := timenow - 1209600000 endDate := timenow else if rangeStart == R6 startDate := timenow - 2592000000 endDate := timenow else if rangeStart == R7 startDate := time endDate := timenow else startDate := periodStart endDate := periodEnd afterStartDate = (time >= startDate) beforeEndDate = (time <= endDate) notInTrade = strategy.position_size == 0 inTrade = strategy.position_size > 0 barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1]) entry = strategy.position_size[0] > strategy.position_size[1] entryBar = barsFromEntry == 0 notEntryBar = barsFromEntry != 0 buyLimitPrice = bind - bind * buyPercent buyLimitFilled = low <= buyLimitPrice sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent) sellLimitPrice = strategy.position_avg_price * (1 + sellPercent) stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent if afterStartDate and beforeEndDate and notInTrade strategy.entry("BUY", true, limit = buyLimitPrice) strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry) strategy.cancel("INSTANT", when = inTrade) if isMaxBars strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell") strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice) showStop = stopPercent <= 0.03 plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1) plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1) plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1) plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)