Squeeze Backtest Transformer v2.0 ist ein quantitatives Handelssystem, das auf einer Squeeze-Strategie basiert. Durch das Setzen von Parametern wie Eintritt, Stop-Loss, Take-Profit-Prozentsätze und maximale Haltezeit wird die Strategie innerhalb eines bestimmten Zeitrahmens zurückgetestet. Die Strategie unterstützt multi-directional Trading und kann die Handelsrichtung flexibel auf lang oder kurz einstellen. Gleichzeitig bietet die Strategie auch umfangreiche Optionen für die Einstellung der Backtest-Periode, die leicht einen festen Zeitrahmen oder die maximale Backtest-Zeit auswählen kann.
Squeeze Backtest Transformer v2.0 ist ein quantitatives Handelssystem, das auf einer Squeeze-Strategie basiert und in verschiedenen Marktumgebungen durch flexible Parameter-Einstellungen und multidirektionale Handelsunterstützung handeln kann. Gleichzeitig können reiche Backtest-Perioden-Einstellungsoptionen und Take-Profit- und Stop-Loss-Einstellungen den Benutzern helfen, historische Datenanalysen und Risikokontrolle durchzuführen. Die Leistung der Strategie wird jedoch stark von Parameter-Einstellungen beeinflusst und muss basierend auf Marktmerkmalen und Handelsbedürfnissen optimiert und verbessert werden, um die Stabilität und Rentabilität der Strategie zu verbessern. In Zukunft können wir in Betracht ziehen, mehr technische Indikatoren einzuführen, die maximale Haltezeit dynamisch anzupassen, Seitenstrategien zu optimieren und die Marktposition und das Kapitalmanagement zu stärken, um zu optimieren.
/*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)