Strategi Stop Loss Terakhir Berdasarkan Kesenjangan Harga

Penulis:ChaoZhang, Tanggal: 2023-11-28 13:53:16
Tag:

img

Gambaran umum

Strategi ini mengadopsi prinsip selisih harga untuk pergi panjang ketika harga memecahkan terendah baru-baru ini, dengan stop loss dan mengambil pesanan keuntungan untuk mengikuti harga terendah untuk mengambil keuntungan.

Logika Strategi

Ini mengidentifikasi kesenjangan ketika harga pecah di bawah harga terendah dalam N jam terakhir, pergi panjang berdasarkan persentase yang dikonfigurasi, dengan stop loss dan take profit order. Stop loss line dan take profit line bergerak sesuai dengan tindakan harga. Logika adalah:

  1. Menghitung harga terendah dalam N jam terakhir sebagai harga yang mengikat
  2. Pergi panjang ketika harga real-time di bawah harga obligasi * persentase beli
  3. Setel mengambil keuntungan berdasarkan harga masuk * persentase jual
  4. Setel stop loss berdasarkan harga masuk - harga masuk * persentase stop loss
  5. Ukuran posisi adalah persentase dari ekuitas strategi
  6. Jalur stop loss dengan harga terendah
  7. Posisi tutup saat mengambil keuntungan atau stop loss dipicu

Analisis Keuntungan

Keuntungan dari strategi ini:

  1. Menggunakan konsep celah harga, meningkatkan tingkat kemenangan
  2. Stop loss otomatis untuk mengunci sebagian besar keuntungan
  3. Persentase stop loss dan take profit yang dapat disesuaikan untuk pasar yang berbeda
  4. Bekerja dengan baik untuk instrumen dengan rebound jelas
  5. Logika sederhana dan mudah diterapkan

Analisis Risiko

Ada juga beberapa risiko:

  1. Penembusan celah mungkin gagal dengan terendah yang lebih rendah
  2. Pengaturan stop loss atau take profit yang tidak tepat dapat menyebabkan keluar dini
  3. Memerlukan penyesuaian parameter secara berkala untuk perubahan pasar
  4. Instrumen terbatas yang berlaku, mungkin tidak bekerja untuk beberapa
  5. Intervensi manual diperlukan dari waktu ke waktu

Arahan Optimasi

Strategi ini dapat ditingkatkan dalam hal berikut:

  1. Tambahkan model pembelajaran mesin untuk penyesuaian parameter otomatis
  2. Tambahkan lebih banyak jenis stop loss/take profit, misalnya trailing stop loss, order bracket
  3. Optimalkan logika stop loss/take profit untuk exit yang lebih cerdas
  4. Masukkan lebih banyak indikator untuk menyaring sinyal palsu
  5. Memperluas ke lebih banyak instrumen untuk meningkatkan universalitas

Kesimpulan

Kesimpulannya, ini adalah strategi stop loss trailing yang sederhana dan efektif berdasarkan kesenjangan harga. Ini mengurangi entri palsu dan kunci dalam keuntungan secara efektif. Masih banyak ruang untuk perbaikan dalam penyesuaian parameter dan penyaringan sinyal. Ini layak penelitian lebih lanjut dan penyempurnaan.


/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Squeeze Backtest by Shaqi v1.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)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     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

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size > 0

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)



Lebih banyak