O Squeeze Backtest Transformer v2.0 é um sistema de negociação quantitativo baseado em uma estratégia de compressão. Ao definir parâmetros como entrada, stop loss, porcentagem de lucro e tempo máximo de retenção, ele testa a estratégia dentro de um intervalo de tempo específico. A estratégia suporta negociação multidirecional e pode definir flexivelmente a direção da negociação para longa ou curta. Ao mesmo tempo, a estratégia também fornece opções ricas para definir o período de backtest, que pode facilmente selecionar um intervalo de tempo fixo ou o tempo máximo de backtest.
O Squeeze Backtest Transformer v2.0 é um sistema de negociação quantitativo baseado em uma estratégia de compressão que pode negociar em diferentes ambientes de mercado através de configurações de parâmetros flexíveis e suporte de negociação multidirecional. Ao mesmo tempo, opções ricas de configuração de período de backtest e configurações de take profit e stop loss podem ajudar os usuários a conduzir análise de dados históricos e controle de risco. No entanto, o desempenho da estratégia é muito afetado pelas configurações de parâmetros e precisa ser otimizado e melhorado com base nas características do mercado e nas necessidades de negociação para melhorar a estabilidade e lucratividade da estratégia. No futuro, podemos considerar a introdução de mais indicadores técnicos, ajustando dinamicamente o tempo máximo de detenção, otimizando estratégias laterais e fortalecendo a gestão de posição e capital para otimizar o mercado.
/*backtest start: 2023-04-22 00:00:00 end: 2024-04-27 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Squeeze Backtest by Shaqi v2.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) R0 = "6 Hours" R1 = "12 Hours" R2 = "24 Hours" R3 = "48 Hours" R4 = "1 Week" R5 = "2 Weeks" R6 = "1 Month" R7 = "Maximum" BL = "low" BH = "high" BO = "open" BC = "close" BHL= "mid (hl)" BOC = "mid (oc)" LONG = "LONG" SHORT = "SHORT" direction = input.string(title="Direction", defval=LONG, options=[LONG, SHORT], group="Squeeze Settings") strategy.risk.allow_entry_in(direction == LONG ? strategy.direction.long : strategy.direction.short) openPercent = input.float(1.4, "Open, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01 closePercent = input.float(0.6, "Close, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01 stopPercent = input.float(0.8, "Stop Loss, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01 isMaxBars = input.bool(true, "Max Bars To Sell", inline="MaxBars", group="Squeeze Settings") maxBars = input.int(10, title="", minval=0, maxval=1000, step=1, inline="MaxBars", group="Squeeze Settings") bind = input.string(BC, "Bind", options=[BL, BH, BO, BC, BHL, BOC], group="Squeeze Settings") isRange = input.bool(true, "Fixed Range", inline="Range", group="Backtesting Period") rangeStart = input.string(R2, "", options=[R0, R1, R2, R3, R4, R5, R6, R7], inline="Range", group="Backtesting Period") periodStart = input(timestamp("12 Apr 2024 00:00 +0000"), "Backtesting Start", group="Backtesting Period") periodEnd = input(timestamp("20 Apr 2024 00:00 +0000"), "Backtesting End", 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 float bindOption = na if bind == BL bindOption := low else if bind == BH bindOption := high else if bind == BO bindOption := open else if bind == BC bindOption := close else if bind == BHL bindOption := hl2 else bindOption := ohlc4 afterStartDate = (time >= startDate) beforeEndDate = (time <= endDate) periodCondition = true notInTrade = strategy.position_size == 0 inTrade = strategy.position_size != 0 barsFromEntry = ta.barssince(strategy.position_size[0] > strategy.position_size[1]) entry = strategy.position_size[0] > strategy.position_size[1] entryBar = barsFromEntry == 0 notEntryBar = barsFromEntry != 0 openLimitPrice = direction == LONG ? (bindOption - bindOption * openPercent) : (bindOption + bindOption * openPercent) closeLimitPriceEntry = openLimitPrice * (direction == LONG ? 1 + closePercent : 1 - closePercent) closeLimitPrice = strategy.position_avg_price * (direction == LONG ? 1 + closePercent : 1 - closePercent) stopLimitPriceEntry = direction == LONG ? openLimitPrice - openLimitPrice * stopPercent : openLimitPrice + openLimitPrice * stopPercent stopLimitPrice = direction == LONG ? strategy.position_avg_price - strategy.position_avg_price * stopPercent : strategy.position_avg_price + strategy.position_avg_price * stopPercent if periodCondition and notInTrade strategy.entry(direction == LONG ? "BUY" : "SELL", direction == LONG ? strategy.long : strategy.short, limit = openLimitPrice, stop = stopLimitPriceEntry) strategy.exit("INSTANT", limit = closeLimitPriceEntry, stop = stopLimitPriceEntry, comment_profit = direction == LONG ? 'INSTANT SELL' : 'INSTANT BUY', comment_loss = 'INSTANT STOP') if inTrade strategy.cancel("INSTANT") strategy.exit(direction == LONG ? "SELL" : "BUY", limit = closeLimitPrice, stop = stopLimitPrice, comment_profit = direction == LONG ? "SELL" : "BUY", comment_loss = "STOP") if isMaxBars and barsFromEntry == maxBars strategy.close_all(comment = "TIMEOUT STOP", immediately = true) showStop = stopPercent <= 0.20 // plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=1) // plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=1) // plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=1) plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=0) plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=0) plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=0) plot(openLimitPrice, title="Trailing Open Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.blue : color.red, 30), offset=1) plot(closeLimitPriceEntry, title="Trailing Close Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.red : color.blue, 80), offset=1) plot(stopLimitPriceEntry, title="Trailing Stop Position Limit Order", style=plot.style_stepline, color=color.new(#c50202, 80), offset=1)