Squeeze Backtest Transformer v2.0 adalah sistem perdagangan kuantitatif berdasarkan strategi squeeze. Dengan menetapkan parameter seperti masuk, hentikan kerugian, mengambil peratusan keuntungan, dan masa tahan maksimum, ia menguji semula strategi dalam julat masa tertentu. Strategi ini menyokong perdagangan pelbagai arah dan dapat menetapkan arah perdagangan dengan fleksibel menjadi panjang atau pendek. Pada masa yang sama, strategi ini juga menyediakan pilihan yang kaya untuk menetapkan tempoh backtest, yang dapat dengan mudah memilih julat masa tetap atau masa backtest maksimum.
Squeeze Backtest Transformer v2.0 adalah sistem perdagangan kuantitatif berdasarkan strategi squeeze yang boleh berdagang dalam persekitaran pasaran yang berbeza melalui tetapan parameter yang fleksibel dan sokongan perdagangan pelbagai arah. Pada masa yang sama, pilihan penetapan tempoh backtest yang kaya dan menetapkan keuntungan dan tetapan stop loss dapat membantu pengguna menjalankan analisis data sejarah dan kawalan risiko. Walau bagaimanapun, prestasi strategi sangat dipengaruhi oleh tetapan parameter dan perlu dioptimumkan dan ditingkatkan berdasarkan ciri pasaran dan keperluan perdagangan untuk meningkatkan kestabilan dan keuntungan strategi. Pada masa akan datang, kita boleh mempertimbangkan untuk memperkenalkan lebih banyak penunjuk teknikal, menyesuaikan masa pegangan maksimum secara dinamik, mengoptimumkan strategi sampingan, dan memperkukuhkan pengurusan kedudukan dan modal untuk mengoptimumkan pasaran.
/*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)