Sumber dimuat naik... memuat...

Squeeze Backtest Transformer v2.0

Penulis:ChaoZhang, Tarikh: 2024-04-28 14:09:26
Tag:

img

Ringkasan

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.

Prinsip Strategi

  1. Pertama, tentukan waktu permulaan dan akhir backtest berdasarkan parameter tempoh backtest yang ditetapkan oleh pengguna.
  2. Semasa tempoh backtest, jika tidak ada kedudukan semasa dan harga mencapai harga masuk (dihitung berdasarkan peratusan pembukaan), buka kedudukan dan tetapkan harga stop loss dan ambil keuntungan (dihitung berdasarkan peratusan stop loss dan ambil keuntungan) pada masa yang sama.
  3. Jika kedudukan sudah dipegang, batalkan pesanan mengambil keuntungan dan menghentikan kerugian sebelumnya dan menetapkan semula harga mengambil keuntungan dan menghentikan kerugian baru (dihitung berdasarkan harga purata kedudukan semasa).
  4. Jika masa tahan maksimum ditetapkan, apabila masa tahan mencapai nilai maksimum, memaksa kedudukan ditutup.
  5. Strategi ini menyokong perdagangan dalam kedua-dua arah panjang dan pendek.

Kelebihan Strategi

  1. Tetapan parameter yang fleksibel boleh diselaraskan mengikut keadaan pasaran dan keperluan perdagangan yang berbeza.
  2. Menyokong perdagangan pelbagai arah untuk memperoleh keuntungan dalam keadaan pasaran yang berbeza.
  3. Menyediakan pilihan yang kaya untuk menetapkan tempoh backtest, yang boleh dengan mudah menjalankan backtesting dan analisis data sejarah.
  4. Tetapan stop loss dan mengambil keuntungan dapat mengawal risiko dengan berkesan dan meningkatkan kecekapan penggunaan modal.
  5. Tetapan masa pegangan maksimum dapat mengelakkan pegangan kedudukan terlalu lama dan menghadapi risiko pasaran.

Risiko Strategi

  1. Tetapan harga masuk, harga stop loss dan harga mengambil keuntungan mempunyai kesan yang besar terhadap pulangan strategi. tetapan parameter yang tidak betul boleh menyebabkan kerugian.
  2. Apabila pasaran turun naik dengan ganas, stop loss boleh dicetuskan segera selepas membuka kedudukan, mengakibatkan kerugian.
  3. Jika masa pegangan maksimum mencetuskan penutupan kedudukan, ia mungkin kehilangan peluang untuk keuntungan berikutnya.
  4. Strategi mungkin tidak berfungsi dengan baik dalam beberapa keadaan pasaran khas (seperti pasaran sampingan).

Arah Pengoptimuman Strategi

  1. Pertimbangkan untuk memperkenalkan lebih banyak penunjuk teknikal atau penunjuk sentimen pasaran untuk mengoptimumkan keadaan untuk masuk, menghentikan kerugian dan mengambil keuntungan untuk meningkatkan kestabilan dan keuntungan strategi.
  2. Untuk penetapan masa pegangan maksimum, ia boleh diselaraskan secara dinamik mengikut turun naik pasaran dan keuntungan dan kerugian kedudukan untuk mengelakkan kos peluang yang mungkin dibawa oleh penutupan masa tetap.
  3. Untuk ciri-ciri pasaran sampingan, logik seperti penembusan julat sampingan atau pengesahan pembalikan trend boleh ditambah untuk mengurangkan kos perdagangan yang kerap.
  4. Pertimbangkan untuk menambah strategi pengurusan kedudukan dan pengurusan modal untuk mengawal pendedahan risiko satu transaksi dan meningkatkan kecekapan dan kestabilan penggunaan modal.

Ringkasan

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)



Lebih lanjut