Sumber daya yang dimuat... Pemuatan...

Squeeze Backtest Transformer v2.0

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

img

Gambaran umum

Squeeze Backtest Transformer v2.0 adalah sistem perdagangan kuantitatif yang didasarkan pada strategi squeeze. Dengan mengatur parameter seperti entri, stop loss, persentase profit, dan waktu tahan maksimum, ia melakukan backtesting strategi dalam rentang waktu tertentu. Strategi ini mendukung perdagangan multi arah dan dapat mengatur arah perdagangan secara fleksibel menjadi panjang atau pendek. Pada saat yang sama, strategi ini juga menyediakan pilihan yang kaya untuk mengatur periode backtest, yang dapat dengan mudah memilih rentang waktu tetap atau waktu backtest maksimum.

Prinsip Strategi

  1. Pertama, tentukan waktu awal dan akhir backtest berdasarkan parameter periode backtest yang ditetapkan oleh pengguna.
  2. Selama periode backtest, jika tidak ada posisi saat ini dan harga mencapai harga masuk (dihitung berdasarkan persentase pembukaan), buka posisi dan atur harga stop loss dan take profit (dihitung berdasarkan persentase stop loss dan take profit) pada saat yang sama.
  3. Jika suatu posisi sudah dipegang, batalkan pesanan mengambil keuntungan dan stop loss sebelumnya dan atur kembali harga mengambil keuntungan dan stop loss baru (dihitung berdasarkan harga rata-rata posisi saat ini).
  4. Jika waktu ditahan maksimum ditetapkan, ketika waktu ditahan mencapai nilai maksimum, paksa posisi ditutup.
  5. Strategi ini mendukung perdagangan dalam arah panjang dan pendek.

Keuntungan Strategi

  1. Pengaturan parameter yang fleksibel dapat disesuaikan sesuai dengan kondisi pasar dan kebutuhan perdagangan yang berbeda.
  2. Mendukung perdagangan multi-arah untuk mendapatkan keuntungan dalam kondisi pasar yang berbeda.
  3. Memberikan pilihan yang kaya untuk mengatur periode backtest, yang dapat dengan mudah melakukan backtesting data historis dan analisis.
  4. Pengaturan stop loss dan take profit dapat secara efektif mengendalikan risiko dan meningkatkan efisiensi pemanfaatan modal.
  5. Pengaturan waktu penyimpanan maksimum dapat menghindari posisi yang dipegang terlalu lama dan menghadapi risiko pasar.

Risiko Strategi

  1. Pengaturan harga masuk, harga stop loss dan harga take profit memiliki dampak besar pada keuntungan strategi.
  2. Ketika pasar berfluktuasi dengan keras, stop loss dapat dipicu segera setelah membuka posisi, menghasilkan kerugian.
  3. Jika waktu penyimpanan maksimum memicu penutupan posisi, ia mungkin kehilangan kesempatan untuk keuntungan berikutnya.
  4. Strategi mungkin tidak berjalan dengan baik dalam beberapa kondisi pasar khusus (seperti pasar sampingan).

Arah Optimasi Strategi

  1. Pertimbangkan untuk memperkenalkan lebih banyak indikator teknis atau indikator sentimen pasar untuk mengoptimalkan kondisi masuk, stop loss dan mengambil keuntungan untuk meningkatkan stabilitas dan profitabilitas strategi.
  2. Untuk pengaturan waktu penyimpanan maksimum, dapat disesuaikan secara dinamis sesuai dengan volatilitas pasar dan keuntungan dan kerugian posisi untuk menghindari biaya peluang yang dapat dibawa oleh penutupan waktu tetap.
  3. Untuk karakteristik pasar lateral, logika seperti terobosan kisaran lateral atau konfirmasi pembalikan tren dapat ditambahkan untuk mengurangi biaya perdagangan yang sering.
  4. Pertimbangkan untuk menambahkan strategi manajemen posisi dan manajemen modal untuk mengendalikan paparan risiko dari satu transaksi dan meningkatkan efisiensi dan stabilitas pemanfaatan modal.

Ringkasan

Squeeze Backtest Transformer v2.0 adalah sistem perdagangan kuantitatif yang didasarkan pada strategi squeeze yang dapat berdagang di lingkungan pasar yang berbeda melalui pengaturan parameter yang fleksibel dan dukungan perdagangan multi arah. Pada saat yang sama, pilihan pengaturan periode backtest yang kaya dan pengaturan take profit dan stop loss dapat membantu pengguna melakukan analisis data historis dan pengendalian risiko. Namun, kinerja strategi sangat dipengaruhi oleh pengaturan parameter dan perlu dioptimalkan dan ditingkatkan berdasarkan karakteristik pasar dan kebutuhan perdagangan untuk meningkatkan stabilitas dan profitabilitas strategi.


/*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 banyak