Strategi trailing stop loss berdasarkan selisih harga


Tanggal Pembuatan: 2023-11-28 13:53:16 Akhirnya memodifikasi: 2023-11-28 13:53:16
menyalin: 0 Jumlah klik: 655
1
fokus pada
1617
Pengikut

Strategi trailing stop loss berdasarkan selisih harga

Ringkasan

Strategi ini menggunakan prinsip selang harga, membeli ketika titik terendah terpecah, dan mengatur stop loss dan stop loss untuk melacak stop loss harga terendah dan menghasilkan keuntungan.

Prinsip Strategi

Ketika harga jatuh di bawah titik terendah dalam N jam terakhir, masuklah ke dalam selang waktu posisi sesuai dengan persentase yang ditetapkan, dan tetapkan stop loss dan stop order. Setelah itu, garis stop loss dan garis stop akan bergerak sesuai dengan tren pasar. Logika spesifiknya adalah sebagai berikut:

  1. Menghitung titik terendah dalam N jam sebagai harga yang mengikat
  2. Harga real-time lebih rendah dari harga terikat kali persentase setup pembelian
  3. Set Stop Order sebagai harga masuk kalikan persentase set yang dijual
  4. Setting Stop Loss adalah harga masuk minus harga masuk kali persentase Stop Loss
  5. Persentase jumlah multi-unit dalam kepentingan strategi
  6. Mengikuti Stop Loss Moving Minimum
  7. Stop Stop atau Stop loss

Analisis Keunggulan Strategi

Strategi ini memiliki keuntungan sebagai berikut:

  1. Berpikir pada selisih harga, masuk saat terjatuh, dan meningkatkan peluang menang
  2. Stop Loss Tracker otomatis, dapat mengunci sebagian besar keuntungan
  3. Persentase Stop Loss yang dapat dikonfigurasi untuk berbagai pasar
  4. Cocok untuk varietas dengan ciri-ciri reversibilitas yang jelas
  5. Operasi sederhana dan mudah diterapkan

Analisis Risiko Strategi

Strategi ini juga memiliki beberapa risiko:

  1. Namun, tidak ada yang bisa memprediksi keberhasilannya, dan kemungkinan akan terjadi lagi.
  2. Stop loss atau stop setting yang tidak tepat dapat menyebabkan stop loss atau stop loss prematur yang lebih besar
  3. Parameter yang perlu dioptimalkan secara berkala untuk menyesuaikan dengan perubahan pasar
  4. Varietas terbatas, mungkin tidak efektif untuk beberapa varietas
  5. Ada kebutuhan untuk intervensi buatan.

Arah optimasi strategi

Strategi ini juga dapat dioptimalkan dengan:

  1. Menambahkan algoritma pembelajaran mesin untuk mengoptimalkan parameter secara otomatis
  2. Menambahkan lebih banyak stop loss, seperti stop loss bergerak, stop loss yang tergantung, dan lain-lain.
  3. Mengoptimalkan Stop Loss Logic untuk Stop Loss yang Lebih Cerdas dan Lebih Lancar
  4. Tergabung dengan lebih banyak indikator untuk menilai keandalan sinyal, memfilter sinyal palsu
  5. Memperluas varietas dan meningkatkan keseragaman strategi

Meringkaskan

Strategi ini secara keseluruhan merupakan strategi tracking stop loss yang sederhana dan efektif berdasarkan pemikiran gap harga. Ini mengurangi probabilitas masuk yang salah, dapat mengunci keuntungan secara efektif, dan masih banyak ruang untuk pengoptimalan dalam pengoptimalan dan penyaringan parameter yang layak untuk penelitian dan perbaikan lebih lanjut.

Kode Sumber Strategi
/*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)